ALTER TABLE tb_IMP_DeclaracoesDocumentos ADD
	nomeFicheiro varchar(100) NULL,
	ficheiro varbinary(MAX) NULL
GO
ALTER TABLE PRO_DUPD ADD
	DPD_NFCH varchar(100) NULL,
	DPD_FICH varbinary(MAX) NULL
GO
ALTER TABLE PRO_DDOC ADD
	DDO_NFCH varchar(100) NULL,
	DDO_FICH varbinary(MAX) NULL
GO
ALTER TABLE tb_IMP_DeclaracoesAdicoesPedidos ADD
	nomeFicheiro varchar(100) NULL,
	ficheiro varbinary(MAX) NULL
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'fn_IMP_ObtemErrosSubmissaoWS') AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT'))
	DROP FUNCTION fn_IMP_ObtemErrosSubmissaoWS
GO 
CREATE FUNCTION fn_IMP_ObtemErrosSubmissaoWS(@IdDeclaracao int) RETURNS @TblErrosSubmissao TABLE 
(
	numero smallint, 
	codigo varchar(25), 
	descricao varchar(250)
) WITH ENCRYPTION 
AS
BEGIN
-- declaração de variáveis
	DECLARE @Ano int, @Numero int, @TotalVols numeric(38, 6), @CodPaisDestino varchar(2), @Contentorizada int, @TotalMontante numeric(38, 6), @TipoNIFCliente int, 
		@AnexoB varchar(2), @Contentor varchar(17), @Regime varchar(4)
-- obtem dados da declaração
	SELECT @Ano = DUC_EANO, @Numero = DUC_PNUM, @TotalVols = ISNULL(DUC_TVL6, 0), @CodPaisDestino = ISNULL(PAI_PA17, ''), @Contentorizada = DUC_CT19, 
		@TotalMontante = ISNULL(DUC_MT22, 0), @TipoNIFCliente = ISNULL(DUC_TPDS, -1), @AnexoB = DUC_ANXB, @Contentor = ISNULL(DUC_CONT, ''), @Regime = ISNULL(DUC_REGI, '')
	FROM PRO_DUCG WITH(NOLOCK)
	WHERE DUC_IDTY = @IdDeclaracao
-- verifica condição de total diferente da soma das adições
	IF NOT EXISTS(SELECT 1 FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero HAVING SUM(DUA_VA42) = @TotalMontante)
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(1, 'INV_MONTANTETOTAL', 'A soma do montante das adições diferente do total declarado.')
	END
-- verifica condição se existe artigo genérico nas adições
	IF EXISTS(SELECT 1 FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND APA_CP33 = '9999999999')
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(2, 'INV_CPARTIGOADICOES', 'Existem adições com artigo pautal genérico "9999999999" atribuído.')
	END	
-- verifica condição se existem volumes definidos
	IF (@TotalVols = 0) AND (NOT EXISTS(SELECT 1 FROM PRO_DU31 WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = 1 AND D31_TTVL = 1))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(3, 'NO_VOLUMES', 'Não existem volumes definidos.')
	END		
-- verifica condição se existem documentos suporte/transporte sem número
	IF EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesDocumentos WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao AND tipo IN (0, 1) AND ISNULL(numero, '') = '')
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(4, 'INV_NUMDOCUMENTOS', 'Existem documentos/certificados sem número atribuído.')
	END		
-- verifica condição se existem documentos transporte definidos
	IF (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesDocumentos WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao AND tipo = 1))
		AND (NOT EXISTS(SELECT 1 FROM PRO_DDOC WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = 1 AND DDO_TIPO = 1))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(5, 'NO_DOCSTRANSPORTE', 'Não existe, pelo menos, um documento de transporte.')
	END		
-- verifica condição se existem documentos obrigatórios definidos
	IF (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY WHERE ddo.id_declaracaoIMP = @IdDeclaracao AND doc.DOC_CODI IN ('9E06', 'N203', 'N315', 'N325', 'N380', 'N381', 'N395')))
		AND (NOT EXISTS(SELECT 1 FROM PRO_DDOC WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = 1 AND DOC_CODI IN ('9E06', 'N203', 'N315', 'N325', 'N380', 'N381', 'N395')))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(6, 'NO_DOCSOBRIGATORIOS', 'Não existe, pelo menos, um dos seguintes documentos obrigatórios "9E06", "N203", "N315", "N325", "N380", "N381", "N395".')
	END	
-- verifica condição se existem documentos precedentes definidos
	IF (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesPrecedentes WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao))
		AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesAdicoesPrecedentes AS dap WITH(NOLOCK) INNER JOIN PRO_DUAD AS dad WITH(NOLOCK) ON dap.id_adicao = dad.DUA_IDEN WHERE dad.DUC_EANO = @Ano AND dad.DUC_PNUM = @Numero AND dad.DUA_CODI = 1))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(7, 'NO_DOCSPRECEDENTES', 'Não existe, pelo menos, um documento precedente.')
	END
-- verifica condição se existe contentor definido
	IF (@Contentorizada > 0) AND (@Contentor = '') AND (NOT EXISTS(SELECT 1 FROM PRO_DCON WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(8, 'NO_CONTENTORES', 'Não existe, pelo menos, um contentor.')
	END	
-- verifica condição se existem referências fiscais definidas
	IF (@AnexoB IN ('H1', 'H6', 'I1')) AND ((@CodPaisDestino <> 'PT') OR (LEFT(@Regime, 2) = '42') OR (@TipoNIFCliente IN (3, 4, 6)))
		AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesReferenciasFiscais WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(9, 'NO_REFSFISCAIS', 'Não existe, pelo menos, uma referência fiscal.')
	END
-- verifica condição se existem acréscimos/deduções obrigatórios definidos
	IF (@AnexoB IN ('H1', 'H5', 'I1', 'I2')) 
		AND (EXISTS(SELECT 1 FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = 1 AND (ISNULL(DUA_VFRE, 0) > 0 OR ISNULL(DUA_VSEG, 0) > 0)))
		AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes AS aad WITH(NOLOCK) INNER JOIN PRO_DUAD AS dad WITH(NOLOCK) ON aad.id_adicao = dad.DUA_IDEN WHERE dad.DUC_EANO = @Ano AND dad.DUC_PNUM = @Numero AND dad.DUA_CODI = 1 AND aad.codigo IN ('AK', 'BA')))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(10, 'NO_ACRESCIMOSDEDUCOES', 'Não existe, pelo menos, o acréscimo "AK" ou a dedução "BA" obrigatórios.')
	END
-- verifica condição se existem estâncias de apuramento definidas
	IF (@AnexoB = 'H3') AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesEstancias WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(11, 'NO_ESTANCIASAPURAMENTO', 'Não existe, pelo menos, uma estância de apuramento.')
	END
-- verifica condição se existem locais de transformação definidas
	IF (@AnexoB = 'H3') AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesLocaisTransformacao WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(12, 'NO_LOCAISTRANSFORMACAO', 'Não existe, pelo menos, um local de transformação.')
	END
-- verifica condição se existem identificação de mercadorias definidas
	IF (@AnexoB = 'H3') AND (NOT EXISTS(SELECT 1 FROM tb_IMP_DeclaracoesMeiosIdentificacao WITH(NOLOCK) WHERE id_declaracaoIMP = @IdDeclaracao))
	BEGIN
		INSERT INTO @TblErrosSubmissao(numero, codigo, descricao)
		VALUES(13, 'NO_IDMERCADORIAS', 'Não existe, pelo menos, uma identificação das mercadorias.')
	END
-- devolve a tabela	dos erros de submissão	
	RETURN 
END
GO
GRANT SELECT ON fn_IMP_ObtemErrosSubmissaoWS TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos @IdDeclaracao int, @DocsAnexosXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- constroi XML para lista XML de documentos anexos às mensagens XML CC415A (Criação da declaração), CC413A (Alteração da declaração) e PT498A (Resposta à AT)
	SELECT @DocsAnexosXML = 
		(SELECT
			t.codigo AS "codigo",
			CAST('' AS XML).value('xs:base64Binary(sql:column("t.ficheiro"))', 'varchar(MAX)') AS "conteudoFicheiro"
		FROM (SELECT doc.DOC_CODI AS codigo, ddo.ficheiro 
			FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK)
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
			WHERE ddo.id_declaracaoIMP = @IdDeclaracao AND ddo.ficheiro IS NOT NULL
			UNION ALL
			SELECT dpe.TXM_CODI AS codigo, dpe.DPD_FICH AS ficheiro
			FROM PRO_DUPD AS dpe WITH(NOLOCK)
				INNER JOIN PRO_DUCG AS ddg WITH(NOLOCK) ON dpe.DUC_EANO = ddg.DUC_EANO AND dpe.DUC_PNUM = ddg.DUC_PNUM
			WHERE ddg.DUC_IDTY = @IdDeclaracao AND dpe.DPD_FICH IS NOT NULL
			UNION ALL
			SELECT dad.DOC_CODI AS codigo, dad.DDO_FICH AS ficheiro
			FROM PRO_DDOC AS dad WITH(NOLOCK)
				INNER JOIN PRO_DUCG AS ddg WITH(NOLOCK) ON dad.DUC_EANO = ddg.DUC_EANO AND dad.DUC_PNUM = ddg.DUC_PNUM
			WHERE ddg.DUC_IDTY = @IdDeclaracao AND dad.DDO_FICH IS NOT NULL
			UNION ALL
			SELECT ped.TXM_CODI AS codigo, dap.ficheiro 
			FROM tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK)
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dap.id_pedido = ped.TXM_IDTY
				INNER JOIN PRO_DUAD AS dai WITH(NOLOCK) ON dap.id_adicao = dai.DUA_IDEN
				INNER JOIN PRO_DUCG AS ddg WITH(NOLOCK) ON dai.DUC_EANO = ddg.DUC_EANO AND dai.DUC_PNUM = ddg.DUC_PNUM
			WHERE ddg.DUC_IDTY = @IdDeclaracao AND dap.ficheiro IS NOT NULL
		) AS t
		FOR XML PATH('documento'), ROOT('listaDocumentos'), TYPE)
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagensSubmetePedido') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagensSubmetePedido
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagensSubmetePedido @TipoMensagem varchar(8), @Id int, @Motivo varchar(512), @NumeroNRMAnterior varchar(18), 
	@ElementosAlterados varchar(512), @XMLDocumentos xml, @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @TblID table (ID bigint NOT NULL)
	DECLARE @NumErro int, @PassPhrase varchar(50), @DataAtual datetime, @CodUtilizador varchar(30), @ProxyAuthentication bit, @ProxyServer varchar(100), @ProxyPort int, 
		@ProxyUser varchar(100), @ProxyPassword varchar(100), @AnoDeclaracao int, @NumDeclaracao int, @EstadoOperacaoDeclaracao varchar(3), @CodTipoDeclaracao varchar(4), 
		@NomeTipoDeclaracao varchar(35), @EnderecoWS varchar(250), @LoginWS varchar(50), @PwdWS varchar(100), @PathCertificado varchar(250), @PwdCertificado varchar(100), 
		@ListaDocsAnexosXML xml, @MensagemSoapAction varchar(250), @MensagemXML xml, @MensagemTXT varchar(MAX), @MensagemXMLBinario varbinary(MAX), @MensagemXMLBase64 varchar(MAX), 
		@PublicKeyCertificadoAT nvarchar(4000), @PwdWSEncriptada nvarchar(4000), @DataSistemaEncriptada nvarchar(4000), @ChvSimetricaEncriptada nvarchar(4000), 
		@RequestXML xml, @Resultado int, @ResponseXML xml, @FaultCode varchar(100), @FaultMessage varchar(MAX), @NumMensagem int
-- inicia variáveis	
	SET @PassPhrase = '16345678901234567'
-- inicia processo de submissão de pedido da declaração
	BEGIN TRY	
		SET @NumErro = 0
		SET @ListaDocsAnexosXML = NULL
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem utilizador
		SELECT @CodUtilizador = UTI_UTIL
		FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
		WHERE UTI_IDTY = @IdUtilizador
-- obtem configurações do Proxy Authentication nos Parâmetros de Despachos
		SELECT TOP 1 @ProxyAuthentication = PDE_PRXA, @ProxyServer = ISNULL(PDE_PRXS, ''), @ProxyPort = ISNULL(PDE_PRXP, 0), @ProxyUser = ISNULL(PDE_PRXU, ''), 
			@ProxyPassword = ISNULL(CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, PDE_PRXW)), '')
		FROM TAB_PDES WITH(NOLOCK)
-- obtem configurações do Webservice no declarante da declaração
		SELECT @AnoDeclaracao = duc.DUC_EANO, @NumDeclaracao = duc.DUC_PNUM, @EstadoOperacaoDeclaracao = duc.DUC_ESTO, @CodTipoDeclaracao = duc.TDE_CODI, 
			@NomeTipoDeclaracao = duc.TDE_NOME, @EnderecoWS = dcl.DEC_WSEP, @LoginWS = dcl.DEC_WSUS, 
			@PwdWS = CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, dcl.DEC_WSPW)), @PathCertificado = dcl.DEC_WSPC, 
			@PwdCertificado = CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, dcl.DEC_WSWC))			
		FROM PRO_DUCG AS duc WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON duc.DEC_CO14 = dcl.DEC_CODI	
		WHERE duc.DUC_IDTY = @Id
-- obtem a chave pública do sistema de autenticação na AT em função se o request é para ambiente de testes ou não (porta 814 = Ambiente de Testes)
		SET @PublicKeyCertificadoAT = GIDWIN.dbo.fn_Geral_ChavePublicaRSAWebservicesAT((CASE WHEN CHARINDEX(':814', @EnderecoWS) > 0 THEN 1 ELSE 0 END))
-- valida se o path p/ o certificado é válido
		EXEC master.dbo.xp_fileexist @PathCertificado, @Resultado OUTPUT
		IF @Resultado = 0
			RAISERROR('Ficheiro do certificado não encontrado em "%s".', 16, 1, @PathCertificado)	
-- constroi o XML de acordo com o tipo de mensagem
		IF @TipoMensagem = 'CC413A' -- Alteração da declaração
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauAlterarDeclaracaoRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC413A @Id, @MensagemXML OUTPUT
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos @Id, @ListaDocsAnexosXML OUTPUT
		END
		ELSE
		IF @TipoMensagem = 'CC414A' -- Anulação da declaração
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauAnularDeclaracaoRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC414A @Id, @Motivo, @MensagemXML OUTPUT
		END
		ELSE
		IF @TipoMensagem = 'CC415A' -- Criação da declaração
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauSubmeterDeclaracaoRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC415A @Id, @MensagemXML OUTPUT
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos @Id, @ListaDocsAnexosXML OUTPUT
		END
		ELSE		
		IF @TipoMensagem = 'CC432A' -- Notificação de Apresentação das Mercadorias
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauNotificarApresentacaoMercadoriasRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC432A @Id, @MensagemXML OUTPUT
		END
		ELSE
		IF @TipoMensagem = 'CC433A' -- Notificação de Apresentação EIDR
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauNotificarEIRRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC433A @Id, @NumeroNRMAnterior, @ElementosAlterados, @MensagemXML OUTPUT
		END
		ELSE
		IF @TipoMensagem = 'CC446A' -- Entrega de documentos
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauEntregarDocumentosRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLCC446A @Id, @XMLDocumentos, @MensagemXML OUTPUT
		END
		ELSE
		IF @TipoMensagem = 'PT498A' -- Resposta à AT
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauRespostaATRequest'
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLPT498A @Id, @ElementosAlterados, @Motivo, @MensagemXML OUTPUT
			EXEC sp_IMP_Declaracoes_MensagemGeraXMLDocsAnexos @Id, @ListaDocsAnexosXML OUTPUT
		END
-- converte o XML gerado para varbinary e depois para Base64
		SET @MensagemTXT = '<?xml version="1.0" encoding="UTF-8"?>' + CAST(@MensagemXML AS varchar(MAX))
		SET @MensagemXMLBinario = CONVERT(varbinary(MAX), @MensagemTXT) 
		SET @MensagemXMLBase64 = CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@MensagemXMLBinario"))', 'varchar(MAX)') 
-- encripta password acesso à AT, Nounce e Data de Criação de acordo com o standard WS-Security da OASIS
		EXEC GIDWIN.dbo.SP_Externo_EncriptarDadosAcessoWS @PwdWS, @PublicKeyCertificadoAT, @PwdWSEncriptada OUTPUT, @DataSistemaEncriptada OUTPUT, @ChvSimetricaEncriptada OUTPUT
-- constroi estrutura XML com os dados do pedido ao metodo para enviar mensagem à AT
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 'http://net.atos.at.impcau.canalWS/' AS net, 'http://schemas.xmlsoap.org/soap/envelope/' AS soapenv)		
		SELECT @RequestXML = 
			(SELECT 
				(SELECT 
					(SELECT
						(SELECT 
							@LoginWS AS "wss:Username", 
							@PwdWSEncriptada AS "wss:Password",
							@ChvSimetricaEncriptada AS "wss:Nonce",
							@DataSistemaEncriptada AS "wss:Created"
						FOR XML PATH('wss:UsernameToken'), ELEMENTS, TYPE)
					FOR XML PATH('wss:Security'), ELEMENTS, TYPE)
				FOR XML PATH('soapenv:Header'), ELEMENTS, TYPE),
				(SELECT
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem",
							@ListaDocsAnexosXML
						FOR XML PATH('processaPedidoInput'), TYPE)
					HAVING @TipoMensagem = 'CC413A' -- Alteração da declaração
					FOR XML PATH('net:IMPCauAlterarDeclaracao'), TYPE), 
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem"
						FOR XML PATH('processaMensagemInput'), TYPE)
					HAVING @TipoMensagem = 'CC414A' -- Anulação da declaração
					FOR XML PATH('net:IMPCauAnularDeclaracao'), TYPE), 
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem", 
							@ListaDocsAnexosXML
						FOR XML PATH('processaPedidoInput'), TYPE)
					HAVING @TipoMensagem = 'CC415A' -- Criação da declaração
					FOR XML PATH('net:IMPCauSubmeterDeclaracao'), TYPE), 					
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem"
						FOR XML PATH('processaMensagemInput'), TYPE)
					HAVING @TipoMensagem = 'CC432A' -- Notificação de Apresentação das Mercadorias
					FOR XML PATH('net:IMPCauNotificarApresentacaoMercadorias'), TYPE), 
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem"
						FOR XML PATH('processaMensagemInput'), TYPE)
					HAVING @TipoMensagem = 'CC433A' -- Notificação de Apresentação EIR
					FOR XML PATH('net:IMPCauNotificarEIR'), TYPE), 
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem"
						FOR XML PATH('processaMensagemInput'), TYPE)
					HAVING @TipoMensagem = 'CC446A' -- Entrega de documentos
					FOR XML PATH('net:IMPCauEntregarDocumentos'), TYPE), 
					(SELECT 
						(SELECT 
							@MensagemXMLBase64 AS "mensagem", 
							@ListaDocsAnexosXML
						FOR XML PATH('processaPedidoInput'), TYPE)
					HAVING @TipoMensagem = 'PT498A' -- Resposta à AT
					FOR XML PATH('net:IMPCauRespostaAT'), TYPE)
				FOR XML PATH('soapenv:Body'), ELEMENTS, TYPE)
			FOR XML PATH('soapenv:Envelope'), ELEMENTS)		
-- processa envio do XML para o WebService da AT	
		EXEC GIDWIN.dbo.SP_Externo_EnviarDadosWS @RequestXML, @EnderecoWS, @MensagemSoapAction, @PathCertificado, @PwdCertificado, @ProxyAuthentication, @ProxyServer, @ProxyPort, @ProxyUser, @ProxyPassword, @ResponseXML OUTPUT
-- valida se ocorreu erro na invocação do webservice		
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP-ENV")
		SELECT 
			@FaultCode = t.c.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = t.c.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('SOAP-ENV:Envelope/SOAP-ENV:Body/SOAP-ENV:Fault') AS t(c)
		IF ISNULL(@FaultMessage, '') <> ''
			RAISERROR('Comunicação ao webservice falhou c/ erro "%s".', 16, 2, @FaultMessage)	
-- valida se ocorreu erro na autenticação/autorização do webservice		
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env)
		SELECT 
			@FaultCode = t.c.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = t.c.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('env:Envelope/env:Body/env:Fault') AS t(c)
		IF ISNULL(@FaultMessage, '') <> ''
			RAISERROR('A autenticação/autorização ao webservice gerou o erro "%s".', 16, 3, @FaultMessage)				
-- obtem o resultado "OK"/"NOK" retornados do WS
		IF @TipoMensagem = 'CC413A' -- Alteração da declaração
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauAlterarDeclaracaoResponse/return/resultadoProcessamento') AS t(c)
		END
		ELSE
		IF @TipoMensagem = 'CC414A' -- Anulação da declaração
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauAnularDeclaracaoResponse/return/resultadoProcessamento') AS t(c)
		END
		ELSE
		IF @TipoMensagem = 'CC415A' -- Criação da declaração
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauSubmeterDeclaracaoResponse/return/resultadoProcessamento') AS t(c)		
		END
		ELSE		
		IF @TipoMensagem = 'CC432A' -- Notificação de Apresentação das Mercadorias
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauNotificarApresentacaoMercadoriasResponse/return/resultadoProcessamento') AS t(c)
		END
		ELSE
		IF @TipoMensagem = 'CC433A' -- Notificação de Apresentação EIR
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauNotificarEIRResponse/return/resultadoProcessamento') AS t(c)
		END
		ELSE
		IF @TipoMensagem = 'CC446A' -- Entrega de documentos
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauEntregarDocumentosResponse/return/resultadoProcessamento') AS t(c)
		END
		ELSE
		IF @TipoMensagem = 'PT498A' -- Resposta à AT
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauRespostaATResponse/return/resultadoProcessamento') AS t(c)
		END
-- se resultado não for de sucesso, manda erro
		IF @FaultCode <> '0'
			RAISERROR('O envio da mensagem gerou o erro "%s".', 16, 4, @FaultMessage)		
-- atualiza declaração p/ alteração do status e utilizador/data
		UPDATE PRO_DUCG SET DUC_STAT = (CASE @TipoMensagem WHEN 'CC414A' THEN 3 ELSE 1 END), DUC_DENV = @DataAtual, DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual 
		WHERE DUC_IDTY = @Id
	END TRY
	BEGIN CATCH
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = ERROR_MESSAGE() + CHAR(13) + '{Detalhe: Número=' + CAST(ERROR_NUMBER() as varchar(50)) + ',Nível=' + CAST(ERROR_SEVERITY() as varchar(5)) + ',Estado=' + CAST(ERROR_STATE() as varchar(5)) + ',Objeto=' + ISNULL(ERROR_PROCEDURE(), '') + ',Linha=' + CAST(ERROR_LINE() as varchar(5)) + '}'
	END CATCH	
-- obtem o próximo número do registo da mensagem da declaração
	SET @NumMensagem = ISNULL((SELECT MAX(DRP_CODI) FROM PRO_DURP WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao), 0) + 1
-- insere no detalhe de mensagens os dados da submissão da declaração
	INSERT INTO PRO_DURP(DUC_EANO, DUC_PNUM, DRP_CODI, DRP_FLUX, DRP_DATA, DRP_OPER, DRP_ESTO, TDE_CODI, TDE_NOME, DRP_UTIL, DRP_XPED, DRP_XRES, DRP_SUCE, DRP_NFCH, DRP_CFCH)
	VALUES(@AnoDeclaracao, @NumDeclaracao, @NumMensagem, 1, @DataAtual, (CASE @TipoMensagem WHEN 'CC415A' THEN 0 WHEN 'CC413A' THEN 1 WHEN 'CC414A' THEN 2 WHEN 'CC432A' THEN 3 WHEN 'CC433A' THEN 4 WHEN 'CC446A' THEN 5 WHEN 'PT498A' THEN 21 ELSE NULL END), 
		@EstadoOperacaoDeclaracao, @CodTipoDeclaracao, @NomeTipoDeclaracao, @CodUtilizador, @MensagemXML, @ResponseXML, (CASE @NumErro WHEN 1 THEN 0 ELSE 1 END),
		(@TipoMensagem + '-' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(varchar(25), @DataAtual, 121), '-', ''), ':', ''), ' ', ''), '.', '') + '.xml'), CAST(@MensagemXML AS varbinary(MAX)))	
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagensSubmetePedido TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagemGeraXMLCC415A') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLCC415A
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLCC415A @IdDeclaracao int, @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para ficheiro XML da mensagem CC415A - Criação da Declaração de Importação	
	SET @FicheiroXML = 				
		(SELECT
			(SELECT
				NULLIF(dcl.DEC_WSUS, '') AS "From", 
				'AT' AS "To", 
				CONVERT(varchar(19), @DataAtual, 120) AS "SendingDateAndTime",
				'IMP-CAU' AS "MessageID", 
				'CC415A' AS "MessageType", 
				NULLIF(duc.DUC_NRLO, '') AS "CorrelationID"
			FOR XML PATH('messageHeader'), TYPE),
			(SELECT
				NULLIF(duc.ALF_CODI, '') AS "importCustomsOffice", 
				(CASE duc.DUC_DCEN WHEN 1 THEN 'PT' ELSE NULL END) AS "languageCode", 
				(CASE duc.DUC_ANXB WHEN 'H6' THEN 1 ELSE NULL END) AS "h6Indicator", 
				NULLIF(duc.DUC_NRLO, '') AS "LRN", 
				(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(duc.TDE_1CAS, '') END) AS "declarationType", 
				(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(duc.TDE_2CAS, '') END) AS "additionalDeclarationType"
			FOR XML PATH('ImportOperation'), TYPE),
			(SELECT 
				1 AS "sequenceNumber", 
				NULLIF(duc.DOC_CODI, '') AS "type", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_NRAU, '')) AS "referenceNumber", 
				NULLIF(duc.DUC_EORI, '') AS "holderOfTheAuthorisation"
			HAVING ISNULL(duc.DOC_CODI, '') <> ''
			FOR XML PATH('Authorisation'), TYPE),
			(SELECT
				NULLIF(duc.ALF_CODI3, '') AS "referenceNumber"
			HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
			FOR XML PATH('CustomsOfficePresentation'), TYPE), 
			(SELECT 
				NULLIF(duc.ALF_CODI4, '') AS "referenceNumber"
			HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'I2')
			FOR XML PATH('SupervisingCustomsOffice'), TYPE), 
			(SELECT 
				(CASE WHEN duc.DUC_TPDS IN (0, 1, 6) THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DNOM, '')) END) AS "name", 
				NULLIF((ISNULL(duc.PAI_DLIV, '') + ISNULL(duc.DUC_DNIF, '')), '') AS "identificationNumber", 		
				(SELECT
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DMOR, '')) AS "streetAndNumber", 
					NULLIF(duc.PAI_DLIV, '') AS "country", 
					NULLIF(duc.DUC_DCPO, '') AS "postcode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DLOC, '')) AS "city"
				HAVING duc.DUC_TPDS NOT IN (0, 1, 6)
				FOR XML PATH('Address'), TYPE)
			HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1')
			FOR XML PATH('Importer'), TYPE), 
			(SELECT 		
				(CASE ISNULL(duc.DUC_TPDC, -1) WHEN 2 THEN NULLIF((ISNULL(duc.PAI_DLIV, '') + ISNULL(duc.DUC_DNIF, '')), '') ELSE NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(duc.DEC_NIF, '')), '') END) AS "identificationNumber", 
				(SELECT TOP 1 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DCR_NOME, '')) AS "name", 
					NULLIF(DCR_TELE, '') AS "phoneNumber", 
					NULLIF(DCR_EMAI, '') AS "eMailAddress"
				FROM TAB_DECR WITH(NOLOCK)
				WHERE DEC_CODI = duc.DEC_CO14 AND DCR_TIPO = 0 AND (ISNULL(EAD_CODI, '') = '' OR EAD_CODI = duc.ALF_CODI)
				FOR XML PATH('ContactPerson'), TYPE)
			FOR XML PATH('Declarant'), TYPE), 				
			(SELECT 				
				NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(duc.DEC_NIF, '')), '') AS "identificationNumber",
				duc.DUC_TPDC AS "status"			
			HAVING ISNULL(duc.DUC_TPDC, -1) = 2 AND dcl.DEC_TIPO <> 1
			FOR XML PATH('Representative'), TYPE), 
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY oim.DUO_CTIP) AS "sequenceNumber", 
				NULLIF(oim.DUO_CTIP, '') AS "guaranteeType", 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF) AS "sequenceNumber", 			
					(CASE ISNULL(soi.DUO_CORF, '') WHEN '' THEN NULLIF(soi.DUO_CAUC, '') ELSE NULL END) AS "GRN", 
					'EUR' AS "currencyCode", 
					CAST(SUM(ISNULL(soi.DUO_MONT, 0)) AS decimal(18, 2)) AS "amountToBeCovered", 
					(SELECT
						NULLIF(soi.ALF_CODI, '') AS "referenceNumber"
					HAVING ISNULL(soi.ALF_CODI, '') <> ''
					FOR XML PATH('CustomsOfficeOfGuarantee'), TYPE), 
					NULLIF(soi.DUO_CORF, '') AS "otherGuaranteeReference"
				FROM PRO_DUOI AS soi WITH(NOLOCK) 
					INNER JOIN TAB_RREC AS srr WITH(NOLOCK) ON soi.RRE_CODI = srr.RRE_CODI
				WHERE soi.DUC_EANO = duc.DUC_EANO AND soi.DUC_PNUM = duc.DUC_PNUM AND ISNULL(soi.DUO_CTIP, '') = ISNULL(oim.DUO_CTIP, '') AND srr.RRE_DPOT = 1
				GROUP BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF
				FOR XML PATH('GuaranteeReference'), TYPE)
			FROM PRO_DUOI AS oim WITH(NOLOCK) 
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON oim.RRE_CODI = rre.RRE_CODI
			WHERE oim.DUC_EANO = duc.DUC_EANO AND oim.DUC_PNUM = duc.DUC_PNUM AND ISNULL(oim.DUO_CTIP, '') <> '' AND rre.RRE_DPOT = 1 AND duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6')
			GROUP BY oim.DUO_CTIP
			FOR XML PATH('Guarantee'), TYPE), 
			(SELECT 
				1 AS "sequenceNumber", 
				NULLIF(duc.DUC_CAUC, '') AS "deferredPayment"				
			HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6') AND duc.DUC_CGLB = 1 AND ISNULL(duc.DUC_CAUC, '') <> ''
			FOR XML PATH('DeferredPayment'), TYPE), 
			(SELECT 
				(CASE 
					WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN NULLIF(duc.PAI_MOFT, '')
					WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN NULLIF(duc.PAI_MOSG, '')
					WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN NULLIF(duc.PAI_MOFT, '')
					ELSE 'EUR'
				END) AS "currency", 
				CAST((CASE 
						WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN ISNULL(duc.DUC_FRET, 0)
						WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN ISNULL(duc.DUC_SEGU, 0)
						WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN (ISNULL(duc.DUC_FRET, 0) + ISNULL(duc.DUC_SEGU, 0))
						ELSE (ROUND(ISNULL(duc.DUC_FRET, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(duc.DUC_SEGU, 0) / ISNULL(duc.DUC_TXSE, 0), 2))
					END) AS decimal(18, 2)) AS "amount"
			HAVING duc.DUC_ANXB = 'H6'
			FOR XML PATH('PostalCharges'), TYPE), 
			(SELECT		
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE NULLIF(duc.PAI_MO22, '') END) AS "invoiceCurrency", 
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE CAST(ISNULL(duc.DUC_MT22, 0) AS decimal(18, 2)) END) AS "totalAmountInvoiced", 
				(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(duc.NTR_CO24, '') END) AS "natureOfTransaction", 
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') OR duc.TDE_2CAS NOT IN ('U', 'V', 'X', 'Y', 'Z') THEN NULL ELSE CONVERT(varchar(10), duc.DUC_NDAT, 120) END) AS "acceptanceDate", 		
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "identificationNumber"
				FROM tb_IMP_DeclaracoesIntervenientes WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('AdditionalSupplyChainActor'), TYPE),
				(SELECT 			
					NULLIF((ISNULL(duc.PAI_CODI1, '') + ISNULL(duc.CLI_NIF, '')), '') AS "identificationNumber" 
				HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.CLI_NIF, '') <> ''
				FOR XML PATH('Buyer'), TYPE), 
				(SELECT 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_NOME, '')) AS "name", 			
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_MORA, '')) AS "streetAndNumber", 
						NULLIF(duc.PAI_CODI, '') AS "country", 
						NULLIF(duc.FOR_CPOS, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_LPOS, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.FOR_NOME, '') <> ''			
				FOR XML PATH('Seller'), TYPE), 
				(SELECT 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ENOM, '')) AS "name", 			
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_EMOR, '')) AS "streetAndNumber", 
						NULLIF(duc.PAI_ELIV, '') AS "country", 
						NULLIF(duc.DUC_ECPO, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ELPO, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_ENOM, '') <> ''
				FOR XML PATH('Exporter'), TYPE), 
				(SELECT
					NULLIF(duc.CEN_CO20, '') AS "incotermCode", 
					NULLIF(duc.PAE_CODI, '') AS "UNLOCODE", 
					NULLIF(duc.PAI_CODI2, '') AS "country", 					
					(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) END) AS "location",
					(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) ELSE NULL END) AS "text"
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C')
				FOR XML PATH('DeliveryTerms'), TYPE), 
				(SELECT 
					NULLIF(duc.PAI_PA15, '') AS countryOfDispatch
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(duc.PAI_PA15, '') <> ''
				FOR XML PATH('CountryOfDispatch'), TYPE),
				(SELECT
					NULLIF(duc.PAI_PA17, '') AS countryOfDestination, 
					(CASE WHEN duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.PAI_P17B END) AS "regionOfDestination"			
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
				FOR XML PATH('Destination'), TYPE), 
				(SELECT
					NULLIF(duc.TAR_CODI, '') AS "type", 
					NULLIF(duc.ARM_CODI, '') AS "identifier"
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.TAR_CODI, '') <> ''
				FOR XML PATH('Warehouse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(dpr.qualificador, '') ELSE NULL END) AS "ccQualifier"
				FROM tb_IMP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
				WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('PreviousDocument'), TYPE), 		
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY DPD_CODI) AS "sequenceNumber", 
					NULLIF(TXM_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DPD_DESC, '')) AS "text", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(DPD_QUAL, '') ELSE NULL END) AS "ccQualifier" 
				FROM PRO_DUPD WITH(NOLOCK) 					
				WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
				FOR XML PATH('AdditionalInformation'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier", 
					(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.entidadeEmissora, '')) END) AS "issuingAuthorityName", 			
					CONVERT(varchar(10), ddo.dataValidade, 120) AS "dateOfValidity"			
				FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 0 
				FOR XML PATH('SupportingDocument'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier" 
				FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 2
				FOR XML PATH('AdditionalReference'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(codigo, '') AS "code", 
					montante AS "amount"
				FROM tb_IMP_DeclaracoesAcrescimosDeducoes WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
				FOR XML PATH('AdditionsAndDeductions'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "VATIdentificationNumber"
				FROM tb_IMP_DeclaracoesReferenciasFiscais WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
				FOR XML PATH('AdditionalFiscalReference'), TYPE), 
				(SELECT
					(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_REF7, '')) END) AS "referenceNumberUCR", 
					(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.DUC_CT19 END) AS "containerIndicator", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_FT21, 1), '') END) AS "modeOfTransportAtTheBorder", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_CODI, 1), '') END) AS "inlandModeOfTransport", 
					ISNULL(duc.DUC_MBRT, 0) AS "grossMass", 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY t.DUC_CONT) AS "sequenceNumber",
						NULLIF(t.DUC_CONT, '') AS "containerIdentificationNumber", 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY DUA_CODI) AS "sequenceNumber", 
							DUA_CODI AS "declarationGoodsItemNumber"
						FROM PRO_DCON WITH(NOLOCK)
						WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM AND DCO_CNUM = t.DUC_CONT
						FOR XML PATH('GoodsReference'), TYPE)
					FROM (
						SELECT duc.DUC_CONT
						UNION
						SELECT DCO_CNUM
						FROM PRO_DCON WITH(NOLOCK)
						WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
						GROUP BY DCO_CNUM
					) AS t
					WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C', 'E', 'F') AND ISNULL(t.DUC_CONT, '') <> '' 
					FOR XML PATH('TransportEquipment'), TYPE),
					(SELECT 
						NULLIF(duc.DUC_TLOC, '') AS "typeOfLocation", 
						NULLIF(duc.DUC_QUAL, '') AS "qualifierOfIdentification", 
						(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'U' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "UNLOCODE", 
						(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'Y' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "authorisationNumber", 
						NULLIF(duc.DUC_IADI, '') AS "additionalIdentifier", 
						(SELECT 
							NULLIF(duc.ALF_CODI1, '') AS "referenceNumber"
						HAVING ISNULL(duc.ALF_CODI1, '') <> ''
						FOR XML PATH('CustomsOffice'), TYPE),				 
						(SELECT 
							NULLIF(duc.DUC_ONIF, '') AS "identificationNumber"
						HAVING ISNULL(duc.DUC_ONIF, '') <> ''
						FOR XML PATH('EconomicOperator'), TYPE),
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LAMO, '')) AS "streetAndNumber", 
							NULLIF(duc.DUC_LACP, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LALO, '')) AS "city", 
							'PT' AS "country"					
						HAVING ISNULL(duc.DUC_LAMO, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'Z'				
						FOR XML PATH('Address'), TYPE), 
						(SELECT 
							NULLIF(duc.DUC_LACP, '') AS "postcode", 					
							'PT' AS "country"
						HAVING ISNULL(duc.DUC_LACP, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'T'
						FOR XML PATH('PostcodeAddress'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
					FOR XML PATH('LocationOfGoods'), TYPE), 
					(SELECT 
						duc.MTR_TIPO AS "typeOfIdentification", 
						NULLIF(duc.DUC_MT18, '') AS "identificationNumber" 
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND duc.MTR_TIPO IS NOT NULL
					FOR XML PATH('ArrivalTransportMeans'), TYPE), 
					(SELECT
						NULLIF(duc.PAI_PA21, '') AS "nationality"
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.PAI_PA21, '') <> ''
					FOR XML PATH('ActiveBorderTransportMeans'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type"
					FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 1
					FOR XML PATH('TransportDocument'), TYPE)
				FOR XML PATH('Consignment'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY adi.DUA_CODI) AS "sequenceNumber", 
					adi.DUA_CODI AS "declarationGoodsItemNumber", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.NTR_CODI, '') END) AS "natureOfTransaction", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE CAST(adi.DUA_VEST AS decimal(18, 2)) END) AS "statisticalValue", 
					(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_NRUR, '')) END) AS "referenceNumberUCR", 			
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY aen.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(aen.numeroReferencia, '')) AS "referenceNumber", 	
						NULLIF(aen.numeroEORI, '') AS "holderOfTheAuthorisation"			
					FROM tb_IMP_DeclaracoesAdicoesEntrepostos AS aen WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON aen.id_documento = doc.DOC_IDTY
					WHERE aen.id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4')
					FOR XML PATH('Authorisation'), TYPE), 
					(SELECT
						NULLIF(LEFT(adi.DUA_RG37, 2), '') AS "requestedProcedure",
						NULLIF(RIGHT(adi.DUA_RG37, 2), '') AS "previousProcedure",
						(SELECT
							ROW_NUMBER() OVER(ORDER BY t.coluna) AS "sequenceNumber",
							NULLIF(t.desdobramento, '') AS "additionalProcedure"									
						FROM tb_TBL_Desdobramentos AS ddb WITH(NOLOCK)
							UNPIVOT(desdobramento FOR coluna IN (ddb.desdobramento1, ddb.desdobramento2, ddb.desdobramento3, ddb.desdobramento4, ddb.desdobramento5)) AS t
						WHERE t.id = adi.id_desdobramento AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1')
						FOR XML PATH('AdditionalProcedure'), TYPE) 
					FOR XML PATH('Procedure'), TYPE), 			
					(SELECT 				
						NULLIF((ISNULL(adi.PAI_CODI4, '') + ISNULL(adi.CLI_NIF, '')), '') AS "identificationNumber"
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.CLI_NIF, '') <> ''
					FOR XML PATH('Buyer'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME1, '')) AS "name", 				
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA1, '')) AS "streetAndNumber", 
							NULLIF(adi.PAI_CODI3, '') AS "country", 
							NULLIF(adi.FOR_CPOS1, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS1, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.FOR_NOME1, '') <> ''
					FOR XML PATH('Seller'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME, '')) AS "name", 				 
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA, '')) AS "streetAndNumber", 
							NULLIF(adi.PAI_CODI, '') AS "country", 
							NULLIF(adi.FOR_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(adi.FOR_NOME, '') <> '' 
					FOR XML PATH('Exporter'), TYPE), 
					(SELECT
						(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(adi.PAI_CO34, '') END) AS "countryOfOrigin", 
						(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.PAI_CODI5, '') END) AS "countryOfPreferentialOrigin" 
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND (ISNULL(adi.PAI_CO34, '') <> '' OR ISNULL(adi.PAI_CODI5, '') <> '')
					FOR XML PATH('Origin'), TYPE), 
					(SELECT 
						NULLIF(adi.PAI_CODI1, '') AS countryOfDispatch
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(adi.PAI_CODI1, '') <> ''
					FOR XML PATH('CountryOfDispatch'), TYPE),
					(SELECT
						NULLIF(adi.PAI_CODI2, '') AS countryOfDestination, 
						adi.RES_CODI AS "regionOfDestination"				
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
					FOR XML PATH('Destination'), TYPE), 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_DESG, '')) AS "descriptionOfGoods", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.APA_CCUS, '') END) AS "CUSCode", 
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_CO39, '') END) AS "quotaOrderNumber", 
						(CASE WHEN duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.DUA_TMER, '') END) AS "typeOfGoods", 
						(SELECT 
							NULLIF(LEFT(adi.APA_CP33, 6), '') AS "harmonizedSystemSubheadingCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 7, 2), '') AS "combinedNomenclatureCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 9, 2), '') AS "taricCode", 
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
								NULLIF(t.DUA_TARIC, '') AS "taricAdditionalCode"
							FROM (
								SELECT 1 AS DUA_ORDEM, SUBSTRING(adi.APA_CP33, 11, 4) AS DUA_TARIC
								UNION
								SELECT 2, SUBSTRING(adi.APA_CP33, 15, 4)
								UNION
								SELECT 3, SUBSTRING(adi.APA_CP33, 19, 4)								
							) AS t
							WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
							FOR XML PATH('TaricAdditionalCode'), TYPE),
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
								NULLIF(t.DUA_TARIC, '') AS "nationalAdditionalCode"						
							FROM (
								SELECT 1 AS DUA_ORDEM, adi.DUA_1TAR AS DUA_TARIC
								UNION
								SELECT 2, adi.DUA_2TAR
								UNION
								SELECT 3, adi.DUA_3TAR 
								UNION
								SELECT 4, adi.DUA_4TAR 
								UNION
								SELECT 5, adi.DUA_5TAR 								
							) AS t
							WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
							FOR XML PATH('NationalAdditionalCode'), TYPE)
						HAVING ISNULL(LEFT(adi.DUA_RG37, 2), '') <> '71'
						FOR XML PATH('CommodityCode'), TYPE), 
						(SELECT
							(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'I2') THEN NULL ELSE adi.DUA_ML38 END) AS "netMass", 
							(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_US41, 0) END) AS "supplementaryUnits", 
							(CASE WHEN duc.DUC_ANXB = 'H6' THEN NULL ELSE adi.DUA_MB35 END) AS "grossMass"
						FOR XML PATH('GoodsMeasure'), TYPE), 
						(SELECT 
							CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "itemAmountInvoiced"
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2') 
						FOR XML PATH('InvoiceLine'), TYPE), 
						(SELECT
							CAST(ISNULL((SELECT SUM(ISNULL(DUO_MONT, 0)) FROM PRO_DUOI WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI), 0) AS decimal(18, 2)) AS "totalDutiesAndTaxesAmount", 
							(CASE WHEN duc.DUC_ANXB = 'H5' OR (ISNULL(adi.PRE_CO36, '') = '000' AND ISNULL(LEFT(adi.DUA_RG37, 2), '') = '71') THEN NULL ELSE NULLIF(adi.PRE_CO36, '') END) AS "preference", 							
							(SELECT
								ROW_NUMBER() OVER(ORDER BY aoi.DUO_IMPO) AS "sequenceNumber", 
								NULLIF(aoi.DUO_IMPO, '') AS "taxType", 												
								CAST(SUM(ISNULL(aoi.DUO_MONT, 0)) AS decimal(18, 2)) AS "payableTaxAmount", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY DUO_CODI) AS "sequenceNumber", 
									CAST((CASE DUO_TIPO WHEN 1 THEN (ISNULL(DUO_TXVL, 0) / 100) ELSE ISNULL(DUO_TXVL, 0) END) AS decimal(18, 3)) AS "taxRate", 
									NULLIF(UME_CODI, '') AS "measurementUnitAndQualifier", 
									(CASE DUO_QTDE WHEN 0 THEN NULL ELSE DUO_QTDE END) AS "quantity", 
									CAST((CASE DUO_QTDE WHEN 0 THEN ISNULL(DUO_BTRI, 0) ELSE NULL END) AS decimal(18, 2)) AS "amount", 
									CAST(ISNULL(DUO_MONT, 0) AS decimal(18, 2)) AS "taxAmount"
								FROM PRO_DUOI WITH(NOLOCK)
								WHERE DUC_EANO = aoi.DUC_EANO AND DUC_PNUM = aoi.DUC_PNUM AND DUA_CODI = aoi.DUA_CODI AND DUO_IMPO = aoi.DUO_IMPO 
								FOR XML PATH('TaxBase'), TYPE) 
							FROM PRO_DUOI AS aoi WITH(NOLOCK)
							WHERE aoi.DUC_EANO = adi.DUC_EANO AND aoi.DUC_PNUM = adi.DUC_PNUM AND aoi.DUA_CODI = adi.DUA_CODI AND ISNULL(aoi.DUO_IMPO, '') <> '' AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
							GROUP BY aoi.DUC_EANO, aoi.DUC_PNUM, aoi.DUA_CODI, aoi.DUO_IMPO							
							FOR XML PATH('DutiesAndTaxes'), TYPE) 
						HAVING duc.DUC_ANXB <> 'H6'
						FOR XML PATH('CalculationOfTaxes'), TYPE), 
						(SELECT
							NULLIF(duc.PAI_MO22, '') AS "currency", 
							CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "amount" 
						HAVING duc.DUC_ANXB = 'H6'
						FOR XML PATH('PostalValue'), TYPE)
					FOR XML PATH('Commodity'), TYPE),
					(SELECT
						ROW_NUMBER() OVER(ORDER BY D31_CODI) AS "sequenceNumber", 
						(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE NULLIF(UME_CODI, '') END) AS "typeOfPackages", 
						(CASE D31_TTVL WHEN 1 THEN NULL ELSE CAST(D31_QNTD AS int) END) AS "numberOfPackages", 
						(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(D31_MARC, '')) END) AS "shippingMarks"
					FROM PRO_DU31 WITH(NOLOCK)
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI
					FOR XML PATH('Packaging'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY apr.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(apr.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type", 				
						umv.UME_CODI AS "typeOfPackages", 
						apr.volumes AS "numberOfPackages", 
						umq.UME_CODI AS "measurementUnitAndQualifier", 
						apr.quantidade AS "quantity", 
						apr.numeroAdicao AS "goodsItemIdentifier" 
					FROM tb_IMP_DeclaracoesAdicoesPrecedentes AS apr WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON apr.id_documento = doc.DOC_IDTY
						INNER JOIN TAB_UMED AS umv WITH(NOLOCK) ON apr.id_unidadeMedidaVolumes = umv.UME_IDTY
						LEFT OUTER JOIN TAB_UMED AS umq WITH(NOLOCK) ON apr.id_unidadeMedidaQualificador = umq.UME_IDTY
					WHERE apr.id_adicao = adi.DUA_IDEN
					FOR XML PATH('PreviousDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ape.id) AS "sequenceNumber", 
						ped.TXM_CODI AS "code", 				
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(numero, '')) AS "text" 				
					FROM tb_IMP_DeclaracoesAdicoesPedidos AS ape WITH(NOLOCK)
						INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ape.id_pedido = ped.TXM_IDTY 					
					WHERE ape.id_adicao = adi.DUA_IDEN
					FOR XML PATH('AdditionalInformation'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ado.DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ado.DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(ado.DOC_CODI, '') AS "type", 				
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(ado.DDO_EEMI, '') END) AS "issuingAuthorityName", 
						NULLIF(ado.UME_CODI, '') AS "measurementUnitAndQualifier", 
						ado.DDO_QTDE AS "quantity", 
						CONVERT(varchar(10), ado.DDO_DINI, 120) AS "dateOfValidity", 
						NULLIF(pai.PAI_PREF, '') AS "currency", 
						ado.DDO_NLIN AS "documentLineItemNumber", 
						CAST(NULLIF(ado.DDO_MONT, 0) AS decimal(18, 2)) AS "amount"
					FROM PRO_DDOC AS ado WITH(NOLOCK) 						
						LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON ado.PAI_CODI = pai.PAI_CODI
					WHERE ado.DUC_EANO = adi.DUC_EANO AND ado.DUC_PNUM = adi.DUC_PNUM AND ado.DUA_CODI = adi.DUA_CODI AND ado.DDO_TIPO = 0
					FOR XML PATH('SupportingDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(DOC_CODI, '') AS "type"				
					FROM PRO_DDOC WITH(NOLOCK) 						
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 2
					FOR XML PATH('AdditionalReference'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(DOC_CODI, '') AS "type"
					FROM PRO_DDOC WITH(NOLOCK) 						
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT 
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') THEN NULL ELSE adi.DUA_MAVA END) AS "valuationMethod",
						(SELECT
							ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
							NULLIF(codigo, '') AS "code", 
							montante AS "amount"
						FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes WITH(NOLOCK) 		
						WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
						FOR XML PATH('AdditionsAndDeductions'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2')
					FOR XML PATH('CustomsValuation'), TYPE), 
					(SELECT 
						NULLIF(adi.DUA_IAVA, '') AS "valuationIndicators"
					HAVING duc.DUC_ANXB IN ('H1', 'H4', 'H5') AND ISNULL(adi.DUA_IAVA, '') <> '' 
					FOR XML PATH('ValuationAdjustment'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "VATIdentificationNumber"
					FROM tb_IMP_DeclaracoesAdicoesReferenciasFiscais WITH(NOLOCK) 		
					WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
					FOR XML PATH('AdditionalFiscalReference'), TYPE)
				FROM PRO_DUAD AS adi WITH(NOLOCK) 		
				WHERE adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM
				FOR XML PATH('GoodsShipmentItem'), TYPE)
			FOR XML PATH('GoodsShipment'), TYPE), 
			(SELECT 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.nome, '')) AS "name", 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.morada, '')) AS "streetAndNumber", 
						NULLIF(pai.PAI_CODI, '') AS "country", 
						NULLIF(dpr.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.localidade, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				FROM tb_IMP_DeclaracoesProprietarios AS dpr WITH(NOLOCK) 
					INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dpr.id_pais = pai.PAI_IDTY
				WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('OwnerOfTheGoods'), TYPE), 
				(SELECT
					 NULLIF(duc.DUC_ATLO, '') AS "typeOfLocation", 
					 NULLIF(duc.DUC_AQUA, '') AS "qualifierOfIdentification", 
					 NULLIF(duc.LME_CODI, '') AS "UNLOCODE", 
					 (SELECT
						NULLIF(duc.PAI_CODI3, '') AS "country", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AMOR, '')) AS "streetAndNumber", 						
						NULLIF(duc.DUC_ACPO, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ALOC, '')) AS "city"
					HAVING ISNULL(duc.DUC_AMOR, '') <> ''
					FOR XML PATH('Address'), TYPE)
				HAVING ISNULL(duc.DUC_ATLO, '') <> ''
				FOR XML PATH('FirstPlaceOfUseOrProcessing'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dlt.id) AS "sequenceNumber", 
					NULLIF(dlt.tipo, '') AS "typeOfLocationCode", 
					NULLIF(dlt.qualificador, '') AS "qualifierOfIdentification", 
					NULLIF(lme.LME_CODI, '') AS "UNLOCODE", 
					(SELECT
						NULLIF(pai.PAI_CODI, '') AS "country", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.morada, '')) AS "streetAndNumber", 						
						NULLIF(dlt.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.localidade, '')) AS "city"
					HAVING ISNULL(dlt.morada, '') <> ''
					FOR XML PATH('Address'), TYPE)
				FROM tb_IMP_DeclaracoesLocaisTransformacao AS dlt WITH(NOLOCK) 
					LEFT OUTER JOIN TAB_LMER AS lme WITH(NOLOCK) ON dlt.id_localAutorizado = lme.LME_IDTY
					LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dlt.id_pais = pai.PAI_IDTY
				WHERE dlt.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('PlacesOfProcessingOrUse'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dea.id) AS "sequenceNumber", 
					NULLIF(ead.EAD_CODI, '') AS "referenceNumber"					
				FROM tb_IMP_DeclaracoesEstancias AS dea WITH(NOLOCK) 
					INNER JOIN TAB_EADU AS ead WITH(NOLOCK) ON dea.id_estancia = ead.EAD_IDTY
				WHERE dea.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('CustomsOfficeOfDischarge'), TYPE), 
				(SELECT 
					duc.DUC_APRZ AS "period", 
					duc.DUC_APPR AS "automaticExtensionIndicator", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ATXT, '')) AS "text"
				HAVING ISNULL(duc.DUC_APRZ, 0) <> 0
				FOR XML PATH('PeriodForDischarge'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpt.id) AS "sequenceNumber", 
					NULLIF(LEFT(dpt.codigoPautal, 8), '') AS "commodityCode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.designacao, '')) AS "descriptionOfGoods"					
				FROM tb_IMP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK) 					
				WHERE dpt.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('ProcessedProducts'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY dmi.id) AS "sequenceNumber", 
					NULLIF(mid.MIA_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dmi.descricao, '')) AS "text"					
				FROM tb_IMP_DeclaracoesMeiosIdentificacao AS dmi WITH(NOLOCK) 					
					INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dmi.id_meioIdentificacao = mid.MIA_IDTY
				WHERE dmi.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('IdentificationOfGoods'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(taxaRendimento, '') AS "RateOfYield"
				FROM tb_IMP_DeclaracoesTaxasRendimento WITH(NOLOCK) 					
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('RateOfYield'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					codigo AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(texto, '')) AS "text"
				FROM tb_IMP_DeclaracoesCondicoesEconomicas WITH(NOLOCK) 					
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('EconomicConditions'), TYPE), 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AAPR, '')) AS "DetailsOfPlannedActivities", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AIAD, '')) AS "AdditionalInformation", 
				(CASE duc.DUC_ANXB WHEN 'H4' THEN duc.DUC_ACMD ELSE NULL END) AS "CalculationOfTheAmountImportDuty"
			HAVING duc.DUC_ANXB IN ('H3', 'H4')
			FOR XML PATH('AttachedRequest'), TYPE)
		FROM PRO_DUCG AS duc WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON duc.DEC_CO14 = dcl.DEC_CODI				
		WHERE duc.DUC_IDTY = @IdDeclaracao
		FOR XML PATH('CC415A'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagemGeraXMLCC415A TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagemGeraXMLCC413A') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLCC413A
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLCC413A @IdDeclaracao int, @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para ficheiro XML da mensagem CC413A - Alteração da Declaração de Importação	
	SET @FicheiroXML = 				
		(SELECT
			(SELECT
				NULLIF(dcl.DEC_WSUS, '') AS "From", 
				'AT' AS "To", 
				CONVERT(varchar(19), @DataAtual, 120) AS "SendingDateAndTime",
				'IMP-CAU' AS "MessageID", 
				'CC413A' AS "MessageType", 
				NULLIF(duc.DUC_NRLO, '') AS "CorrelationID"
			FOR XML PATH('messageHeader'), TYPE),
			(SELECT
				NULLIF(duc.ALF_CODI, '') AS "importCustomsOffice", 
				(CASE duc.DUC_DCEN WHEN 1 THEN 'PT' ELSE NULL END) AS "languageCode", 	
				(CASE duc.DUC_ANXB WHEN 'H6' THEN 1 ELSE NULL END) AS "h6Indicator",			
				NULLIF(duc.DUC_NORD, '') AS "MRN", 
				(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(duc.TDE_1CAS, '') END) AS "declarationType", 
				(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(duc.TDE_2CAS, '') END) AS "additionalDeclarationType"
			FOR XML PATH('ImportOperation'), TYPE),
			(SELECT 
				1 AS "sequenceNumber", 
				NULLIF(duc.DOC_CODI, '') AS "type", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_NRAU, '')) AS "referenceNumber", 
				NULLIF(duc.DUC_EORI, '') AS "holderOfTheAuthorisation"
			HAVING ISNULL(duc.DOC_CODI, '') <> ''
			FOR XML PATH('Authorisation'), TYPE),
			(SELECT
				NULLIF(duc.ALF_CODI3, '') AS "referenceNumber"
			HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
			FOR XML PATH('CustomsOfficePresentation'), TYPE), 
			(SELECT 
				NULLIF(duc.ALF_CODI4, '') AS "referenceNumber"
			HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'I2')
			FOR XML PATH('SupervisingCustomsOffice'), TYPE), 
			(SELECT 
				(CASE WHEN duc.DUC_TPDS IN (0, 1, 6) THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DNOM, '')) END) AS "name", 
				NULLIF((ISNULL(duc.PAI_DLIV, '') + ISNULL(duc.DUC_DNIF, '')), '') AS "identificationNumber", 		
				(SELECT
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DMOR, '')) AS "streetAndNumber", 
					NULLIF(duc.PAI_DLIV, '') AS "country", 
					NULLIF(duc.DUC_DCPO, '') AS "postcode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DLOC, '')) AS "city"
				HAVING duc.DUC_TPDS NOT IN (0, 1, 6)
				FOR XML PATH('Address'), TYPE)
			HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1')
			FOR XML PATH('Importer'), TYPE), 
			(SELECT 		
				(CASE ISNULL(duc.DUC_TPDC, -1) WHEN 2 THEN NULLIF((ISNULL(duc.PAI_DLIV, '') + ISNULL(duc.DUC_DNIF, '')), '') ELSE NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(duc.DEC_NIF, '')), '') END) AS "identificationNumber", 
				(SELECT TOP 1 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DCR_NOME, '')) AS "name", 
					NULLIF(DCR_TELE, '') AS "phoneNumber", 
					NULLIF(DCR_EMAI, '') AS "eMailAddress"
				FROM TAB_DECR WITH(NOLOCK)
				WHERE DEC_CODI = duc.DEC_CO14 AND DCR_TIPO = 0 AND (ISNULL(EAD_CODI, '') = '' OR EAD_CODI = duc.ALF_CODI)
				FOR XML PATH('ContactPerson'), TYPE)
			FOR XML PATH('Declarant'), TYPE), 				
			(SELECT 				
				NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(duc.DEC_NIF, '')), '') AS "identificationNumber", 
				duc.DUC_TPDC AS "status"			
			HAVING ISNULL(duc.DUC_TPDC, -1) = 2 AND dcl.DEC_TIPO <> 1
			FOR XML PATH('Representative'), TYPE),
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY oim.DUO_CTIP) AS "sequenceNumber", 
				NULLIF(oim.DUO_CTIP, '') AS "guaranteeType", 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF) AS "sequenceNumber", 			
					(CASE ISNULL(soi.DUO_CORF, '') WHEN '' THEN NULLIF(soi.DUO_CAUC, '') ELSE NULL END) AS "GRN", 
					'EUR' AS "currencyCode", 
					CAST(SUM(ISNULL(soi.DUO_MONT, 0)) AS decimal(18, 2)) AS "amountToBeCovered",  
					(SELECT
						NULLIF(soi.ALF_CODI, '') AS "referenceNumber"
					HAVING ISNULL(soi.ALF_CODI, '') <> ''
					FOR XML PATH('CustomsOfficeOfGuarantee'), TYPE), 
					NULLIF(soi.DUO_CORF, '') AS "otherGuaranteeReference"
				FROM PRO_DUOI AS soi WITH(NOLOCK) 
					INNER JOIN TAB_RREC AS srr WITH(NOLOCK) ON soi.RRE_CODI = srr.RRE_CODI
				WHERE soi.DUC_EANO = duc.DUC_EANO AND soi.DUC_PNUM = duc.DUC_PNUM AND ISNULL(soi.DUO_CTIP, '') = ISNULL(oim.DUO_CTIP, '') AND srr.RRE_DPOT = 1
				GROUP BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF
				FOR XML PATH('GuaranteeReference'), TYPE)
			FROM PRO_DUOI AS oim WITH(NOLOCK) 
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON oim.RRE_CODI = rre.RRE_CODI
			WHERE oim.DUC_EANO = duc.DUC_EANO AND oim.DUC_PNUM = duc.DUC_PNUM AND ISNULL(oim.DUO_CTIP, '') <> '' AND rre.RRE_DPOT = 1 AND duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6')
			GROUP BY oim.DUO_CTIP
			FOR XML PATH('Guarantee'), TYPE),			
			(SELECT 
				1 AS "sequenceNumber", 
				NULLIF(duc.DUC_CAUC, '') AS "deferredPayment"				
			HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6') AND duc.DUC_CGLB = 1 AND ISNULL(duc.DUC_CAUC, '') <> ''
			FOR XML PATH('DeferredPayment'), TYPE), 
			(SELECT 
				(CASE 
					WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN NULLIF(duc.PAI_MOFT, '')
					WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN NULLIF(duc.PAI_MOSG, '')
					WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN NULLIF(duc.PAI_MOFT, '')
					ELSE 'EUR'
				END) AS "currency", 
				CAST((CASE 
						WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN ISNULL(duc.DUC_FRET, 0)
						WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN ISNULL(duc.DUC_SEGU, 0)
						WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN (ISNULL(duc.DUC_FRET, 0) + ISNULL(duc.DUC_SEGU, 0))
						ELSE (ROUND(ISNULL(duc.DUC_FRET, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(duc.DUC_SEGU, 0) / ISNULL(duc.DUC_TXSE, 0), 2))
					END) AS decimal(18, 2)) AS "amount"
			HAVING duc.DUC_ANXB = 'H6'
			FOR XML PATH('PostalCharges'), TYPE), 
			(SELECT		
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE NULLIF(duc.PAI_MO22, '') END) AS "invoiceCurrency", 
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE CAST(ISNULL(duc.DUC_MT22, 0) AS decimal(18, 2)) END) AS "totalAmountInvoiced", 
				(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(duc.NTR_CO24, '') END) AS "natureOfTransaction", 
				(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') OR duc.TDE_2CAS NOT IN ('U', 'V', 'X', 'Y', 'Z') THEN NULL ELSE CONVERT(varchar(10), duc.DUC_NDAT, 120) END) AS "acceptanceDate", 		
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "identificationNumber"
				FROM tb_IMP_DeclaracoesIntervenientes WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('AdditionalSupplyChainActor'), TYPE),
				(SELECT 			
					NULLIF((ISNULL(duc.PAI_CODI1, '') + ISNULL(duc.CLI_NIF, '')), '') AS "identificationNumber" 
				HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.CLI_NIF, '') <> ''
				FOR XML PATH('Buyer'), TYPE), 
				(SELECT 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_NOME, '')) AS "name", 			
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_MORA, '')) AS "streetAndNumber", 
						NULLIF(duc.PAI_CODI, '') AS "country", 
						NULLIF(duc.FOR_CPOS, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_LPOS, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.FOR_NOME, '') <> ''			
				FOR XML PATH('Seller'), TYPE), 
				(SELECT 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ENOM, '')) AS "name", 			
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_EMOR, '')) AS "streetAndNumber", 
						NULLIF(duc.PAI_ELIV, '') AS "country", 
						NULLIF(duc.DUC_ECPO, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ELPO, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_ENOM, '') <> ''
				FOR XML PATH('Exporter'), TYPE), 
				(SELECT
					NULLIF(duc.CEN_CO20, '') AS "incotermCode", 
					NULLIF(duc.PAE_CODI, '') AS "UNLOCODE", 
					NULLIF(duc.PAI_CODI2, '') AS "country", 					
					(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) END) AS "location",
					(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) ELSE NULL END) AS "text"
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C')
				FOR XML PATH('DeliveryTerms'), TYPE), 
				(SELECT 
					NULLIF(duc.PAI_PA15, '') AS countryOfDispatch
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(duc.PAI_PA15, '') <> ''
				FOR XML PATH('CountryOfDispatch'), TYPE),
				(SELECT
					NULLIF(duc.PAI_PA17, '') AS countryOfDestination, 
					(CASE WHEN duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.PAI_P17B END) AS "regionOfDestination"			
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
				FOR XML PATH('Destination'), TYPE), 
				(SELECT
					NULLIF(duc.TAR_CODI, '') AS "type", 
					NULLIF(duc.ARM_CODI, '') AS "identifier"
				HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.TAR_CODI, '') <> ''
				FOR XML PATH('Warehouse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(dpr.qualificador, '') ELSE NULL END) AS "ccQualifier"
				FROM tb_IMP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
				WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('PreviousDocument'), TYPE), 		
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY DPD_CODI) AS "sequenceNumber", 
					NULLIF(TXM_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DPD_DESC, '')) AS "text", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(DPD_QUAL, '') ELSE NULL END) AS "ccQualifier" 
				FROM PRO_DUPD WITH(NOLOCK) 					
				WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
				FOR XML PATH('AdditionalInformation'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier", 
					(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.entidadeEmissora, '')) END) AS "issuingAuthorityName", 			
					CONVERT(varchar(10), ddo.dataValidade, 120) AS "dateOfValidity"			
				FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 0 
				FOR XML PATH('SupportingDocument'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
					doc.DOC_CODI AS "type", 
					(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier" 
				FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 2
				FOR XML PATH('AdditionalReference'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(codigo, '') AS "code", 
					montante AS "amount"
				FROM tb_IMP_DeclaracoesAcrescimosDeducoes WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
				FOR XML PATH('AdditionsAndDeductions'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "VATIdentificationNumber"
				FROM tb_IMP_DeclaracoesReferenciasFiscais WITH(NOLOCK) 		
				WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
				FOR XML PATH('AdditionalFiscalReference'), TYPE), 
				(SELECT
					(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_REF7, '')) END) AS "referenceNumberUCR", 
					(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.DUC_CT19 END) AS "containerIndicator", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_FT21, 1), '') END) AS "modeOfTransportAtTheBorder", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_CODI, 1), '') END) AS "inlandModeOfTransport", 
					ISNULL(duc.DUC_MBRT, 0) AS "grossMass", 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY t.DUC_CONT) AS "sequenceNumber",
						NULLIF(t.DUC_CONT, '') AS "containerIdentificationNumber", 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY DUA_CODI) AS "sequenceNumber", 
							DUA_CODI AS "declarationGoodsItemNumber"
						FROM PRO_DCON WITH(NOLOCK)
						WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM AND DCO_CNUM = t.DUC_CONT
						FOR XML PATH('GoodsReference'), TYPE)
					FROM (
						SELECT duc.DUC_CONT
						UNION
						SELECT DCO_CNUM
						FROM PRO_DCON WITH(NOLOCK)
						WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
						GROUP BY DCO_CNUM
					) AS t
					WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C', 'E', 'F') AND ISNULL(t.DUC_CONT, '') <> '' 
					FOR XML PATH('TransportEquipment'), TYPE),
					(SELECT 
						NULLIF(duc.DUC_TLOC, '') AS "typeOfLocation", 
						NULLIF(duc.DUC_QUAL, '') AS "qualifierOfIdentification", 
						(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'U' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "UNLOCODE", 
						(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'Y' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "authorisationNumber", 
						NULLIF(duc.DUC_IADI, '') AS "additionalIdentifier", 
						(SELECT 
							NULLIF(duc.ALF_CODI1, '') AS "referenceNumber"
						HAVING ISNULL(duc.ALF_CODI1, '') <> ''
						FOR XML PATH('CustomsOffice'), TYPE),				 
						(SELECT 
							NULLIF(duc.DUC_ONIF, '') AS "identificationNumber"
						HAVING ISNULL(duc.DUC_ONIF, '') <> ''
						FOR XML PATH('EconomicOperator'), TYPE),
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LAMO, '')) AS "streetAndNumber", 
							NULLIF(duc.DUC_LACP, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LALO, '')) AS "city", 
							'PT' AS "country"					
						HAVING ISNULL(duc.DUC_LAMO, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'Z'				
						FOR XML PATH('Address'), TYPE), 
						(SELECT 
							NULLIF(duc.DUC_LACP, '') AS "postcode", 					
							'PT' AS "country"
						HAVING ISNULL(duc.DUC_LACP, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'T'
						FOR XML PATH('PostcodeAddress'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
					FOR XML PATH('LocationOfGoods'), TYPE), 
					(SELECT 
						duc.MTR_TIPO AS "typeOfIdentification", 
						NULLIF(duc.DUC_MT18, '') AS "identificationNumber" 
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND duc.MTR_TIPO IS NOT NULL
					FOR XML PATH('ArrivalTransportMeans'), TYPE), 
					(SELECT
						NULLIF(duc.PAI_PA21, '') AS "nationality"
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.PAI_PA21, '') <> ''
					FOR XML PATH('ActiveBorderTransportMeans'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type"
					FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 1
					FOR XML PATH('TransportDocument'), TYPE)
				FOR XML PATH('Consignment'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY adi.DUA_CODI) AS "sequenceNumber", 
					adi.DUA_CODI AS "declarationGoodsItemNumber", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.NTR_CODI, '') END) AS "natureOfTransaction", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE CAST(adi.DUA_VEST AS decimal(18, 2)) END) AS "statisticalValue", 
					(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_NRUR, '')) END) AS "referenceNumberUCR", 			
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY aen.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(aen.numeroReferencia, '')) AS "referenceNumber", 	
						NULLIF(aen.numeroEORI, '') AS "holderOfTheAuthorisation"			
					FROM tb_IMP_DeclaracoesAdicoesEntrepostos AS aen WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON aen.id_documento = doc.DOC_IDTY
					WHERE aen.id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4')
					FOR XML PATH('Authorisation'), TYPE), 
					(SELECT
						NULLIF(LEFT(adi.DUA_RG37, 2), '') AS "requestedProcedure",
						NULLIF(RIGHT(adi.DUA_RG37, 2), '') AS "previousProcedure",
						(SELECT
							ROW_NUMBER() OVER(ORDER BY t.coluna) AS "sequenceNumber",
							NULLIF(t.desdobramento, '') AS "additionalProcedure"									
						FROM tb_TBL_Desdobramentos AS ddb WITH(NOLOCK)
							UNPIVOT(desdobramento FOR coluna IN (ddb.desdobramento1, ddb.desdobramento2, ddb.desdobramento3, ddb.desdobramento4, ddb.desdobramento5)) AS t
						WHERE t.id = adi.id_desdobramento AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1')
						FOR XML PATH('AdditionalProcedure'), TYPE) 
					FOR XML PATH('Procedure'), TYPE), 			
					(SELECT 				
						NULLIF((ISNULL(adi.PAI_CODI4, '') + ISNULL(adi.CLI_NIF, '')), '') AS "identificationNumber"
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.CLI_NIF, '') <> ''
					FOR XML PATH('Buyer'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME1, '')) AS "name", 				
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA1, '')) AS "streetAndNumber", 
							NULLIF(adi.PAI_CODI3, '') AS "country", 
							NULLIF(adi.FOR_CPOS1, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS1, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.FOR_NOME1, '') <> ''
					FOR XML PATH('Seller'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME, '')) AS "name", 				 
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA, '')) AS "streetAndNumber", 
							NULLIF(adi.PAI_CODI, '') AS "country", 
							NULLIF(adi.FOR_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(adi.FOR_NOME, '') <> '' 
					FOR XML PATH('Exporter'), TYPE), 
					(SELECT
						(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(adi.PAI_CO34, '') END) AS "countryOfOrigin", 
						(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.PAI_CODI5, '') END) AS "countryOfPreferentialOrigin" 
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND (ISNULL(adi.PAI_CO34, '') <> '' OR ISNULL(adi.PAI_CODI5, '') <> '')
					FOR XML PATH('Origin'), TYPE), 
					(SELECT 
						NULLIF(adi.PAI_CODI1, '') AS countryOfDispatch
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(adi.PAI_CODI1, '') <> ''
					FOR XML PATH('CountryOfDispatch'), TYPE),
					(SELECT
						NULLIF(adi.PAI_CODI2, '') AS countryOfDestination, 
						adi.RES_CODI AS "regionOfDestination"				
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
					FOR XML PATH('Destination'), TYPE), 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_DESG, '')) AS "descriptionOfGoods", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.APA_CCUS, '') END) AS "CUSCode", 
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_CO39, '') END) AS "quotaOrderNumber", 
						(CASE WHEN duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.DUA_TMER, '') END) AS "typeOfGoods", 
						(SELECT 
							NULLIF(LEFT(adi.APA_CP33, 6), '') AS "harmonizedSystemSubheadingCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 7, 2), '') AS "combinedNomenclatureCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 9, 2), '') AS "taricCode", 
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
								NULLIF(t.DUA_TARIC, '') AS "taricAdditionalCode"
							FROM (
								SELECT 1 AS DUA_ORDEM, SUBSTRING(adi.APA_CP33, 11, 4) AS DUA_TARIC
								UNION
								SELECT 2, SUBSTRING(adi.APA_CP33, 15, 4)
								UNION
								SELECT 3, SUBSTRING(adi.APA_CP33, 19, 4) 								
							) AS t
							WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
							FOR XML PATH('TaricAdditionalCode'), TYPE),
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
								NULLIF(t.DUA_TARIC, '') AS "nationalAdditionalCode"						
							FROM (
								SELECT 1 AS DUA_ORDEM, adi.DUA_1TAR AS DUA_TARIC
								UNION
								SELECT 2, adi.DUA_2TAR
								UNION
								SELECT 3, adi.DUA_3TAR 
								UNION
								SELECT 4, adi.DUA_4TAR 
								UNION
								SELECT 5, adi.DUA_5TAR 								
							) AS t
							WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
							FOR XML PATH('NationalAdditionalCode'), TYPE)
						HAVING ISNULL(LEFT(adi.DUA_RG37, 2), '') <> '71'
						FOR XML PATH('CommodityCode'), TYPE), 
						(SELECT
							(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'I2') THEN NULL ELSE adi.DUA_ML38 END) AS "netMass", 
							(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_US41, 0) END) AS "supplementaryUnits", 
							(CASE WHEN duc.DUC_ANXB = 'H6' THEN NULL ELSE adi.DUA_MB35 END) AS "grossMass"
						FOR XML PATH('GoodsMeasure'), TYPE), 
						(SELECT 
							CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "itemAmountInvoiced"
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2') 
						FOR XML PATH('InvoiceLine'), TYPE), 
						(SELECT
							CAST(ISNULL((SELECT SUM(ISNULL(DUO_MONT, 0)) FROM PRO_DUOI WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI), 0) AS decimal(18, 2)) AS "totalDutiesAndTaxesAmount", 
							(CASE WHEN duc.DUC_ANXB = 'H5' OR (ISNULL(adi.PRE_CO36, '') = '000' AND ISNULL(LEFT(adi.DUA_RG37, 2), '') = '71') THEN NULL ELSE NULLIF(adi.PRE_CO36, '') END) AS "preference", 
							(SELECT
								ROW_NUMBER() OVER(ORDER BY aoi.DUO_IMPO) AS "sequenceNumber", 
								NULLIF(aoi.DUO_IMPO, '') AS "taxType", 												
								CAST(SUM(ISNULL(aoi.DUO_MONT, 0)) AS decimal(18, 2)) AS "payableTaxAmount", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY DUO_CODI) AS "sequenceNumber", 
									CAST((CASE DUO_TIPO WHEN 1 THEN (ISNULL(DUO_TXVL, 0) / 100) ELSE ISNULL(DUO_TXVL, 0) END) AS decimal(18, 3)) AS "taxRate", 
									NULLIF(UME_CODI, '') AS "measurementUnitAndQualifier", 
									(CASE DUO_QTDE WHEN 0 THEN NULL ELSE DUO_QTDE END) AS "quantity", 
									CAST((CASE DUO_QTDE WHEN 0 THEN ISNULL(DUO_BTRI, 0) ELSE NULL END) AS decimal(18, 2)) AS "amount", 
									CAST(ISNULL(DUO_MONT, 0) AS decimal(18, 2)) AS "taxAmount"
								FROM PRO_DUOI WITH(NOLOCK)
								WHERE DUC_EANO = aoi.DUC_EANO AND DUC_PNUM = aoi.DUC_PNUM AND DUA_CODI = aoi.DUA_CODI AND DUO_IMPO = aoi.DUO_IMPO
								FOR XML PATH('TaxBase'), TYPE) 
							FROM PRO_DUOI AS aoi WITH(NOLOCK)
							WHERE aoi.DUC_EANO = adi.DUC_EANO AND aoi.DUC_PNUM = adi.DUC_PNUM AND aoi.DUA_CODI = adi.DUA_CODI AND ISNULL(aoi.DUO_IMPO, '') <> '' AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
							GROUP BY aoi.DUC_EANO, aoi.DUC_PNUM, aoi.DUA_CODI, aoi.DUO_IMPO
							FOR XML PATH('DutiesAndTaxes'), TYPE) 
						HAVING duc.DUC_ANXB <> 'H6'
						FOR XML PATH('CalculationOfTaxes'), TYPE), 
						(SELECT
							NULLIF(duc.PAI_MO22, '') AS "currency", 
							CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "amount" 
						HAVING duc.DUC_ANXB = 'H6'
						FOR XML PATH('PostalValue'), TYPE)
					FOR XML PATH('Commodity'), TYPE),
					(SELECT
						ROW_NUMBER() OVER(ORDER BY D31_CODI) AS "sequenceNumber", 
						(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE NULLIF(UME_CODI, '') END) AS "typeOfPackages", 
						(CASE D31_TTVL WHEN 1 THEN NULL ELSE CAST(D31_QNTD AS int) END) AS "numberOfPackages", 
						(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(D31_MARC, '')) END) AS "shippingMarks"
					FROM PRO_DU31 WITH(NOLOCK)
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI
					FOR XML PATH('Packaging'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY apr.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(apr.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type", 				
						umv.UME_CODI AS "typeOfPackages", 
						apr.volumes AS "numberOfPackages", 
						umq.UME_CODI AS "measurementUnitAndQualifier", 
						apr.quantidade AS "quantity", 
						apr.numeroAdicao AS "goodsItemIdentifier" 
					FROM tb_IMP_DeclaracoesAdicoesPrecedentes AS apr WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON apr.id_documento = doc.DOC_IDTY
						INNER JOIN TAB_UMED AS umv WITH(NOLOCK) ON apr.id_unidadeMedidaVolumes = umv.UME_IDTY
						LEFT OUTER JOIN TAB_UMED AS umq WITH(NOLOCK) ON apr.id_unidadeMedidaQualificador = umq.UME_IDTY
					WHERE apr.id_adicao = adi.DUA_IDEN 
					FOR XML PATH('PreviousDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ape.id) AS "sequenceNumber", 
						ped.TXM_CODI AS "code", 				
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(numero, '')) AS "text" 				
					FROM tb_IMP_DeclaracoesAdicoesPedidos AS ape WITH(NOLOCK)
						INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ape.id_pedido = ped.TXM_IDTY 					
					WHERE ape.id_adicao = adi.DUA_IDEN
					FOR XML PATH('AdditionalInformation'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ado.DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ado.DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(ado.DOC_CODI, '') AS "type", 				
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(ado.DDO_EEMI, '') END) AS "issuingAuthorityName", 
						NULLIF(ado.UME_CODI, '') AS "measurementUnitAndQualifier", 
						ado.DDO_QTDE AS "quantity", 
						CONVERT(varchar(10), ado.DDO_DINI, 120) AS "dateOfValidity", 
						NULLIF(pai.PAI_PREF, '') AS "currency", 
						ado.DDO_NLIN AS "documentLineItemNumber", 
						CAST(NULLIF(ado.DDO_MONT, 0) AS decimal(18, 2)) AS "amount"
					FROM PRO_DDOC AS ado WITH(NOLOCK) 						
						LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON ado.PAI_CODI = pai.PAI_CODI
					WHERE ado.DUC_EANO = adi.DUC_EANO AND ado.DUC_PNUM = adi.DUC_PNUM AND ado.DUA_CODI = adi.DUA_CODI AND ado.DDO_TIPO = 0
					FOR XML PATH('SupportingDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(DOC_CODI, '') AS "type"				
					FROM PRO_DDOC WITH(NOLOCK) 						
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 2
					FOR XML PATH('AdditionalReference'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
						NULLIF(DOC_CODI, '') AS "type"
					FROM PRO_DDOC WITH(NOLOCK) 						
					WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT 
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') THEN NULL ELSE adi.DUA_MAVA END) AS "valuationMethod",
						(SELECT
							ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
							NULLIF(codigo, '') AS "code", 
							montante AS "amount"
						FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes WITH(NOLOCK) 		
						WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
						FOR XML PATH('AdditionsAndDeductions'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2')
					FOR XML PATH('CustomsValuation'), TYPE), 
					(SELECT 
						NULLIF(adi.DUA_IAVA, '') AS "valuationIndicators"
					HAVING duc.DUC_ANXB IN ('H1', 'H4', 'H5') AND ISNULL(adi.DUA_IAVA, '') <> '' 
					FOR XML PATH('ValuationAdjustment'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "VATIdentificationNumber"
					FROM tb_IMP_DeclaracoesAdicoesReferenciasFiscais WITH(NOLOCK) 		
					WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
					FOR XML PATH('AdditionalFiscalReference'), TYPE)
				FROM PRO_DUAD AS adi WITH(NOLOCK) 		
				WHERE adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM
				FOR XML PATH('GoodsShipmentItem'), TYPE)
			FOR XML PATH('GoodsShipment'), TYPE), 
			(SELECT 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.nome, '')) AS "name", 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.morada, '')) AS "streetAndNumber", 
						NULLIF(pai.PAI_CODI, '') AS "country", 
						NULLIF(dpr.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.localidade, '')) AS "city"
					FOR XML PATH('Address'), TYPE)
				FROM tb_IMP_DeclaracoesProprietarios AS dpr WITH(NOLOCK) 
					INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dpr.id_pais = pai.PAI_IDTY
				WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('OwnerOfTheGoods'), TYPE), 
				(SELECT
					 NULLIF(duc.DUC_ATLO, '') AS "typeOfLocation", 
					 NULLIF(duc.DUC_AQUA, '') AS "qualifierOfIdentification", 
					 NULLIF(duc.LME_CODI, '') AS "UNLOCODE", 
					 (SELECT
						NULLIF(duc.PAI_CODI3, '') AS "country", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AMOR, '')) AS "streetAndNumber", 						
						NULLIF(duc.DUC_ACPO, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ALOC, '')) AS "city"
					HAVING ISNULL(duc.DUC_AMOR, '') <> ''
					FOR XML PATH('Address'), TYPE)
				HAVING ISNULL(duc.DUC_ATLO, '') <> ''
				FOR XML PATH('FirstPlaceOfUseOrProcessing'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dlt.id) AS "sequenceNumber", 
					NULLIF(dlt.tipo, '') AS "typeOfLocationCode", 
					NULLIF(dlt.qualificador, '') AS "qualifierOfIdentification", 
					NULLIF(lme.LME_CODI, '') AS "UNLOCODE", 
					(SELECT
						NULLIF(pai.PAI_CODI, '') AS "country", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.morada, '')) AS "streetAndNumber", 						
						NULLIF(dlt.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.localidade, '')) AS "city"
					HAVING ISNULL(dlt.morada, '') <> ''
					FOR XML PATH('Address'), TYPE)
				FROM tb_IMP_DeclaracoesLocaisTransformacao AS dlt WITH(NOLOCK) 
					LEFT OUTER JOIN TAB_LMER AS lme WITH(NOLOCK) ON dlt.id_localAutorizado = lme.LME_IDTY
					LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dlt.id_pais = pai.PAI_IDTY
				WHERE dlt.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('PlacesOfProcessingOrUse'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dea.id) AS "sequenceNumber", 
					NULLIF(ead.EAD_CODI, '') AS "referenceNumber"					
				FROM tb_IMP_DeclaracoesEstancias AS dea WITH(NOLOCK) 
					INNER JOIN TAB_EADU AS ead WITH(NOLOCK) ON dea.id_estancia = ead.EAD_IDTY
				WHERE dea.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('CustomsOfficeOfDischarge'), TYPE), 
				(SELECT 
					duc.DUC_APRZ AS "period", 
					duc.DUC_APPR AS "automaticExtensionIndicator", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ATXT, '')) AS "text"
				HAVING ISNULL(duc.DUC_APRZ, 0) <> 0
				FOR XML PATH('PeriodForDischarge'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpt.id) AS "sequenceNumber", 
					NULLIF(LEFT(dpt.codigoPautal, 8), '') AS "commodityCode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.designacao, '')) AS "descriptionOfGoods"					
				FROM tb_IMP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK) 					
				WHERE dpt.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('ProcessedProducts'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY dmi.id) AS "sequenceNumber", 
					NULLIF(mid.MIA_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dmi.descricao, '')) AS "text"					
				FROM tb_IMP_DeclaracoesMeiosIdentificacao AS dmi WITH(NOLOCK) 					
					INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dmi.id_meioIdentificacao = mid.MIA_IDTY
				WHERE dmi.id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('IdentificationOfGoods'), TYPE), 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(taxaRendimento, '') AS "RateOfYield"
				FROM tb_IMP_DeclaracoesTaxasRendimento WITH(NOLOCK) 					
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('RateOfYield'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					codigo AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(texto, '')) AS "text"
				FROM tb_IMP_DeclaracoesCondicoesEconomicas WITH(NOLOCK) 					
				WHERE id_declaracaoIMP = duc.DUC_IDTY
				FOR XML PATH('EconomicConditions'), TYPE), 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AAPR, '')) AS "DetailsOfPlannedActivities", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AIAD, '')) AS "AdditionalInformation", 
				(CASE duc.DUC_ANXB WHEN 'H4' THEN duc.DUC_ACMD ELSE NULL END) AS "CalculationOfTheAmountImportDuty"
			HAVING duc.DUC_ANXB IN ('H3', 'H4')
			FOR XML PATH('AttachedRequest'), TYPE)		
		FROM PRO_DUCG AS duc WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON duc.DEC_CO14 = dcl.DEC_CODI	
		WHERE duc.DUC_IDTY = @IdDeclaracao
		FOR XML PATH('CC413A'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagemGeraXMLCC413A TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagemGeraXMLPT498A') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLPT498A
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagemGeraXMLPT498A @IdDeclaracao int, @Indicador varchar(1), @Justificacao varchar(2000), @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para ficheiro XML da mensagem PT498A - Resposta à AT da Declaração de Importação	
	SET @FicheiroXML = 				
		(SELECT
			(SELECT
				NULLIF(dcl.DEC_WSUS, '') AS "From", 
				'AT' AS "To", 
				CONVERT(varchar(19), @DataAtual, 120) AS "SendingDateAndTime",
				'IMP-CAU' AS "MessageID", 
				'PT498A' AS "MessageType", 
				NULLIF(duc.DUC_NRLO, '') AS "CorrelationID"
			FOR XML PATH('messageHeader'), TYPE),
			(SELECT
				NULLIF(duc.ALF_CODI, '') AS "importCustomsOffice", 				
				NULLIF(duc.DUC_NRLO, '') AS "LRN",
				NULLIF(duc.DUC_NORD, '') AS "MRN",
				(CASE duc.DUC_DCEN WHEN 1 THEN 'PT' ELSE NULL END) AS "languageCode", 
				(CASE duc.DUC_ANXB WHEN 'H6' THEN 1 ELSE NULL END) AS "h6Indicator"
			FOR XML PATH('ImportOperation'), TYPE),	
			(SELECT 
				NULLIF(duc.ALF_CODI4, '') AS "referenceNumber"
			HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'I2')
			FOR XML PATH('SupervisingCustomsOffice'), TYPE), 
			(SELECT 		
				NULLIF((ISNULL(dcl.PAI_CODI, '') + NULLIF(duc.DEC_NIF, '')), '') AS "identificationNumber"
			FOR XML PATH('Declarant'), TYPE), 				
			(SELECT 				
				NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(duc.DEC_NIF, '')), '') AS "identificationNumber",
				duc.DUC_TPDC AS "status"			
			HAVING ISNULL(duc.DUC_TPDC, -1) = 2 AND dcl.DEC_TIPO <> 1
			FOR XML PATH('Representative'), TYPE), 	
			(SELECT 		
				('2' + NULLIF(RIGHT(duc.DUC_CJUS, 3), '')) AS "functionCode"
			FOR XML PATH('Function'), TYPE), 		
			(SELECT 		
				@Indicador AS "indicator",
				NULLIF(@Justificacao, '') AS "justification", 
				CONVERT(varchar(10), @DataAtual, 120) AS "responseDate"
			FOR XML PATH('Response'), TYPE),												
			(SELECT 
				NULLIF(duc.TDE_1CAS, '') AS "declarationType", 
				NULLIF(duc.TDE_2CAS, '') AS "additionalDeclarationType", 	
				(SELECT 
					1 AS "sequenceNumber", 
					NULLIF(duc.DOC_CODI, '') AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_NRAU, '')) AS "referenceNumber", 
					NULLIF(duc.DUC_EORI, '') AS "holderOfTheAuthorisation"
				HAVING ISNULL(duc.DOC_CODI, '') <> ''
				FOR XML PATH('Authorisation'), TYPE), 
				(SELECT
					NULLIF(duc.ALF_CODI3, '') AS "referenceNumber"
				HAVING duc.DUC_DCEN = 1 AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
				FOR XML PATH('CustomsOfficePresentation'), TYPE), 
				(SELECT 
					(CASE WHEN duc.DUC_TPDS IN (0, 1, 6) THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DNOM, '')) END) AS "name", 
					NULLIF((ISNULL(duc.PAI_DLIV, '') + ISNULL(duc.DUC_DNIF, '')), '') AS "identificationNumber", 		
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DMOR, '')) AS "streetAndNumber", 
						NULLIF(duc.PAI_DLIV, '') AS "country", 
						NULLIF(duc.DUC_DCPO, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DLOC, '')) AS "city"
					HAVING duc.DUC_TPDS NOT IN (0, 1, 6)
					FOR XML PATH('Address'), TYPE)				
				FOR XML PATH('Importer'), TYPE), 
				(SELECT 							
					(SELECT TOP 1 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DCR_NOME, '')) AS "name", 
						NULLIF(DCR_TELE, '') AS "phoneNumber", 
						NULLIF(DCR_EMAI, '') AS "eMailAddress"
					FROM TAB_DECR WITH(NOLOCK)
					WHERE DEC_CODI = duc.DEC_CO14 AND DCR_TIPO = 0 AND (ISNULL(EAD_CODI, '') = '' OR EAD_CODI = duc.ALF_CODI)
					FOR XML PATH('ContactPerson'), TYPE)
				FOR XML PATH('Declarant'), TYPE), 					
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY oim.DUO_CTIP) AS "sequenceNumber", 
					NULLIF(oim.DUO_CTIP, '') AS "guaranteeType", 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF) AS "sequenceNumber", 			
						(CASE ISNULL(soi.DUO_CORF, '') WHEN '' THEN NULLIF(soi.DUO_CAUC, '') ELSE NULL END) AS "GRN", 
						'EUR' AS "currencyCode", 
						SUM(ISNULL(soi.DUO_MONT, 0)) AS "amountToBeCovered", 
						(SELECT
							NULLIF(soi.ALF_CODI, '') AS "referenceNumber"
						HAVING ISNULL(soi.ALF_CODI, '') <> ''
						FOR XML PATH('CustomsOfficeOfGuarantee'), TYPE), 
						NULLIF(soi.DUO_CORF, '') AS "otherGuaranteeReference"
					FROM PRO_DUOI AS soi WITH(NOLOCK) 
						INNER JOIN TAB_RREC AS srr WITH(NOLOCK) ON soi.RRE_CODI = srr.RRE_CODI
					WHERE soi.DUC_EANO = duc.DUC_EANO AND soi.DUC_PNUM = duc.DUC_PNUM AND ISNULL(soi.DUO_CTIP, '') = ISNULL(oim.DUO_CTIP, '') AND srr.RRE_DPOT = 1
					GROUP BY soi.DUO_CAUC, soi.ALF_CODI, soi.DUO_CORF
					FOR XML PATH('GuaranteeReference'), TYPE)
				FROM PRO_DUOI AS oim WITH(NOLOCK) 
					INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON oim.RRE_CODI = rre.RRE_CODI
				WHERE oim.DUC_EANO = duc.DUC_EANO AND oim.DUC_PNUM = duc.DUC_PNUM AND ISNULL(oim.DUO_CTIP, '') <> '' AND rre.RRE_DPOT = 1 AND duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6')
				GROUP BY oim.DUO_CTIP
				FOR XML PATH('Guarantee'), TYPE), 
				(SELECT 
					1 AS "sequenceNumber", 
					NULLIF(duc.DUC_CAUC, '') AS "deferredPayment"				
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H6') AND duc.DUC_CGLB = 1 AND ISNULL(duc.DUC_CAUC, '') <> ''
				FOR XML PATH('DeferredPayment'), TYPE), 
				(SELECT 
					(CASE 
						WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN NULLIF(duc.PAI_MOFT, '')
						WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN NULLIF(duc.PAI_MOSG, '')
						WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN NULLIF(duc.PAI_MOFT, '')
						ELSE 'EUR'
					END) AS "currency", 
					(CASE 
						WHEN (ISNULL(duc.DUC_FRET, 0) > 0) AND (ISNULL(duc.DUC_SEGU, 0) = 0) THEN ISNULL(duc.DUC_FRET, 0)
						WHEN (ISNULL(duc.DUC_FRET, 0) = 0) AND (ISNULL(duc.DUC_SEGU, 0) > 0) THEN ISNULL(duc.DUC_SEGU, 0)
						WHEN (ISNULL(duc.PAI_FRET, '') = ISNULL(duc.PAI_SEGU, '')) THEN (ISNULL(duc.DUC_FRET, 0) + ISNULL(duc.DUC_SEGU, 0))
						ELSE (ROUND(ISNULL(duc.DUC_FRET, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(duc.DUC_SEGU, 0) / ISNULL(duc.DUC_TXSE, 0), 2))
					END) AS "amount"
				HAVING duc.DUC_ANXB = 'H6'
				FOR XML PATH('PostalCharges'), TYPE), 
				(SELECT		
					(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE NULLIF(duc.PAI_MO22, '') END) AS "invoiceCurrency", 
					(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6') THEN NULL ELSE ISNULL(duc.DUC_MT22, 0) END) AS "totalAmountInvoiced", 
					(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(duc.NTR_CO24, '') END) AS "natureOfTransaction", 
					(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') OR duc.TDE_2CAS NOT IN ('U', 'V', 'X', 'Y', 'Z') THEN NULL ELSE CONVERT(varchar(10), duc.DUC_NDAT, 120) END) AS "acceptanceDate", 		
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "identificationNumber"
					FROM tb_IMP_DeclaracoesIntervenientes WITH(NOLOCK) 		
					WHERE id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('AdditionalSupplyChainActor'), TYPE),
					(SELECT 			
						NULLIF((ISNULL(duc.PAI_CODI1, '') + ISNULL(duc.CLI_NIF, '')), '') AS "identificationNumber" 
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.CLI_NIF, '') <> ''
					FOR XML PATH('Buyer'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_NOME, '')) AS "name", 			
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_MORA, '')) AS "streetAndNumber", 
							NULLIF(duc.PAI_CODI, '') AS "country", 
							NULLIF(duc.FOR_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.FOR_LPOS, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB = 'H1' AND ISNULL(duc.FOR_NOME, '') <> ''			
					FOR XML PATH('Seller'), TYPE), 
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ENOM, '')) AS "name", 			
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_EMOR, '')) AS "streetAndNumber", 
							NULLIF(duc.PAI_ELIV, '') AS "country", 
							NULLIF(duc.DUC_ECPO, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ELPO, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_ENOM, '') <> ''
					FOR XML PATH('Exporter'), TYPE), 
					(SELECT
						NULLIF(duc.CEN_CO20, '') AS "incotermCode", 
						NULLIF(duc.PAE_CODI, '') AS "UNLOCODE", 
						NULLIF(duc.PAI_CODI2, '') AS "country", 					
						(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) END) AS "location",
						(CASE ISNULL(duc.CEN_CO20, '') WHEN 'XXX' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_DE20, '')) ELSE NULL END) AS "text"
					HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C')
					FOR XML PATH('DeliveryTerms'), TYPE), 
					(SELECT 
						NULLIF(duc.PAI_PA15, '') AS countryOfDispatch
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(duc.PAI_PA15, '') <> ''
					FOR XML PATH('CountryOfDispatch'), TYPE),
					(SELECT
						NULLIF(duc.PAI_PA17, '') AS countryOfDestination, 
						(CASE WHEN duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.PAI_P17B END) AS "regionOfDestination"			
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
					FOR XML PATH('Destination'), TYPE), 
					(SELECT
						NULLIF(duc.TAR_CODI, '') AS "type", 
						NULLIF(duc.ARM_CODI, '') AS "identifier"
					HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.TAR_CODI, '') <> ''
					FOR XML PATH('Warehouse'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type", 
						(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(dpr.qualificador, '') ELSE NULL END) AS "ccQualifier"
					FROM tb_IMP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
					WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('PreviousDocument'), TYPE), 		
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY DPD_CODI) AS "sequenceNumber", 
						NULLIF(TXM_CODI, '') AS "code", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DPD_DESC, '')) AS "text", 
						(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(DPD_QUAL, '') ELSE NULL END) AS "ccQualifier" 
					FROM PRO_DUPD WITH(NOLOCK) 					
					WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
					FOR XML PATH('AdditionalInformation'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type", 
						(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier", 
						(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.entidadeEmissora, '')) END) AS "issuingAuthorityName", 			
						CONVERT(varchar(10), ddo.dataValidade, 120) AS "dateOfValidity"			
					FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 0 
					FOR XML PATH('SupportingDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
						doc.DOC_CODI AS "type", 
						(CASE duc.DUC_DCEN WHEN 1 THEN NULLIF(ddo.qualificador, '') ELSE NULL END) AS "ccQualifier" 
					FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 2
					FOR XML PATH('AdditionalReference'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(codigo, '') AS "code", 
						montante AS "amount"
					FROM tb_IMP_DeclaracoesAcrescimosDeducoes WITH(NOLOCK) 		
					WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
					FOR XML PATH('AdditionsAndDeductions'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "VATIdentificationNumber"
					FROM tb_IMP_DeclaracoesReferenciasFiscais WITH(NOLOCK) 		
					WHERE id_declaracaoIMP = duc.DUC_IDTY AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
					FOR XML PATH('AdditionalFiscalReference'), TYPE), 
					(SELECT
						(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_REF7, '')) END) AS "referenceNumberUCR", 
						(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE duc.DUC_CT19 END) AS "containerIndicator", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_FT21, 1), '') END) AS "modeOfTransportAtTheBorder", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') OR duc.TDE_2CAS IN ('B', 'C', 'E', 'F') THEN NULL ELSE NULLIF(LEFT(duc.MTR_CODI, 1), '') END) AS "inlandModeOfTransport", 
						ISNULL(duc.DUC_MBRT, 0) AS "grossMass", 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY t.DUC_CONT) AS "sequenceNumber",
							NULLIF(t.DUC_CONT, '') AS "containerIdentificationNumber", 
							(SELECT 
								ROW_NUMBER() OVER(ORDER BY DUA_CODI) AS "sequenceNumber", 
								DUA_CODI AS "declarationGoodsItemNumber"
							FROM PRO_DCON WITH(NOLOCK)
							WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM AND DCO_CNUM = t.DUC_CONT
							FOR XML PATH('GoodsReference'), TYPE)
						FROM (
							SELECT duc.DUC_CONT
							UNION
							SELECT DCO_CNUM
							FROM PRO_DCON WITH(NOLOCK)
							WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
							GROUP BY DCO_CNUM
						) AS t
						WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') AND duc.TDE_2CAS NOT IN ('B', 'C', 'E', 'F') AND ISNULL(t.DUC_CONT, '') <> '' 
						FOR XML PATH('TransportEquipment'), TYPE),
						(SELECT 
							NULLIF(duc.DUC_TLOC, '') AS "typeOfLocation", 
							NULLIF(duc.DUC_QUAL, '') AS "qualifierOfIdentification", 
							(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'U' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "UNLOCODE", 
							(CASE ISNULL(duc.DUC_QUAL, '') WHEN 'Y' THEN NULLIF(duc.LME_CO30, '') ELSE NULL END) AS "authorisationNumber", 
							NULLIF(duc.DUC_IADI, '') AS "additionalIdentifier", 
							(SELECT 
								NULLIF(duc.ALF_CODI1, '') AS "referenceNumber"
							HAVING ISNULL(duc.ALF_CODI1, '') <> ''
							FOR XML PATH('CustomsOffice'), TYPE),				 
							(SELECT 
								NULLIF(duc.DUC_ONIF, '') AS "identificationNumber"
							HAVING ISNULL(duc.DUC_ONIF, '') <> ''
							FOR XML PATH('EconomicOperator'), TYPE),
							(SELECT
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LAMO, '')) AS "streetAndNumber", 
								NULLIF(duc.DUC_LACP, '') AS "postcode", 
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_LALO, '')) AS "city", 
								'PT' AS "country"					
							HAVING ISNULL(duc.DUC_LAMO, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'Z'				
							FOR XML PATH('Address'), TYPE), 
							(SELECT 
								NULLIF(duc.DUC_LACP, '') AS "postcode", 					
								'PT' AS "country"
							HAVING ISNULL(duc.DUC_LACP, '') <> '' AND ISNULL(duc.DUC_QUAL, '') = 'T'
							FOR XML PATH('PostcodeAddress'), TYPE)
						HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2')
						FOR XML PATH('LocationOfGoods'), TYPE), 
						(SELECT 
							duc.MTR_TIPO AS "typeOfIdentification", 
							NULLIF(duc.DUC_MT18, '') AS "identificationNumber" 
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND duc.MTR_TIPO IS NOT NULL
						FOR XML PATH('ArrivalTransportMeans'), TYPE), 
						(SELECT
							NULLIF(duc.PAI_PA21, '') AS "nationality"
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5') AND duc.TDE_2CAS NOT IN ('B', 'C') AND ISNULL(duc.PAI_PA21, '') <> ''
						FOR XML PATH('ActiveBorderTransportMeans'), TYPE),
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 
							doc.DOC_CODI AS "type"
						FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
							INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
						WHERE ddo.id_declaracaoIMP = duc.DUC_IDTY AND ddo.tipo = 1
						FOR XML PATH('TransportDocument'), TYPE)
					FOR XML PATH('Consignment'), TYPE), 
					(SELECT
						ROW_NUMBER() OVER(ORDER BY adi.DUA_CODI) AS "sequenceNumber", 
						adi.DUA_CODI AS "declarationGoodsItemNumber", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.NTR_CODI, '') END) AS "natureOfTransaction", 
						(CASE WHEN duc.DUC_ANXB IN ('H6', 'I1', 'I2') THEN NULL ELSE CAST(adi.DUA_VEST AS decimal(18, 2)) END) AS "statisticalValue", 
						(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_NRUR, '')) END) AS "referenceNumberUCR", 			
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY aen.id) AS "sequenceNumber", 
							doc.DOC_CODI AS "type", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(aen.numeroReferencia, '')) AS "referenceNumber", 	
							NULLIF(aen.numeroEORI, '') AS "holderOfTheAuthorisation"			
						FROM tb_IMP_DeclaracoesAdicoesEntrepostos AS aen WITH(NOLOCK) 		
							INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON aen.id_documento = doc.DOC_IDTY
						WHERE aen.id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4')
						FOR XML PATH('Authorisation'), TYPE), 
						(SELECT
							NULLIF(LEFT(adi.DUA_RG37, 2), '') AS "requestedProcedure",
							NULLIF(RIGHT(adi.DUA_RG37, 2), '') AS "previousProcedure",
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.coluna) AS "sequenceNumber",
								NULLIF(t.desdobramento, '') AS "additionalProcedure"									
							FROM tb_TBL_Desdobramentos AS ddb WITH(NOLOCK)
								UNPIVOT(desdobramento FOR coluna IN (ddb.desdobramento1, ddb.desdobramento2, ddb.desdobramento3, ddb.desdobramento4, ddb.desdobramento5)) AS t
							WHERE t.id = adi.id_desdobramento AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1')
							FOR XML PATH('AdditionalProcedure'), TYPE) 
						FOR XML PATH('Procedure'), TYPE), 			
						(SELECT 				
							NULLIF((ISNULL(adi.PAI_CODI4, '') + ISNULL(adi.CLI_NIF, '')), '') AS "identificationNumber"
						HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.CLI_NIF, '') <> ''
						FOR XML PATH('Buyer'), TYPE), 
						(SELECT 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME1, '')) AS "name", 				
							(SELECT
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA1, '')) AS "streetAndNumber", 
								NULLIF(adi.PAI_CODI3, '') AS "country", 
								NULLIF(adi.FOR_CPOS1, '') AS "postcode", 
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS1, '')) AS "city"
							FOR XML PATH('Address'), TYPE)
						HAVING duc.DUC_ANXB = 'H1' AND ISNULL(adi.FOR_NOME1, '') <> ''
						FOR XML PATH('Seller'), TYPE), 
						(SELECT 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_NOME, '')) AS "name", 				 
							(SELECT
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_MORA, '')) AS "streetAndNumber", 
								NULLIF(adi.PAI_CODI, '') AS "country", 
								NULLIF(adi.FOR_CPOS, '') AS "postcode", 
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS, '')) AS "city"
							FOR XML PATH('Address'), TYPE)
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(adi.FOR_NOME, '') <> '' 
						FOR XML PATH('Exporter'), TYPE), 
						(SELECT
							(CASE duc.DUC_ANXB WHEN 'I2' THEN NULL ELSE NULLIF(adi.PAI_CO34, '') END) AS "countryOfOrigin", 
							(CASE WHEN duc.DUC_ANXB IN ('H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.PAI_CODI5, '') END) AS "countryOfPreferentialOrigin" 
						HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(adi.PAI_CO34, '') <> ''
						FOR XML PATH('Origin'), TYPE), 
						(SELECT 
							NULLIF(adi.PAI_CODI1, '') AS countryOfDispatch
						HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(adi.PAI_CODI1, '') <> ''
						FOR XML PATH('CountryOfDispatch'), TYPE),
						(SELECT
							NULLIF(adi.PAI_CODI2, '') AS countryOfDestination, 
							adi.RES_CODI AS "regionOfDestination"				
						HAVING duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
						FOR XML PATH('Destination'), TYPE), 
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.DUA_DESG, '')) AS "descriptionOfGoods", 
							(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.APA_CCUS, '') END) AS "CUSCode", 
							(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_CO39, '') END) AS "quotaOrderNumber", 
							(CASE WHEN duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1', 'I2') THEN NULL ELSE NULLIF(adi.DUA_TMER, '') END) AS "typeOfGoods", 
							(SELECT 
								NULLIF(LEFT(adi.APA_CP33, 6), '') AS "harmonizedSystemSubheadingCode", 
								NULLIF(SUBSTRING(adi.APA_CP33, 7, 2), '') AS "combinedNomenclatureCode", 
								NULLIF(SUBSTRING(adi.APA_CP33, 9, 2), '') AS "taricCode", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
									NULLIF(t.DUA_TARIC, '') AS "taricAdditionalCode"
								FROM (
									SELECT 1 AS DUA_ORDEM, SUBSTRING(adi.APA_CP33, 11, 4) AS DUA_TARIC
									UNION
									SELECT 2, SUBSTRING(adi.APA_CP33, 15, 4)
									UNION
									SELECT 3, SUBSTRING(adi.APA_CP33, 19, 4) 									
								) AS t
								WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
								FOR XML PATH('TaricAdditionalCode'), TYPE),
								(SELECT
									ROW_NUMBER() OVER(ORDER BY t.DUA_ORDEM) AS "sequenceNumber",
									NULLIF(t.DUA_TARIC, '') AS "nationalAdditionalCode"						
								FROM (
									SELECT 1 AS DUA_ORDEM, adi.DUA_1TAR AS DUA_TARIC
									UNION
									SELECT 2, adi.DUA_2TAR
									UNION
									SELECT 3, adi.DUA_3TAR 
									UNION
									SELECT 4, adi.DUA_4TAR 
									UNION
									SELECT 5, adi.DUA_5TAR 								
								) AS t
								WHERE duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'I1') AND ISNULL(t.DUA_TARIC, '') <> '' AND ISNULL(t.DUA_TARIC, '') <> '0000'
								FOR XML PATH('NationalAdditionalCode'), TYPE)
							HAVING ISNULL(LEFT(adi.DUA_RG37, 2), '') <> '71'
							FOR XML PATH('CommodityCode'), TYPE), 
							(SELECT
								(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'I2') THEN NULL ELSE adi.DUA_ML38 END) AS "netMass", 
								(CASE WHEN duc.DUC_ANXB IN ('H6', 'I2') THEN NULL ELSE NULLIF(adi.DUA_US41, 0) END) AS "supplementaryUnits", 
								(CASE WHEN duc.DUC_ANXB = 'H6' THEN NULL ELSE adi.DUA_MB35 END) AS "grossMass"
							FOR XML PATH('GoodsMeasure'), TYPE), 
							(SELECT 
								CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "itemAmountInvoiced"
							HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2') 
							FOR XML PATH('InvoiceLine'), TYPE), 
							(SELECT
								CAST(ISNULL((SELECT SUM(ISNULL(DUO_MONT, 0)) FROM PRO_DUOI WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI), 0) AS decimal(18, 2)) AS "totalDutiesAndTaxesAmount", 
								(CASE WHEN duc.DUC_ANXB = 'H5' OR ISNULL(adi.PRE_CO36, '') = '000' THEN NULL ELSE NULLIF(adi.PRE_CO36, '') END) AS "preference", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY aoi.DUO_IMPO) AS "sequenceNumber", 
									NULLIF(aoi.DUO_IMPO, '') AS "taxType", 												
									CAST(SUM(ISNULL(aoi.DUO_MONT, 0)) AS decimal(18, 2)) AS "payableTaxAmount", 
									(SELECT
										ROW_NUMBER() OVER(ORDER BY DUO_CODI) AS "sequenceNumber", 
										CAST((CASE DUO_TIPO WHEN 1 THEN (ISNULL(DUO_TXVL, 0) / 100) ELSE ISNULL(DUO_TXVL, 0) END) AS decimal(18, 3)) AS "taxRate", 
										NULLIF(UME_CODI, '') AS "measurementUnitAndQualifier", 
										(CASE DUO_QTDE WHEN 0 THEN NULL ELSE DUO_QTDE END) AS "quantity", 
										(CASE DUO_QTDE WHEN 0 THEN ISNULL(DUO_BTRI, 0) ELSE NULL END) AS "amount", 
										CAST(ISNULL(DUO_MONT, 0) AS decimal(18, 2)) AS "taxAmount"
									FROM PRO_DUOI WITH(NOLOCK)
									WHERE DUC_EANO = aoi.DUC_EANO AND DUC_PNUM = aoi.DUC_PNUM AND DUA_CODI = aoi.DUA_CODI AND DUO_IMPO = aoi.DUO_IMPO 
									FOR XML PATH('TaxBase'), TYPE) 
								FROM PRO_DUOI AS aoi WITH(NOLOCK)
								WHERE aoi.DUC_EANO = adi.DUC_EANO AND aoi.DUC_PNUM = adi.DUC_PNUM AND aoi.DUA_CODI = adi.DUA_CODI AND ISNULL(aoi.DUO_IMPO, '') <> '' AND duc.DUC_ANXB IN ('H1', 'H2', 'H3', 'H4', 'H5')
								GROUP BY aoi.DUC_EANO, aoi.DUC_PNUM, aoi.DUA_CODI, aoi.DUO_IMPO							
								FOR XML PATH('DutiesAndTaxes'), TYPE) 
							HAVING duc.DUC_ANXB <> 'H6'
							FOR XML PATH('CalculationOfTaxes'), TYPE), 
							(SELECT
								NULLIF(duc.PAI_MO22, '') AS "currency", 
								CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "amount" 
							HAVING duc.DUC_ANXB = 'H6'
							FOR XML PATH('PostalValue'), TYPE)
						FOR XML PATH('Commodity'), TYPE),
						(SELECT
							ROW_NUMBER() OVER(ORDER BY D31_CODI) AS "sequenceNumber", 
							(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE NULLIF(UME_CODI, '') END) AS "typeOfPackages", 
							(CASE D31_TTVL WHEN 1 THEN NULL ELSE CAST(D31_QNTD AS int) END) AS "numberOfPackages", 
							(CASE duc.DUC_ANXB WHEN 'H6' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(D31_MARC, '')) END) AS "shippingMarks"
						FROM PRO_DU31 WITH(NOLOCK)
						WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI
						FOR XML PATH('Packaging'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY apr.id) AS "sequenceNumber", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(apr.numero, '')) AS "referenceNumber", 
							doc.DOC_CODI AS "type", 				
							umv.UME_CODI AS "typeOfPackages", 
							apr.volumes AS "numberOfPackages", 
							umq.UME_CODI AS "measurementUnitAndQualifier", 
							apr.quantidade AS "quantity", 
							apr.numeroAdicao AS "goodsItemIdentifier" 
						FROM tb_IMP_DeclaracoesAdicoesPrecedentes AS apr WITH(NOLOCK) 		
							INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON apr.id_documento = doc.DOC_IDTY
							INNER JOIN TAB_UMED AS umv WITH(NOLOCK) ON apr.id_unidadeMedidaVolumes = umv.UME_IDTY
							LEFT OUTER JOIN TAB_UMED AS umq WITH(NOLOCK) ON apr.id_unidadeMedidaQualificador = umq.UME_IDTY
						WHERE apr.id_adicao = adi.DUA_IDEN
						FOR XML PATH('PreviousDocument'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY ape.id) AS "sequenceNumber", 
							ped.TXM_CODI AS "code", 				
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(numero, '')) AS "text" 				
						FROM tb_IMP_DeclaracoesAdicoesPedidos AS ape WITH(NOLOCK)
							INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ape.id_pedido = ped.TXM_IDTY 					
						WHERE ape.id_adicao = adi.DUA_IDEN
						FOR XML PATH('AdditionalInformation'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY ado.DDO_CODI) AS "sequenceNumber", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ado.DDO_NUME, '')) AS "referenceNumber", 
							NULLIF(ado.DOC_CODI, '') AS "type", 				
							(CASE WHEN duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H5', 'H6', 'I2') THEN NULL ELSE NULLIF(ado.DDO_EEMI, '') END) AS "issuingAuthorityName", 
							NULLIF(ado.UME_CODI, '') AS "measurementUnitAndQualifier", 
							ado.DDO_QTDE AS "quantity", 
							CONVERT(varchar(10), ado.DDO_DINI, 120) AS "dateOfValidity", 
							NULLIF(pai.PAI_PREF, '') AS "currency", 
							ado.DDO_NLIN AS "documentLineItemNumber", 
							CAST(NULLIF(ado.DDO_MONT, 0) AS decimal(18, 2)) AS "amount"
						FROM PRO_DDOC AS ado WITH(NOLOCK) 						
							LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON ado.PAI_CODI = pai.PAI_CODI
						WHERE ado.DUC_EANO = adi.DUC_EANO AND ado.DUC_PNUM = adi.DUC_PNUM AND ado.DUA_CODI = adi.DUA_CODI AND ado.DDO_TIPO = 0
						FOR XML PATH('SupportingDocument'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
							NULLIF(DOC_CODI, '') AS "type"				
						FROM PRO_DDOC WITH(NOLOCK) 						
						WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 2
						FOR XML PATH('AdditionalReference'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS "sequenceNumber", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(DDO_NUME, '')) AS "referenceNumber", 
							NULLIF(DOC_CODI, '') AS "type"
						FROM PRO_DDOC WITH(NOLOCK) 						
						WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DDO_TIPO = 1
						FOR XML PATH('TransportDocument'), TYPE), 
						(SELECT 
							(CASE WHEN duc.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') THEN NULL ELSE adi.DUA_MAVA END) AS "valuationMethod",
							(SELECT
								ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
								NULLIF(codigo, '') AS "code", 
								montante AS "amount"
							FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes WITH(NOLOCK) 		
							WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H5', 'I1', 'I2')
							FOR XML PATH('AdditionsAndDeductions'), TYPE)
						HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H4', 'H5', 'I1', 'I2')
						FOR XML PATH('CustomsValuation'), TYPE), 
						(SELECT 
							NULLIF(adi.DUA_IAVA, '') AS "valuationIndicators"
						HAVING duc.DUC_ANXB IN ('H1', 'H4', 'H5') AND ISNULL(adi.DUA_IAVA, '') <> '' 
						FOR XML PATH('ValuationAdjustment'), TYPE),
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
							NULLIF(funcao, '') AS "role", 
							NULLIF(nif, '') AS "VATIdentificationNumber"
						FROM tb_IMP_DeclaracoesAdicoesReferenciasFiscais WITH(NOLOCK) 		
						WHERE id_adicao = adi.DUA_IDEN AND duc.DUC_ANXB IN ('H1', 'H6', 'I1')
						FOR XML PATH('AdditionalFiscalReference'), TYPE)
					FROM PRO_DUAD AS adi WITH(NOLOCK) 		
					WHERE adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM
					FOR XML PATH('GoodsShipmentItem'), TYPE)
				FOR XML PATH('GoodsShipment'), TYPE), 
				(SELECT 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.nome, '')) AS "name", 
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.morada, '')) AS "streetAndNumber", 
							NULLIF(pai.PAI_CODI, '') AS "country", 
							NULLIF(dpr.codigoPostal, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.localidade, '')) AS "city"
						FOR XML PATH('Address'), TYPE)
					FROM tb_IMP_DeclaracoesProprietarios AS dpr WITH(NOLOCK) 
						INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dpr.id_pais = pai.PAI_IDTY
					WHERE dpr.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('OwnerOfTheGoods'), TYPE), 
					(SELECT
						 NULLIF(duc.DUC_ATLO, '') AS "typeOfLocation", 
						 NULLIF(duc.DUC_AQUA, '') AS "qualifierOfIdentification", 
						 NULLIF(duc.LME_CODI, '') AS "UNLOCODE", 
						 (SELECT
							NULLIF(duc.PAI_CODI3, '') AS "country", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AMOR, '')) AS "streetAndNumber", 						
							NULLIF(duc.DUC_ACPO, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ALOC, '')) AS "city"
						HAVING ISNULL(duc.DUC_AMOR, '') <> ''
						FOR XML PATH('Address'), TYPE)
					HAVING ISNULL(duc.DUC_ATLO, '') <> ''
					FOR XML PATH('FirstPlaceOfUseOrProcessing'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dlt.id) AS "sequenceNumber", 
						NULLIF(dlt.tipo, '') AS "typeOfLocationCode", 
						NULLIF(dlt.qualificador, '') AS "qualifierOfIdentification", 
						NULLIF(lme.LME_CODI, '') AS "UNLOCODE", 
						(SELECT
							NULLIF(pai.PAI_CODI, '') AS "country", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.morada, '')) AS "streetAndNumber", 						
							NULLIF(dlt.codigoPostal, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.localidade, '')) AS "city"
						HAVING ISNULL(dlt.morada, '') <> ''
						FOR XML PATH('Address'), TYPE)
					FROM tb_IMP_DeclaracoesLocaisTransformacao AS dlt WITH(NOLOCK) 
						LEFT OUTER JOIN TAB_LMER AS lme WITH(NOLOCK) ON dlt.id_localAutorizado = lme.LME_IDTY
						LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dlt.id_pais = pai.PAI_IDTY
					WHERE dlt.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('PlacesOfProcessingOrUse'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dea.id) AS "sequenceNumber", 
						NULLIF(ead.EAD_CODI, '') AS "referenceNumber"					
					FROM tb_IMP_DeclaracoesEstancias AS dea WITH(NOLOCK) 
						INNER JOIN TAB_EADU AS ead WITH(NOLOCK) ON dea.id_estancia = ead.EAD_IDTY
					WHERE dea.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('CustomsOfficeOfDischarge'), TYPE), 
					(SELECT 
						duc.DUC_APRZ AS "period", 
						duc.DUC_APPR AS "automaticExtensionIndicator", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_ATXT, '')) AS "text"
					HAVING ISNULL(duc.DUC_APRZ, 0) <> 0
					FOR XML PATH('PeriodForDischarge'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dpt.id) AS "sequenceNumber", 
						NULLIF(LEFT(dpt.codigoPautal, 8), '') AS "commodityCode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.designacao, '')) AS "descriptionOfGoods"					
					FROM tb_IMP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK) 					
					WHERE dpt.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('ProcessedProducts'), TYPE), 
					(SELECT
						ROW_NUMBER() OVER(ORDER BY dmi.id) AS "sequenceNumber", 
						NULLIF(mid.MIA_CODI, '') AS "code", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dmi.descricao, '')) AS "text"					
					FROM tb_IMP_DeclaracoesMeiosIdentificacao AS dmi WITH(NOLOCK) 					
						INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dmi.id_meioIdentificacao = mid.MIA_IDTY
					WHERE dmi.id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('IdentificationOfGoods'), TYPE), 
					(SELECT
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(taxaRendimento, '') AS "RateOfYield"
					FROM tb_IMP_DeclaracoesTaxasRendimento WITH(NOLOCK) 					
					WHERE id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('RateOfYield'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						codigo AS "code", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(texto, '')) AS "text"
					FROM tb_IMP_DeclaracoesCondicoesEconomicas WITH(NOLOCK) 					
					WHERE id_declaracaoIMP = duc.DUC_IDTY
					FOR XML PATH('EconomicConditions'), TYPE), 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AAPR, '')) AS "DetailsOfPlannedActivities", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(duc.DUC_AIAD, '')) AS "AdditionalInformation", 
					(CASE duc.DUC_ANXB WHEN 'H4' THEN duc.DUC_ACMD ELSE NULL END) AS "CalculationOfTheAmountImportDuty"
				HAVING duc.DUC_ANXB IN ('H3', 'H4')
				FOR XML PATH('AttachedRequest'), TYPE)
			HAVING @Indicador = 0
			FOR XML PATH('Counterproposal'), TYPE)	
		FROM PRO_DUCG AS duc WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON duc.DEC_CO14 = dcl.DEC_CODI	
		WHERE duc.DUC_IDTY = @IdDeclaracao
		FOR XML PATH('PT498A'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagemGeraXMLPT498A TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_SDSViaAerea_Manifestos_MensagensSubmetePedido') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_SDSViaAerea_Manifestos_MensagensSubmetePedido
GO
CREATE PROCEDURE sp_SDSViaAerea_Manifestos_MensagensSubmetePedido @TipoMensagem varchar(50), @AcaoMensagem varchar(10), @AnoManifesto int, @NumManifesto int, @SoFranquias bit, 
	@SoCriacao bit, @TipoCarga varchar(3), @CodEstancia varchar(8), @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @CodUtilizador varchar(30), @ProxyAuthentication bit, @ProxyServer varchar(100), @ProxyPort int, @ProxyUser varchar(100), 
		@ProxyPassword varchar(100), @EnderecoWS varchar(250), @LoginWS varchar(50), @PwdWS varchar(100), @IdTransitario varchar(20), @PathCertificado varchar(250), @PwdCertificado varchar(100), 
		@MensagemSoapAction varchar(250), @MensagemXML xml, @MensagemTXT varchar(MAX), @MensagemXMLBinario varbinary(MAX), @MensagemXMLBase64 varchar(MAX), @PublicKeyCertificadoAT nvarchar(4000), 
		@PwdWSEncriptada nvarchar(4000), @PwdDigestWSEncriptada nvarchar(4000), @DataSistema nvarchar(4000), @ChvSimetricaEncriptada nvarchar(4000), @RequestXML xml, @Resultado int, 
		@ResponseXML xml, @FaultCode varchar(100), @FaultMessage varchar(MAX)
-- inicia processo de submissão de pedido da declaração
	BEGIN TRY	
		SET @NumErro = 0
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem utilizador
		SELECT @CodUtilizador = UTI_UTIL
		FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
		WHERE UTI_IDTY = @IdUtilizador
-- obtem configurações do Proxy Authentication nos Parâmetros da Aplicação
		SELECT @ProxyAuthentication = PAP_PAUT, @ProxyServer = ISNULL(PAP_PSRV, ''), @ProxyPort = ISNULL(PAP_PPRT, 0), @ProxyUser = ISNULL(PAP_PUSE, ''), @ProxyPassword = ISNULL(PAP_PPWD, '')		
		FROM TAB_PAPL WITH(NOLOCK)
-- obtem configurações do Webservice nos Parâmetros de SDS - Via Aérea
		SELECT @IdTransitario = PSD_ITSP, @PathCertificado = PSD_PATC, @PwdCertificado = PSD_PWDC, 
			@EnderecoWS = (CASE WHEN @TipoMensagem IN ('AirManifestInformation', 'AirTransportInformation') THEN PSD_WSTR ELSE PSD_WEBS END), 
			@LoginWS = (CASE WHEN @TipoMensagem IN ('AirManifestInformation', 'AirTransportInformation') THEN PSD_UTTR ELSE PSD_UTIL END), 
			@PwdWS = (CASE WHEN @TipoMensagem IN ('AirManifestInformation', 'AirTransportInformation') THEN PSD_PWTR ELSE PSD_PASS END)			      
		FROM TAB_PSDS WITH(NOLOCK) 	
-- obtem a chave pública do sistema de autenticação na AT em função se o request é para ambiente de testes ou não (porta 821 = Ambiente de Testes)
		SET @PublicKeyCertificadoAT = GIDWIN.dbo.fn_Geral_ChavePublicaRSAWebservicesAT((CASE WHEN CHARINDEX(':821', @EnderecoWS) > 0 THEN 1 ELSE 0 END))				
-- valida se o path p/ o certificado é válido
		EXEC master.dbo.xp_fileexist @PathCertificado, @Resultado OUTPUT
		IF @Resultado = 0
			RAISERROR('Ficheiro do certificado não encontrado em "%s".', 16, 1, @PathCertificado)	
-- constroi o XML de acordo com o tipo de mensagem
		SET @MensagemSoapAction = ''
		IF @TipoMensagem = 'AirTransportInformation' -- Criação/Alteração/Anulação da contramarca SDS-Via Aérea
			EXEC sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirTransportInformation @AnoManifesto, @NumManifesto, @AcaoMensagem, @MensagemXML OUTPUT
		ELSE
		IF @TipoMensagem = 'AirManifestInformation' -- Criação do manifesto SDS-Via Aérea
			EXEC sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirManifestInformation @AnoManifesto, @NumManifesto, @SoFranquias, @MensagemXML OUTPUT		
		ELSE
		IF @TipoMensagem = 'AirWarehouseKeepersReportInformation' -- Criação do relatório descarga SDS-Via Aérea
			EXEC sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirWarehouseKeepersReportInformation @AnoManifesto, @NumManifesto, @SoCriacao, @TipoCarga, @MensagemXML OUTPUT
		ELSE
		IF @TipoMensagem = 'AirWarehouseKeepersMovementInformation' -- Criação do movimento de saída SDS-Via Aérea
			EXEC sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirWarehouseKeepersMovementInformation @CodEstancia, @MensagemXML OUTPUT
-- converte o XML gerado para varbinary e depois para Base64
		SET @MensagemTXT = '<?xml version="1.0" encoding="UTF-8"?>' + CAST(@MensagemXML AS varchar(MAX))
		SET @MensagemXMLBinario = CONVERT(varbinary(MAX), @MensagemTXT)
		/* POR ENQUANTO A COMPRESSÃO ZIP DAS MENSAGENS XML FICA EM STAND-BY
		IF @TipoMensagem = 'AirTransportInformation' -- Criação/Alteração/Anulação da contramarca SDS-Via Aérea
			SET @MensagemXMLBinario = CONVERT(varbinary(MAX), @MensagemTXT) 		
		ELSE
			EXEC GIDWIN.dbo.SP_Externo_ComprimirXMLEmBinario @MensagemTXT, @MensagemXMLBinario OUTPUT*/
		SET @MensagemXMLBase64 = CAST(N'' AS xml).value('xs:base64Binary(sql:variable("@MensagemXMLBinario"))', 'varchar(MAX)') 
-- encripta password acesso à AT, Nounce e Data de Criação de acordo com o standard WS-Security da OASIS
		EXEC GIDWIN.dbo.SP_Externo_GerarDigestSecurityHeader @PwdWS, @PublicKeyCertificadoAT, @PwdWSEncriptada OUTPUT, @PwdDigestWSEncriptada OUTPUT, @DataSistema OUTPUT, @ChvSimetricaEncriptada OUTPUT
-- constroi estrutura XML com os dados do pedido ao metodo para enviar mensagem à AT
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 'http://simtem.at.gov.pt/WS/AirTraders' AS air, 'http://www.w3.org/2003/05/soap-envelope' AS soap)		
		SELECT @RequestXML = 
			(SELECT 
				(SELECT 
					(SELECT
						(SELECT 
							@LoginWS AS "wss:Username", 
							@ChvSimetricaEncriptada AS "wss:Nonce",
							(SELECT @PwdDigestWSEncriptada AS "@Digest", 
								@PwdWSEncriptada	
							FOR XML PATH('wss:Password'), ELEMENTS, TYPE),							 							
							@DataSistema AS "wss:Created"
						FOR XML PATH('wss:UsernameToken'), ELEMENTS, TYPE)
					FOR XML PATH('wss:Security'), ELEMENTS, TYPE)
				FOR XML PATH('soap:Header'), ELEMENTS, TYPE),
				(SELECT
					(SELECT 
						@IdTransitario AS "air:sender", 
						@MensagemXMLBase64 AS "air:messages"						
					FOR XML PATH('air:submitMessagesRequest'), TYPE)
				FOR XML PATH('soap:Body'), ELEMENTS, TYPE)
			FOR XML PATH('soap:Envelope'), ELEMENTS)		
-- processa envio do XML para o WebService da AT	
		EXEC GIDWIN.dbo.SP_Externo_EnviarDadosWS @RequestXML, @EnderecoWS, @MensagemSoapAction, @PathCertificado, @PwdCertificado, @ProxyAuthentication, @ProxyServer, @ProxyPort, @ProxyUser, @ProxyPassword, @ResponseXML OUTPUT
-- valida se ocorreu erro na invocação do webservice		
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP-ENV")
		SELECT 
			@FaultCode = t.c.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = t.c.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('SOAP-ENV:Envelope/SOAP-ENV:Body/SOAP-ENV:Fault') AS t(c)
		IF ISNULL(@FaultMessage, '') <> ''
			RAISERROR('Comunicação ao webservice falhou c/ erro "%s".', 16, 2, @FaultMessage)	
-- valida se ocorreu erro na autenticação/autorização do webservice		
		;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env)
		SELECT 
			@FaultCode = t.c.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = t.c.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('env:Envelope/env:Body/env:Fault') AS t(c)
		IF ISNULL(@FaultMessage, '') <> ''
			RAISERROR('A autenticação/autorização ao webservice gerou o erro "%s".', 16, 3, @FaultMessage)				
-- obtem o resultado "OK"/"NOK" retornados do WS
		;WITH XMLNAMESPACES ('http://www.w3.org/2003/05/soap-envelope' AS env, 'http://simtem.at.gov.pt/WS/AirTraders' AS ns2)		
		SELECT TOP 1 			
			@FaultMessage = t.c.value('.[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('env:Envelope/env:Body/ns2:submitMessagesResponse/ns2:return') AS t(c)				
-- se resultado não for de sucesso, manda erro
		IF @FaultMessage <> 'OK'
			RAISERROR('O envio da mensagem gerou o erro "%s".', 16, 4, @FaultMessage)	
-- processa atualizações no manifesto e linhas AWB conforme tipo de mensagem
		IF @TipoMensagem = 'AirTransportInformation' -- Criação/Alteração/Anulação da contramarca SDS-Via Aérea
		BEGIN
			UPDATE PRO_SDSC SET 
				DSC_STCM = (CASE @AcaoMensagem WHEN 'Create' THEN 10 WHEN 'Update' THEN 20 WHEN 'Annul' THEN 30 ELSE 0 END),
				DSC_UCCM = (CASE @AcaoMensagem WHEN 'Create' THEN @CodUtilizador ELSE DSC_UCCM END),
				DSC_DCCM = (CASE @AcaoMensagem WHEN 'Create' THEN @DataAtual ELSE DSC_DCCM END),
				DSC_UUCM = (CASE @AcaoMensagem WHEN 'Update' THEN @CodUtilizador ELSE DSC_UUCM END),
				DSC_DUCM = (CASE @AcaoMensagem WHEN 'Update' THEN @DataAtual ELSE DSC_DUCM END),
				DSC_UACM = (CASE @AcaoMensagem WHEN 'Annul' THEN @CodUtilizador ELSE DSC_UACM END),
				DSC_DACM = (CASE @AcaoMensagem WHEN 'Annul' THEN @DataAtual ELSE DSC_DACM END), 
				DSC_UALT = @CodUtilizador,
				DSC_DALT = @DataAtual
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto			
		END
		ELSE
		IF @TipoMensagem = 'AirManifestInformation' -- Criação do manifesto SDS-Via Aérea
		BEGIN
-- atualiza estado interno de envio conforme acção de cada linha AWB
			UPDATE PRO_SDSD SET 
				DSD_STAT = (CASE DSD_ESTI WHEN 1 THEN 1 WHEN 2 THEN 4 WHEN 3 THEN 7 ELSE 0 END),
				DSD_DERR = NULL, 
				DSD_JUST = NULL, 
				DSD_EFRQ = (CASE @SoFranquias WHEN 1 THEN 1 ELSE DSD_EFRQ END)					
			FROM VW_SDSViaAerea_EnvioManifestoDadosAWBPendentes AS SDSVA_EMDAWBP
			WHERE PRO_SDSD.DSC_EANO = SDSVA_EMDAWBP.DSC_EANO AND PRO_SDSD.DSC_NPRO = SDSVA_EMDAWBP.DSC_NPRO AND PRO_SDSD.DSD_NUME = SDSVA_EMDAWBP.DSD_NUME AND PRO_SDSD.DSC_EANO = @AnoManifesto 
				AND PRO_SDSD.DSC_NPRO = @NumManifesto AND (CASE @SoFranquias WHEN 1 THEN ISNULL(SDSVA_EMDAWBP.DSD_AFRQ, -1) ELSE 0 END) <> -1					
-- atualiza manifesto SDS - Via Aérea p/ incremento do n.º submissões e utilizador/data
			IF @SoFranquias = 0
			BEGIN
				UPDATE PRO_SDSC SET 
					DSC_NREM = DSC_NREM + 1,
					DSC_UDEM = @DataAtual, 
					DSC_UALT = @CodUtilizador,
					DSC_DALT = @DataAtual
				WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
			END		
		END
		ELSE
		IF @TipoMensagem = 'AirWarehouseKeepersReportInformation' -- Criação do relatório descarga SDS-Via Aérea
		BEGIN
-- atualiza processo SDS - Via Aérea p/ alteração do status e utilizador/data
			UPDATE PRO_SDSC SET 
				DSC_STRD = (CASE @SoCriacao WHEN 1 THEN 1 ELSE 2 END), 
				DSC_NRER = DSC_NRER + 1,
				DSC_UERC = (CASE @SoCriacao WHEN 1 THEN @CodUtilizador ELSE DSC_UERC END), 
				DSC_DERC = (CASE @SoCriacao WHEN 1 THEN @DataAtual ELSE DSC_DERC END),
				DSC_UERF = (CASE @SoCriacao WHEN 1 THEN DSC_UERF ELSE @CodUtilizador END), 
				DSC_DERF = (CASE @SoCriacao WHEN 1 THEN DSC_DERF ELSE @DataAtual END)	
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
-- atualiza linhas AWB do processo SDS - Via Aérea p/ alteração do status e data de envio do relatório de descarga
			UPDATE PRO_SDSD SET 
				DSD_STRD = (CASE dsp.DSD_ESTI WHEN 1 THEN 2 WHEN 2 THEN 3 ELSE 1 END), 
				DSD_DERD = @DataAtual
			FROM PRO_SDSD AS dsd WITH(NOLOCK) 
				INNER JOIN VW_SDSViaAerea_EnvioRelatorioDescargaDadosAWBPendentes AS dsp ON dsd.DSD_IDNN = dsp.DSD_IDNN
				LEFT OUTER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON duc.DUC_DUNO IN (1, 2) AND dsp.DSD_NRMH = duc.DUC_CPRT AND dsp.EAD_CODI = duc.ALF_CODI AND CAST(CONVERT(varchar(10), dsp.DSC_DTVO, 105) AS datetime) = CAST(CONVERT(varchar(10), duc.DUC_DTVO, 105) AS datetime)
				LEFT OUTER JOIN TAB_NDES AS nat WITH(NOLOCK) ON duc.NDE_CODI = nat.NDE_CODI
			WHERE dsd.DSC_EANO = @AnoManifesto AND dsd.DSC_NPRO = @NumManifesto AND dsd.DSD_TCAR = ISNULL(NULLIF(@TipoCarga, ''), dsd.DSD_TCAR) 
				AND ((@TipoCarga <> 'XXX') OR (@TipoCarga = 'XXX' AND dsd.DSD_VOLS = duc.DUC_VSCA AND ((nat.NDE_FEDI = 1) OR (duc.DUC_ARTI IS NOT NULL))))
		END
		ELSE
		IF @TipoMensagem = 'AirWarehouseKeepersMovementInformation' -- Criação do movimento de saída SDS-Via Aérea
		BEGIN
-- atualiza processo SDS - Via Aérea p/ alteração do status e utilizador/data
			UPDATE PRO_SDSC SET 
				DSC_STMS = 1, 
				DSC_NRES = DSC_NRES + 1, 
				DSC_UEMS = @CodUtilizador, 
				DSC_DEMS = @DataAtual 
			FROM PRO_SDSC AS sds WITH(NOLOCK)
				INNER JOIN (SELECT DSC_EANO, DSC_NPRO 
					FROM VW_SDSViaAerea_MovimentoSaidaDadosAWB 
					WHERE ISNULL(DSD_DNRD, '') <> '' AND ISNULL(SIN_CODI, '') <> '' AND EAD_CODI = @CodEstancia
					GROUP BY DSC_EANO, DSC_NPRO) AS t ON sds.DSC_EANO = t.DSC_EANO AND sds.DSC_NPRO = t.DSC_NPRO			
-- atualiza linhas AWB do processo SDS - Via Aérea p/ alteração do status e data de envio do movimento de saída
			UPDATE PRO_SDSD SET 
				DSD_STMS = 1, 
				DSD_DEMS = @DataAtual
			FROM PRO_SDSD AS dsd WITH(NOLOCK) 
				INNER JOIN VW_SDSViaAerea_MovimentoSaidaDadosAWB AS mvs ON dsd.DSD_IDNN = mvs.DSD_IDNN
			WHERE ISNULL(mvs.DSD_DNRD, '') <> '' AND ISNULL(mvs.SIN_CODI, '') <> '' AND mvs.EAD_CODI = @CodEstancia
		END
	END TRY
	BEGIN CATCH
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = ERROR_MESSAGE() + CHAR(13) + '{Detalhe: Número=' + CAST(ERROR_NUMBER() as varchar(50)) + ',Nível=' + CAST(ERROR_SEVERITY() as varchar(5)) + ',Estado=' + CAST(ERROR_STATE() as varchar(5)) + ',Objeto=' + ISNULL(ERROR_PROCEDURE(), '') + ',Linha=' + CAST(ERROR_LINE() as varchar(5)) + '}'		
	END CATCH	
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_SDSViaAerea_Manifestos_MensagensSubmetePedido TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_ImportaDeXML') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_ImportaDeXML
GO
CREATE PROCEDURE sp_IMP_Declaracoes_ImportaDeXML @XMLDeclaracoes xml(XMLSC_DeclaracoesIMPCAUToGIDWin), @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @TblID table (ID bigint NOT NULL, NUMERO int NOT NULL)	
	DECLARE @NumErro int, @CodUtilizador varchar(30), @CamposAdicionais int, @InterfaceDUContas bit, @CodigoTipoDocContas varchar(4), @ValidaAWB bit, @NumDigitosAWB int, @DataAtual datetime, 
		@Ano smallint, @TotalAdicoes int, @TotalVolumes int, @TotalVolumesDirty int, @TotalVolumesClean int, @TotalVolumesScan int, @TotalValorAduaneiro numeric(38, 6), @GarantiaGlobal bit, 
		@NumeroNRG varchar(24), @TipoEntidadeCaucao int, @AnoCaucao varchar(4), @TipoCaucao varchar(1), @AlfandegaCaucao varchar(8), @CodAcessoCaucao varchar(4), @OutrasRefCaucao varchar(35), 
		@NIFResponsavelCaucao varchar(17), @IdDeclaracao bigint, @Numero int, @NRL varchar(22), @ValorTrafegoCTT numeric(38, 6), @NumMascaras int, @TipoMascara int, @CodMascara int, 
		@ExtraFieldUPDATEValue varchar(20), @IdRegisto bigint, @UltCodTabela int, @UltCodTabela1 int, @OperacaoManifesto int, @Resultado int, @MsgErro varchar(MAX)
	DECLARE @acao varchar(1), @data datetime, @despachoCentralizado bit, @anexoB varchar(2), @natureza varchar(3), @documentoTransporte varchar(18), @descricaoGenerica varchar(40), 
		@nifExportador varchar(17), @nomeExportador varchar(70), @moradaExportador varchar(70), @localidadeExportador varchar(35), @codigoPostalExportador varchar(12), 
		@localidadePostalExportador varchar(35), @paisExportador varchar(2), @paisExpedicao varchar(2), @nifImportador varchar(17), @tipoNIFImportador int, @nomeImportador varchar(70), 
		@moradaImportador varchar(70), @localidadeImportador varchar(35), @codigoPostalImportador varchar(12), @localidadePostalImportador varchar(35), @paisImportador varchar(2), 
		@telefoneImportador varchar(14), @emailImportador varchar(200), @paisDestino varchar(2), @regiao int, @declarante varchar(6), @estatutoDeclarante int, @vossaReferencia varchar(50), 
		@estancia varchar(8), @tipoDeclaracao varchar(4), @naturezaTransacao varchar(2), @condicaoEntrega varchar(3), @localidadeCE varchar(30), @paisCE varchar(2), @portoAeroporto varchar(3), 
		@paisFatura varchar(2), @valorTotalFatura decimal(18, 3), @paisFrete varchar(2), @valorTotalFrete decimal(18, 3), @paisSeguro varchar(2), @valorTotalSeguro decimal(18, 3), 
		@totalMassaLiquida decimal(18, 6), @totalMassaBruta decimal(18, 6), @numeroNRUR varchar(30), @meioTransporteFronteira varchar(2), @paisFronteira varchar(2), 
		@meioTransporteInterior varchar(2), @meioTransporteChegada varchar(2), @identificacaoTransporte varchar(30), @contentorizada int, @numeroContentor varchar(17), 
		@tipoLocalizacao varchar(1), @qualificador varchar(1), @armazemDTP varchar(17), @estanciaLM varchar(8), @nifOperadorEconomico varchar(17), @moradaLM varchar(70), @localidadeLM varchar(35), 
		@codigoPostalLM varchar(12), @armazem varchar(17), @locID varchar(6), @gateway varchar(6), @serviceLevel int, @portesAcc varchar(10), @portes varchar(13), @despachoAcc varchar(50), 
		@freteOriginal decimal(18, 2), @moedafreteOriginal varchar(3), @despesas decimal(18, 3), @condEntrega varchar(2), @nomeFicheiro varchar(100), @numeroPDDT int, @dataEntrada datetime, 
		@numeroPDDTDEV int, @numeroTD int, @numeroACTM int, @numeroSequencia int, @posicaoArmazem varchar(4), @miniCPA varchar(20), @dataVoo datetime, @aeroportoOrigem varchar(80), 
		@numeroVoo varchar(20), @posicaoAviao varchar(13), @tracking varchar(35), @tipoCarga varchar(5), @numeroContaExpedidor varchar(10), @numeroContaDestinatario varchar(10), 
		@nomeOriginalDestinatario varchar(70), @moradaOriginalDestinatario varchar(70), @localidadeOriginalDestinatario varchar(35), @codigoPostalOriginalDestinatario varchar(12), 
		@localidadePostalOriginalDestinatario varchar(35), @referenciaExterna1 varchar(50), @referenciaExterna2 varchar(50), @shipID varchar(11), @dutyType varchar(2), @payment int, 
		@dataDocumentoTransporte datetime, @numeroRequerimento varchar(30), @numeroDURetorno varchar(30), @numeroT1Retorno varchar(30), @anotacoes varchar(MAX), @followUp int, 
		@utilizadorNomeado varchar(30), @XMLCamposExtra xml, @XMLDocumentos xml, @XMLPrecedentes xml, @XMLPedidos xml, @XMLAdicoes xml, @XMLIncidencias xml, @XMLFollowUps xml, 
		@XMLContactos xml, @XMLManifestos xml, @XMLArquivos xml	
	DECLARE @CodigoNatureza varchar(3), @NomeNatureza varchar(35), @NaturezaRetorno bit, @CodigoFollowUp int, @CodigoUtilizadorNomeado varchar(30)
	DECLARE @CodigoAlfandegaSujeicao varchar(8), @NomeAlfandegaSujeicao varchar(70), @CodigoAlfandegaApresentacao varchar(8), @CodigoLocalizacaoMercadoriasEstanciaSujeicao varchar(17)
	DECLARE @CodigoTipoDeclaracao varchar(4), @NomeTipoDeclaracao varchar(35), @NaturezaTipoDeclaracao int, @1CasaTipoDeclaracao varchar(5), @2CasaTipoDeclaracao varchar(4), 
		@Regime varchar(4) 			
	DECLARE @CodigoExportador varchar(18), @CodigoPaisExportador varchar(2), @NomePaisExportador varchar(35)
	DECLARE @CodigoPaisExpedicao varchar(2), @NomePaisExpedicao varchar(35)			
	DECLARE @CodigoPaisImportador varchar(2)			
	DECLARE @CodigoCliente varchar(18), @CodigoClienteCC varchar(18), @NIFResponsavelCaucaoCliente varchar(17), @CodigoClienteServico varchar(18), @NomeClienteServico varchar(70), 
		@BeneficiarioIVACliente bit, @CaucaoCliente varchar(24), @AnoCaucaoCliente varchar(4), @TipoCaucaoCliente varchar(1), @AlfandegaCaucaoCliente varchar(8), 
		@CodAcessoCaucaoCliente varchar(4), @OutrasRefCaucaoCliente varchar(35)
	DECLARE @CodigoPaisDestino varchar(2), @NomePaisDestino varchar(35)			
	DECLARE @CodigoRegiao int			
	DECLARE @CodigoDeclarante varchar(6), @NomeDeclarante varchar(70), @NIFDeclarante varchar(18), @CedulaDeclarante varchar(18), @CaucaoDeclarante varchar(24), @AnoCaucaoDeclarante varchar(4), 
		@TipoCaucaoDeclarante varchar(1), @AlfandegaCaucaoDeclarante varchar(8), @CodAcessoCaucaoDeclarante varchar(4), @OutrasRefCaucaoDeclarante varchar(35)
	DECLARE @CodigoMeioTransporteFronteira varchar(2), @NomeMeioTransporteFronteira varchar(35)
	DECLARE @CodigoPaisMeioTransporteFronteira varchar(2)			
	DECLARE @CodigoMeioTransporteInterior varchar(2)					
	DECLARE @CodigoMeioTransporteChegada varchar(2), @NomeMeioTransporteChegada varchar(35), @TipoIdentificacaoMeioTransporte int, @TotalOptativas numeric(38, 6), @MeioTransportePorVolume bit
	DECLARE @CodigoCondicaoEntrega varchar(3), @CodigoFormula int, @TipoLocCondicaoEntrega int, @OpcaoLocCondicaoEntrega int
	DECLARE @DescricaoFormula varchar(70), @FormulaFOB bit, @FormulaPositiva bit
	DECLARE @CodigoNaturezaTransacao varchar(2), @NomeNaturezaTransacao varchar(70)			
	DECLARE @CodigoPaisCondicaoEntrega varchar(2)
	DECLARE @CodigoPortoAeroporto varchar(8)
	DECLARE @CodigoLocalizacaoMercadorias varchar(17), @NomeLocalizacaoMercadorias varchar(70)
	DECLARE @CodigoAlfandegaLM varchar(8), @NomeAlfandegaLM varchar(70)
	DECLARE @CodigoPaisMontante varchar(2), @MoedaMontante varchar(3), @CambioMontante numeric(38, 6), @ValorTotalEUR numeric(38, 6)
	DECLARE @CodigoPaisFrete varchar(2), @MoedaFrete varchar(3), @CambioFrete numeric(38, 6)
	DECLARE @CodigoPaisSeguro varchar(2), @MoedaSeguro varchar(3), @CambioSeguro numeric(38, 6)
	DECLARE @CodigoArmazem varchar(17), @NomeArmazem varchar(70), @CodigoTipoArmazem varchar(1), @NomeTipoArmazem varchar(35), @CodigoDocumentoArmazem varchar(5), 
		@NumReferenciaArmazem varchar(35), @EORIArmazem varchar(17)
	DECLARE @CodigoPaisVerbaTransitario varchar(2), @MoedaVerbaTransitario varchar(35), @CambioVerbaTransitario numeric(38, 6)
	DECLARE @tipoDocumento int, @codigoDocumento varchar(5), @numeroDocumento varchar(70), @qualificadorDC varchar(2), @dataValidade datetime, @pais varchar(2), @montante decimal(18, 2), 
		@entidadeEmissora varchar(70), @unidadeMedida varchar(3), @quantidade decimal(18, 6)
	DECLARE @IdDocumento int, @NomeDocumento varchar(70), @IdPais int, @IdUnidadeMedida int
	DECLARE @codigoPedido varchar(5), @numeroPedido varchar(512)
	DECLARE @IdPedido int
	DECLARE @codigoIncidencia varchar(8), @dataInicio datetime, @dataFim datetime, @observacoes varchar(MAX), @tipoIncidencia varchar(1)
	DECLARE @IdIncidencia int, @NomeIncidencia varchar(60), @ReleaseHold int
	DECLARE @utilizador varchar(30), @dataHora datetime
	DECLARE @IdUtilizadorValido int
	DECLARE @descricaoContacto varchar(200)
	DECLARE @tipoManifesto int, @paisManifesto varchar(2), @descricao varchar(104), @valor decimal(18, 3), @paisMoedaManifesto varchar(2), @totalFatura decimal(18, 3), @numeroCPA varchar(35), 
		@pesoBruto decimal(18, 3)
	DECLARE @CodigoPaisManifesto varchar(2), @IdPaisMoedaManifesto int, @MoedaManifesto varchar(3)
	DECLARE @nomeArquivo varchar(100), @descricaoArquivo varchar(150), @tipoArquivo varchar(8), @origemArquivo int, @ficheiroBase64 varchar(MAX)
	DECLARE @FicheiroBinario varbinary(MAX)
	DECLARE @acaoAdicao varchar(1), @numeroAdicao int, @codigoPautal varchar(22), @designacao varchar(150), @regimeAdicional varchar(6), @paisOrigem varchar(2), @preferencia varchar(3), 
		@metodoAvaliacao int, @massaLiquida decimal(18, 6), @massaBruta decimal(18, 6), @unidades decimal(18, 6), @montanteAd decimal(18, 3), @valorFrete decimal(18, 3), 
		@valorSeguro decimal(18, 3), @taxaIVA decimal(18, 2), @XMLMarcasEVolumes xml, @XMLContentores xml, @XMLVeiculos xml
	DECLARE @CodigoArtigo varchar(22), @IdDesdobramento int, @CodigoPaisOrigem varchar(2), @IdAdicao int, @CodigoPreferencia varchar(3), @DireitosDDP numeric(38, 6)
	DECLARE @volumes int, @marcas varchar(512), @numeroObjeto varchar(20), @codigoBarras varchar(30), @parte bit
	DECLARE @CodigoUnidadeMedida varchar(3), @NomeUnidadeMedida varchar(35), @VolumesAZero bit
	DECLARE @IdUnidadeMedidaVolumes int, @VolumesPrecedente int, @IdUnidadeMedidaQualificador int
	DECLARE @tipoContentor varchar(10)
	DECLARE @homologacaoTecnica varchar(20), @adicionalISV varchar(4), @tabela varchar(1), @marca varchar(20), @modelo varchar(20), @qualificadorV varchar(1), @categoria varchar(2), 
		@tipoVeiculo varchar(3), @combustivel varchar(2), @cilindrada decimal(18, 3), @co2 int, @tipoCO2 varchar(4), @particulas varchar(10), @autonomia int, @documentoIMT varchar(5), 
		@valorISV decimal(18, 2), @XMLChassis xml
	DECLARE @CodigoCategoria varchar(2), @CodigoTipoVeiculo varchar(3), @CodigoTipoCombustivel varchar(2)
	DECLARE @matricula varchar(10), @dataMatricula datetime, @numeroChassi varchar(22), @dataChassi datetime
	DECLARE @ValorEstatistico numeric(38, 6), @Ajustamento numeric(38, 6), @ValorEUR numeric(38, 6), @SomaMontantesAdicoes numeric(38, 6), @SomaFretesAdicoes numeric(38, 6), 
		@SomaSegurosAdicoes numeric(38, 6), @TaxaFDA numeric(38, 6), @Direitos numeric(38, 6), @Acrescimos numeric(38, 6), @Deducoes numeric(38, 6)
-- inicia variaveis
	SET @NumErro = 0
-- obtem utilizador
	SELECT @CodUtilizador = UTI_UTIL
	FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
	WHERE UTI_IDTY = @IdUtilizador
-- obtem nos campos adicionais qual o tipo de empresa configurada
	SELECT TOP 1 @CamposAdicionais = ISNULL(PDE_CADI, 0), @InterfaceDUContas = PDE_IDCV, @CodigoTipoDocContas = PDE_TDOC, @ValidaAWB = PDE_VCPI, @NumDigitosAWB = PDE_DCPI
	FROM TAB_PDES WITH(NOLOCK)
-- carrega declaracoes IMP-CAU do XML p/ INSERT
	DECLARE DeclaracoesIMP CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
		SELECT t.c.value('@acao[1]', 'varchar(1)'), 
			t.c.value('data[1]', 'datetime'), 
			t.c.value('despachoCentralizado[1]', 'bit'), 			
			t.c.value('anexoB[1]', 'varchar(2)'), 			
			t.c.value('natureza[1]', 'varchar(3)'), 
			NULLIF(t.c.value('documentoTransporte[1]', 'varchar(18)'), ''), 
			NULLIF(t.c.value('descricaoGenerica[1]', 'varchar(40)'), ''), 
			NULLIF(t.c.value('(operadores/exportador/nif)[1]', 'varchar(17)'), ''), 
			t.c.value('(operadores/exportador/nome)[1]', 'varchar(70)'), 
			t.c.value('(operadores/exportador/morada)[1]', 'varchar(70)'), 
			t.c.value('(operadores/exportador/localidade)[1]', 'varchar(35)'), 
			t.c.value('(operadores/exportador/codigoPostal)[1]', 'varchar(12)'), 
			t.c.value('(operadores/exportador/localidadePostal)[1]', 'varchar(35)'), 
			t.c.value('(operadores/exportador/pais)[1]', 'varchar(2)'), 
			NULLIF(t.c.value('(operadores/paisExpedicao)[1]', 'varchar(2)'), ''), 
			t.c.value('(operadores/importador/nif)[1]', 'varchar(17)'), 
			t.c.value('(operadores/importador/tipoNIF)[1]', 'int'), 
			t.c.value('(operadores/importador/nome)[1]', 'varchar(70)'), 
			t.c.value('(operadores/importador/morada)[1]', 'varchar(70)'), 
			t.c.value('(operadores/importador/localidade)[1]', 'varchar(35)'), 
			t.c.value('(operadores/importador/codigoPostal)[1]', 'varchar(12)'), 
			t.c.value('(operadores/importador/localidadePostal)[1]', 'varchar(35)'), 
			t.c.value('(operadores/importador/pais)[1]', 'varchar(2)'), 
			NULLIF(t.c.value('(operadores/importador/telefone)[1]', 'varchar(14)'), ''), 
			NULLIF(t.c.value('(operadores/importador/email)[1]', 'varchar(200)'), ''), 
			t.c.value('(operadores/paisDestino)[1]', 'varchar(2)'),
			t.c.value('(operadores/regiao)[1]', 'int'),
			t.c.value('(operadores/declarante/codigoDeclarante)[1]', 'varchar(6)'), 
			t.c.value('(operadores/declarante/estatuto)[1]', 'int'), 
			NULLIF(t.c.value('vossaReferencia[1]', 'varchar(50)'), ''), 
			t.c.value('estancia[1]', 'varchar(8)'), 
			t.c.value('tipoDeclaracao[1]', 'varchar(4)'), 			
			NULLIF(t.c.value('naturezaTransacao[1]', 'varchar(2)'), ''), 
			t.c.value('condicaoEntrega[1]', 'varchar(3)'),
			NULLIF(t.c.value('(localizacao/localidadeCE)[1]', 'varchar(30)'), ''),
			NULLIF(t.c.value('(localizacao/paisCE)[1]', 'varchar(2)'), ''),
			NULLIF(t.c.value('portoAeroporto[1]', 'varchar(3)'), ''), 
			t.c.value('(totais/fatura/pais)[1]', 'varchar(2)'),
			t.c.value('(totais/fatura/valorTotal)[1]', 'decimal(18, 3)'), 
			t.c.value('(totais/frete/pais)[1]', 'varchar(2)'),
			t.c.value('(totais/frete/valorTotal)[1]', 'decimal(18, 3)'), 
			t.c.value('(totais/seguro/pais)[1]', 'varchar(2)'),
			t.c.value('(totais/seguro/valorTotal)[1]', 'decimal(18, 3)'), 
			t.c.value('(totais/pesos/massaLiquida)[1]', 'decimal(18, 6)'), 
			t.c.value('(totais/pesos/massaBruta)[1]', 'decimal(18, 6)'), 
			NULLIF(t.c.value('(transporte/numeroNRUR)[1]', 'varchar(30)'), ''),
			NULLIF(t.c.value('(transporte/fronteira/meioTransporte)[1]', 'varchar(2)'), ''),
			NULLIF(t.c.value('(transporte/fronteira/pais)[1]', 'varchar(2)'), ''),
			NULLIF(t.c.value('(transporte/meioTransporteInterior)[1]', 'varchar(2)'), ''), 
			t.c.value('(transporte/meioTransporteChegada)[1]', 'varchar(2)'),
			NULLIF(t.c.value('(transporte/identificacao)[1]', 'varchar(30)'), ''),
			t.c.value('(transporte/contentorizada)[1]', 'int'),
			NULLIF(t.c.value('(transporte/numeroContentor)[1]', 'varchar(17)'), ''),
			NULLIF(t.c.value('(localizacaoMercadorias/tipoLocalizacao)[1]', 'varchar(1)'), ''),
			NULLIF(t.c.value('(localizacaoMercadorias/qualificador)[1]', 'varchar(1)'), ''),
			NULLIF(t.c.value('(localizacaoMercadorias/armazemDTP)[1]', 'varchar(17)'), ''), 
			NULLIF(t.c.value('(localizacaoMercadorias/estancia)[1]', 'varchar(8)'), ''), 
			NULLIF(t.c.value('(localizacaoMercadorias/nifOperadorEconomico)[1]', 'varchar(17)'), ''), 
			NULLIF(t.c.value('(localizacaoMercadorias/endereco/morada)[1]', 'varchar(70)'), ''), 
			NULLIF(t.c.value('(localizacaoMercadorias/endereco/localidade)[1]', 'varchar(35)'), ''), 
			NULLIF(t.c.value('(localizacaoMercadorias/endereco/codigoPostal)[1]', 'varchar(12)'), ''), 
			NULLIF(t.c.value('armazem[1]', 'varchar(17)'), ''),
			NULLIF(t.c.value('(dadosEspecificos/locID)[1]', 'varchar(6)'), ''), 
			NULLIF(t.c.value('(dadosEspecificos/gateway)[1]', 'varchar(6)'), ''), 
			t.c.value('(dadosEspecificos/serviceLevel)[1]', 'int'), 
			NULLIF(t.c.value('(dadosEspecificos/portesAcc)[1]', 'varchar(10)'), ''), 
			NULLIF(t.c.value('(dadosEspecificos/portes)[1]', 'varchar(13)'), ''), 
			NULLIF(t.c.value('(dadosEspecificos/despachoAcc)[1]', 'varchar(50)'), ''), 
			ISNULL(t.c.value('(dadosEspecificos/freteOriginal)[1]', 'decimal(18, 2)'), 0), 
			NULLIF(t.c.value('(dadosEspecificos/moedafreteOriginal)[1]', 'varchar(3)'), ''), 
			ISNULL(t.c.value('(dadosEspecificos/despesas)[1]', 'decimal(18, 3)'), 0), 
			NULLIF(t.c.value('(dadosEspecificos/condEntrega)[1]', 'varchar(2)'), ''), 
			NULLIF(t.c.value('(dadosEspecificos/nomeFicheiro)[1]', 'varchar(100)'), ''), 
			t.c.value('(depositoTemporario/numeroPDDT)[1]', 'int'), 
			t.c.value('(depositoTemporario/dataEntrada)[1]', 'datetime'), 
			t.c.value('(depositoTemporario/numeroPDDTDEV)[1]', 'int'), 
			t.c.value('(depositoTemporario/numeroTD)[1]', 'int'), 
			t.c.value('(depositoTemporario/numeroACTM)[1]', 'int'), 
			t.c.value('(depositoTemporario/numeroSequencia)[1]', 'int'), 
			NULLIF(t.c.value('(depositoTemporario/posicaoArmazem)[1]', 'varchar(4)'), ''), 
			NULLIF(t.c.value('(dadosAWB/miniCPA)[1]', 'varchar(20)'), ''), 
			t.c.value('(dadosAWB/dataVoo)[1]', 'datetime'),  
			NULLIF(t.c.value('(dadosAWB/aeroportoOrigem)[1]', 'varchar(80)'), ''), 
			NULLIF(t.c.value('(dadosAWB/numeroVoo)[1]', 'varchar(20)'), ''), 
			NULLIF(t.c.value('(dadosAWB/posicaoAviao)[1]', 'varchar(13)'), ''), 
			NULLIF(t.c.value('(dadosAWB/tracking)[1]', 'varchar(35)'), ''), 
			NULLIF(t.c.value('(dadosAWB/tipoCarga)[1]', 'varchar(5)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/numeroContaExpedidor)[1]', 'varchar(10)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/numeroContaDestinatario)[1]', 'varchar(10)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/nomeOriginalDestinatario)[1]', 'varchar(70)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/moradaOriginalDestinatario)[1]', 'varchar(70)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/localidadeOriginalDestinatario)[1]', 'varchar(35)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/codigoPostalOriginalDestinatario)[1]', 'varchar(12)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/localidadePostalOriginalDestinatario)[1]', 'varchar(35)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/referenciaExterna1)[1]', 'varchar(50)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/referenciaExterna2)[1]', 'varchar(50)'), ''), 
			NULLIF(t.c.value('(dadosEntidades/shipID)[1]', 'varchar(11)'), ''), 
			NULLIF(t.c.value('(outrosDados/dutyType)[1]', 'varchar(2)'), ''), 
			t.c.value('(outrosDados/payment)[1]', 'int'), 
			t.c.value('(outrosDados/dataDocumentoTransporte)[1]', 'datetime'),
			t.c.value('(outrosDados/numeroRequerimento)[1]', 'varchar(30)'), 
			t.c.value('(outrosDados/numeroDURetorno)[1]', 'varchar(30)'), 
			t.c.value('(outrosDados/numeroT1Retorno)[1]', 'varchar(30)'), 			
			NULLIF(t.c.value('anotacoes[1]', 'varchar(MAX)'), ''), 
			t.c.value('(followUp/codigoFollowUp)[1]', 'int'),
			NULLIF(t.c.value('(followUp/utilizadorNomeado)[1]', 'varchar(30)'), ''), 
			t.c.query('camposExtra'), 											
			t.c.query('documentosECertificados'), 
			t.c.query('documentosPrecedentes'),			
			t.c.query('pedidos'),
			t.c.query('adicoes'), 
			t.c.query('incidencias'), 
			t.c.query('followUps'),
			t.c.query('contactos'), 
			t.c.query('manifestos'), 
			t.c.query('arquivos')
		FROM @XMLDeclaracoes.nodes('declaracoesIMPToGIDWin/declaracao') AS t(c)			
	OPEN DeclaracoesIMP
	FETCH NEXT FROM DeclaracoesIMP INTO @acao, @data, @despachoCentralizado, @anexoB, @natureza, @documentoTransporte, @descricaoGenerica, @nifExportador, @nomeExportador, @moradaExportador, 
		@localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @paisExpedicao, @nifImportador, @tipoNIFImportador, @nomeImportador, @moradaImportador, 
		@localidadeImportador, @codigoPostalImportador, @localidadePostalImportador, @paisImportador, @telefoneImportador, @emailImportador, @paisDestino, @regiao, @declarante, 
		@estatutoDeclarante, @vossaReferencia, @estancia, @tipoDeclaracao, @naturezaTransacao, @condicaoEntrega, @localidadeCE, @paisCE, @portoAeroporto, @paisFatura, @valorTotalFatura, 
		@paisFrete, @valorTotalFrete, @paisSeguro, @valorTotalSeguro, @totalMassaLiquida, @totalMassaBruta, @numeroNRUR, @meioTransporteFronteira, @paisFronteira, @meioTransporteInterior, 
		@meioTransporteChegada, @identificacaoTransporte, @contentorizada, @numeroContentor, @tipoLocalizacao, @qualificador, @armazemDTP, @estanciaLM, @nifOperadorEconomico, @moradaLM, 
		@localidadeLM, @codigoPostalLM, @armazem, @locID, @gateway, @serviceLevel, @portesAcc, @portes, @despachoAcc, @freteOriginal, @moedafreteOriginal, @despesas, @condEntrega, @nomeFicheiro, 
		@numeroPDDT, @dataEntrada, @numeroPDDTDEV, @numeroTD, @numeroACTM, @numeroSequencia, @posicaoArmazem, @miniCPA, @dataVoo, @aeroportoOrigem, @numeroVoo, @posicaoAviao, @tracking, 
		@tipoCarga, @numeroContaExpedidor, @numeroContaDestinatario, @nomeOriginalDestinatario, @moradaOriginalDestinatario, @localidadeOriginalDestinatario, @codigoPostalOriginalDestinatario, 
		@localidadePostalOriginalDestinatario, @referenciaExterna1, @referenciaExterna2, @shipID, @dutyType, @payment, @dataDocumentoTransporte, @numeroRequerimento, @numeroDURetorno, 
		@numeroT1Retorno, @anotacoes, @followUp, @utilizadorNomeado, @XMLCamposExtra, @XMLDocumentos, @XMLPrecedentes, @XMLPedidos, @XMLAdicoes, @XMLIncidencias, @XMLFollowUps, @XMLContactos, 
		@XMLManifestos, @XMLArquivos
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- inicia transacção para importação da declaração IMP-CAU
		BEGIN TRANSACTION TspIMPImportacao
		BEGIN TRY	
-- inicia variáveis
			SET @Ano = YEAR(@data)	
			SET @Numero = NULL
			SET @IdDeclaracao = NULL
			SET @TotalAdicoes = 0
			SET @TotalVolumes = 0
			SET @TotalVolumesDirty = 0
			SET @TotalVolumesClean = 0
			SET @TotalVolumesScan = 0
			SET @TotalValorAduaneiro = 0
			SET @CodigoNatureza = NULL 
			SET @NomeNatureza = NULL
			SET @NaturezaRetorno = 0
			SET @CodigoFollowUp = NULL
			SET @CodigoUtilizadorNomeado = NULL
			SET @CodigoAlfandegaSujeicao = NULL
			SET @NomeAlfandegaSujeicao = NULL
			SET @CodigoAlfandegaApresentacao = NULL
			SET @CodigoLocalizacaoMercadoriasEstanciaSujeicao = NULL
			SET @CodigoTipoDeclaracao = NULL 
			SET @NomeTipoDeclaracao = NULL 
			SET @NaturezaTipoDeclaracao = NULL
			SET @1CasaTipoDeclaracao = NULL 
			SET @2CasaTipoDeclaracao = NULL 			
			SET @Regime = NULL
			SET @CodigoExportador = NULL 
			SET @CodigoPaisExportador = NULL
			SET @NomePaisExportador = NULL
			SET @CodigoPaisExpedicao = NULL
			SET @NomePaisExpedicao = NULL
			SET @CodigoPaisImportador = NULL
			SET @CodigoCliente = NULL
			SET @CodigoClienteCC = NULL
			SET @NIFResponsavelCaucaoCliente = NULL 
			SET @CodigoClienteServico = NULL 
			SET @NomeClienteServico = NULL
			SET @BeneficiarioIVACliente = 0
			SET @CaucaoCliente = NULL
			SET @AnoCaucaoCliente = NULL
			SET @TipoCaucaoCliente = NULL
			SET @AlfandegaCaucaoCliente = NULL
			SET @CodAcessoCaucaoCliente = NULL
			SET @OutrasRefCaucaoCliente = NULL
			SET @CodigoPaisDestino = NULL
			SET @NomePaisDestino = NULL
			SET @CodigoRegiao = NULL
			SET @CodigoDeclarante = NULL 
			SET @NomeDeclarante = NULL 
			SET @NIFDeclarante = NULL 
			SET @CedulaDeclarante = NULL 
			SET @CaucaoDeclarante = NULL
			SET @AnoCaucaoDeclarante = NULL
			SET @TipoCaucaoDeclarante = NULL
			SET @AlfandegaCaucaoDeclarante = NULL
			SET @CodAcessoCaucaoDeclarante = NULL
			SET @OutrasRefCaucaoDeclarante = NULL
			SET @CodigoMeioTransporteFronteira = NULL 
			SET @NomeMeioTransporteFronteira = NULL
			SET @CodigoPaisMeioTransporteFronteira = NULL
			SET @CodigoMeioTransporteInterior = NULL 			
			SET @CodigoMeioTransporteChegada = NULL
			SET @NomeMeioTransporteChegada = NULL
			SET @TipoIdentificacaoMeioTransporte = NULL 
			SET @TotalOptativas = 0
			SET @MeioTransportePorVolume = 0
			SET @CodigoCondicaoEntrega = NULL
			SET @CodigoFormula = NULL
			SET @TipoLocCondicaoEntrega = NULL
			SET @OpcaoLocCondicaoEntrega = NULL			
			SET @DescricaoFormula = NULL
			SET @FormulaFOB = 0
			SET @FormulaPositiva = 0
			SET @CodigoNaturezaTransacao = NULL
			SET @NomeNaturezaTransacao = NULL
			SET @CodigoPaisCondicaoEntrega = NULL
			SET @CodigoPortoAeroporto = NULL
			SET @CodigoLocalizacaoMercadorias = NULL
			SET @NomeLocalizacaoMercadorias = NULL
			SET @CodigoAlfandegaLM = NULL 
			SET @NomeAlfandegaLM = NULL
			SET @CodigoPaisMontante = NULL
			SET @MoedaMontante = NULL 
			SET @CambioMontante = 0
			SET @ValorTotalEUR = 0
			SET @CodigoPaisFrete = NULL
			SET @MoedaFrete = NULL 
			SET @CambioFrete = 0
			SET @CodigoPaisSeguro = NULL
			SET @MoedaSeguro = NULL 
			SET @CambioSeguro = 0
			SET @CodigoArmazem = NULL
			SET @NomeArmazem = NULL
			SET @CodigoTipoArmazem = NULL
			SET @NomeTipoArmazem = NULL
			SET @CodigoDocumentoArmazem = NULL
			SET @NumReferenciaArmazem = NULL
			SET @EORIArmazem = NULL
			SET @CodigoPaisVerbaTransitario = NULL 
			SET @MoedaVerbaTransitario = NULL
			SET @CambioVerbaTransitario = 0
			SET @SomaMontantesAdicoes = 0
			SET @SomaFretesAdicoes = 0
			SET @SomaSegurosAdicoes = 0
			SET @OperacaoManifesto = NULL
			SET @ExtraFieldUPDATEValue = NULL
-- obtem data atual GMT
			SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- verifica se documento transporte é válido
			IF (@ValidaAWB = 1) AND (@NumDigitosAWB > 0) AND (LEN(ISNULL(@documentoTransporte, '')) <> @NumDigitosAWB)
				RAISERROR('Documento de transporte "%s" inválido porque não cumpre o número de caracteres configurado.', 16, 1, @documentoTransporte)
-- obtem dados do follow-up
			SELECT @CodigoFollowUp = FUP_CODI
			FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK)
			WHERE FUP_EXPO = 0 AND FUP_CODI = @followUp
-- verifica se o follow-up é válido
			IF (@followUp IS NOT NULL) AND (@CodigoFollowUp IS NULL)
				RAISERROR('Follow-up "%d" inválido.', 16, 2, @followUp)
-- obtem dados do utilizador nomeado
			SELECT @CodigoUtilizadorNomeado = UTI_UTIL
			FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
			WHERE UTI_UTIL = @utilizadorNomeado
-- verifica se o utilizador nomeado é válido
			IF (ISNULL(@utilizadorNomeado, '') <> '') AND (ISNULL(@CodigoUtilizadorNomeado, '') = '')
				RAISERROR('Utilizador nomeado "%s" inválido.', 16, 3, @utilizadorNomeado)
-- obtem dados da natureza de despacho			
			SELECT @CodigoNatureza = NDE_CODI, @NomeNatureza = NDE_NOME, @NaturezaRetorno = NDE_RETO, 
				@CodigoFollowUp = (CASE WHEN (@CodigoFollowUp IS NULL) AND (FUP_CODI IS NOT NULL) THEN FUP_CODI ELSE @CodigoFollowUp END),
				@CodigoTipoDocContas = (CASE WHEN (@CamposAdicionais <> 3) AND (@InterfaceDUContas = 1) AND (@CodigoTipoDocContas <> '') AND (NDE_TLCV IS NOT NULL) AND (NDE_TLCV = 0) THEN @CodigoTipoDocContas ELSE NULL END)		
			FROM TAB_NDES WITH(NOLOCK)
			WHERE NDE_PART = 0 AND NDE_VDAR = 0 AND NDE_VEXI = 0 AND NDE_CODI = @natureza
-- verifica se a natureza é válida
			IF ISNULL(@CodigoNatureza, '') = ''
				RAISERROR('Natureza "%s" inválida.', 16, 4, @natureza)
-- obtem dados do Tipo de Declaração
			SELECT @CodigoTipoDeclaracao = TDE_CODI, @NomeTipoDeclaracao = TDE_NOME, @NaturezaTipoDeclaracao = ISNULL(TDE_NATU, 1), @1CasaTipoDeclaracao = TDE_1CAS, 
				@2CasaTipoDeclaracao = TDE_2CAS, @Regime = TDE_REGI
			FROM TAB_TDEC WITH(NOLOCK)
			WHERE ISNULL(TDE_1CAS, '') <> 'EU' AND ISNULL(TDE_2CAS, '') <> '' AND ISNULL(TDE_NATU, 0) = 1 AND TDE_CODI = @tipoDeclaracao	
-- verifica se o tipo de declaração é válido
			IF ISNULL(@CodigoTipoDeclaracao, '') = ''
				RAISERROR('Tipo de declaração "%s" inválido.', 16, 5, @tipoDeclaracao)
			ELSE
				IF ISNULL(@Regime, '') = ''
					RAISERROR('Tipo de declaração "%s" sem regime definido.', 16, 6, @tipoDeclaracao)
				ELSE
					IF ((@anexoB = 'H1') AND (LEFT(@Regime, 2) NOT IN ('01', '07', '40', '42', '43', '44', '45', '46', '48', '61', '63', '68')))
					OR ((@anexoB = 'H2') AND (LEFT(@Regime, 2) <> '71'))
					OR ((@anexoB = 'H3') AND (LEFT(@Regime, 2) <> '53'))
					OR ((@anexoB = 'H4') AND (LEFT(@Regime, 2) <> '51'))
					OR ((@anexoB = 'H5') AND (LEFT(@Regime, 2) NOT IN ('40', '42', '61', '63', '95', '96')))
					OR ((@anexoB = 'H6') AND (LEFT(@Regime, 2) NOT IN ('01', '07', '40')))
					OR ((@anexoB = 'I1') AND (LEFT(@Regime, 2) NOT IN ('01', '07', '40', '42', '43', '44', '45', '46', '48', '51', '53', '61', '63', '68')))
						RAISERROR('Regime "%s" não se enquadra no anexo "%s" da declaração.', 16, 7, @Regime, @anexoB)
					ELSE
						IF ISNULL(@2CasaTipoDeclaracao, '') NOT IN ('A', 'B', 'C', 'D', 'E', 'F')
							RAISERROR('Tipo de declaração adicional "%s" inválido.', 16, 8, @2CasaTipoDeclaracao)
-- obtem dados do país do fornecedor (exportador)
			SELECT @CodigoPaisExportador = PAI_CODI, @NomePaisExportador = PAI_NOME
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisExportador
-- verifica se o país do fornecedor (exportador) é válido
			IF (ISNULL(@paisExportador, '') <> '') AND (ISNULL(@CodigoPaisExportador, '') = '')
				RAISERROR('País "%s" do exportador inválido.', 16, 9, @paisExportador)
-- obtem dados do fornecedor (exportador)
			SELECT TOP 1 @CodigoExportador = frn.FOR_CODI, @nomeExportador = ISNULL(frn.FOR_NOME, @nomeExportador), @CodigoPaisExportador = ISNULL(pai.PAI_CODI, @CodigoPaisExportador), 
				@NomePaisExportador = ISNULL(pai.PAI_NOME, @NomePaisExportador), @moradaExportador = ISNULL(frn.FOR_MORA, @moradaExportador), 
				@localidadeExportador = ISNULL(frn.FOR_LOCA, @localidadeExportador), @codigoPostalExportador = ISNULL(frn.FOR_CPOS, @codigoPostalExportador), 
				@localidadePostalExportador = ISNULL(frn.FOR_LPOS, @localidadePostalExportador)
			FROM TAB_FORN AS frn WITH(NOLOCK) 
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON frn.PAI_CODI = pai.PAI_CODI
			WHERE frn.FOR_INAC = 0 AND frn.FOR_DESP = 1 AND frn.FOR_NIF = @nifExportador
-- obtem dados do país de expedição
			SELECT @CodigoPaisExpedicao = PAI_CODI, @NomePaisExpedicao = PAI_NOME
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisExpedicao
-- verifica se o país de expedição é válido
			IF (ISNULL(@paisExpedicao, '') <> '') AND (ISNULL(@CodigoPaisExpedicao, '') = '')
				RAISERROR('País de expedição "%s" inválido.', 16, 10, @paisExpedicao)				
			ELSE
				IF (@anexoB IN ('H6', 'I2')) AND (ISNULL(@CodigoPaisExpedicao, '') <> '')
					RAISERROR('País de expedição "%s" inválido para o anexo B "%s".', 16, 11, @CodigoPaisExpedicao, @anexoB)	
				ELSE
					IF (@anexoB NOT IN ('H6', 'I2')) AND (ISNULL(@CodigoPaisExpedicao, '') = '')
						RAISERROR('O anexo B "%s" obriga ao preenchimento do país de expedição.', 16, 12, @anexoB)	
-- obtem dados da região
			SELECT @CodigoRegiao = (CASE WHEN RES_DONO IS NOT NULL THEN RES_DONO ELSE RES_CODI END)
			FROM TAB_REST WITH(NOLOCK)
			WHERE RES_CODI = @regiao
-- verifica se o país de expedição é válido
			IF (@regiao IS NOT NULL) AND (@CodigoRegiao IS NULL)
				RAISERROR('Região "%d" inválida.', 16, 13, @regiao)
			ELSE
				IF (@anexoB IN ('H6', 'I1', 'I2')) AND (@CodigoRegiao IS NOT NULL)
					RAISERROR('Região "%d" inválida para o anexo B "%s".', 16, 14, @CodigoRegiao, @anexoB)					
-- obtem dados do país do cliente (importador)
			SELECT @CodigoPaisImportador = PAI_CODI
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisImportador
-- verifica se o país do cliente (importador) é válido
			IF ISNULL(@CodigoPaisImportador, '') = '' 
				RAISERROR('País "%s" do importador inválido.', 16, 15, @paisImportador)				
-- obtem dados do cliente (importador)
			SELECT TOP 1 @CodigoCliente = cli.CLI_CODI, @CodigoClienteCC = ISNULL(NULLIF(cli.CLI_CCOR, ''), cli.CLI_CODI), @NIFResponsavelCaucaoCliente = cli.CLI_CNIF, 
				@CodigoClienteServico = cli.CLI_SENT, @NomeClienteServico = cse.CLI_NOME, 
				@nomeImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @nomeImportador 
										ELSE ISNULL(cli.CLI_NOME, @nomeImportador) 
									END), 
				@CodigoPaisImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @CodigoPaisImportador 
										ELSE ISNULL(pai.PAI_CODI, @CodigoPaisImportador)
									END), 				
				@moradaImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @moradaImportador 
										ELSE ISNULL(cli.CLI_MORA, @moradaImportador) 
									END), 
				@localidadeImportador = (CASE 
											WHEN cli.CLI_NIF = '999999990' THEN @localidadeImportador 
											ELSE ISNULL(cli.CLI_LOCA, @localidadeImportador) 
										END), 
				@codigoPostalImportador = (CASE 
											WHEN cli.CLI_NIF = '999999990' THEN @codigoPostalImportador 
											ELSE ISNULL(cli.CLI_CPOS, @codigoPostalImportador)
										END), 
				@localidadePostalImportador = (CASE 
												WHEN cli.CLI_NIF = '999999990' THEN @localidadePostalImportador 
												ELSE ISNULL(cli.CLI_LPOS, @localidadePostalImportador) 
										END), 
				@telefoneImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @telefoneImportador 
										ELSE ISNULL(cli.CLI_TELF, @telefoneImportador)
									END), 
				@emailImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @emailImportador 
										ELSE ISNULL(cli.CLI_EMAI, @emailImportador) 
									END), 
				@tipoNIFImportador = (CASE 
										WHEN cli.CLI_NIF = '999999990' THEN @tipoNIFImportador
										ELSE ISNULL(cli.CLI_TNIF, @tipoNIFImportador) 
									END), 						
				@BeneficiarioIVACliente = (CASE
					WHEN  (cli.CLI_BIVA = 1) AND (cli.CLI_DIBI <= @data) THEN 1 
					ELSE 0
				END), 
				@CaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN (ISNULL(RIGHT(cli.CLI_ANO1, 2), '') + ISNULL(cli.ALF_CODI1, '') + REPLICATE('0', (7 - LEN(cli.CLI_NCA1))) + cli.CLI_NCA1)
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN (ISNULL(RIGHT(cli.CLI_ANO2, 2), '') + ISNULL(cli.ALF_CODI2, '') + REPLICATE('0', (7 - LEN(cli.CLI_NCA2))) + cli.CLI_NCA2)
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN (ISNULL(RIGHT(cli.CLI_ANO3, 2), '') + ISNULL(cli.ALF_CODI3, '') + REPLICATE('0', (7 - LEN(cli.CLI_NCA3))) + cli.CLI_NCA3)
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN (ISNULL(RIGHT(cli.CLI_ANO4, 2), '') + ISNULL(cli.ALF_CODI4, '') + REPLICATE('0', (7 - LEN(cli.CLI_NCA4))) + cli.CLI_NCA4)
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN (ISNULL(RIGHT(cli.CLI_ANO5, 2), '') + ISNULL(cli.ALF_CODI5, '') + REPLICATE('0', (7 - LEN(cli.CLI_NCA5))) + cli.CLI_NCA5)
					ELSE NULL 
				END),
				@AnoCaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN cli.CLI_ANO1
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN cli.CLI_ANO2
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN cli.CLI_ANO3
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN cli.CLI_ANO4
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN cli.CLI_ANO5
					ELSE NULL 
				END),
				@TipoCaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN cli.CLI_TCA1
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN cli.CLI_TCA2
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN cli.CLI_TCA3
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN cli.CLI_TCA4
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN cli.CLI_TCA5
					ELSE NULL 
				END),
				@AlfandegaCaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN cli.ALF_CODI1
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN cli.ALF_CODI2
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN cli.ALF_CODI3
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN cli.ALF_CODI4
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN cli.ALF_CODI5
					ELSE NULL 
				END),
				@CodAcessoCaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN cli.CLI_CCA1
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN cli.CLI_CCA2
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN cli.CLI_CCA3
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN cli.CLI_CCA4
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN cli.CLI_CCA5
					ELSE NULL 
				END),
				@OutrasRefCaucaoCliente = (CASE 
					WHEN (ISNULL(cli.CLI_NCA1, '') <> '') AND (cli.CLI_INA1 = 0) THEN cli.CLI_OCA1
					WHEN (ISNULL(cli.CLI_NCA2, '') <> '') AND (cli.CLI_INA2 = 0) THEN cli.CLI_OCA2
					WHEN (ISNULL(cli.CLI_NCA3, '') <> '') AND (cli.CLI_INA3 = 0) THEN cli.CLI_OCA3
					WHEN (ISNULL(cli.CLI_NCA4, '') <> '') AND (cli.CLI_INA4 = 0) THEN cli.CLI_OCA4
					WHEN (ISNULL(cli.CLI_NCA5, '') <> '') AND (cli.CLI_INA5 = 0) THEN cli.CLI_OCA5
					ELSE NULL 
				END), 
				@CodigoRegiao = (CASE WHEN (@CodigoRegiao IS NULL) AND (@anexoB NOT IN ('H6', 'I1', 'I2')) THEN cli.RES_CODI ELSE @CodigoRegiao END)
			FROM TAB_CLIE AS cli WITH(NOLOCK) 
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON cli.PAI_CODI = pai.PAI_CODI
				LEFT OUTER JOIN TAB_CLIE AS cse WITH(NOLOCK) ON cli.CLI_SENT = cse.CLI_CODI
			WHERE cli.CLI_INAC = 0 AND cli.CLI_DESP = 1 AND cli.CLI_NIF = @nifImportador
-- se cliente (importador) não existir, assume como cliente "Consumidor Final"
			IF ISNULL(@CodigoCliente, '') = ''
			BEGIN
				SELECT TOP 1 @CodigoCliente = CLI_CODI, @CodigoClienteCC = ISNULL(NULLIF(CLI_CCOR, ''), CLI_CODI), @NIFResponsavelCaucaoCliente = CLI_CNIF, 						
					@BeneficiarioIVACliente = (CASE
						WHEN  (CLI_BIVA = 1) AND (CLI_DIBI <= @data) THEN 1 
						ELSE 0
					END), 
					@CaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN (ISNULL(RIGHT(CLI_ANO1, 2), '') + ISNULL(ALF_CODI1, '') + REPLICATE('0', (7 - LEN(CLI_NCA1))) + CLI_NCA1)
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN (ISNULL(RIGHT(CLI_ANO2, 2), '') + ISNULL(ALF_CODI2, '') + REPLICATE('0', (7 - LEN(CLI_NCA2))) + CLI_NCA2)
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN (ISNULL(RIGHT(CLI_ANO3, 2), '') + ISNULL(ALF_CODI3, '') + REPLICATE('0', (7 - LEN(CLI_NCA3))) + CLI_NCA3)
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN (ISNULL(RIGHT(CLI_ANO4, 2), '') + ISNULL(ALF_CODI4, '') + REPLICATE('0', (7 - LEN(CLI_NCA4))) + CLI_NCA4)
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN (ISNULL(RIGHT(CLI_ANO5, 2), '') + ISNULL(ALF_CODI5, '') + REPLICATE('0', (7 - LEN(CLI_NCA5))) + CLI_NCA5)
						ELSE NULL 
					END),
					@AnoCaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN CLI_ANO1
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN CLI_ANO2
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN CLI_ANO3
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN CLI_ANO4
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN CLI_ANO5
						ELSE NULL 
					END),
					@TipoCaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN CLI_TCA1
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN CLI_TCA2
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN CLI_TCA3
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN CLI_TCA4
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN CLI_TCA5
						ELSE NULL 
					END),
					@AlfandegaCaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN ALF_CODI1
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN ALF_CODI2
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN ALF_CODI3
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN ALF_CODI4
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN ALF_CODI5
						ELSE NULL 
					END),
					@CodAcessoCaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN CLI_CCA1
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN CLI_CCA2
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN CLI_CCA3
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN CLI_CCA4
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN CLI_CCA5
						ELSE NULL 
					END),
					@OutrasRefCaucaoCliente = (CASE 
						WHEN (ISNULL(CLI_NCA1, '') <> '') AND (CLI_INA1 = 0) THEN CLI_OCA1
						WHEN (ISNULL(CLI_NCA2, '') <> '') AND (CLI_INA2 = 0) THEN CLI_OCA2
						WHEN (ISNULL(CLI_NCA3, '') <> '') AND (CLI_INA3 = 0) THEN CLI_OCA3
						WHEN (ISNULL(CLI_NCA4, '') <> '') AND (CLI_INA4 = 0) THEN CLI_OCA4
						WHEN (ISNULL(CLI_NCA5, '') <> '') AND (CLI_INA5 = 0) THEN CLI_OCA5
						ELSE NULL 
					END), 
					@CodigoRegiao = (CASE WHEN (@CodigoRegiao IS NULL) AND (@anexoB NOT IN ('H6', 'I1', 'I2')) THEN RES_CODI ELSE @CodigoRegiao END)
				FROM TAB_CLIE WITH(NOLOCK) 
				WHERE CLI_INAC = 0 AND CLI_DESP = 1 AND CLI_NIF = '999999990'
			END
-- verifica se o cliente (importador) é válido
			IF ISNULL(@CodigoCliente, '') = ''
				RAISERROR('Cliente importador "%s" inválido.', 16, 16, @nifImportador)							
-- obtem dados do país de destino
			SELECT @CodigoPaisDestino = PAI_CODI, @NomePaisDestino = PAI_NOME
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisDestino
-- verifica se o país de expedição é válido
			IF ISNULL(@CodigoPaisDestino, '') = ''
				RAISERROR('País de destino "%s" inválido.', 16, 17, @paisDestino)
			ELSE
				IF (ISNULL(@CodigoPaisDestino, '') = 'PT') AND (LEFT(@Regime, 2) IN ('42', '63'))
					RAISERROR('País "%s" de destino inválido para o regime "%s".', 16, 18, @paisImportador, @Regime)	
-- obtem dados do declarante
			SELECT @CodigoDeclarante = DEC_CODI, @NomeDeclarante = DEC_NOME, @CedulaDeclarante = DEC_CEDU, @NIFDeclarante = DEC_NIF, 				
				@CaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN (ISNULL(RIGHT(DEC_ACA1, 2), '') + ISNULL(ALF_CODI1, '') + REPLICATE('0', (7 - LEN(DEC_NCA1))) + DEC_NCA1)
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN (ISNULL(RIGHT(DEC_ACA2, 2), '') + ISNULL(ALF_CODI2, '') + REPLICATE('0', (7 - LEN(DEC_NCA2))) + DEC_NCA2)
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN (ISNULL(RIGHT(DEC_ACA3, 2), '') + ISNULL(ALF_CODI3, '') + REPLICATE('0', (7 - LEN(DEC_NCA3))) + DEC_NCA3)
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN (ISNULL(RIGHT(DEC_ACA4, 2), '') + ISNULL(ALF_CODI4, '') + REPLICATE('0', (7 - LEN(DEC_NCA4))) + DEC_NCA4)
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN (ISNULL(RIGHT(DEC_ACA5, 2), '') + ISNULL(ALF_CODI5, '') + REPLICATE('0', (7 - LEN(DEC_NCA5))) + DEC_NCA5)
					ELSE NULL 
				END),
				@AnoCaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN DEC_ACA1
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN DEC_ACA2
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN DEC_ACA3
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN DEC_ACA4
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN DEC_ACA5
					ELSE NULL 
				END),
				@TipoCaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN DEC_TCA1
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN DEC_TCA2
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN DEC_TCA3
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN DEC_TCA4
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN DEC_TCA5
					ELSE NULL 
				END),
				@AlfandegaCaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN ALF_CODI1
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN ALF_CODI2
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN ALF_CODI3
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN ALF_CODI4
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN ALF_CODI5
					ELSE NULL 
				END),
				@CodAcessoCaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN DEC_CCA1
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN DEC_CCA2
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN DEC_CCA3
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN DEC_CCA4
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN DEC_CCA5
					ELSE NULL 
				END),
				@OutrasRefCaucaoDeclarante = (CASE 
					WHEN (ISNULL(DEC_NCA1, '') <> '') AND (DEC_INA1 = 0) THEN DEC_OCA1
					WHEN (ISNULL(DEC_NCA2, '') <> '') AND (DEC_INA2 = 0) THEN DEC_OCA2
					WHEN (ISNULL(DEC_NCA3, '') <> '') AND (DEC_INA3 = 0) THEN DEC_OCA3
					WHEN (ISNULL(DEC_NCA4, '') <> '') AND (DEC_INA4 = 0) THEN DEC_OCA4
					WHEN (ISNULL(DEC_NCA5, '') <> '') AND (DEC_INA5 = 0) THEN DEC_OCA5
					ELSE NULL 
				END)
			FROM TAB_DECL WITH(NOLOCK) 
			WHERE DEC_INAC = 0 AND DEC_CODI = @declarante
-- verifica se o declarante é válido
			IF ISNULL(@CodigoDeclarante, '') = ''
				RAISERROR('Declarante "%s" inválido.', 16, 19, @declarante)						
-- obtem dados da condição de entrega 
			SELECT @CodigoCondicaoEntrega = CEN_CODI, @TipoLocCondicaoEntrega = CEN_LOCT, @OpcaoLocCondicaoEntrega = CEN_LOCD, 
				@CodigoFormula = (CASE 
									WHEN CEN_FOR1 = 1 THEN FIN_CODI1 
									WHEN CEN_FOR2 = 1 THEN FIN_CODI2 
									WHEN CEN_FOR3 = 1 THEN FIN_CODI3 
									WHEN CEN_FOR4 = 1 THEN FIN_CODI4 
									WHEN CEN_FOR5 = 1 THEN FIN_CODI5 
									ELSE NULL 
								END)
			FROM TAB_CENT WITH(NOLOCK)
			WHERE CEN_CODI = @condicaoEntrega
-- verifica se a condição de entrega é válida
			IF ISNULL(@CodigoCondicaoEntrega, '') = '' 
				RAISERROR('Condição de entrega "%s" inválida.', 16, 20, @condicaoEntrega)	
-- obtem dados da formula obtida	
			SELECT @DescricaoFormula = NULLIF(FIN_DESC, ''), 
				@FormulaFOB = FIN_VFOB, 
				@FormulaPositiva = (CASE 
										WHEN ISNULL(NULLIF(CHARINDEX('+', ISNULL(FIN_DESC, '')), 0), 999999999) < ISNULL(NULLIF(CHARINDEX('-', ISNULL(FIN_DESC, '')), 0), 999999999) THEN 1 
										ELSE 0 
									END)			
			FROM TAB_FINC WITH(NOLOCK)
			WHERE FIN_CODI = @CodigoFormula
-- obtem dados do país da condição de entrega
			SELECT @CodigoPaisCondicaoEntrega = PAI_CODI
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisCE
-- verifica se o país da condição de entrega é válido
			IF (ISNULL(@paisCE, '') <> '') AND (ISNULL(@CodigoPaisCondicaoEntrega, '') = '')
				RAISERROR('País da condição de entrega "%s" inválido.', 16, 21, @paisCE)	
-- obtem dados do porto/aeroporto
			SELECT @CodigoPortoAeroporto = PAE_CODI
			FROM TAB_PAER WITH(NOLOCK)
			WHERE PAE_CODI = @portoAeroporto AND ((@FormulaPositiva = 0 AND PAI_CODI = 'PT') OR (@FormulaPositiva = 1 AND PAI_CODI = ISNULL(NULLIF(@CodigoPaisExportador, ''), PAI_CODI)))
-- verifica se o porto/aeroporto é válido
			IF (ISNULL(@portoAeroporto, '') <> '') AND (ISNULL(@CodigoPortoAeroporto, '') = '')
				RAISERROR('Porto/Aeroporto "%s" inválido.', 16, 22, @portoAeroporto)	
-- obtem dados da alfândega de sujeição
			SELECT @CodigoAlfandegaSujeicao = ALF_CODI, @NomeAlfandegaSujeicao = ALF_NOME, @CodigoLocalizacaoMercadoriasEstanciaSujeicao = LME_CODI, 
				@CodigoPortoAeroporto = (CASE WHEN (ISNULL(@CodigoPortoAeroporto, '') = '') AND (ISNULL(@localidadeCE, '') = '') AND (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (@FormulaPositiva = 0) AND (ISNULL(PAE_CODI, '') <> '') THEN PAE_CODI ELSE @CodigoPortoAeroporto END), 				
				@tipoLocalizacao = (CASE WHEN (ISNULL(@tipoLocalizacao, '') = '') AND (@anexoB <> 'H6') THEN (CASE ALF_TLOC WHEN 'EA' THEN 'A' WHEN 'LA' THEN 'B' WHEN 'OL' THEN 'D' ELSE 'B' END) ELSE @tipoLocalizacao END), 
				@qualificador = (CASE WHEN (ISNULL(@qualificador, '') = '') AND (@anexoB <> 'H6') THEN (CASE ALF_TLOC WHEN 'EA' THEN 'V' WHEN 'LA' THEN 'Y' WHEN 'OL' THEN 'Z' ELSE NULL END) ELSE @qualificador END)
			FROM TAB_ALFA WITH(NOLOCK)
			WHERE LEN(ALF_CODI) = 8 AND ALF_CODI = @estancia
-- verifica se a alfândega é válida
			IF ISNULL(@CodigoAlfandegaSujeicao, '') = ''
				RAISERROR('Alfândega "%s" inválida.', 16, 23, @estancia)
			ELSE
				IF (@anexoB = 'H6') AND (ISNULL(@CodigoAlfandegaSujeicao, '') <> 'PT000236')
					RAISERROR('Alfândega "%s" inválida para o anexo B "%s".', 16, 24, @CodigoAlfandegaSujeicao, @anexoB)
				ELSE
					IF (@anexoB <> 'H6') AND (@despachoCentralizado = 1)
						SET @CodigoAlfandegaApresentacao = @CodigoAlfandegaSujeicao			
-- obtem dados da natureza de transação
			SELECT @CodigoNaturezaTransacao = NTR_CODI, @NomeNaturezaTransacao = NTR_NOME
			FROM TAB_NTRA WITH(NOLOCK)
			WHERE NTR_CODI = @naturezaTransacao	
-- verifica se a natureza de transação é válida
			IF (ISNULL(@naturezaTransacao, '') <> '') AND (ISNULL(@CodigoNaturezaTransacao, '') = '')
				RAISERROR('Natureza de transação "%s" inválida.', 16, 25, @naturezaTransacao)							
-- obtem dados do país da moeda do montante
			SELECT @CodigoPaisMontante = PAI_CODI, @MoedaMontante = PAI_PREF, @CambioMontante = dbo.FNT_Geral_ObtemCambio(0, PAI_CODI, @data)
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisFatura
-- verifica se o país da moeda do montante é válido
			IF ISNULL(@CodigoPaisMontante, '') = ''				
				RAISERROR('País "%s" da moeda da fatura inválido.', 16, 26, @paisFatura)	
			ELSE
				SET @ValorTotalEUR = ROUND(@valorTotalFatura / ISNULL(NULLIF(@CambioMontante, 0), 1), 2)
-- obtem dados do país da moeda do frete
			SELECT @CodigoPaisFrete = PAI_CODI, @MoedaFrete = PAI_PREF, @CambioFrete = dbo.FNT_Geral_ObtemCambio(0, PAI_CODI, @data)
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisFrete
-- verifica se o país da moeda do frete é válido
			IF ISNULL(@CodigoPaisFrete, '') = ''	
				RAISERROR('País "%s" da moeda do frete inválido.', 16, 27, @paisFrete)
-- obtem dados do país da moeda do seguro
			SELECT @CodigoPaisSeguro = PAI_CODI, @MoedaSeguro = PAI_PREF, @CambioSeguro = dbo.FNT_Geral_ObtemCambio(0, PAI_CODI, @data)
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisSeguro
-- verifica se o país da moeda do seguro é válido
			IF ISNULL(@CodigoPaisSeguro, '') = ''	
				RAISERROR('País "%s" da moeda do seguro inválido.', 16, 28, @paisSeguro)						
-- verifica se a massa líquida/massa bruta são válidas
			IF @totalMassaLiquida > @totalMassaBruta
				RAISERROR('Massa líquida superior à massa bruta.', 16, 29)															
-- obtem dados do meio de transporte fronteira
			SELECT @CodigoMeioTransporteFronteira = MTR_CODI, @NomeMeioTransporteFronteira = MTR_NOME				
			FROM TAB_MTRA WITH(NOLOCK)
			WHERE MTR_CODI = @meioTransporteFronteira
-- verifica se o meio de transporte fronteira é válido
			IF (ISNULL(@meioTransporteFronteira, '') <> '') AND (ISNULL(@CodigoMeioTransporteFronteira, '') = '')
				RAISERROR('Meio de transporte fronteira "%s" inválido.', 16, 30, @meioTransporteFronteira)	
-- obtem dados do país do meio de transporte fronteira
			SELECT @CodigoPaisMeioTransporteFronteira = PAI_CODI	
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisFronteira
-- verifica se o país do meio de transporte fronteira é válido
			IF (ISNULL(@paisFronteira, '') <> '') AND (ISNULL(@CodigoPaisMeioTransporteFronteira, '') = '')
				RAISERROR('País do meio de transporte fronteira "%s" inválido.', 16, 31, @paisFronteira)
-- obtem dados do meio de transporte interior
			SELECT @CodigoMeioTransporteInterior = MTR_CODI
			FROM TAB_MTRA WITH(NOLOCK)
			WHERE MTR_CODI = @meioTransporteInterior
-- verifica se o meio de transporte interior é válido
			IF (ISNULL(@meioTransporteInterior, '') <> '') AND (ISNULL(@CodigoMeioTransporteInterior, '') = '')
				RAISERROR('Meio de transporte interior "%s" inválido.', 16, 32, @meioTransporteInterior)	
-- obtem dados do meio de transporte chegada
			SELECT @CodigoMeioTransporteChegada = mtr.MTR_CODI, @NomeMeioTransporteChegada = mtr.MTR_NOME, 
				@TotalOptativas = (CASE mtr.MTR_OPAU 
												WHEN 1 THEN ISNULL((SELECT TOP 1 MTO_VOPT 
																	FROM TAB_MTRO WITH(NOLOCK) 
																	WHERE MTR_IDTY = mtr.MTR_IDTY 
																		AND @totalMassaBruta BETWEEN MTO_LMNP AND MTO_LMXP 
																		AND @ValorTotalEUR BETWEEN MTO_LMNV AND MTO_LMXV), 0) 
												ELSE ISNULL(mtr.MTR_VOP1, 0) 
											END), 
				@TipoIdentificacaoMeioTransporte = (CASE WHEN @anexoB NOT IN ('H2', 'H6', 'I1', 'I2') THEN mtr.MTR_TIPO ELSE NULL END), 
				@MeioTransportePorVolume = (CASE ISNULL(mtr.MTR_VPVL, 0) WHEN 2 THEN 1 ELSE 0 END), 
				@CodigoMeioTransporteFronteira = (CASE WHEN (ISNULL(@CodigoMeioTransporteFronteira, '') = '') AND (@anexoB NOT IN ('H6', 'I1', 'I2')) THEN mtr.MTR_CODI ELSE @CodigoMeioTransporteFronteira END)
			FROM TAB_MTRA AS mtr WITH(NOLOCK)
			WHERE mtr.MTR_CODI = @meioTransporteChegada
-- verifica se o meio de transporte é válido
			IF ISNULL(@CodigoMeioTransporteChegada, '') = ''
				RAISERROR('Meio de transporte chegada "%s" inválido.', 16, 33, @meioTransporteChegada)	
-- obtem dados da localização de mercadorias
			SELECT @CodigoLocalizacaoMercadorias = LME_CODI, @NomeLocalizacaoMercadorias = LME_NOME
			FROM TAB_LMER WITH(NOLOCK)
			WHERE LME_CODI = @armazemDTP AND LME_FLUX = 1 AND LEFT(RIGHT(LME_CODI, 5), 3) = (CASE @qualificador WHEN 'U' THEN LEFT(RIGHT(LME_CODI, 5), 3) ELSE RIGHT(@CodigoAlfandegaSujeicao, 3) END)
-- verifica se a localização das mercadorias é válida
			IF (ISNULL(@armazemDTP, '') <> '') AND (ISNULL(@CodigoLocalizacaoMercadorias, '') = '')
				RAISERROR('Armazém DTP "%s" da localização das mercadorias inválido.', 16, 34, @armazemDTP)
			ELSE
				IF (ISNULL(@CodigoLocalizacaoMercadorias, '') = '') AND (ISNULL(@qualificador, '') = 'Y') 
					SET @CodigoLocalizacaoMercadorias = @CodigoLocalizacaoMercadoriasEstanciaSujeicao
-- obtem dados da estância da localização das mercadorias
			SELECT @CodigoAlfandegaLM = ALF_CODI, @NomeAlfandegaLM = ALF_NOME
			FROM TAB_ALFA WITH(NOLOCK)
			WHERE LEFT(ALF_CODI, 2) = 'PT' AND LEN(ALF_CODI) = 8 AND ALF_CODI = @estanciaLM
-- verifica se a estância da localização das mercadorias é válida
			IF (ISNULL(@estanciaLM, '') <> '') AND (ISNULL(@CodigoAlfandegaLM, '') = '')
				RAISERROR('Alfândega "%s" da localização das mercadorias inválida.', 16, 35, @estanciaLM)
			ELSE
				IF (ISNULL(@CodigoAlfandegaLM, '') = '') AND (ISNULL(@qualificador, '') = 'V') 
					SET @CodigoAlfandegaLM = @CodigoAlfandegaSujeicao
-- obtem dados do armazém
			SELECT @CodigoArmazem = arm.ARM_CODI, @NomeArmazem = arm.ARM_NOME, @CodigoDocumentoArmazem = arm.DOC_CODI, @NumReferenciaArmazem = arm.ARM_NAUT, @EORIArmazem = arm.ARM_EORI, 
				@CodigoTipoArmazem = tar.TAR_CODI, @NomeTipoArmazem = tar.TAR_DESC
			FROM TAB_ARMZ AS arm WITH(NOLOCK)
				LEFT OUTER JOIN TAB_TARM AS tar WITH(NOLOCK) ON arm.TAR_CODI = tar.TAR_CODI
			WHERE arm.ARM_CODI = @armazem
-- verifica se o armazém é válido
			IF (ISNULL(@armazem, '') <> '') AND (ISNULL(@CodigoArmazem, '') = '')
				RAISERROR('Armazém "%s" inválido.', 16, 36, @armazem)
-- obtem dados do país da moeda da verba transitário
			SELECT @CodigoPaisVerbaTransitario = PAI_CODI, @MoedaVerbaTransitario = PAI_PREF, @CambioVerbaTransitario = dbo.FNT_Geral_ObtemCambio(0, PAI_CODI, @data)
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = 'EU'
-- verifica se o país da moeda da verba transitário é válido
			IF ISNULL(@CodigoPaisVerbaTransitario, '') = ''	
				RAISERROR('País "EU" da moeda da verba transitário inválido.', 16, 37)	
-- calcula a localidade e pais da condição de entrega
			IF (ISNULL(@CodigoPortoAeroporto, '') = '') AND (ISNULL(@localidadeCE, '') = '') AND (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (@TipoLocCondicaoEntrega = 1)
			BEGIN
				IF @OpcaoLocCondicaoEntrega = 0 
					SET @localidadeCE = @localidadeExportador 
				ELSE 
					SET @localidadeCE = @localidadeImportador 
			END 
			IF (ISNULL(@CodigoPortoAeroporto, '') = '') AND (ISNULL(@paisCE, '') = '') AND (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (@TipoLocCondicaoEntrega = 1)
			BEGIN
				IF @OpcaoLocCondicaoEntrega = 0 
					SET @CodigoPaisCondicaoEntrega = @CodigoPaisExportador 
				ELSE 
					SET @CodigoPaisCondicaoEntrega = @CodigoPaisImportador 
			END
-- calcula todos os dados da garantia		
			IF @anexoB IN ('H2', 'I1', 'I2')
			BEGIN
				SET @GarantiaGlobal = 0
				SET @TipoEntidadeCaucao = NULL
				SET @NumeroNRG = NULL
				SET @AnoCaucao = NULL
				SET @TipoCaucao = NULL
				SET @AlfandegaCaucao = NULL
				SET @CodAcessoCaucao = NULL
				SET @OutrasRefCaucao = NULL
				SET @NIFResponsavelCaucao = NULL
			END
			ELSE
			BEGIN
				SET  @GarantiaGlobal = 1
				IF ISNULL(@CaucaoCliente, '') <> ''
				BEGIN
					SET @TipoEntidadeCaucao = 1
					SET @NumeroNRG = @CaucaoCliente
					SET @AnoCaucao = @AnoCaucaoCliente
					SET @TipoCaucao = @TipoCaucaoCliente
					SET @AlfandegaCaucao = @AlfandegaCaucaoCliente
					SET @CodAcessoCaucao = @CodAcessoCaucaoCliente
					SET @OutrasRefCaucao = @OutrasRefCaucaoCliente
					IF @anexoB IN ('H1', 'H3', 'H4', 'H5', 'H6')
						SET @NIFResponsavelCaucao = @NIFResponsavelCaucaoCliente
					ELSE
						SET @NIFResponsavelCaucao = NULL
				END
				ELSE
					IF ISNULL(@CaucaoDeclarante, '') <> ''
					BEGIN
						SET @TipoEntidadeCaucao = 0
						SET @NumeroNRG = @CaucaoDeclarante
						SET @AnoCaucao = @AnoCaucaoDeclarante
						SET @TipoCaucao = @TipoCaucaoDeclarante
						SET @AlfandegaCaucao = @AlfandegaCaucaoDeclarante
						SET @CodAcessoCaucao = @CodAcessoCaucaoDeclarante
						SET @OutrasRefCaucao = @OutrasRefCaucaoDeclarante
						SET @NIFResponsavelCaucao = NULL
					END
					ELSE
					BEGIN
						SET @TipoEntidadeCaucao = NULL
						SET @NumeroNRG = NULL
						SET @AnoCaucao = NULL
						SET @TipoCaucao = NULL
						SET @AlfandegaCaucao = NULL
						SET @CodAcessoCaucao = NULL
						SET @OutrasRefCaucao = NULL
						SET @NIFResponsavelCaucao = NULL
					END	
			END		
-- calcula os dados do endereço das mercadorias
			IF (ISNULL(@moradaLM, '') = '') AND (ISNULL(@qualificador, '') = 'Z')
				SET @moradaLM = @moradaImportador
			IF (ISNULL(@codigoPostalLM, '') = '') AND (ISNULL(@qualificador, '') = 'Z')
				SET @codigoPostalLM = @codigoPostalImportador
			IF (ISNULL(@localidadeLM, '') = '') AND (ISNULL(@qualificador, '') = 'Z')
				SET @localidadeLM = @localidadePostalImportador
-- verifica as regras da estância de apresentação
			IF (@anexoB = 'H6') AND (ISNULL(@CodigoAlfandegaApresentacao, '') <> '')
				RAISERROR('Estância de apresentação "%s" inválida para o anexo B "%s".', 16, 38, @CodigoAlfandegaApresentacao, @anexoB)
			ELSE
				IF (@despachoCentralizado = 0) AND (ISNULL(@CodigoAlfandegaApresentacao, '') <> '')
					RAISERROR('Estância de apresentação "%s" inválida para despacho centralizado.', 16, 39, @CodigoAlfandegaApresentacao)
				ELSE
					IF (@anexoB <> 'H6') AND (@despachoCentralizado = 1) AND (ISNULL(@CodigoAlfandegaApresentacao, '') = '')
						RAISERROR('O anexo B "%s" com despacho centralizado obriga ao preenchimento da estância de apresentação.', 16, 40, @anexoB)
-- verifica as regras da massa líquida
			IF (@anexoB IN ('H2', 'H3', 'I2')) AND (@totalMassaLiquida > 0)
				RAISERROR('O anexo B "%s" não permite a definição de massa líquida.', 16, 41, @anexoB)
			ELSE
				IF (@anexoB NOT IN ('H2', 'H3', 'I2')) AND (@totalMassaLiquida = 0)
					RAISERROR('O anexo B "%s" obriga ao preenchimento da massa líquida.', 16, 42, @anexoB)	
-- verifica as regras do número NRUR
			IF (@anexoB = 'I2') AND (ISNULL(@numeroNRUR, '') <> '')
				RAISERROR('Número NRUR "%s" inválido para o anexo B "%s".', 16, 43, @numeroNRUR, @anexoB)	
-- verifica as regras da natureza de transação
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoNaturezaTransacao, '') <> '') 
				RAISERROR('Natureza de transação "%s" inválida para o anexo B "%s".', 16, 44, @CodigoNaturezaTransacao, @anexoB)
			ELSE
				IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoNaturezaTransacao, '') = '') 
					RAISERROR('O anexo B "%s" obriga ao preenchimento da natureza de transação.', 16, 45, @anexoB)
-- verifica as regras do meio de transporte fronteira
			IF (@anexoB IN ('H6', 'I1', 'I2')) AND (ISNULL(@CodigoMeioTransporteFronteira, '') <> '') 
				RAISERROR('Meio de transporte fronteira "%s" inválido para o anexo B "%s".', 16, 46, @CodigoMeioTransporteFronteira, @anexoB)
			ELSE
				IF (@anexoB NOT IN ('H6', 'I1', 'I2')) AND (ISNULL(@CodigoMeioTransporteFronteira, '') = '') 
					RAISERROR('O anexo B "%s" obriga ao preenchimento do meio de transporte fronteira.', 16, 47, @anexoB)
-- verifica as regras do país do meio de transporte fronteira
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoPaisMeioTransporteFronteira, '') <> '')
				RAISERROR('País do meio de transporte fronteira "%s" inválido para o anexo B "%s".', 16, 48, @CodigoPaisMeioTransporteFronteira, @anexoB)
			ELSE
				IF (ISNULL(@CodigoMeioTransporteFronteira, '') = '') AND (ISNULL(@CodigoPaisMeioTransporteFronteira, '') <> '')
					RAISERROR('País do meio de transporte fronteira "%s" inválido quando o meio de transporte fronteira não está definido.', 16, 49, @CodigoPaisMeioTransporteFronteira)
-- verifica as regras do meio de transporte interior
			IF (@anexoB IN ('H6', 'I1', 'I2')) AND (ISNULL(@CodigoMeioTransporteInterior, '') <> '')
				RAISERROR('Meio de transporte interior "%s" inválido para o anexo B "%s".', 16, 50, @CodigoMeioTransporteInterior, @anexoB)						
			ELSE
				IF (@anexoB IN ('H2', 'H5')) AND (ISNULL(@CodigoMeioTransporteInterior, '') = '')
					RAISERROR('O anexo B "%s" obriga ao preenchimento do meio de transporte interior.', 16, 51, @anexoB)
-- verifica as regras da localização da condição de entrega
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@localidadeCE, '') <> '')
				RAISERROR('Localização da condição de entrega "%s" inválida para o anexo B "%s".', 16, 52, @localidadeCE, @anexoB)
			ELSE
				IF (ISNULL(@CodigoPortoAeroporto, '') <> '') AND (ISNULL(@localidadeCE, '') <> '')
					RAISERROR('Localização da condição de entrega "%s" inválida quando o porto/aeroporto está definido.', 16, 53, @localidadeCE)
				ELSE
					IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoPortoAeroporto, '') = '') AND (ISNULL(@localidadeCE, '') = '')
						RAISERROR('O anexo B "%s" sem porto/aeroporto definido obriga ao preenchimento da localização da condição de entrega.', 16, 54, @anexoB)	
-- verifica as regras do país da condição de entrega
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoPaisCondicaoEntrega, '') <> '')
				RAISERROR('País "%s" da condição de entrega inválido para o anexo B "%s".', 16, 55, @CodigoPaisCondicaoEntrega, @anexoB)
			ELSE				
				IF (ISNULL(@CodigoPortoAeroporto, '') <> '') AND (ISNULL(@CodigoPaisCondicaoEntrega, '') <> '')
					RAISERROR('País "%s" da condição de entrega inválido quando o porto/aeroporto está definido.', 16, 56, @CodigoPaisCondicaoEntrega)
				ELSE
					IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoPortoAeroporto, '') = '') AND (ISNULL(@CodigoPaisCondicaoEntrega, '') = '')
						RAISERROR('O anexo B "%s" sem porto/aeroporto definido obriga ao preenchimento do país da condição de entrega.', 16, 57, @anexoB)
-- verifica as regras do porto/aeroporto da condição de entrega
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoPortoAeroporto, '') <> '')
				RAISERROR('Porto/Aeroporto "%s" da condição de entrega inválido para o anexo B "%s".', 16, 58, @CodigoPortoAeroporto, @anexoB)
			ELSE
				IF (ISNULL(@localidadeCE, '') <> '') AND (ISNULL(@CodigoPortoAeroporto, '') <> '')
					RAISERROR('Porto/Aeroporto "%s" da condição de entrega inválida quando a localização da condição de entrega está definida.', 16, 59, @CodigoPortoAeroporto)
				ELSE
					IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@localidadeCE, '') = '') AND (ISNULL(@CodigoPortoAeroporto, '') = '')
						RAISERROR('O anexo B "%s" sem localização da condição de entrega definida obriga ao preenchimento do porto/aeroporto da condição de entrega.', 16, 60, @anexoB)	
-- verifica as regras do tipo de identificação do meio de transporte
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@TipoIdentificacaoMeioTransporte, '') <> '')
				RAISERROR('Tipo de identificação do meio de transporte "%s" inválido para o anexo B "%s".', 16, 61, @TipoIdentificacaoMeioTransporte, @anexoB)
			ELSE
				IF (LEFT(ISNULL(@CodigoMeioTransporteChegada, '0'), 1) IN ('0', '5', '6', '7', '9')) AND (ISNULL(@TipoIdentificacaoMeioTransporte, '') <> '')
					RAISERROR('Tipo de identificação do meio de transporte "%s" inválido quando o meio de transporte chegada não está definido ou é "5", "6", "7" ou "9".', 16, 62, @TipoIdentificacaoMeioTransporte)
				ELSE
					IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (LEFT(ISNULL(@CodigoMeioTransporteChegada, '0'), 1) IN ('1', '2', '3', '4', '8')) AND (ISNULL(@TipoIdentificacaoMeioTransporte, '') = '')
						RAISERROR('O anexo B "%s" com meio de transporte chegada de "1", "2", "3", "4" ou "8" obriga ao preenchimento do tipo de identificação.', 16, 63, @anexoB)	
-- verifica as regras da identificação do meio de transporte
			IF (@anexoB IN ('H2', 'H6', 'I1', 'I2')) AND (ISNULL(@identificacaoTransporte, '') <> '')
				RAISERROR('Identificação do meio de transporte "%s" inválida para o anexo B "%s".', 16, 64, @identificacaoTransporte, @anexoB)
			ELSE
				IF (LEFT(ISNULL(@CodigoMeioTransporteChegada, '0'), 1) IN ('0', '5', '7')) AND (ISNULL(@identificacaoTransporte, '') <> '')
					RAISERROR('Identificação do meio de transporte "%s" inválida quando o meio de transporte chegada não está definido ou é "5" ou "7".', 16, 65, @identificacaoTransporte)
				ELSE
					IF (@anexoB NOT IN ('H2', 'H6', 'I1', 'I2')) AND (LEFT(ISNULL(@CodigoMeioTransporteChegada, '0'), 1) IN ('1', '2', '3', '4', '6', '8', '9')) AND (ISNULL(@identificacaoTransporte, '') = '')
						RAISERROR('O anexo B "%s" com meio de transporte chegada de "1", "2", "3", "4", "6", "8" ou "9" obriga ao preenchimento da identificação do meio de transporte.', 16, 66, @anexoB)	
-- verifica as regras da mercadoria contentorizada							
			IF (@anexoB = 'H6') AND (@contentorizada = 1)
				RAISERROR('Mercadoria não pode ser contentorizada para o anexo B "%s".', 16, 67, @anexoB)
			ELSE
				IF (@contentorizada = 0) AND (ISNULL(@numeroContentor, '') <> '')
					RAISERROR('Número do contentor "%s" inválido quando a mercadoria não é contentorizada.', 16, 68, @numeroContentor)
-- verifica as regras do tipo de localização
			IF (@anexoB = 'H6') AND (ISNULL(@tipoLocalizacao, '') <> '')
				RAISERROR('Tipo de localização "%s" inválida para o anexo B "%s".', 16, 69, @tipoLocalizacao, @anexoB)
			ELSE
				IF (@anexoB <> 'H6') AND (ISNULL(@tipoLocalizacao, '') = '')
					RAISERROR('O anexo B "%s" obriga ao preenchimento do tipo de localização.', 16, 70, @anexoB)
-- verifica as regras do armazém
			IF (@anexoB IN ('H5', 'H6', 'I1', 'I2')) AND (ISNULL(@CodigoArmazem, '') <> '')
				RAISERROR('Armazém "%s" inválido para o anexo B "%s".', 16, 71, @CodigoArmazem, @anexoB)
			ELSE
				IF (@anexoB = 'H2') AND (ISNULL(@CodigoArmazem, '') = '')
					RAISERROR('O anexo B "%s" obriga ao preenchimento do armazém.', 16, 72, @anexoB)
				ELSE
					IF (@anexoB IN ('H1', 'H3', 'H4')) AND (LEFT(@Regime, 2) = '07') AND (ISNULL(@CodigoArmazem, '') = '')
						RAISERROR('O anexo B "%s" com o regime "%s" obrigam ao preenchimento do armazém.', 16, 73, @anexoB, @Regime)
-- verifica as regras do NIF responsável da garantia
			IF (@anexoB IN ('H2', 'I1', 'I2')) AND (ISNULL(@NIFResponsavelCaucao, '') <> '')
				RAISERROR('NIF responsável da garantia "%s" inválido para o anexo B "%s".', 16, 74, @NIFResponsavelCaucao, @anexoB)
			ELSE
				IF (ISNULL(@TipoEntidadeCaucao, -1) = 0) AND (ISNULL(@NIFResponsavelCaucao, '') <> '')
					RAISERROR('NIF responsável da garantia "%s" inválido quando a garantia é do declarante.', 16, 75, @NIFResponsavelCaucao)
				ELSE
					IF (@anexoB IN ('H1', 'H3', 'H4', 'H5', 'H6')) AND (ISNULL(@TipoEntidadeCaucao, -1) = 1) AND (ISNULL(@NIFResponsavelCaucao, '') = '')
						RAISERROR('O anexo B "%s" com a garantia do cliente obriga ao preenchimento do NIF responsável da garantia.', 16, 76, @anexoB)
-- verifica as regras do qualificador
			IF (@qualificador NOT IN ('U', 'Y')) AND (ISNULL(@CodigoLocalizacaoMercadorias, '') <> '')
				RAISERROR('Localização das mercadorias "%s" inválida para o qualificador "%s".', 16, 77, @CodigoLocalizacaoMercadorias, @qualificador)
			ELSE
				IF (@qualificador IN ('U', 'Y')) AND (ISNULL(@CodigoLocalizacaoMercadorias, '') = '')
					RAISERROR('O qualificador "%s" obriga ao preenchimento da localização das mercadorias.', 16, 78, @qualificador)
				ELSE
					IF (@qualificador <> 'V') AND (ISNULL(@CodigoAlfandegaLM, '') <> '')
						RAISERROR('Estância das mercadorias "%s" inválida para o qualificador "%s".', 16, 79, @CodigoAlfandegaLM, @qualificador)
					ELSE
						IF (@qualificador = 'V') AND (ISNULL(@CodigoAlfandegaLM, '') = '')
							RAISERROR('O qualificador "%s" obriga ao preenchimento da estância das mercadorias.', 16, 80, @qualificador)
						ELSE
							IF (@qualificador <> 'X') AND (ISNULL(@nifOperadorEconomico, '') <> '')
								RAISERROR('NIF do operador económico das mercadorias "%s" inválido para o qualificador "%s".', 16, 81, @nifOperadorEconomico, @qualificador)
							ELSE
								IF (@qualificador = 'X') AND (ISNULL(@nifOperadorEconomico, '') = '')
									RAISERROR('O qualificador "%s" obriga ao preenchimento do NIF do operador económico das mercadorias.', 16, 82, @qualificador)
								ELSE
									IF (@qualificador <> 'Z') AND ((ISNULL(@moradaLM, '') <> '') OR (ISNULL(@localidadeLM, '') <> '') OR (ISNULL(@codigoPostalLM, '') <> ''))
										RAISERROR('Dados de endereço das mercadorias "%s", "%s", "%s" inválidos para o qualificador "%s".', 16, 83, @moradaLM, @localidadeLM, @codigoPostalLM, @qualificador)
									ELSE
										IF (@qualificador = 'Z') AND ((ISNULL(@moradaLM, '') = '') OR (ISNULL(@localidadeLM, '') = '') OR (ISNULL(@codigoPostalLM, '') = ''))
											RAISERROR('O qualificador "%s" obriga ao preenchimento dos dados de endereço das mercadorias.', 16, 84, @qualificador)
-- verifica as regras do armazém
			IF (ISNULL(@CodigoArmazem, '') <> '') AND (ISNULL(@CodigoTipoArmazem, '') = '')
				RAISERROR('O armazém "%s" obriga ao preenchimento do tipo de armazém.', 16, 85, @CodigoArmazem)
			ELSE
				IF (ISNULL(@CodigoArmazem, '') <> '') AND (ISNULL(@CodigoDocumentoArmazem, '') = '')
					RAISERROR('O armazém "%s" obriga ao preenchimento do documento do armazém.', 16, 86, @CodigoArmazem)
				ELSE
					IF (ISNULL(@CodigoArmazem, '') <> '') AND (ISNULL(@NumReferenciaArmazem, '') = '')
						RAISERROR('O armazém "%s" obriga ao preenchimento do número de referência do armazém.', 16, 87, @CodigoArmazem)
					ELSE
						IF (ISNULL(@CodigoArmazem, '') <> '') AND (ISNULL(@EORIArmazem, '') = '')
							RAISERROR('O armazém "%s" obriga ao preenchimento do EORI titular autorização do armazém.', 16, 88, @CodigoArmazem)		
-- obtém a máscara de faturação do cliente/natureza
			SET @NumMascaras = 1
			SET @TipoMascara = 0
			SET @CodMascara = 0
			EXEC SP_ObtemMascaraFacturacao @CodigoClienteCC, @CodigoNatureza, @NumMascaras OUTPUT, @TipoMascara OUTPUT, @CodMascara OUTPUT
-- processa a inserção ou edição da declaração IMP-CAU conforme a ação
			IF @acao = 'I'
			BEGIN
-- se posição no armazém não definida, preenche com valor por defeito
				IF (ISNULL(@documentoTransporte, '') <> '') AND (ISNULL(@posicaoArmazem, '') = '')
					SET @posicaoArmazem = 'C' + RIGHT(@documentoTransporte, 1)
-- se numero NRUR não definido, preenche com valor por defeito (excepto em "I2")
				IF (ISNULL(@documentoTransporte, '') <> '') AND (@anexoB <> 'I2') AND (ISNULL(@numeroNRUR, '') = '')
					SET @numeroNRUR = @documentoTransporte
-- obtem valores totais da declaração existentes apenas nas adições
				DECLARE Totais CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						CAST(ISNULL(t.c.value('sum(marcasEVolumes/marcaEVolume/volumes)', 'float'), 0) AS int), 
						t.c.value('massaBruta[1]', 'decimal(18, 6)'), 
						t.c.value('montanteAd[1]', 'decimal(18, 3)'), 						
						t.c.value('valorFrete[1]', 'decimal(18, 3)'), 
						t.c.value('valorSeguro[1]', 'decimal(18, 3)')					
					FROM @XMLAdicoes.nodes('adicoes/adicao') AS t(c)
				OPEN Totais
				FETCH NEXT FROM Totais INTO @volumes, @massaBruta, @montanteAd, @valorFrete, @valorSeguro
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @TotalAdicoes = @TotalAdicoes + 1
					SET @TotalVolumes = @TotalVolumes + @volumes
					SET @valorFrete = ISNULL(@valorFrete, ROUND((CASE (@valorTotalFatura - @SomaMontantesAdicoes - @montanteAd) 
																	WHEN 0 THEN (@valorTotalFrete - @SomaFretesAdicoes) 
																	ELSE (@massaBruta * @valorTotalFrete / @totalMassaBruta) 
																END), 3))
					SET @valorSeguro = ISNULL(@valorSeguro, ROUND((CASE (@valorTotalFatura - @SomaMontantesAdicoes - @montanteAd) 
																	WHEN 0 THEN (@valorTotalSeguro - @SomaSegurosAdicoes) 
																	ELSE (@montanteAd * @valorTotalSeguro / @valorTotalFatura) 
																END), 3))					
					SET @ValorEUR = ROUND(@montanteAd / @CambioMontante, 2)
					SET @Ajustamento = dbo.fn_IMP_CalculaAjustamento(@DescricaoFormula, 0, @CambioFrete, @CambioSeguro, @valorFrete, @valorSeguro, 0, 0, 0)
					SET @ValorEstatistico = dbo.fn_IMP_CalculaValorEstatistico(@ValorEUR, @Ajustamento)
					SET @TotalValorAduaneiro = @TotalValorAduaneiro + @ValorEstatistico
					SET @SomaMontantesAdicoes = @SomaMontantesAdicoes + @montanteAd
					SET @SomaFretesAdicoes = @SomaFretesAdicoes + @valorFrete
					SET @SomaSegurosAdicoes = @SomaSegurosAdicoes + @valorSeguro
					FETCH NEXT FROM Totais INTO @volumes, @massaBruta, @montanteAd, @valorFrete, @valorSeguro
				END
				CLOSE Totais
				DEALLOCATE Totais
-- obtem valores totais de volumes dirty, clean e scan da declaração existentes apenas nos manifestos
				DECLARE Totais CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('tipoManifesto[1]', 'int')				
					FROM @XMLManifestos.nodes('manifestos/manifesto') AS t(c)
					WHERE ISNULL(t.c.value('numeroCPA[1]', 'varchar(35)'), '') <> ''
				OPEN Totais
				FETCH NEXT FROM Totais INTO @tipoManifesto
				WHILE @@FETCH_STATUS = 0
				BEGIN				
					IF @tipoManifesto = 0 
						SET @TotalVolumesDirty = @TotalVolumesDirty + 1
					ELSE
						IF @tipoManifesto = 1
							SET @TotalVolumesClean = @TotalVolumesClean + 1
						ELSE
							IF @tipoManifesto = 2 
								SET @TotalVolumesScan = @TotalVolumesScan + 1											
					FETCH NEXT FROM Totais INTO @tipoManifesto
				END
				CLOSE Totais
				DEALLOCATE Totais	
-- obtem o número para a nova declaração
				SELECT TOP 1 @Numero = PDE_NPRO, @ValorTrafegoCTT = (CASE @MeioTransportePorVolume WHEN 1 THEN ISNULL(PDE_TPOS1, 0) ELSE 0 END)
				FROM TAB_PDES				
-- verifica se o número é válido
				IF @Numero = 0
					RAISERROR('Número da declaração não foi especificado.', 16, 89)			
-- constroi NRL
				SET @NRL = RIGHT(STR(@Ano, 4), 2) + 'PT' + REPLICATE('0', 9 - LEN(@NIFDeclarante)) + @NIFDeclarante + REPLICATE('0', 9 - LEN(LTRIM(STR(@Numero, 9)))) + LTRIM(STR(@Numero, 9))
-- insere os dados gerais da nova declaração IMP-CAU
				INSERT INTO PRO_DUCG(DUC_PNUM, DUC_EANO, DUC_DATA, NDE_CODI, DUC_CPRT, TDE_CODI, DUC_TIPO, ALF_CODI, DUC_ADI5, DUC_TVL6, DUC_REF7, DUC_EXP2, DUC_DST8, DEC_CO14, PAI_PA15, PAI_P15A, 
					PAI_PA16, PAI_PA17, PAI_P17A, PAI_P17B, MTR_PT18, DUC_MT18, DUC_OP18, DUC_CT18, MTR_FT21, PAI_PA21, DUC_CT19, CEN_CO20, DUC_FR20, DUC_DE20, NTR_CO24, LME_CO30, DUC_LC30, 
					PAI_PR22, DUC_MT22, DUC_TX23, DUC_FRET, PAI_FRET, DUC_TXFR, DUC_SEGU, PAI_SEGU, DUC_TXSE, DUC_MLQT, DUC_MBRT, DUC_VTRN, PAI_VTRN, DUC_TXVT, DUC_VEUR, DUC_UFOB, DUC_VFOB, 
					DUC_DIRT, DUC_TFDA, DUC_ENOM, DUC_EMOR, DUC_ELOC, DUC_ECPO, DUC_ELPO, DUC_ENIF, PAI_ELIV, DUC_DNOM, DUC_DMOR, DUC_DLOC, DUC_DCPO, DUC_DLPO, DUC_DNIF, PAI_DLIV, DUC_HIST, 
					DUC_VLRC, DUC_VLRE, DUC_VATT, DUC_UCRI, DUC_DTCR, DUC_UALT, DUC_DTAL, NDE_NOME, TDE_NOME, ALF_NOME, PAI_NO15, PAI_NO16, PAI_NO17, PAI_MO22, PAI_MOFT, PAI_MOSG, PAI_MOVT, 
					DEC_NOME, DEC_CENI, MTR_NO18, MTR_NO21, DUC_MASC, DUC_NREQ, DUC_NDUR, DUC_T1RE, DUC_DDTE, DUC_DTVO, DUC_PAYM, DUC_NPDT, DUC_NPDD, DUC_NTDP, DUC_PARM, DUC_NVRF, DUC_TREM, 
					DUC_CIEX, DUC_CIDE, DUC_AERO, DUC_PPFC, DUC_NVOO, DUC_MCPA, DUC_NSEQ, DUC_REF1, DUC_REF2, DUC_SHIP, DUC_TRAC, DUC_DTYP, DUC_POSA, DUC_TPCG, DUC_FUPS, DUC_VDIR, DUC_VCLE, 
					DUC_D2NO, DUC_D2MO, DUC_D2LO, DUC_D2CP, DUC_D2LP, FIN_CODI, DUC_TPDS, DUC_TPDC, TDE_1CAS, TDE_2CAS, DUC_GTWY, DUC_DELG, DUC_TMSF, TDO_DOCU, CLI_CODI, CLI_NOME, DUC_CGLB, 
					DUC_CAUC, DUC_CANO, DUC_CTIP, DUC_TLOC, ALF_CODI1, ALF_NOME1, DUC_LAMO, DUC_LALO, DUC_LACP, ARM_CODI, ARM_NOME, TAR_CODI, TAR_DESC, DUC_NRLO, DUC_DUNO, DUC_CENT, NTR_NOME, 
					DUC_VBAT, DUC_VSCA, DUC_VFRC, DUC_MFRC, DUC_NVSR, FUP_CODI, DUC_DDDT, DUC_UNMD, DUC_NACT, DUC_BIVA, DUC_VDES, DUC_DTEL, DUC_DEMA, DUC_DCEN, DUC_ANXB, DUC_DGEN,  DEC_NIF, 
					DUC_CNIR, ALF_CODI2, DUC_CCAC, DUC_CORF, ALF_CODI3, PAI_CODI2, PAE_CODI, MTR_CODI, MTR_TIPO, DUC_CONT, DUC_QUAL, DUC_ONIF, DOC_CODI, DUC_NRAU, DUC_EORI, DUC_REGI)	
				OUTPUT inserted.DUC_IDTY, inserted.DUC_PNUM INTO @TblID
				VALUES (@Numero, --DUC_PNUM, 
					@Ano, --DUC_EANO, 
					@data, --DUC_DATA, 
					@CodigoNatureza, --NDE_CODI, 
					@documentoTransporte, --DUC_CPRT, 
					@CodigoTipoDeclaracao, --TDE_CODI, 
					@NaturezaTipoDeclaracao, --DUC_TIPO, 
					@CodigoAlfandegaSujeicao, --ALF_CODI, 
					@TotalAdicoes, --DUC_ADI5, 
					@TotalVolumes, --DUC_TVL6, 
					@numeroNRUR, --DUC_REF7, 
					@CodigoExportador, --DUC_EXP2, 
					@CodigoCliente, --DUC_DST8, 
					@CodigoDeclarante, --DEC_CO14, 
					@CodigoPaisExpedicao, --PAI_PA15, 
					@CodigoPaisExpedicao, --PAI_P15A, 
					@CodigoPaisExportador, --PAI_PA16, 
					@CodigoPaisDestino, --PAI_PA17, 
					@CodigoPaisDestino, --PAI_P17A, 
					@CodigoRegiao, --PAI_P17B, 
					@CodigoMeioTransporteChegada, --MTR_PT18, 
					@identificacaoTransporte, --DUC_MT18, 
					@TotalOptativas, --DUC_OP18, 
					@ValorTrafegoCTT, --DUC_CT18, 
					@CodigoMeioTransporteFronteira, --MTR_FT21, 
					@CodigoPaisMeioTransporteFronteira, --PAI_PA21, 
					@contentorizada, --DUC_CT19, 
					@CodigoCondicaoEntrega, --CEN_CO20, 
					@DescricaoFormula, --DUC_FR20, 
					@localidadeCE, --DUC_DE20, 
					@CodigoNaturezaTransacao, --NTR_CO24, 
					@CodigoLocalizacaoMercadorias, --LME_CO30, 
					@NomeLocalizacaoMercadorias, --DUC_LC30, 
					@CodigoPaisMontante, --PAI_PR22, 
					@valorTotalFatura, --DUC_MT22, 
					@CambioMontante, --DUC_TX23, 
					@valorTotalFrete, --DUC_FRET, 
					@CodigoPaisFrete, --PAI_FRET, 
					@CambioFrete, --DUC_TXFR, 
					@valorTotalSeguro, --DUC_SEGU, 
					@CodigoPaisSeguro, --PAI_SEGU, 
					@CambioSeguro, --DUC_TXSE, 
					@totalMassaLiquida, --DUC_MLQT, 
					@totalMassaBruta, --DUC_MBRT, 
					0, --DUC_VTRN, 
					@CodigoPaisVerbaTransitario, --PAI_VTRN, 
					@CambioVerbaTransitario, --DUC_TXVT, 
					@ValorTotalEUR, --DUC_VEUR, 
					@FormulaFOB, --DUC_UFOB, 
					0, --DUC_VFOB, 
					0, --DUC_DIRT, 
					0, --DUC_TFDA, 
					@nomeExportador, --DUC_ENOM, 
					@moradaExportador, --DUC_EMOR, 
					@localidadeExportador, --DUC_ELOC, 
					@codigoPostalExportador, --DUC_ECPO, 
					@localidadePostalExportador, --DUC_ELPO, 
					@nifExportador, --DUC_ENIF, 
					@CodigoPaisExportador, --PAI_ELIV, 
					@nomeImportador, --DUC_DNOM, 
					@moradaImportador, --DUC_DMOR, 
					@localidadeImportador, --DUC_DLOC, 
					@codigoPostalImportador, --DUC_DCPO, 
					@localidadePostalImportador, --DUC_DLPO, 
					@nifImportador, --DUC_DNIF, 
					@CodigoPaisImportador, --PAI_DLIV, 
					@anotacoes, --DUC_HIST, 
					0, --DUC_VLRC, 
					'Zero euros', --DUC_VLRE, 
					@TotalValorAduaneiro, --DUC_VATT, 
					@CodUtilizador, --DUC_UCRI, 
					@DataAtual, --DUC_DTCR, 
					@CodUtilizador, --DUC_UALT, 
					@DataAtual, --DUC_DTAL, 
					@NomeNatureza, --NDE_NOME, 
					@NomeTipoDeclaracao, --TDE_NOME, 
					@NomeAlfandegaSujeicao, --ALF_NOME, 
					@NomePaisExpedicao, --PAI_NO15, 
					@NomePaisExportador, --PAI_NO16, 
					@NomePaisDestino, --PAI_NO17, 
					@MoedaMontante, --PAI_MO22, 
					@MoedaFrete, --PAI_MOFT, 
					@MoedaSeguro, --PAI_MOSG, 
					@MoedaVerbaTransitario, --PAI_MOVT, 
					@NomeDeclarante, --DEC_NOME, 
					@CedulaDeclarante, --DEC_CENI, 
					@NomeMeioTransporteChegada, --MTR_NO18, 
					@NomeMeioTransporteFronteira, --MTR_NO21, 
					@CodMascara, --DUC_MASC, 
					@numeroRequerimento, --DUC_NREQ, 
					@numeroDURetorno, --DUC_NDUR, 
					@numeroT1Retorno, --DUC_T1RE, 
					@dataEntrada, --DUC_DDTE, 
					@dataVoo, --DUC_DTVO, 
					@payment, --DUC_PAYM, 
					@numeroPDDT, --DUC_NPDT, 
					@numeroPDDTDEV, --DUC_NPDD, 
					@numeroTD, --DUC_NTDP, 
					@posicaoArmazem, --DUC_PARM, 
					@vossaReferencia, --DUC_NVRF, 
					@totalMassaBruta, --DUC_TREM, 
					@numeroContaExpedidor, --DUC_CIEX, 
					ISNULL(@portesAcc, @numeroContaDestinatario), --DUC_CIDE, 
					@aeroportoOrigem, --DUC_AERO, 
					@condEntrega, --DUC_PPFC, 
					@numeroVoo, --DUC_NVOO, 
					@miniCPA, --DUC_MCPA, 
					@numeroSequencia, --DUC_NSEQ, 
					ISNULL(@despachoAcc, @referenciaExterna1), --DUC_REF1, 
					@referenciaExterna2, --DUC_REF2, 
					@shipID, --DUC_SHIP, 
					@tracking, --DUC_TRAC, 
					@dutyType, --DUC_DTYP, 
					ISNULL(@portes, @posicaoAviao), --DUC_POSA, 
					@tipoCarga, --DUC_TPCG, 
					@nomeFicheiro, --DUC_FUPS, 
					@TotalVolumesDirty, --DUC_VDIR, 
					@TotalVolumesClean, --DUC_VCLE, 
					@nomeOriginalDestinatario, --DUC_D2NO, 
					@moradaOriginalDestinatario, --DUC_D2MO, 
					@localidadeOriginalDestinatario, --DUC_D2LO, 
					@codigoPostalOriginalDestinatario, --DUC_D2CP, 
					@localidadePostalOriginalDestinatario, --DUC_D2LP, 
					@CodigoFormula, --FIN_CODI, 
					@tipoNIFImportador, --DUC_TPDS, 
					@estatutoDeclarante, --DUC_TPDC, 
					@1CasaTipoDeclaracao, --TDE_1CAS, 
					@2CasaTipoDeclaracao, --TDE_2CAS, 
					@gateway, --DUC_GTWY, 
					@locID, --DUC_DELG, 
					@TipoMascara, --DUC_TMSF, 
					@CodigoTipoDocContas, --TDO_DOCU, 
					@CodigoClienteServico, --CLI_CODI, 
					@NomeClienteServico, --CLI_NOME, 
					@GarantiaGlobal, --DUC_CGLB, 
					@NumeroNRG, --DUC_CAUC, 
					@AnoCaucao, --DUC_CANO, 
					@TipoCaucao, --DUC_CTIP, 
					@tipoLocalizacao, --DUC_TLOC, 
					@CodigoAlfandegaLM, --ALF_CODI1, 
					@NomeAlfandegaLM, --ALF_NOME1, 
					@moradaLM, --DUC_LAMO, 
					@localidadeLM, --DUC_LALO, 
					@codigoPostalLM, --DUC_LACP, 
					@CodigoArmazem, --ARM_CODI, 
					@NomeArmazem, --ARM_NOME, 
					@CodigoTipoArmazem, --TAR_CODI, 
					@NomeTipoArmazem, --TAR_DESC, 
					@NRL, --DUC_NRLO, 
					2, --DUC_DUNO, 
					@TipoEntidadeCaucao, --DUC_CENT, 
					@NomeNaturezaTransacao, --NTR_NOME, 
					1, --DUC_VBAT, 
					@TotalVolumesScan, --DUC_VSCA, 
					@freteOriginal, --DUC_VFRC, 
					@moedafreteOriginal, --DUC_MFRC, 
					@serviceLevel, --DUC_NVSR, 
					@CodigoFollowUp, --FUP_CODI,
					@dataDocumentoTransporte, --DUC_DDDT, 
					@CodigoUtilizadorNomeado, --DUC_UNMD, 
					@numeroACTM, --DUC_NACT, 
					@BeneficiarioIVACliente, --DUC_BIVA, 
					@despesas, --DUC_VDES, 
					@telefoneImportador, --DUC_DTEL, 
					@emailImportador, --DUC_DEMA, 
					@despachoCentralizado, --DUC_DCEN, 
					@anexoB, --DUC_ANXB, 
					@descricaoGenerica, --DUC_DGEN,  
					@NIFDeclarante, --DEC_NIF, 
					@NIFResponsavelCaucao, --DUC_CNIR, 
					@AlfandegaCaucao, --ALF_CODI2, 
					@CodAcessoCaucao, --DUC_CCAC, 
					@OutrasRefCaucao, --DUC_CORF, 
					@CodigoAlfandegaApresentacao, --ALF_CODI3, 
					@CodigoPaisCondicaoEntrega, --PAI_CODI2, 
					@CodigoPortoAeroporto, --PAE_CODI, 
					@CodigoMeioTransporteInterior, --MTR_CODI, 
					@TipoIdentificacaoMeioTransporte, --MTR_TIPO, 
					@numeroContentor, --DUC_CONT, 
					@qualificador, --DUC_QUAL, 
					@nifOperadorEconomico, --DUC_ONIF, 
					@CodigoDocumentoArmazem, --DOC_CODI, 
					@NumReferenciaArmazem, --DUC_NRAU, 
					@EORIArmazem, --DUC_EORI, 
					@Regime /*DUC_REGI*/)		
-- obtem o ID da nova declaração IMP-CAU
				SELECT @IdDeclaracao = ID, @Numero = NUMERO
				FROM @TblID
			END
			ELSE
			BEGIN
-- obtem o tipo de update especifico a realizar
				SELECT TOP 1 @ExtraFieldUPDATEValue = t.c.value('valorCampoExtra[1]', 'varchar(20)')
				FROM @XMLCamposExtra.nodes('camposExtra/campoExtra') AS t(c) 
				WHERE t.c.value('codigoCampoExtra[1]', 'varchar(100)') = 'UPDATE' AND @CamposAdicionais = 3 --DHL				
-- obtem o tipo de dados de manifesto				
				SELECT TOP 1 @OperacaoManifesto = t.c.value('tipoManifesto[1]', 'int') 
				FROM @XMLManifestos.nodes('manifestos/manifesto') AS t(c)
-- obtem o número da declaração a atualizar	
				IF @CamposAdicionais = 8 --ENTREPOSTO
				BEGIN
					SELECT @Numero = DUC_PNUM
					FROM PRO_DUCG WITH(NOLOCK)
					WHERE DUC_DUNO = 2 AND DUC_EANO = @Ano AND DUC_PNUM = ISNULL((SELECT t.c.value('valorCampoExtra[1]', 'varchar(20)')
																				FROM @XMLCamposExtra.nodes('camposExtra/campoExtra') AS t(c)
																				WHERE t.c.value('codigoCampoExtra[1]', 'varchar(100)') = 'DUC_PNUM'), -1)
				END	
				ELSE
				BEGIN
					SELECT TOP 1 @Numero = DUC_PNUM								
					FROM PRO_DUCG WITH(NOLOCK)						
					WHERE DUC_DUNO = 2 AND DUC_EANO = @Ano AND DUC_CPRT = @documentoTransporte 
					ORDER BY DUC_IDTY DESC
				END
-- verifica se o número é válido
				IF @Numero IS NULL
					RAISERROR('Documento de transporte "%s" não existe em nenhuma declaraçao IMP-CAU.', 16, 90, @documentoTransporte)	
-- obtem dados da declaração a atualizar
				SELECT @IdDeclaracao = duc.DUC_IDTY, @TaxaFDA = ISNULL(duc.DUC_TFDA, 0), @valorTotalSeguro = ISNULL(duc.DUC_SEGU, 0), @CambioSeguro = ISNULL(duc.DUC_TXSE, 0), 
					@TotalVolumesDirty = ISNULL(duc.DUC_VDIR, 0), @TotalVolumesClean = ISNULL(duc.DUC_VCLE, 0), @TotalVolumesScan = duc.DUC_VSCA, 
					@DescricaoFormula = (CASE ISNULL(@ExtraFieldUPDATEValue, '') WHEN 'DHL-PORTAL' THEN @DescricaoFormula ELSE duc.DUC_FR20 END), 
					@valorTotalFrete = (CASE ISNULL(@ExtraFieldUPDATEValue, '') WHEN 'DHL-PORTAL' THEN @valorTotalFrete ELSE ISNULL(duc.DUC_FRET, 0) END), 
					@CambioFrete = (CASE ISNULL(@ExtraFieldUPDATEValue, '') WHEN 'DHL-PORTAL' THEN @CambioFrete ELSE ISNULL(duc.DUC_TXFR, 0) END), 
					@valorTotalFatura = (CASE WHEN (@CamposAdicionais = 2) OR (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') THEN @valorTotalFatura ELSE ISNULL(duc.DUC_MT22, 0) END), 
					@CambioMontante = (CASE WHEN (@CamposAdicionais = 2) OR (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') THEN @CambioMontante ELSE ISNULL(duc.DUC_TX23, 0) END), 
					@MeioTransportePorVolume = (CASE ISNULL(mtr.MTR_VPVL, 0) WHEN 2 THEN 1 ELSE 0 END), 
					@TotalOptativas = (CASE mtr.MTR_OPAU 
											WHEN 1 THEN ISNULL((SELECT TOP 1 MTO_VOPT 
																FROM TAB_MTRO WITH(NOLOCK) 
																WHERE MTR_IDTY = mtr.MTR_IDTY 
																	AND (CASE WHEN ((@CamposAdicionais IN (1, 4) AND @OperacaoManifesto <> 2) OR (@CamposAdicionais = 2 AND @OperacaoManifesto = 0) OR (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') OR (@CamposAdicionais = 3 AND (CASE WHEN @NaturezaRetorno = 1 THEN 1 WHEN (@NaturezaRetorno = 0 AND duc.DUC_ADI5 = 1 AND (ABS(duc.DUC_MBRT) - @totalMassaBruta) < 0.500) THEN 1 ELSE 0 END) = 1)) THEN @totalMassaBruta ELSE ISNULL(duc.DUC_MBRT, 0) END) BETWEEN MTO_LMNP AND MTO_LMXP 
																	AND (CASE WHEN (@CamposAdicionais = 2 AND @OperacaoManifesto = 0) OR (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') THEN @ValorTotalEUR ELSE ISNULL(duc.DUC_VEUR, 0) END) BETWEEN MTO_LMNV AND MTO_LMXV), 0) 
											ELSE ISNULL(mtr.MTR_VOP1, 0) 
										END) 											
				FROM PRO_DUCG AS duc WITH(NOLOCK)
					LEFT OUTER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON (CASE WHEN @CamposAdicionais IN (1, 4) THEN @CodigoMeioTransporteChegada ELSE duc.MTR_PT18 END) = mtr.MTR_CODI
				WHERE duc.DUC_EANO = @Ano AND duc.DUC_PNUM = @Numero 				
-- obtem valores totais da declaração existentes apenas nas adições
				DECLARE Totais CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT CAST(ISNULL(t.c.value('sum(marcasEVolumes/marcaEVolume/volumes)', 'float'), 0) AS int), 
						t.c.value('massaBruta[1]', 'decimal(18, 6)'), 
						t.c.value('montanteAd[1]', 'decimal(18, 3)'), 						
						t.c.value('valorFrete[1]', 'decimal(18, 3)'), 
						t.c.value('valorSeguro[1]', 'decimal(18, 3)'),
						ISNULL(adi.DUA_CODI, 0), ISNULL(adi.DUA_VDIR, 0), ISNULL(adi.DUA_ACRE, 0), ISNULL(adi.DUA_DEDU, 0)
					FROM @XMLAdicoes.nodes('adicoes/adicao') AS t(c)
						LEFT OUTER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON adi.DUC_EANO = @Ano AND adi.DUC_PNUM = @Numero AND t.c.value('numeroAdicao[1]', 'int') = adi.DUA_CODI
				OPEN Totais
				FETCH NEXT FROM Totais INTO @volumes, @massaBruta, @montanteAd, @valorFrete, @valorSeguro, @numeroAdicao, @Direitos, @Acrescimos, @Deducoes
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @TotalAdicoes = @TotalAdicoes + 1					
					SET @TotalVolumes = @TotalVolumes + @volumes
					SELECT @SomaMontantesAdicoes = ISNULL(SUM(DUA_VA42), 0), @SomaFretesAdicoes = ISNULL(SUM(ISNULL(DUA_VFRE, 0)), 0), @SomaSegurosAdicoes = ISNULL(SUM(ISNULL(DUA_VSEG, 0)), 0)			
					FROM PRO_DUAD WITH(NOLOCK)
					WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI <> @numeroAdicao
					SET @valorFrete = ISNULL(@valorFrete, ROUND((CASE (@valorTotalFatura - @SomaMontantesAdicoes - @montanteAd) 
																	WHEN 0 THEN (@valorTotalFrete - @SomaFretesAdicoes) 
																	ELSE (@massaBruta * @valorTotalFrete / @totalMassaBruta) 
																END), 3))
					SET @valorSeguro = ISNULL(@valorSeguro, ROUND((CASE (@valorTotalFatura - @SomaMontantesAdicoes - @montanteAd) 
																	WHEN 0 THEN (@valorTotalSeguro - @SomaSegurosAdicoes) 
																	ELSE (@montanteAd * @valorTotalSeguro / @valorTotalFatura) 
																END), 3))					
					SET @ValorEUR = ROUND(@montanteAd / @CambioMontante, 2)
					SET @Ajustamento = dbo.fn_IMP_CalculaAjustamento(@DescricaoFormula, @TaxaFDA, @CambioFrete, @CambioSeguro, @valorFrete, @valorSeguro, @Direitos, @Acrescimos, @Deducoes)
					SET @ValorEstatistico = dbo.fn_IMP_CalculaValorEstatistico(@ValorEUR, @Ajustamento)
					SET @TotalValorAduaneiro = @TotalValorAduaneiro + @ValorEstatistico
					SET @SomaMontantesAdicoes = @SomaMontantesAdicoes + @montanteAd
					SET @SomaFretesAdicoes = @SomaFretesAdicoes + @valorFrete
					SET @SomaSegurosAdicoes = @SomaSegurosAdicoes + @valorSeguro
					FETCH NEXT FROM Totais INTO @volumes, @massaBruta, @montanteAd, @valorFrete, @valorSeguro, @numeroAdicao, @Direitos, @Acrescimos, @Deducoes
				END
				CLOSE Totais
				DEALLOCATE Totais
-- -- inicia total de volumes dirty, clean e scan em função do tipo de manifesto (se "Clean" [1] remove também as linhas "Scan")
				IF @OperacaoManifesto = 1
				BEGIN				
					SET @TotalVolumesClean = 0
					SET @TotalVolumesScan = 0
				END
				ELSE				
					IF @OperacaoManifesto = 0
						SET @TotalVolumesDirty = 0 
					ELSE
						IF @OperacaoManifesto = 2
							SET @TotalVolumesScan = 0		
-- obtem valores totais de volumes dirty, clean e scan da declaração existentes apenas nos manifestos
				DECLARE Totais CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('tipoManifesto[1]', 'int')				
					FROM @XMLManifestos.nodes('manifestos/manifesto') AS t(c)
					WHERE ISNULL(t.c.value('numeroCPA[1]', 'varchar(35)'), '') <> ''
				OPEN Totais
				FETCH NEXT FROM Totais INTO @tipoManifesto
				WHILE @@FETCH_STATUS = 0
				BEGIN				
					IF @tipoManifesto = 0 
						SET @TotalVolumesDirty = @TotalVolumesDirty + 1
					ELSE
						IF @tipoManifesto = 1
							SET @TotalVolumesClean = @TotalVolumesClean + 1
						ELSE
							IF @tipoManifesto = 2 
								SET @TotalVolumesScan = @TotalVolumesScan + 1											
					FETCH NEXT FROM Totais INTO @tipoManifesto
				END
				CLOSE Totais
				DEALLOCATE Totais										
-- atualiza os dados gerais da nova declaração IMP-CAU		
				IF @CamposAdicionais IN (1, 4) --FEDEX/TNT | TNT
				BEGIN
					UPDATE PRO_DUCG SET 
						NDE_CODI = @CodigoNatureza, 
						NDE_NOME = @NomeNatureza, 
						ALF_CODI = @CodigoAlfandegaSujeicao,  
						ALF_NOME = @NomeAlfandegaSujeicao, 						
						DUC_TVL6 = @TotalVolumes, 
						DUC_VATT = @TotalValorAduaneiro, 
						DUC_VDIR = @TotalVolumesDirty, 
						DUC_VCLE = @TotalVolumesClean, 
						DUC_VSCA = @TotalVolumesScan, 
						LME_CO30 = @CodigoLocalizacaoMercadorias, 
						DUC_LC30 = @NomeLocalizacaoMercadorias, 
						DUC_DTVO = @dataVoo, 
						DUC_MBRT = (CASE @OperacaoManifesto 
										WHEN 2 THEN DUC_MBRT 
										ELSE @totalMassaBruta 
									END), 
						DUC_MLQT = (CASE @OperacaoManifesto 
										WHEN 2 THEN DUC_MLQT 
										ELSE @totalMassaLiquida 
									END), 
						DUC_TREM = (CASE @OperacaoManifesto 
										WHEN 2 THEN DUC_TREM 
										ELSE @totalMassaBruta 
									END), 
						MTR_PT18 = @CodigoMeioTransporteChegada, 
						MTR_NO18 = @NomeMeioTransporteChegada, 
						DUC_MT18 = @identificacaoTransporte, 
						DUC_OP18 = @TotalOptativas, 							
						MTR_FT21 = @CodigoMeioTransporteFronteira,
						MTR_NO21 = @NomeMeioTransporteFronteira, 
						PAI_PA21 = @CodigoPaisMeioTransporteFronteira, 
						DUC_UALT = @CodUtilizador, 
						DUC_DTAL = @DataAtual
					WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano
				END
				ELSE				
				IF @CamposAdicionais = 2 --UPS
				BEGIN
					IF @OperacaoManifesto = 0 --Dirty
					BEGIN
						UPDATE PRO_DUCG SET 							
							DUC_TVL6 = @TotalVolumes, 
							DUC_VATT = @TotalValorAduaneiro, 
							DUC_VDIR = @TotalVolumesDirty, 
							DUC_VCLE = @TotalVolumesClean, 
							DUC_VSCA = @TotalVolumesScan, 
							PAI_PR22 = @CodigoPaisMontante, 
							DUC_MT22 = @valorTotalFatura, 
							DUC_TX23 = @CambioMontante, 
							DUC_MLQT = @totalMassaLiquida, 
							DUC_MBRT = @totalMassaBruta, 
							DUC_VEUR = @ValorTotalEUR, 					
							PAI_MO22 = @MoedaMontante, 
							DUC_TREM = @totalMassaBruta, 
							DUC_OP18 = @TotalOptativas, 
							DUC_FUPS = @nomeFicheiro, 					
							DUC_VFRC = @freteOriginal, 
							DUC_MFRC = @moedafreteOriginal, 
							DUC_NVSR = @serviceLevel, 					 							
							DUC_UALT = @CodUtilizador, 
							DUC_DTAL = @DataAtual
						WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano
					END
					ELSE
					BEGIN
						UPDATE PRO_DUCG SET 														
							DUC_VDIR = @TotalVolumesDirty, 
							DUC_VCLE = @TotalVolumesClean, 
							DUC_VSCA = @TotalVolumesScan, 											 
							DUC_DTVO = @dataVoo, 
							DUC_UALT = @CodUtilizador, 
							DUC_DTAL = @DataAtual
						WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano
					END
				END
				ELSE				
				IF @CamposAdicionais = 3 --DHL
				BEGIN
					IF ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL'
					BEGIN
						SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de UPDATE (das Adições) não ser processado					
						UPDATE PRO_DUCG SET 
							NDE_CODI = @CodigoNatureza, 
							NDE_NOME = @NomeNatureza, 	
							FUP_CODI = ISNULL(@CodigoFollowUp, FUP_CODI), 	
							DUC_UNMD = (CASE WHEN @CodigoFollowUp IS NOT NULL THEN NULL ELSE DUC_UNMD END),  
							DUC_TMSF = @TipoMascara,
							DUC_MASC = @CodMascara,
							CEN_CO20 = @CodigoCondicaoEntrega, 
							DUC_DE20 = @localidadeCE, 
							PAI_CODI2 = @CodigoPaisCondicaoEntrega, 
							PAE_CODI = @CodigoPortoAeroporto, 
							FIN_CODI = @CodigoFormula, 
							DUC_FR20 = @DescricaoFormula, 
							DUC_UFOB = @FormulaFOB, 
							DUC_VFOB = (CASE @FormulaFOB WHEN 0 THEN 0 ELSE DUC_VFOB END), 
							PAI_PR22 = @CodigoPaisMontante,
							PAI_MO22 = @MoedaMontante, 
							DUC_TX23 = @CambioMontante, 
							DUC_MT22 = @valorTotalFatura, 
							DUC_VEUR = @ValorTotalEUR, 
							DUC_VATT = @TotalValorAduaneiro, 							
							DUC_OP18 = @TotalOptativas, 
							DUC_VTRN = (CASE @TotalOptativas WHEN 0 THEN DUC_VTRN ELSE 0 END), 
							PAI_FRET = @CodigoPaisFrete,
							PAI_MOFT = @MoedaFrete, 
							DUC_TXFR = @CambioFrete,
							DUC_FRET = @valorTotalFrete,
							DUC_DST8 = @CodigoCliente, 
							DUC_DNOM = @nomeImportador,
							DUC_DMOR = @moradaImportador, 
							DUC_DLOC = @localidadeImportador, 
							DUC_DCPO = @codigoPostalImportador,
							DUC_DLPO = @localidadePostalImportador,
							DUC_DNIF = @nifImportador, 
							PAI_DLIV = @CodigoPaisImportador, 
							DUC_TPDS = @tipoNIFImportador, 
							CLI_CODI = @CodigoClienteServico,  
							CLI_NOME = @NomeClienteServico,  
							DUC_BIVA = @BeneficiarioIVACliente, 
							DUC_DTEL = @telefoneImportador,
							DUC_DEMA = @emailImportador,
							PAI_P17B = @CodigoRegiao, 
							DUC_CAUC = @NumeroNRG, 
							DUC_CANO = @AnoCaucao, 
							DUC_CTIP = @TipoCaucao, 
							DUC_CENT = @TipoEntidadeCaucao, 
							ALF_CODI2 = @AlfandegaCaucao, 
							DUC_CCAC = @CodAcessoCaucao, 
							DUC_CORF = @OutrasRefCaucao, 														 														
							DUC_UALT = @CodUtilizador, 
							DUC_DTAL = @DataAtual
						WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano	
						SET CONTEXT_INFO 0x0 --reset à variavel global de sessão				
					END
					ELSE
					BEGIN
						UPDATE PRO_DUCG SET 
							NDE_CODI = @CodigoNatureza, 
							NDE_NOME = @NomeNatureza, 						
							DUC_TVL6 = @TotalVolumes, 
							DUC_VATT = @TotalValorAduaneiro, 
							DUC_VDIR = @TotalVolumesDirty, 
							DUC_VCLE = @TotalVolumesClean, 
							DUC_VSCA = @TotalVolumesScan, 						
							DUC_DTVO = @dataVoo, 
							DUC_MBRT = (CASE 
											WHEN @NaturezaRetorno = 1 THEN @totalMassaBruta 
											WHEN (@NaturezaRetorno = 0 AND DUC_ADI5 = 1 AND (ABS(DUC_MBRT) - @totalMassaBruta) < 0.500) THEN @totalMassaBruta 
											ELSE DUC_MBRT
										END), 						
							DUC_TREM = (CASE 
											WHEN @NaturezaRetorno = 1 THEN @totalMassaBruta 
											WHEN (@NaturezaRetorno = 0 AND DUC_ADI5 = 1 AND (ABS(DUC_MBRT) - @totalMassaBruta) < 0.500) THEN @totalMassaBruta 
											ELSE DUC_TREM
										END), 
							DUC_OP18 = (CASE 
											WHEN @NaturezaRetorno = 1 THEN @TotalOptativas 
											WHEN (@NaturezaRetorno = 0 AND DUC_ADI5 = 1 AND (ABS(DUC_MBRT) - @totalMassaBruta) < 0.500) THEN @TotalOptativas 
											ELSE DUC_OP18
										END), 
							DUC_CIDE = ISNULL(@portesAcc, @numeroContaDestinatario), 
							DUC_NVOO = @numeroVoo, 
							DUC_SHIP = @shipID, 
							DUC_DTYP = @dutyType, 						
							DUC_DTEL = @telefoneImportador,
							DUC_DEMA = @emailImportador,
							DUC_UALT = @CodUtilizador, 
							DUC_DTAL = @DataAtual
						WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano					
					END
				END				
				ELSE
				BEGIN
					UPDATE PRO_DUCG SET 
						DUC_ADI5 = @TotalAdicoes, 							
						DUC_TVL6 = @TotalVolumes, 
						DUC_VATT = @TotalValorAduaneiro, 
						DUC_VDIR = @TotalVolumesDirty, 
						DUC_VCLE = @TotalVolumesClean, 
						DUC_VSCA = @TotalVolumesScan, 
						DUC_UALT = @CodUtilizador, 
						DUC_DTAL = @DataAtual
					WHERE DUC_PNUM = @Numero AND DUC_EANO = @Ano
				END				
-- remove o detalhe de adições da declaração
				IF @CamposAdicionais = 8 --ENTREPOSTO
				BEGIN
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado
					DELETE FROM PRO_DUAD
					WHERE DUC_EANO = @Ano and DUC_PNUM = @Numero
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
				END
				ELSE
-- remove o detalhe de Marcas e Volumes das adições da declaração
					IF ((@CamposAdicionais <> 2) OR ((@CamposAdicionais = 2) AND (@OperacaoManifesto = 0))) AND (ISNULL(@ExtraFieldUPDATEValue, '') = '')
					BEGIN
						SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado
						DELETE FROM PRO_DU31
						WHERE DUC_EANO = @Ano and DUC_PNUM = @Numero
						SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
					END
-- remove dados de manifesto do tipo dirty, clean ou scan quando em edição (se "Clean" [1] remove também as linhas "Scan")
				IF @OperacaoManifesto = 1
				BEGIN					
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado
					DELETE FROM PRO_DUOD
					WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUO_TIPO >= 1
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
				END
				ELSE
				BEGIN
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado			
					DELETE FROM PRO_DUOD
					WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUO_TIPO = @tipoManifesto		
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão		
				END	
			END
-- processa a inserção ou edição dos documentos e certificados da declaração IMP-CAU conforme a ação
			IF @acao = 'I'
			BEGIN			
-- obtem os documentos e certificados 
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('tipoDocumento[1]', 'int'), 
						t.c.value('codigoDocumento[1]', 'varchar(5)'), 
						NULLIF(t.c.value('numeroDocumento[1]', 'varchar(70)'), ''),
						NULLIF(t.c.value('qualificadorDC[1]', 'varchar(2)'), ''),
						t.c.value('dataValidade[1]', 'datetime'), 
						NULLIF(t.c.value('pais[1]', 'varchar(2)'), ''),
						ISNULL(t.c.value('montante[1]', 'decimal(18, 2)'), 0),
						NULLIF(t.c.value('entidadeEmissora[1]', 'varchar(70)'), ''),
						NULLIF(t.c.value('unidadeMedida[1]', 'varchar(3)'), ''),
						ISNULL(t.c.value('quantidade[1]', 'decimal(18, 6)'), 0)
					FROM @XMLDocumentos.nodes('documentosECertificados/documento') AS t(c)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @qualificadorDC, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, 
					@quantidade
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis
					SET @IdDocumento = NULL
					SET @IdPais = NULL
					SET @IdUnidadeMedida = NULL
-- obtem dados do documento
					SELECT @IdDocumento = DOC_IDTY
					FROM TAB_DOCU WITH(NOLOCK)
					WHERE LEN(DOC_CODI) = 4 AND DOC_DESP = 1 AND DOC_DTRA = (CASE @tipoDocumento WHEN 1 THEN 1 ELSE 0 END) AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
					IF @IdDocumento IS NULL
						RAISERROR('Documento "%s" inválido.', 16, 91, @codigoDocumento)		
-- obtem dados do país
					SELECT @IdPais = PAI_IDTY
					FROM TAB_PAIS WITH(NOLOCK)
					WHERE PAI_CODI = @pais
-- verifica se o país é válido
					IF (ISNULL(@pais, '') <> '') AND (@IdPais IS NULL)
						RAISERROR('País "%s" inválido.', 16, 92, @pais)
					ELSE
						IF (@IdPais IS NULL) AND (@montante > 0) 
							RAISERROR('Montante inválido quando não se especifica país.', 16, 93)
						ELSE
							IF (@IdPais IS NOT NULL) AND (@montante = 0) 
								RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 94, @pais)
-- obtem dados da unidade de medida
					SELECT @IdUnidadeMedida = UME_IDTY
					FROM TAB_UMED WITH(NOLOCK)
					WHERE UME_IMPT = 1 AND UME_CODI = @unidadeMedida
-- verifica se a unidade de medida é válida
					IF (ISNULL(@unidadeMedida, '') <> '') AND (@IdUnidadeMedida IS NULL)
						RAISERROR('Unidade de medida "%s" inválida.', 16, 95, @unidadeMedida)										
-- insere o documento no detalhe de documentos e certificados na nova declaracao IMP-CAU
					INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, qualificador, dataValidade, id_paisMoeda, montante, entidadeEmissora, id_unidadeMedida, 
						quantidade, id_utilizadorControlo, dataControlo)
					VALUES (@IdDeclaracao, 
						@tipoDocumento, 
						@IdDocumento, 
						@numeroDocumento, 
						@qualificadorDC,
						@dataValidade, 
						@IdPais, 
						@montante,
						@entidadeEmissora, 
						@IdUnidadeMedida, 
						@quantidade, 						
						@IdUtilizador, 
						@DataAtual)		
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @qualificadorDC, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, 
						@quantidade
				END
				CLOSE Documentos
				DEALLOCATE Documentos
			END
			ELSE
			BEGIN
-- obtem os documentos e certicados
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('tipoDocumento[1]', 'int'), 
						t.c.value('codigoDocumento[1]', 'varchar(5)'), 
						NULLIF(t.c.value('numeroDocumento[1]', 'varchar(70)'), ''),
						NULLIF(t.c.value('qualificadorDC[1]', 'varchar(2)'), ''),
						t.c.value('dataValidade[1]', 'datetime'), 
						NULLIF(t.c.value('pais[1]', 'varchar(2)'), ''),
						ISNULL(t.c.value('montante[1]', 'decimal(18, 2)'), 0),
						NULLIF(t.c.value('entidadeEmissora[1]', 'varchar(70)'), ''),
						NULLIF(t.c.value('unidadeMedida[1]', 'varchar(3)'), ''),
						ISNULL(t.c.value('quantidade[1]', 'decimal(18, 6)'), 0)
					FROM @XMLDocumentos.nodes('documentosECertificados/documento') AS t(c)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @qualificadorDC, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, 
					@quantidade
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis
					SET @IdRegisto = NULL
					SET @IdPais = NULL
					SET @IdUnidadeMedida = NULL
					SET @IdDocumento = NULL
-- obtem dados do país
					SELECT @IdPais = PAI_IDTY
					FROM TAB_PAIS WITH(NOLOCK)
					WHERE PAI_CODI = @pais
-- verifica se o país é válido
					IF (ISNULL(@pais, '') <> '') AND (@IdPais IS NULL)
						RAISERROR('País "%s" inválido.', 16, 96, @pais)
					ELSE
						IF (@IdPais IS NULL) AND (@montante > 0) 
							RAISERROR('Montante inválido quando não se especifica país.', 16, 97)
						ELSE
							IF (@IdPais IS NOT NULL) AND (@montante = 0) 
								RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 98, @pais)
-- obtem dados da unidade de medida
					SELECT @IdUnidadeMedida = UME_IDTY
					FROM TAB_UMED WITH(NOLOCK)
					WHERE UME_IMPT = 1 AND UME_CODI = @unidadeMedida
-- verifica se a unidade de medida é válida
					IF (ISNULL(@unidadeMedida, '') <> '') AND (@IdUnidadeMedida IS NULL)
						RAISERROR('Unidade de medida "%s" inválida.', 16, 99, @unidadeMedida)
-- obtem id do detalhe de documento
					SELECT @IdRegisto = ddo.id
					FROM tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoIMP = @IdDeclaracao AND doc.DOC_CODI = @codigoDocumento AND ddo.tipo = @tipoDocumento 
-- altera o documento na declaracao se este já existir
					IF @IdRegisto IS NOT NULL
					BEGIN
-- edita o documento no detalhe de documentos e certificados na nova declaracao IMP-CAU
						UPDATE tb_IMP_DeclaracoesDocumentos SET 
							numero = @numeroDocumento, 
							qualificador = @qualificadorDC, 
							dataValidade = @dataValidade, 
							id_paisMoeda = @IdPais, 
							montante = @montante, 
							entidadeEmissora = @entidadeEmissora, 
							id_unidadeMedida = @IdUnidadeMedida, 
							quantidade = @quantidade, 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdRegisto	
					END
					ELSE
-- insere o documento na declaração se não existir e apenas quando é DHL e atualização do portal
						IF ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL'
						BEGIN					
-- obtem dados do documento
							SELECT @IdDocumento = DOC_IDTY
							FROM TAB_DOCU WITH(NOLOCK)
							WHERE LEN(DOC_CODI) = 4 AND DOC_DESP = 1 AND DOC_DTRA = (CASE @tipoDocumento WHEN 1 THEN 1 ELSE 0 END) AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
							IF @IdDocumento IS NULL
								RAISERROR('Documento "%s" inválido.', 16, 100, @codigoDocumento)											
-- insere o documento no detalhe de documentos e certificados na nova declaracao IMP-CAU
							INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, qualificador, dataValidade, id_paisMoeda, montante, entidadeEmissora, 
								id_unidadeMedida, quantidade, id_utilizadorControlo, dataControlo)
							VALUES (@IdDeclaracao, 
								@tipoDocumento, 
								@IdDocumento, 
								@numeroDocumento, 
								@qualificadorDC,
								@dataValidade, 
								@IdPais, 
								@montante,
								@entidadeEmissora, 
								@IdUnidadeMedida, 
								@quantidade, 						
								@IdUtilizador, 
								@DataAtual)							
						END
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @qualificadorDC, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, 
						@quantidade
				END
				CLOSE Documentos
				DEALLOCATE Documentos
			END
-- processa a inserção dos restantes detalhes da declaração IMP-CAU apenas quando a ação for INSERT
			IF @acao = 'I'
			BEGIN
-- obtem os documentos precedentes
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('codigoDocumento[1]', 'varchar(5)'), 
						t.c.value('numeroDocumento[1]', 'varchar(70)'), 
						NULLIF(t.c.value('qualificadorDC[1]', 'varchar(2)'), '')
					FROM @XMLPrecedentes.nodes('documentosPrecedentes/documentoPrecedente') AS t(c)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento, @qualificadorDC
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis
					SET @IdDocumento = NULL
					SET @IdRegisto = NULL
-- obtem dados do documento
					SELECT @IdDocumento = DOC_IDTY
					FROM TAB_DOCU WITH(NOLOCK)
					WHERE DOC_CA40 = 1 AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
					IF @IdDocumento IS NULL
						RAISERROR('Documento precedente "%s" inválido.', 16, 101, @codigoDocumento)		
-- obtem id do detalhe de documento precedente
					SELECT @IdRegisto = id
					FROM tb_IMP_DeclaracoesPrecedentes WITH(NOLOCK) 						
					WHERE id_declaracaoIMP = @IdDeclaracao AND id_documento = @IdDocumento	
-- verifica se vai proceder à inserção ou edição (no caso do documento já ter sido criado porum processo automático)
					IF @IdRegisto IS NULL
					BEGIN												
-- insere o documento no detalhe de documentos precedentes na nova declaracao IMP-CAU
						INSERT INTO tb_IMP_DeclaracoesPrecedentes(id_declaracaoIMP, id_documento, numero, qualificador, id_utilizadorControlo, dataControlo)
						VALUES (@IdDeclaracao, 
							@IdDocumento, 
							@numeroDocumento, 
							@qualificadorDC, 										
							@IdUtilizador, 
							@DataAtual)		
					END
					ELSE
					BEGIN												
-- edita o documento no detalhe de documentos precedentes na nova declaracao IMP-CAU
						UPDATE tb_IMP_DeclaracoesPrecedentes SET 
							numero = @numeroDocumento, 
							qualificador = @qualificadorDC, 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdRegisto
					END
					FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento, @qualificadorDC
				END
				CLOSE Documentos
				DEALLOCATE Documentos
-- inicia variavel
				SET @UltCodTabela = ISNULL((SELECT MAX(DPD_CODI) FROM PRO_DUPD WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero), 0)
-- obtem os pedidos
				DECLARE Pedidos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('codigoPedido[1]', 'varchar(5)'), 
						NULLIF(t.c.value('numeroPedido[1]', 'varchar(512)'), ''), 
						NULLIF(t.c.value('qualificadorDC[1]', 'varchar(2)'), '')
					FROM @XMLPedidos.nodes('pedidos/pedido') AS t(c)
				OPEN Pedidos
				FETCH NEXT FROM Pedidos INTO @codigoPedido, @numeroPedido, @qualificadorDC
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis
					SET @IdPedido = NULL
					SET @UltCodTabela = @UltCodTabela + 1
-- obtem dados do pedido
					SELECT @IdPedido = TXM_IDTY
					FROM TAB_TXML WITH(NOLOCK)
					WHERE LEN(TXM_CODI) = 5 AND TXM_CODI = @codigoPedido
-- verifica se o pedido é válido
					IF @IdPedido IS NULL
						RAISERROR('Pedido "%s" inválido.', 16, 102, @codigoPedido)		
-- insere o pedido no detalhe de pedidos na nova declaracao IMP-CAU
					INSERT INTO PRO_DUPD(DUC_EANO, DUC_PNUM, DPD_CODI, TXM_CODI, DPD_DESC, DPD_QUAL)
					VALUES (@Ano,
						@Numero, 
						@UltCodTabela,  
						@codigoPedido, 
						@numeroPedido, 
						@qualificadorDC)		
					FETCH NEXT FROM Pedidos INTO @codigoPedido, @numeroPedido, @qualificadorDC
				END
				CLOSE Pedidos
				DEALLOCATE Pedidos
-- inicia variavel
				SET @UltCodTabela = ISNULL((SELECT MAX(DUI_CODI) FROM PRO_DUIN WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero), 0)
-- obtem as incidências
				DECLARE Incidencias CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('codigoIncidencia[1]', 'varchar(8)'), 
						t.c.value('dataInicio[1]', 'datetime'), 
						t.c.value('dataFim[1]', 'datetime'), 
						NULLIF(t.c.value('observacoes[1]', 'varchar(MAX)'), ''),
						NULLIF(t.c.value('tipoIncidencia[1]', 'varchar(1)'), '')
					FROM @XMLIncidencias.nodes('incidencias/incidencia') AS t(c)
				OPEN Incidencias
				FETCH NEXT FROM Incidencias INTO @codigoIncidencia, @dataInicio, @dataFim, @observacoes, @tipoIncidencia
				WHILE @@FETCH_STATUS = 0
				BEGIN	
-- inicia variáveis					
					SET @IdIncidencia = NULL
					SET @UltCodTabela = @UltCodTabela + 1
-- obtem dados da incidência
					SELECT @IdIncidencia = t.SIN_IDTY, @NomeIncidencia = t.SIN_DESP, @ReleaseHold = ISNULL((CASE @tipoIncidencia WHEN 'R' THEN 0 WHEN 'H' THEN 1 ELSE NULL END), t.SIN_REHO)
					FROM (SELECT SIN_CODI, SIN_DESP, SIN_IDTY, NULL AS SIN_REHO
						FROM TAB_SINC WITH(NOLOCK)
						UNION ALL
						SELECT COS_CODE, COS_POST, COS_IDTY, (CASE WHEN COS_RELI = 1 THEN 0 WHEN COS_HOLD = 1 THEN 1 ELSE NULL END)
						FROM TAB_COSM WITH(NOLOCK)
					) AS t
					WHERE t.SIN_CODI = @codigoIncidencia
-- verifica se a incidência é válida
					IF @IdIncidencia IS NULL
						RAISERROR('Status de incidência "%s" inválido.', 16, 103, @codigoIncidencia)		
					ELSE
						IF @dataFim < @dataInicio
							RAISERROR('Data de fim inferior à data de início.', 16, 104)		
-- insere a incidência no detalhe de incidências na nova declaracao IMP-CAU
					INSERT INTO PRO_DUIN(DUC_EANO, DUC_PNUM, DUI_CODI, SIN_CODI, SIN_DESC, DUI_DINI, DUI_HINI, DUI_DFIM, DUI_HFIM, DUI_OBSR, DUI_REHO)
					VALUES (@Ano, @Numero, @UltCodTabela, @codigoIncidencia, @NomeIncidencia, CAST(CONVERT(varchar(10), @dataInicio, 105) AS datetime), CAST(CONVERT(varchar(12), @dataInicio, 114) AS datetime), CAST(CONVERT(varchar(10), @dataFim, 105) AS datetime), CAST(CONVERT(varchar(12), @dataFim, 114) AS datetime), @observacoes, @ReleaseHold)
					FETCH NEXT FROM Incidencias INTO @codigoIncidencia, @dataInicio, @dataFim, @observacoes, @tipoIncidencia
				END
				CLOSE Incidencias
				DEALLOCATE Incidencias		
-- inicia variavel
				SET @UltCodTabela = ISNULL((SELECT MAX(DFW_CODI) FROM PRO_DUFW WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero), 0)
-- obtem os follow-ups
				DECLARE FollowUps CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('codigoFollowUp[1]', 'int'), 
						t.c.value('utilizador[1]', 'varchar(30)'), 
						t.c.value('dataHora[1]', 'datetime')						
					FROM @XMLFollowUps.nodes('followUps/followUpData') AS t(c)
				OPEN FollowUps
				FETCH NEXT FROM FollowUps INTO @followUp, @utilizador, @dataHora
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis	
					SET @CodigoFollowUp = NULL
					SET @IdUtilizadorValido = NULL
					SET @UltCodTabela = @UltCodTabela + 1
-- obtem dados do follow-up
					SELECT @CodigoFollowUp = FUP_CODI
					FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK)
					WHERE FUP_EXPO = 0 AND FUP_CODI = @followUp
-- verifica se o follow-up é válido
					IF @CodigoFollowUp IS NULL
						RAISERROR('Follow-up "%d" inválido.', 16, 105, @followUp)	
-- obtem dados do utilizador
					SELECT @IdUtilizadorValido = UTI_IDTY
					FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
					WHERE UTI_UTIL = @utilizador
-- verifica se o utilizador é válido
					IF @IdUtilizadorValido IS NULL
						RAISERROR('Utilizador "%s" inválido.', 16, 106, @utilizador)											
-- insere o follow-up no detalhe de follow-ups na nova declaracao IMP-CAU
					INSERT INTO PRO_DUFW(DUC_EANO, DUC_PNUM, DFW_CODI, DFW_DATA, FUP_CODI, UTI_UTIL)
					VALUES (@Ano, 
						@Numero, 
						@UltCodTabela, 
						@dataHora,						
						@CodigoFollowUp, 
						@utilizador)		
					FETCH NEXT FROM FollowUps INTO @followUp, @utilizador, @dataHora
				END
				CLOSE FollowUps
				DEALLOCATE FollowUps										
-- obtem os contactos
				DECLARE Contactos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('descricaoContacto[1]', 'varchar(200)'), 
						t.c.value('utilizador[1]', 'varchar(30)'), 
						t.c.value('dataHora[1]', 'datetime')						
					FROM @XMLContactos.nodes('contactos/contacto') AS t(c)
				OPEN Contactos
				FETCH NEXT FROM Contactos INTO @descricaoContacto, @utilizador, @dataHora
				WHILE @@FETCH_STATUS = 0
				BEGIN				
-- inicia variáveis	
					SET @IdUtilizadorValido = NULL
-- obtem dados do utilizador
					SELECT @IdUtilizadorValido = UTI_IDTY
					FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
					WHERE UTI_UTIL = @utilizador
-- verifica se o utilizador é válido
					IF @IdUtilizadorValido IS NULL
						RAISERROR('Utilizador "%s" inválido.', 16, 107, @utilizador)								
-- insere o contacto no detalhe de contactos na nova declaracao IMP-CAU
					INSERT INTO PRO_DUCN(DUC_PNUM, DUC_EANO, DCN_TEXT, DCN_UCRI, DCN_DTCR)
					VALUES (@Numero, 
						@Ano, 
						@descricaoContacto, 
						@utilizador,												
						@dataHora)		
					FETCH NEXT FROM Contactos INTO @descricaoContacto, @utilizador, @dataHora
				END
				CLOSE Contactos
				DEALLOCATE Contactos	
-- obtem os arquivos
				DECLARE Arquivos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						t.c.value('nomeArquivo[1]', 'varchar(100)'), 
						t.c.value('descricaoArquivo[1]', 'varchar(150)'), 
						t.c.value('tipoArquivo[1]', 'varchar(8)'), 
						t.c.value('origemArquivo[1]', 'int'),
						t.c.value('ficheiroBase64[1]', 'varchar(MAX)')					
					FROM @XMLArquivos.nodes('arquivos/arquivo') AS t(c)
				OPEN Arquivos
				FETCH NEXT FROM Arquivos INTO @nomeArquivo, @descricaoArquivo, @tipoArquivo, @origemArquivo, @ficheiroBase64
				WHILE @@FETCH_STATUS = 0
				BEGIN				
-- converte o base64 para varbinary 
					SET @FicheiroBinario = CAST('' AS XML).value('xs:base64Binary(sql:variable("@ficheiroBase64"))', 'varbinary(MAX)')									
-- insere o arquivo no detalhe de arquivo documental na nova declaracao IMP-CAU
					INSERT INTO PRO_DUFI(DUC_PNUM, DUC_EANO, DUF_DESC, DUF_DATA, DUF_NOMF, DUF_UTIL, DUF_TMSG, DUF_ORIG, DUF_FICH)
					VALUES (@Numero, 
						@Ano, 
						@descricaoArquivo, 																		
						@DataAtual, 
						@nomeArquivo, 
						@CodUtilizador,
						@tipoArquivo, 
						@origemArquivo, 
						@FicheiroBinario)		
					FETCH NEXT FROM Arquivos INTO @nomeArquivo, @descricaoArquivo, @tipoArquivo, @origemArquivo, @ficheiroBase64
				END
				CLOSE Arquivos
				DEALLOCATE Arquivos	
			END
-- inicia variavel
			SET @UltCodTabela = ISNULL((SELECT MAX(DUO_CODI) FROM PRO_DUOD WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero), 0)
-- obtem os manifestos
			DECLARE Manifestos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT 
					t.c.value('tipoManifesto[1]', 'int'), 
					NULLIF(t.c.value('paisManifesto[1]', 'varchar(2)'), ''), 
					NULLIF(t.c.value('descricao[1]', 'varchar(104)'), ''), 
					t.c.value('valor[1]', 'decimal(18, 3)'), 
					NULLIF(t.c.value('paisMoeda[1]', 'varchar(2)'), ''), 
					t.c.value('totalFatura[1]', 'decimal(18, 3)'), 
					NULLIF(t.c.value('numeroCPA[1]', 'varchar(35)'), ''), 
					t.c.value('pesoBruto[1]', 'decimal(18, 3)')					
				FROM @XMLManifestos.nodes('manifestos/manifesto') AS t(c)
			OPEN Manifestos
			FETCH NEXT FROM Manifestos INTO @tipoManifesto, @paisManifesto, @descricao, @valor, @paisMoedaManifesto, @totalFatura, @numeroCPA, @pesoBruto
			WHILE @@FETCH_STATUS = 0
			BEGIN			
-- inicia variáveis										
				SET @CodigoPaisManifesto = NULL
				SET @IdPaisMoedaManifesto = NULL
				SET @MoedaManifesto = NULL
				SET @UltCodTabela = @UltCodTabela + 1
-- obtem dados do país do manifesto
				SELECT @CodigoPaisManifesto = PAI_CODI
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisManifesto
-- verifica se o país do manifesto é válido
				IF (ISNULL(@paisManifesto, '') <> '') AND (ISNULL(@CodigoPaisManifesto, '') = '')
					RAISERROR('País "%s" do manifesto inválido.', 16, 108, @paisManifesto)
-- obtem dados do país da moeda do manifesto
				SELECT @IdPaisMoedaManifesto = PAI_IDTY, @MoedaManifesto = PAI_PREF
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisMoedaManifesto	
-- verifica se o país da moeda do manifesto é válido
				IF (ISNULL(@paisMoedaManifesto, '') <> '') AND (@IdPaisMoedaManifesto IS NULL)
					RAISERROR('País "%s" da moeda do manifesto inválido.', 16, 109, @paisMoedaManifesto)												
-- insere o manifesto no detalhe de manifestos na nova declaracao IMP-CAU
				SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de INSERT não ser processado
				INSERT INTO PRO_DUOD(DUC_EANO, DUC_PNUM, DUO_CODI, PAI_CODI, DUO_DESC, DUO_VALO, DUO_MOED, DUO_TFAC, DUO_CPA2, DUO_PES2, DUO_TIPO, PAI_IDTY)				
				VALUES (@Ano,
					@Numero, 
					@UltCodTabela, 
					@CodigoPaisManifesto, 
					@descricao,
					@valor, 
					@MoedaManifesto, 
					@totalFatura,
					@numeroCPA, 	
					@pesoBruto,
					@tipoManifesto, 												
					@IdPaisMoedaManifesto)	
				SET CONTEXT_INFO 0x0 --reset à variavel global de sessão											
				FETCH NEXT FROM Manifestos INTO @tipoManifesto, @paisManifesto, @descricao, @valor, @paisMoedaManifesto, @totalFatura, @numeroCPA, @pesoBruto
			END
			CLOSE Manifestos
			DEALLOCATE Manifestos		
-- altera ação da declaração de modo a ignorar a leitura das adições
			IF (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') AND (EXISTS(SELECT 1 FROM PRO_DUCG WITH(NOLOCK) WHERE DUC_ADI5 > 1 AND DUC_IDTY = @IdDeclaracao))			
				SET @acao = ''							
-- obtem as adições do XML
			DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT ISNULL(NULLIF(t.c.value('@acao[1]', 'varchar(1)'), ''), @acao), 
					t.c.value('numeroAdicao[1]', 'int'), 
					t.c.value('codigoPautal[1]', 'varchar(22)'), 
					t.c.value('designacao[1]', 'varchar(150)'), 
					NULLIF(t.c.value('regimeAdicional[1]', 'varchar(6)'), ''), 
					NULLIF(t.c.value('paisOrigem[1]', 'varchar(2)'), ''), 
					NULLIF(t.c.value('preferencia[1]', 'varchar(3)'), ''), 
					t.c.value('metodoAvaliacao[1]', 'int'), 
					t.c.value('massaLiquida[1]', 'decimal(18, 6)'), 
					t.c.value('massaBruta[1]', 'decimal(18, 6)'), 
					ISNULL(t.c.value('unidades[1]', 'decimal(18, 6)'), 0), 
					t.c.value('montanteAd[1]', 'decimal(18, 3)'), 						
					t.c.value('valorFrete[1]', 'decimal(18, 3)'), 
					t.c.value('valorSeguro[1]', 'decimal(18, 3)'), 
					t.c.value('taxaIVA[1]', 'decimal(18, 2)'),  						
					t.c.query('documentosECertificados'),
					t.c.query('documentosPrecedentes'), 					
					t.c.query('pedidos'), 
					t.c.query('marcasEVolumes'), 
					t.c.query('contentores'), 
					t.c.query('veiculos')
				FROM @XMLAdicoes.nodes('adicoes/adicao') AS t(c)
				WHERE (@acao = 'I') OR ((@acao = 'U') AND ((@CamposAdicionais <> 2) OR ((@CamposAdicionais = 2) AND (@OperacaoManifesto = 0))))					
			OPEN Adicoes			
			FETCH NEXT FROM Adicoes INTO @acaoAdicao, @numeroAdicao, @codigoPautal, @designacao, @regimeAdicional, @paisOrigem, @preferencia, @metodoAvaliacao, @massaLiquida, @massaBruta, 
				@unidades, @montanteAd, @valorFrete, @valorSeguro, @taxaIVA, @XMLDocumentos, @XMLPrecedentes, @XMLPedidos, @XMLMarcasEVolumes, @XMLContentores, @XMLVeiculos
			WHILE @@FETCH_STATUS = 0
			BEGIN	
-- inicia variáveis
				SET @CodigoArtigo = NULL	
				SET @IdDesdobramento = NULL				
				SET @CodigoPaisOrigem = NULL
				SET @CodigoPreferencia = NULL
				SET @IdAdicao = NULL
				SET @Resultado = 0
				SET @MsgErro = NULL
-- obtem dados do artigo
				SELECT TOP 1 @CodigoArtigo = APA_CODI, 
						@designacao = (CASE 											
											WHEN APA_CPAU IN ('9999999999', '9999999998', '9999999997', '9999999996') THEN @designacao --cóodigo de artigo genérico/códigos de artigo restritos e dumping
											ELSE ISNULL(NULLIF(APA_DESG, ''), @designacao) 
									END)
				FROM TAB_APAU WITH(NOLOCK)
				WHERE APA_INAC = 0 AND APA_FLUX IN (0, 1) AND APA_EDAR = 0 AND LEN(APA_CPAU) >= 10 AND APA_CPAU = @codigoPautal
-- se artigo não existir, assume como artigo "Artigo Genérico"
				IF ISNULL(@CodigoArtigo, '') = ''
				BEGIN
					SELECT TOP 1 @CodigoArtigo = APA_CODI
					FROM TAB_APAU WITH(NOLOCK) 
					WHERE APA_INAC = 0 AND APA_FLUX IN (0, 1) AND APA_EDAR = 0 AND LEN(APA_CPAU) >= 10 AND APA_CPAU = '9999999999'
				END
-- verifica se o artigo é válido
				IF ISNULL(@CodigoArtigo, '') = ''
					RAISERROR('Artigo "%s" inválido.', 16, 110, @codigoPautal)	
-- obtem dados do desdobramento do regime
				SELECT TOP 1 @IdDesdobramento = id					
				FROM tb_TBL_Desdobramentos WITH(NOLOCK)
				WHERE tipoDeclaracao = @1CasaTipoDeclaracao AND regime = @Regime AND desdobramento1 = @regimeAdicional
-- verifica se o desdobramento é válido
				IF (ISNULL(@regimeAdicional, '') <> '') AND (@IdDesdobramento IS NULL) 					
					RAISERROR('Regime adicional "%s" inválido.', 16, 111, @regimeAdicional)					
-- obtem dados do país de origem
				SELECT @CodigoPaisOrigem = PAI_CODI
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisOrigem	
-- verifica se o país de origem é válido
				IF (ISNULL(@paisOrigem, '') <> '') AND (ISNULL(@CodigoPaisOrigem, '') = '')
					RAISERROR('País de origem "%s" inválido.', 16, 112, @paisOrigem)	
-- obtem dados da preferência
				SELECT @CodigoPreferencia = PRE_CODI
				FROM TAB_PREF WITH(NOLOCK)
				WHERE PRE_CODI = @preferencia
-- verifica se a preferência é válida
				IF (ISNULL(@preferencia, '') <> '') AND (ISNULL(@CodigoPreferencia, '') = '')
					RAISERROR('Preferência "%s" inválida.', 16, 113, @preferencia)
-- processa a inserção ou edição da adição conforme a ação da adição 
				IF @acaoAdicao = 'I'
				BEGIN
-- insere a adição no detalhe de adições na nova declaracao IMP-CAU
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado
					EXEC @Resultado = sp_IMP_Declaracoes_AdicoesInsere @Ano, @Numero, @numeroAdicao, @CodigoArtigo, @massaLiquida, @massaBruta, @montanteAd, @unidades, @CodigoPreferencia, @CodigoPaisOrigem, @designacao, @regimeAdicional, @metodoAvaliacao, @valorFrete, @valorSeguro, @taxaIVA, @IdAdicao OUTPUT, @MsgErro OUTPUT
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão	
					IF @Resultado > 0
						RAISERROR('Erro na inserção da adição n.º "%d"! ERRO: "%s".', 16, 114, @numeroAdicao, @MsgErro)		
				END	
				ELSE
				BEGIN	
-- obtem dados da adição
					SELECT @IdAdicao = adi.DUA_IDEN, @unidades = ISNULL(adi.DUA_US41, 0), @CodigoPreferencia = adi.PRE_CO36, @CodigoPaisOrigem = adi.PAI_CO34, @DireitosDDP = ISNULL(adi.DUA_VDIR, 0), 
						@montanteAd = (CASE  
											WHEN (@CamposAdicionais = 2) OR (ISNULL(@ExtraFieldUPDATEValue, '') = 'DHL-PORTAL') THEN @montanteAd
											ELSE adi.DUA_VA42 
										END), 
						@massaLiquida = (CASE 
											WHEN (@CamposAdicionais IN (1, 2, 4)) AND (@OperacaoManifesto <> 2) THEN @massaLiquida 
											ELSE adi.DUA_ML38 
										END), 
						@massaBruta = (CASE 										
										WHEN @CamposAdicionais = 3 THEN (CASE 
																			WHEN @NaturezaRetorno = 1 THEN @massaBruta 
																			WHEN (@NaturezaRetorno = 0 AND duc.DUC_ADI5 = 1 AND (ABS(adi.DUA_MB35) - @massaBruta) < 0.500) THEN @massaBruta 
																			ELSE adi.DUA_MB35 
																		END)
										WHEN (@CamposAdicionais IN (1, 4)) AND (@OperacaoManifesto = 2) THEN adi.DUA_MB35 
										ELSE @massaBruta 
									END)
					FROM PRO_DUAD AS adi WITH(NOLOCK) 	
						INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM						
					WHERE adi.DUC_EANO = @Ano AND adi.DUC_PNUM = @Numero AND adi.DUA_CODI = @numeroAdicao					 								
-- verifica se a adição é válida
					IF @IdAdicao IS NULL
						RAISERROR('Adição n.º "%d" não existe na declaraçao IMP-CAU.', 16, 115, @numeroAdicao)	
-- edita a adição no detalhe de adições na nova declaracao IMP-CAU
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de DELETE não ser processado
					EXEC @Resultado = sp_IMP_Declaracoes_AdicoesEdita @IdAdicao, @Ano, @Numero, @numeroAdicao, @CodigoArtigo, @massaLiquida, @massaBruta, @montanteAd, @unidades, @CodigoPreferencia, @CodigoPaisOrigem, @DireitosDDP, @MsgErro OUTPUT
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão	
					IF @Resultado > 0
						RAISERROR('Erro na edição da adição n.º "%d"! ERRO: "%s".', 16, 116, @numeroAdicao, @MsgErro)														
				END
-- inicia variavel
				SET @UltCodTabela = ISNULL((SELECT MAX(D31_CODI) FROM PRO_DU31 WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @numeroAdicao), 0)
-- obtem as marcas e volumes da adição
				DECLARE MarcasVolumes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT 
						NULLIF(t.c.value('unidadeMedida[1]', 'varchar(3)'), ''),
						t.c.value('volumes[1]', 'int'), 							
						NULLIF(t.c.value('marcas[1]', 'varchar(512)'), ''), 														
						NULLIF(t.c.value('numeroObjeto[1]', 'varchar(20)'), ''),							
						NULLIF(t.c.value('codigoBarras[1]', 'varchar(30)'), ''),							
						t.c.value('parte[1]', 'bit')
					FROM @XMLMarcasEVolumes.nodes('marcasEVolumes/marcaEVolume') as t(c)
				OPEN MarcasVolumes
				FETCH NEXT FROM MarcasVolumes INTO @unidadeMedida, @volumes, @marcas, @numeroObjeto, @codigoBarras, @parte
				WHILE @@FETCH_STATUS = 0
				BEGIN		
-- inicia variáveis						
					SET @CodigoUnidadeMedida = NULL
					SET @NomeUnidadeMedida = NULL
					SET @VolumesAZero = 0
					SET @UltCodTabela = @UltCodTabela + 1	
-- obtem dados da unidade de medida
					SELECT @CodigoUnidadeMedida = UME_CODI, @NomeUnidadeMedida = UME_NOME, @VolumesAZero = UME_TVOL
					FROM TAB_UMED WITH(NOLOCK)
					WHERE UME_IMPT = 1 AND LEN(UME_CODI) <= 2 AND UME_CODI = @unidadeMedida
-- verifica se a unidade de medida é válida
					IF (ISNULL(@unidadeMedida, '') <> '') AND (ISNULL(@CodigoUnidadeMedida, '') = '')
						RAISERROR('Unidade de medida "%s" inválida.', 16, 117, @unidadeMedida)
					ELSE
						IF (@anexoB = 'H6') AND (ISNULL(@CodigoUnidadeMedida, '') <> '')
							RAISERROR('Unidade de medida "%s" inválida para o anexo B "%s".', 16, 118, @CodigoUnidadeMedida, @anexoB)
						ELSE
							IF (@anexoB <> 'H6') AND (ISNULL(@CodigoUnidadeMedida, '') = '')
								RAISERROR('O anexo B "%s" obriga ao preenchimento da unidade de medida.', 16, 119, @anexoB)							
							ELSE
								IF (ISNULL(@CodigoUnidadeMedida, '') NOT IN ('NE', 'NF', 'NG')) AND (@volumes = 0)
									RAISERROR('Unidade de medida "%s" obriga ao preenchimento dos volumes.', 16, 120, @unidadeMedida)
								ELSE
									IF (ISNULL(@CodigoUnidadeMedida, '') <> '') AND (@VolumesAZero = 1) AND (@volumes > 0)
										RAISERROR('Volumes inválidos para a Unidade de medida "%s".', 16, 121, @unidadeMedida)
-- verifica se as marcas é válida
					IF (@anexoB = 'H6') AND (ISNULL(@marcas, '') <> '')
						RAISERROR('Marcas "%s" inválida para o anexo B "%s".', 16, 122, @marcas, @anexoB)
					ELSE
						IF (@anexoB NOT IN ('H6', 'I1')) AND (ISNULL(@marcas, '') = '')
							RAISERROR('O anexo B "%s" obriga ao preenchimento das marcas.', 16, 123, @anexoB)
-- verifica restantes regras														
					IF (@numeroAdicao > 1) AND (@parte = 1)
						RAISERROR('"Parte" apenas é válido na 1ª adição.', 16, 124)
					IF (@CamposAdicionais <> 5) AND (ISNULL(@numeroObjeto, '') <> '')
						RAISERROR('Número do objeto "%s" inválido neste contexto.', 16, 125, @numeroObjeto)
					IF (@CamposAdicionais <> 5) AND (ISNULL(@codigoBarras, '') <> '')
						RAISERROR('Código de barras "%s" inválido neste contexto.', 16, 126, @codigoBarras)						
-- insere a marca e volume no sub-detalhe de marcas e volumes da adição na nova declaracao IMP-CAU
					SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de INSERT não ser processado
					INSERT INTO PRO_DU31(DUC_EANO, DUC_PNUM, DUA_CODI, D31_CODI, D31_MARC, D31_NUME, D31_QNTD, UME_CODI, UME_NOME, D31_CASP, D31_TTVL, D31_LOPT)
					VALUES (@Ano, 
						@Numero, 
						@numeroAdicao, 
						@UltCodTabela, 
						@marcas, 
						@numeroObjeto, 
						@volumes, 
						@CodigoUnidadeMedida, 
						@NomeUnidadeMedida, 
						@parte, 
						@VolumesAZero, 
						@codigoBarras)	
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão	
					FETCH NEXT FROM MarcasVolumes INTO @unidadeMedida, @volumes, @marcas, @numeroObjeto, @codigoBarras, @parte
				END
				CLOSE MarcasVolumes
				DEALLOCATE MarcasVolumes																
-- processa a inserção dos restantes detalhes da adição apenas quando a ação for INSERT
				IF @acaoAdicao = 'I'
				BEGIN
-- inicia variavel
					SET @UltCodTabela = ISNULL((SELECT MAX(DDO_CODI) FROM PRO_DDOC WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @numeroAdicao), 0)
-- obtem os documentos e certicados da adição
					DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT 
							t.c.value('tipoDocumento[1]', 'int'), 
							t.c.value('codigoDocumento[1]', 'varchar(5)'), 
							NULLIF(t.c.value('numeroDocumento[1]', 'varchar(70)'), ''), 							
							t.c.value('dataValidade[1]', 'datetime'), 
							NULLIF(t.c.value('pais[1]', 'varchar(2)'), ''),
							ISNULL(t.c.value('montante[1]', 'decimal(18, 2)'), 0),
							NULLIF(t.c.value('entidadeEmissora[1]', 'varchar(70)'), ''),
							NULLIF(t.c.value('unidadeMedida[1]', 'varchar(3)'), ''),
							ISNULL(t.c.value('quantidade[1]', 'decimal(18, 6)'), 0)
						FROM @XMLDocumentos.nodes('documentosECertificados/documento') as t(c)
					OPEN Documentos
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, @quantidade
					WHILE @@FETCH_STATUS = 0
					BEGIN		
-- inicia variáveis
						SET @IdDocumento = NULL
						SET @NomeDocumento = NULL
						SET @IdPais = NULL
						SET @CodigoUnidadeMedida = NULL
						SET @UltCodTabela = @UltCodTabela + 1
-- obtem dados do documento
						SELECT @IdDocumento = DOC_IDTY, @NomeDocumento = DOC_NOME, 
							@numeroDocumento = ISNULL(@numeroDocumento, (CASE DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END))							
						FROM TAB_DOCU WITH(NOLOCK)
						WHERE LEN(DOC_CODI) = 4 AND DOC_DESP = 1 AND DOC_DTRA = (CASE @tipoDocumento WHEN 1 THEN 1 ELSE 0 END) AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
						IF @IdDocumento IS NULL
							RAISERROR('Documento "%s" inválido.', 16, 127, @codigoDocumento)		
-- obtem dados do país
						SELECT @IdPais = PAI_IDTY
						FROM TAB_PAIS WITH(NOLOCK)
						WHERE PAI_CODI = @pais
-- verifica se o país é válido
						IF (ISNULL(@pais, '') <> '') AND (@IdPais IS NULL)
							RAISERROR('País "%s" inválido.', 16, 128, @pais)
						ELSE
							IF (@IdPais IS NULL) AND (@montante > 0) 
								RAISERROR('Montante inválido quando não se especifica país.', 16, 129)
							ELSE
								IF (@IdPais IS NOT NULL) AND (@montante = 0) 
									RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 130, @pais)
-- obtem dados da unidade de medida
						SELECT @CodigoUnidadeMedida = UME_CODI
						FROM TAB_UMED WITH(NOLOCK)
						WHERE UME_IMPT = 1 AND UME_CODI = @unidadeMedida
-- verifica se a unidade de medida é válida
						IF (ISNULL(@unidadeMedida, '') <> '') AND (ISNULL(@CodigoUnidadeMedida, '') = '')
							RAISERROR('Unidade de medida "%s" inválida.', 16, 131, @unidadeMedida)				
-- insere o documento no sub-detalhe de documentos da adição na nova declaracao IMP-CAU
						INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_DINI, PAI_CODI, DDO_MONT, DDO_DPRZ, DDO_TIPO, DDO_EEMI, UME_CODI, DDO_QTDE)
						VALUES (@Ano, 
							@Numero, 
							@numeroAdicao, 
							@UltCodTabela, 
							@codigoDocumento, 
							@NomeDocumento, 
							@numeroDocumento, 
							@dataValidade, 
							@pais, 
							@montante, 
							0, 
							@tipoDocumento, 
							@entidadeEmissora, 
							@CodigoUnidadeMedida, 
							@quantidade)		
						FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento, @dataValidade, @pais, @montante, @entidadeEmissora, @unidadeMedida, @quantidade
					END
					CLOSE Documentos
					DEALLOCATE Documentos	
-- obtem os documentos precedentes
					DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT 
							t.c.value('codigoDocumento[1]', 'varchar(5)'), 
							t.c.value('numeroDocumento[1]', 'varchar(70)'), 
							NULLIF(t.c.value('qualificadorDC[1]', 'varchar(2)'), '')
						FROM @XMLPrecedentes.nodes('documentosPrecedentes/documentoPrecedente') AS t(c)
					OPEN Documentos
					FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento, @qualificadorDC
					WHILE @@FETCH_STATUS = 0
					BEGIN		
-- inicia variáveis
						SET @IdDocumento = NULL					
						SET @IdUnidadeMedidaVolumes = NULL
						SET @VolumesPrecedente = NULL
						SET @IdUnidadeMedidaQualificador = NULL
-- obtem dados do documento
						SELECT @IdDocumento = DOC_IDTY
						FROM TAB_DOCU WITH(NOLOCK)
						WHERE DOC_CA40 = 1 AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
						IF @IdDocumento IS NULL
							RAISERROR('Documento precedente "%s" inválido.', 16, 132, @codigoDocumento)		
-- obtem dados da unidade de medida de volumes no detalhe de Marcas&Volumes da adição
						SELECT TOP 1 @VolumesPrecedente = NULLIF(dam.D31_QNTD, 0), @IdUnidadeMedidaVolumes = ume.UME_IDTY
						FROM PRO_DU31 AS dam WITH(NOLOCK)
							LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON dam.UME_CODI = ume.UME_CODI
						WHERE dam.DUC_EANO = @Ano AND dam.DUC_PNUM = @Numero AND dam.DUA_CODI = @numeroAdicao
						ORDER BY dam.D31_CODI
-- obtem dados da unidade de medida do qualificador
						SELECT @IdUnidadeMedidaQualificador = UME_IDTY
						FROM TAB_UMED WITH(NOLOCK)
						WHERE UME_IMPT = 1 AND UME_CODI = 'KGM'
-- insere o documento no sub-detalhe de documentos precedentes da adição na nova declaracao IMP-CAU																	
						INSERT INTO tb_IMP_DeclaracoesAdicoesPrecedentes(id_adicao, id_documento, numero, id_unidadeMedidaVolumes, volumes, id_unidadeMedidaQualificador, quantidade, numeroAdicao, 
							id_utilizadorControlo, dataControlo)
						VALUES (@IdAdicao, 
							@IdDocumento, 
							@numeroDocumento, 						
							@IdUnidadeMedidaVolumes, 
							@VolumesPrecedente, 
							@IdUnidadeMedidaQualificador, 
							@massaBruta, 
							@numeroAdicao, 
							@IdUtilizador, 
							@DataAtual)							
						FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento, @qualificadorDC
					END
					CLOSE Documentos
					DEALLOCATE Documentos							
-- obtem os pedidos da adição
					DECLARE Pedidos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT 
							t.c.value('codigoPedido[1]', 'varchar(5)'), 
							NULLIF(t.c.value('numeroPedido[1]', 'varchar(512)'), '')
						FROM @XMLPedidos.nodes('pedidos/pedido') AS t(c)
					OPEN Pedidos
					FETCH NEXT FROM Pedidos INTO @codigoPedido, @numeroPedido
					WHILE @@FETCH_STATUS = 0
					BEGIN		
-- inicia variáveis
						SET @IdPedido = NULL
-- obtem dados do pedido
						SELECT @IdPedido = TXM_IDTY
						FROM TAB_TXML WITH(NOLOCK)
						WHERE LEN(TXM_CODI) = 5 AND TXM_CODI = @codigoPedido
-- verifica se o pedido é válido
						IF @IdPedido IS NULL
							RAISERROR('Pedido "%s" inválido.', 16, 133, @codigoPedido)		
-- insere o pedido no sub-detalhe de pedidos da adição na nova declaracao IMP-CAU
						INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, id_utilizadorControlo, dataControlo)
						VALUES (@IdAdicao,			
							@IdPedido, 
							@numeroPedido,  							
							@IdUtilizador, 
							@DataAtual)		
						FETCH NEXT FROM Pedidos INTO @codigoPedido, @numeroPedido
					END
					CLOSE Pedidos
					DEALLOCATE Pedidos		
-- inicia variavel
					SET @UltCodTabela = ISNULL((SELECT MAX(DCO_CODI) FROM PRO_DCON WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @numeroAdicao), 0)
-- obtem os contentores da adição
					DECLARE Contentores CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT 
							t.c.value('numeroContentor[1]', 'varchar(17)'), 													
							NULLIF(t.c.value('tipoContentor[1]', 'varchar(10)'), '')
						FROM @XMLContentores.nodes('contentores/contentor') as t(c)
					OPEN Contentores
					FETCH NEXT FROM Contentores INTO @numeroContentor, @tipoContentor
					WHILE @@FETCH_STATUS = 0
					BEGIN		
-- inicia variáveis						
						SET @UltCodTabela = @UltCodTabela + 1	
-- verifica regra													
						IF (@contentorizada = 0) AND (ISNULL(@numeroContentor, '') <> '')
							RAISERROR('Número de contentor "%s" inválido quando declaração não é contentorizada.', 16, 134, @numeroContentor)
-- insere o contentor no sub-detalhe de contentores da adição na nova declaracao IMP-CAU
						INSERT INTO PRO_DCON(DUC_EANO, DUC_PNUM, DUA_CODI, DCO_CODI, DCO_CNUM, DCO_TIPO)
						VALUES (@Ano, 
							@Numero, 
							@numeroAdicao, 
							@UltCodTabela, 
							@numeroContentor, 
							@tipoContentor)		
						FETCH NEXT FROM Contentores INTO @numeroContentor, @tipoContentor
					END
					CLOSE Contentores
					DEALLOCATE Contentores	
-- inicia variavel
					SET @UltCodTabela = ISNULL((SELECT MAX(DBT_CODI) FROM PRO_DUBT WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @numeroAdicao), 0)
-- obtem os veículos da adição
					DECLARE Veiculos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT 
							NULLIF(t.c.value('homologacaoTecnica[1]', 'varchar(20)'), ''), 
							NULLIF(t.c.value('adicionalISV[1]', 'varchar(4)'), ''), 
							NULLIF(t.c.value('tabela[1]', 'varchar(1)'), ''), 
							t.c.value('marca[1]', 'varchar(20)'), 
							t.c.value('modelo[1]', 'varchar(20)'), 
							NULLIF(t.c.value('qualificadorV[1]', 'varchar(1)'), ''), 
							NULLIF(t.c.value('categoria[1]', 'varchar(2)'), ''), 
							NULLIF(t.c.value('tipoVeiculo[1]', 'varchar(3)'), ''), 
							NULLIF(t.c.value('combustivel[1]', 'varchar(2)'), ''), 
							ISNULL(t.c.value('cilindrada[1]', 'decimal(18, 3)'), 0), 
							ISNULL(t.c.value('co2[1]', 'int'), 0), 
							NULLIF(t.c.value('tipoCO2[1]', 'varchar(4)'), ''), 
							NULLIF(t.c.value('particulas[1]', 'varchar(6)'), ''), 
							t.c.value('autonomia[1]', 'int'), 
							NULLIF(t.c.value('documentoIMT[1]', 'varchar(5)'), ''), 
							ISNULL(t.c.value('valorISV[1]', 'decimal(18, 2)'), 0), 
							t.c.query('chassis')
						FROM @XMLVeiculos.nodes('veiculos/veiculo') AS t(c)
					OPEN Veiculos
					FETCH NEXT FROM Veiculos INTO @homologacaoTecnica, @adicionalISV, @tabela, @marca, @modelo, @qualificadorV, @categoria, @tipoVeiculo, @combustivel, @cilindrada, @co2, 
						@tipoCO2, @particulas, @autonomia, @documentoIMT, @valorISV, @XMLChassis
					WHILE @@FETCH_STATUS = 0
					BEGIN		
-- inicia variáveis						
						SET @CodigoCategoria = NULL
						SET @CodigoTipoVeiculo = NULL
						SET @CodigoTipoCombustivel = NULL
						SET @UltCodTabela = @UltCodTabela + 1	
-- obtem dados da categoria
						SELECT @CodigoCategoria = CAT_CODI
						FROM TAB_CATG WITH(NOLOCK)
						WHERE CAT_CODI = @categoria
-- verifica se a categoria é válida
						IF (ISNULL(@categoria, '') <> '') AND (ISNULL(@CodigoCategoria, '') = '')
							RAISERROR('Categoria "%s" inválida.', 16, 135, @categoria)
-- obtem dados do tipo veículo
						SELECT @CodigoTipoVeiculo = TVE_CODI
						FROM TAB_TVEI WITH(NOLOCK)
						WHERE TVE_CODI = @tipoVeiculo
-- verifica se o tipo veículo é válido
						IF (ISNULL(@tipoVeiculo, '') <> '') AND (ISNULL(@CodigoTipoVeiculo, '') = '')
							RAISERROR('Tipo de veículo "%s" inválido.', 16, 136, @tipoVeiculo)
-- obtem dados do tipo combústivel
						SELECT @CodigoTipoCombustivel = TCO_CODI
						FROM TAB_TCOM WITH(NOLOCK)
						WHERE TCO_CODI = @combustivel
-- verifica se o tipo combústivel é válido
						IF (ISNULL(@combustivel, '') <> '') AND (ISNULL(@CodigoTipoCombustivel, '') = '')
							RAISERROR('Tipo de combustível "%s" inválido.', 16, 137, @combustivel)
-- verifica restantes regras																		
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') IN ('A', 'B', 'C')) AND (ISNULL(@homologacaoTecnica, '') = '') 
							RAISERROR('A tabela "%s" sem adicional ISV obriga ao preenchimento da homologação técnica.', 16, 138, @tabela)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@qualificadorV, '') = '') 
							RAISERROR('Sem adicional ISV obriga ao preenchimento do qualificador.', 16, 139)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@CodigoTipoVeiculo, '') = '') 
							RAISERROR('Sem adicional ISV obriga ao preenchimento do tipo de veículo.', 16, 140)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (ISNULL(@CodigoCategoria, '') = '') 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento da categoria.', 16, 141)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (ISNULL(@CodigoTipoCombustivel, '') = '') 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento do tipo de combustível.', 16, 142)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (@cilindrada = 0) 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento da cilindrada.', 16, 143)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (ISNULL(@particulas, '') = '') 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento das partículas.', 16, 144)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = 'A') AND (@co2 = 0) 
							RAISERROR('A tabela "%s" sem adicional ISV obriga ao preenchimento do co2.', 16, 145, @tabela)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = 'A') AND (ISNULL(@tipoCO2, '') = '') 
							RAISERROR('A tabela "%s" sem adicional ISV obriga ao preenchimento do tipo co2.', 16, 146, @tabela)
						IF (LEFT(@Regime, 2) IN ('40', '61')) AND (ISNULL(@documentoIMT, '') = '')
							RAISERROR('O regime "%s" obriga ao preenchimento do documento IMT.', 16, 147, @Regime)
-- insere o veículo no sub-detalhe de veículos da adição na nova declaracao IMP-CAU
						INSERT INTO PRO_DUBT(DUC_EANO, DUC_PNUM, DUA_CODI, DBT_CODI, DBT_QTDE, DBT_NVEI, TVE_CODI, DBT_QUAL, DBT_VIEC, DBT_VCO2, CAT_CODI, TCO_CODI, DBT_OUTR, DBT_VLIA, DBT_MARC, 
							DBT_MODE, DBT_IDCR, DBT_HOMO, DBT_TABE, DBT_TCO2, DBT_AUTN, DBT_DIMT)
						VALUES (@Ano, 
							@Numero, 
							@numeroAdicao, 
							@UltCodTabela, 
							@cilindrada, 
							0, 
							@CodigoTipoVeiculo, 
							@qualificadorV, 
							@adicionalISV, 
							@co2, 
							@CodigoCategoria, 
							@CodigoTipoCombustivel, 
							@particulas, 
							@valorISV, 
							@marca, 
							@modelo, 
							REPLACE(CONVERT(numeric(38, 10), DATEADD(MILLISECOND, (@UltCodTabela * 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT())), '.', ','), 
							@homologacaoTecnica, 
							@tabela, 
							@tipoCO2, 
							@autonomia, 
							@documentoIMT)		
-- inicia variavel
						SET @UltCodTabela1 = ISNULL((SELECT MAX(DVC_CODI) FROM PRO_DUVE WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @numeroAdicao AND DBT_CODI = @UltCodTabela), 0)
-- obtem os chassis do veículo
						DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
							SELECT 
								NULLIF(t.c.value('matricula[1]', 'varchar(10)'), ''), 
								t.c.value('dataMatricula[1]', 'datetime'), 																				
								NULLIF(t.c.value('numeroChassi[1]', 'varchar(22)'), ''),
								t.c.value('dataChassi[1]', 'datetime') 
							FROM @XMLChassis.nodes('chassis/chassi') AS t(c)
						OPEN Chassis
						FETCH NEXT FROM Chassis INTO @matricula, @dataMatricula, @numeroChassi, @dataChassi
						WHILE @@FETCH_STATUS = 0
						BEGIN		
-- inicia variáveis						
							SET @UltCodTabela1 = @UltCodTabela1 + 1	
-- verifica regras												
							IF (ISNULL(@qualificadorV, '') IN ('', 'A')) AND (ISNULL(@matricula, '') = '')
								RAISERROR('O qualificador "%s" obriga ao preenchimento da matrícula.', 16, 148, @qualificadorV)
							ELSE
								IF (ISNULL(@qualificadorV, '') IN ('', 'A')) AND (@dataMatricula IS NULL)
									RAISERROR('O qualificador "%s" obriga ao preenchimento da data da matrícula.', 16, 149, @qualificadorV)
								ELSE
									IF (ISNULL(@qualificadorV, '') IN ('N', 'U')) AND (ISNULL(@numeroChassi, '') = '')
										RAISERROR('O qualificador "%s" obriga ao preenchimento do chassi.', 16, 150, @qualificadorV)
									ELSE
										IF (ISNULL(@qualificadorV, '') IN ('N', 'U')) AND (@dataChassi IS NULL)
											RAISERROR('O qualificador "%s" obriga ao preenchimento da data do chassi.', 16, 151, @qualificadorV)
							IF (ISNULL(@matricula, '') = '') AND (@dataMatricula IS NOT NULL)
								RAISERROR('Data da matrícula inválida.', 16, 152)
							IF (ISNULL(@numeroChassi, '') = '') AND (@dataChassi IS NOT NULL)
								RAISERROR('Data do chassi inválida.', 16, 153)
-- insere o chassi no sub-detalhe de chassis do veículo da adição na nova declaracao IMP-CAU
							INSERT INTO PRO_DUVE(DUC_EANO, DUC_PNUM, DUA_CODI, DBT_CODI, DVC_CODI, DVC_MATR, DVC_CHAS, DVC_DMAT, DVC_DCHA)
							VALUES (@Ano, 
								@Numero, 
								@numeroAdicao, 
								@UltCodTabela, 
								@UltCodTabela1,
								@matricula, 
								@numeroChassi, 
								@dataMatricula, 
								@dataChassi)		
							FETCH NEXT FROM Chassis INTO @matricula, @dataMatricula, @numeroChassi, @dataChassi
						END
						CLOSE Chassis
						DEALLOCATE Chassis
						FETCH NEXT FROM Veiculos INTO @homologacaoTecnica, @adicionalISV, @tabela, @marca, @modelo, @qualificadorV, @categoria, @tipoVeiculo, @combustivel, @cilindrada, @co2, 
							@tipoCO2, @particulas, @autonomia, @documentoIMT, @valorISV, @XMLChassis
					END
					CLOSE Veiculos
					DEALLOCATE Veiculos
				END									
				FETCH NEXT FROM Adicoes INTO @acaoAdicao, @numeroAdicao, @codigoPautal, @designacao, @regimeAdicional, @paisOrigem, @preferencia, @metodoAvaliacao, @massaLiquida, @massaBruta, 
					@unidades, @montanteAd, @valorFrete, @valorSeguro, @taxaIVA, @XMLDocumentos, @XMLPrecedentes, @XMLPedidos, @XMLMarcasEVolumes, @XMLContentores, @XMLVeiculos
			END
			CLOSE Adicoes
			DEALLOCATE Adicoes																
		END TRY
		BEGIN CATCH
-- constroi mensagem de erro detalhada
			SET @NumErro = 1 
			SET @Erro = ISNULL(@Erro, '') + 
						'Detalhes do Erro: ' + CHAR(13) + 
						' » Data: ' + CONVERT(varchar(23), @DataAtual, 126) + CHAR(13) +
						' » Doc. Transporte: ' + ISNULL(@documentoTransporte, '') + CHAR(13) +
						' » Número: ' + CAST(ERROR_NUMBER() as varchar(50)) + CHAR(13) + 
						' » Nível: ' + CAST(ERROR_SEVERITY() as varchar(5)) + CHAR(13) + 
						' » Estado: ' + CAST(ERROR_STATE() as varchar(5)) + CHAR(13) + 
						' » Objeto: ' + ERROR_PROCEDURE() + CHAR(13) + 
						' » Linha N.º: ' + CAST(ERROR_LINE() as varchar(5)) + CHAR(13) + 
						' » Mensagem: ' + ERROR_MESSAGE() + CHAR(13) 
-- em caso de erro faz rollback da transacção iniciada						           
			IF @@TRANCOUNT > 0
				ROLLBACK TRANSACTION TspIMPImportacao
		END CATCH			
-- se sucesso faz commit da transacção iniciada
		IF @@TRANCOUNT > 0
			COMMIT TRANSACTION TspIMPImportacao
		FETCH NEXT FROM DeclaracoesIMP INTO @acao, @data, @despachoCentralizado, @anexoB, @natureza, @documentoTransporte, @descricaoGenerica, @nifExportador, @nomeExportador, @moradaExportador, 
			@localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @paisExpedicao, @nifImportador, @tipoNIFImportador, @nomeImportador, @moradaImportador, 
			@localidadeImportador, @codigoPostalImportador, @localidadePostalImportador, @paisImportador, @telefoneImportador, @emailImportador, @paisDestino, @regiao, @declarante, 
			@estatutoDeclarante, @vossaReferencia, @estancia, @tipoDeclaracao, @naturezaTransacao, @condicaoEntrega, @localidadeCE, @paisCE, @portoAeroporto, @paisFatura, @valorTotalFatura, 
			@paisFrete, @valorTotalFrete, @paisSeguro, @valorTotalSeguro, @totalMassaLiquida, @totalMassaBruta, @numeroNRUR, @meioTransporteFronteira, @paisFronteira, @meioTransporteInterior, 
			@meioTransporteChegada, @identificacaoTransporte, @contentorizada, @numeroContentor, @tipoLocalizacao, @qualificador, @armazemDTP, @estanciaLM, @nifOperadorEconomico, @moradaLM, 
			@localidadeLM, @codigoPostalLM, @armazem, @locID, @gateway, @serviceLevel, @portesAcc, @portes, @despachoAcc, @freteOriginal, @moedafreteOriginal, @despesas, @condEntrega, @nomeFicheiro, 
			@numeroPDDT, @dataEntrada, @numeroPDDTDEV, @numeroTD, @numeroACTM, @numeroSequencia, @posicaoArmazem, @miniCPA, @dataVoo, @aeroportoOrigem, @numeroVoo, @posicaoAviao, @tracking, 
			@tipoCarga, @numeroContaExpedidor, @numeroContaDestinatario, @nomeOriginalDestinatario, @moradaOriginalDestinatario, @localidadeOriginalDestinatario, @codigoPostalOriginalDestinatario, 
			@localidadePostalOriginalDestinatario, @referenciaExterna1, @referenciaExterna2, @shipID, @dutyType, @payment, @dataDocumentoTransporte, @numeroRequerimento, @numeroDURetorno, 
			@numeroT1Retorno, @anotacoes, @followUp, @utilizadorNomeado, @XMLCamposExtra, @XMLDocumentos, @XMLPrecedentes, @XMLPedidos, @XMLAdicoes, @XMLIncidencias, @XMLFollowUps, @XMLContactos, 
			@XMLManifestos, @XMLArquivos
	END
	CLOSE DeclaracoesIMP
	DEALLOCATE DeclaracoesIMP	
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_ImportaDeXML TO public AS dbo
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_DU31_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_DU31_IMPCAU  
GO
CREATE TRIGGER TAIU_PRO_DU31_IMPCAU ON PRO_DU31 WITH ENCRYPTION AFTER INSERT, UPDATE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @Marca varchar(512), @NumeroObjeto varchar(20), @CodUnidadeMedida varchar(3), @NomeUnidadeMedida varchar(35), @Parte bit, 
		@VolumesZero bit, @CodigoBarras varchar(30), @IdRegisto int, @NumProxRegisto int, @SomaVolumes numeric(38, 6)
-- se colunas da marca, tipo volume ou parte alteradas, processa a inserção/edição das marcas e volumes configuradas como parte nas restantes adições
	IF UPDATE(D31_MARC) OR UPDATE(UME_CODI) OR UPDATE(D31_CASP)
	BEGIN
-- insere/edita as marcas e volumes configuradas como parte nas restantes adições e ainda não existentes no anexo de marcas e volumes da adição > 1
		DECLARE MarcasEVolumes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUC_EANO, adi.DUC_PNUM, adi.DUA_CODI, ins.D31_MARC, ins.D31_NUME, ins.UME_CODI, ins.UME_NOME, ins.D31_CASP, ins.D31_TTVL, ins.D31_LOPT, dam.D31_IDEN
			FROM inserted AS ins 
				LEFT OUTER JOIN deleted AS del ON ins.D31_IDEN = del.D31_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM				
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI > 1
				LEFT OUTER JOIN PRO_DU31 AS dam WITH(NOLOCK) ON adi.DUC_EANO = dam.DUC_EANO AND adi.DUC_PNUM = dam.DUC_PNUM AND adi.DUA_CODI = dam.DUA_CODI AND dam.D31_AUTO = 1
			WHERE duc.DUC_DUNO = 2 AND ins.DUA_CODI = 1 AND ((ins.D31_CASP = 1) OR (del.D31_CASP = 1))							
		OPEN MarcasEVolumes
		FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Marca, @NumeroObjeto, @CodUnidadeMedida, @NomeUnidadeMedida, @Parte, @VolumesZero, @CodigoBarras, 
			@IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere a marca e volume parte da adição
			IF (@IdRegisto IS NULL) AND (@Parte = 1)
			BEGIN 
-- obtem o próximo numero de registo de marcas e volumes da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(D31_CODI), 0) + 1
				FROM PRO_DU31
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a marca e volume no detalhe de marcas e volumes da adição IMP-CAU
				INSERT INTO PRO_DU31(DUC_EANO, DUC_PNUM, DUA_CODI, D31_CODI, D31_MARC, D31_NUME, D31_QNTD, UME_CODI, UME_NOME, D31_CASP, D31_TTVL, D31_AUTO, D31_LOPT)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @Marca, @NumeroObjeto, 0, @CodUnidadeMedida, @NomeUnidadeMedida, 0, @VolumesZero, 1, @CodigoBarras)			
			END
			ELSE
-- edita a marca e volume parte da adição
				IF @Parte = 1
				BEGIN
					UPDATE PRO_DU31 SET											 
						D31_MARC = @Marca, 
						D31_NUME = @NumeroObjeto, 
						UME_CODI = @CodUnidadeMedida, 
						UME_NOME = @NomeUnidadeMedida, 
						D31_TTVL = @VolumesZero, 
						D31_LOPT = @CodigoBarras
					WHERE D31_IDEN = @IdRegisto
				END
				ELSE
				BEGIN
-- remove marca e volume					
					DELETE FROM PRO_DU31
					WHERE D31_IDEN = @IdRegisto
-- atualiza numero de marcas e volumes posteriores
					UPDATE PRO_DU31 SET D31_CODI = D31_CODI - 1    
					WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND D31_IDEN > @IdRegisto 
				END
			FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Marca, @NumeroObjeto, @CodUnidadeMedida, @NomeUnidadeMedida, @Parte, @VolumesZero, @CodigoBarras, 
				@IdRegisto
		END
		CLOSE MarcasEVolumes
		DEALLOCATE MarcasEVolumes		
	END
-- se coluna de n.º volumes alterada, processa a edição do total de volumes na declaração IMP-CAU
	IF (ISNULL(CONTEXT_INFO(), 0x0) <> 0x44495341424C4544) AND (UPDATE(D31_QNTD)) --"DISABLED" em binário
	BEGIN
-- obtem as declarações associadas às marcas e volumes não originadas em P/R inseridas/editadas
		DECLARE MarcasEVolumes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM
			FROM inserted AS ins 				
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM				
			WHERE duc.DUC_DUNO = 2 AND ins.D31_AUTO <> 1
			GROUP BY ins.DUC_EANO, ins.DUC_PNUM
		OPEN MarcasEVolumes
		FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula a soma dos volumes das marcas e volumes não originadas em P/R de todas as adições da declaração IMP-CAU
			SET @SomaVolumes = ISNULL(
				(SELECT SUM(D31_QNTD)
				FROM PRO_DU31 WITH(NOLOCK)
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND D31_AUTO <> 1), 0)
-- atualiza total de volumes na declaração IMP-CAU
			UPDATE PRO_DUCG SET 
				DUC_TVL6 = @SomaVolumes				
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao
			FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao
		END
		CLOSE MarcasEVolumes
		DEALLOCATE MarcasEVolumes		
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAD_PRO_DU31_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAD_PRO_DU31_IMPCAU  
GO
CREATE TRIGGER TAD_PRO_DU31_IMPCAU ON PRO_DU31 WITH ENCRYPTION AFTER DELETE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @IdRegisto int, @SomaVolumes numeric(38, 6)
-- se variavel global de sessão tem o valor "DISABLED", não processa o trigger
	IF CONTEXT_INFO() = 0x44495341424C4544 --"DISABLED" em binário
		RETURN
-- obtem as marcas e volumes configuradas como parte nas restantes adições e existentes no anexo de marcas e volumes da adição > 1
	DECLARE MarcasEVolumes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT del.DUC_EANO, del.DUC_PNUM, del.DUA_CODI, dam.D31_IDEN
		FROM deleted AS del 
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM				
			INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON del.DUC_EANO = adi.DUC_EANO AND del.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI > 1
			INNER JOIN PRO_DU31 AS dam WITH(NOLOCK) ON adi.DUC_EANO = dam.DUC_EANO AND adi.DUC_PNUM = dam.DUC_PNUM AND adi.DUA_CODI = dam.DUA_CODI AND dam.D31_AUTO = 1
		WHERE duc.DUC_DUNO = 2 AND del.DUA_CODI = 1 AND del.D31_CASP = 1		
	OPEN MarcasEVolumes
	FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- remove marca e volume					
		DELETE FROM PRO_DU31
		WHERE D31_IDEN = @IdRegisto
-- atualiza numero de marcas e volumes posteriores
		UPDATE PRO_DU31 SET D31_CODI = D31_CODI - 1    
		WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND D31_IDEN > @IdRegisto 
		FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
	END
	CLOSE MarcasEVolumes
	DEALLOCATE MarcasEVolumes		
-- obtem as declarações associadas às marcas e volumes não originadas em P/R removidas
	DECLARE MarcasEVolumes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT del.DUC_EANO, del.DUC_PNUM
		FROM deleted AS del
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM				
		WHERE duc.DUC_DUNO = 2 AND del.D31_AUTO <> 1
		GROUP BY del.DUC_EANO, del.DUC_PNUM
	OPEN MarcasEVolumes
	FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- calcula a soma dos volumes das marcas e volumes não originadas em P/R de todas as adições da declaração IMP-CAU
		SET @SomaVolumes = ISNULL(
			(SELECT SUM(D31_QNTD)
			FROM PRO_DU31 WITH(NOLOCK)
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND D31_AUTO <> 1), 0)
-- atualiza total de volumes na declaração IMP-CAU
		UPDATE PRO_DUCG SET 
			DUC_TVL6 = @SomaVolumes				
		WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao
		FETCH NEXT FROM MarcasEVolumes INTO @AnoDeclaracao, @NumDeclaracao
	END
	CLOSE MarcasEVolumes
	DEALLOCATE MarcasEVolumes			
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_DUVE_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_DUVE_IMPCAU  
GO
CREATE TRIGGER TAIU_PRO_DUVE_IMPCAU ON PRO_DUVE WITH ENCRYPTION AFTER INSERT, UPDATE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis	
	DECLARE @DataAtual datetime, @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @Matricula varchar(22), @Chassi varchar(22), @IdChassi bigint, 
		@CodUnidadeMedida varchar(3), @NomeUnidadeMedida varchar(35), @VolsAZeroUnidadeMedida bit, @IdRegisto bigint, @NumProxRegisto int, @IdAdicao int, @IdUtilizador int, 
		@IdPedido int, @NumeroPedido varchar(512)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- se colunas de matrícula ou chassi alteradas, processa a gestão das marcas e volumes associadas às matrículas/chassis inseridas/alteradas nas adições IMP-CAU 
	IF UPDATE(DVC_MATR) OR UPDATE(DVC_CHAS) 
	BEGIN
-- insere/edita a marca e volume no detalhe de marcas e volumes das adições IMP-CAU 
		DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR 
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, REPLACE(REPLACE(REPLACE(ins.DVC_MATR, 'I', ''), 'O', ''), 'Q', ''), ins.DVC_CHAS, ins.DVC_IDEN, ume.UME_CODI, 
				ume.UME_NOME, ume.UME_TVOL, dam.D31_IDEN
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM		
				INNER JOIN TAB_UMED AS ume WITH(NOLOCK) ON ume.UME_CODI = 'NE' AND ume.UME_IMPT = 1				
				LEFT OUTER JOIN PRO_DU31 AS dam WITH(NOLOCK) ON ins.DUC_EANO = dam.DUC_EANO AND ins.DUC_PNUM = dam.DUC_PNUM AND ins.DUA_CODI = dam.DUA_CODI AND dam.D31_AUTO = 2 AND ins.DVC_IDEN = dam.DVC_IDEN								
			WHERE duc.DUC_DUNO = 2 
		OPEN Chassis
		FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Matricula, @Chassi, @IdChassi, @CodUnidadeMedida, @NomeUnidadeMedida, @VolsAZeroUnidadeMedida, 
			@IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN				
-- obtem o próximo numero de registo de marcas e volumes da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(D31_CODI), 0) + 1
				FROM PRO_DU31
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a marca e volume no detalhe de marcas e volumes da adição IMP-CAU
				INSERT INTO PRO_DU31(DUC_EANO, DUC_PNUM, DUA_CODI, D31_CODI, D31_MARC, D31_QNTD, UME_CODI, UME_NOME, D31_TTVL, D31_AUTO, DVC_IDEN)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, ISNULL(NULLIF(@Matricula, ''), @Chassi), 1, @CodUnidadeMedida, @NomeUnidadeMedida, 
					@VolsAZeroUnidadeMedida, 2, @IdChassi)
			END
			ELSE
			BEGIN
				UPDATE PRO_DU31 SET
					D31_MARC = ISNULL(NULLIF(@Matricula, ''), @Chassi)
				WHERE D31_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Matricula, @Chassi, @IdChassi, @CodUnidadeMedida, @NomeUnidadeMedida, @VolsAZeroUnidadeMedida, 
				@IdRegisto
		END
		CLOSE Chassis
		DEALLOCATE Chassis			
	END
-- se coluna da matrícula alterada, processa a gestão do pedido “G1MTV” no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DVC_MATR)
	BEGIN
-- insere/edita o pedido “G1MTV” no detalhe de pedidos da adição IMP-CAU 
		DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DVC_IDEN, NULLIF(ins.DVC_MATR, ''), adi.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, dap.id
			FROM inserted AS ins 			
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND ins.DUA_CODI = adi.DUA_CODI
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL		
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'G1MTV'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 18 AND ins.DVC_IDEN = dap.id_chassi								
			WHERE duc.DUC_DUNO = 2 AND ISNULL(ins.DVC_MATR, '') <> '' 
		OPEN Chassis
		FETCH NEXT FROM Chassis INTO @IdChassi, @NumeroPedido, @IdAdicao, @IdUtilizador, @IdPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo, id_chassi)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 18, @IdUtilizador, @DataAtual, @IdChassi)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET										
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Chassis INTO @IdChassi, @NumeroPedido, @IdAdicao, @IdUtilizador, @IdPedido, @IdRegisto
		END
		CLOSE Chassis
		DEALLOCATE Chassis
-- remove o pedido “G1MTV” existente no detalhe de pedidos da adição mas já não satisfaz a condição da matrícula
		DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DVC_IDEN = del.DVC_IDEN
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND ins.DUA_CODI = adi.DUA_CODI
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 18 AND ins.DVC_IDEN = dap.id_chassi			
			WHERE duc.DUC_DUNO = 2 AND ISNULL(ins.DVC_MATR, '') = ''
		OPEN Chassis
		FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Chassis
		DEALLOCATE Chassis		
	END
-- se coluna data matrícula alterada, processa a gestão do pedido “G1DMV” no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DVC_DMAT)
	BEGIN
-- insere/edita o pedido “G1DMV” no detalhe de pedidos da adição IMP-CAU 
		DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DVC_IDEN, CONVERT(varchar(10), ins.DVC_DMAT, 120), adi.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, dap.id
			FROM inserted AS ins 			
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND ins.DUA_CODI = adi.DUA_CODI
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL		
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'G1DMV'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 19 AND ins.DVC_IDEN = dap.id_chassi								
			WHERE duc.DUC_DUNO = 2 AND ins.DVC_DMAT IS NOT NULL
		OPEN Chassis
		FETCH NEXT FROM Chassis INTO @IdChassi, @NumeroPedido, @IdAdicao, @IdUtilizador, @IdPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo, id_chassi)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 19, @IdUtilizador, @DataAtual, @IdChassi)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET										
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Chassis INTO @IdChassi, @NumeroPedido, @IdAdicao, @IdUtilizador, @IdPedido, @IdRegisto
		END
		CLOSE Chassis
		DEALLOCATE Chassis
-- remove o pedido “G1DMV” existente no detalhe de pedidos da adição mas já não satisfaz a condição da data matrícula
		DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DVC_IDEN = del.DVC_IDEN
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND ins.DUA_CODI = adi.DUA_CODI
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 19 AND ins.DVC_IDEN = dap.id_chassi			
			WHERE duc.DUC_DUNO = 2 AND ins.DVC_DMAT IS NULL 
		OPEN Chassis
		FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Chassis
		DEALLOCATE Chassis		
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAD_PRO_DUVE_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAD_PRO_DUVE_IMPCAU  
GO
CREATE TRIGGER TAD_PRO_DUVE_IMPCAU ON PRO_DUVE WITH ENCRYPTION AFTER DELETE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @DataAtual datetime, @TotalVeiculos int, @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @NumVeiculo int, @IdRegisto bigint, @IdUtilizador int
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem os veículos pertencentes às matrículas/chassis removidos
	DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT del.DUC_EANO, del.DUC_PNUM, del.DUA_CODI, del.DBT_CODI
		FROM deleted AS del 
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM				
		WHERE duc.DUC_DUNO = 2
		GROUP BY del.DUC_EANO, del.DUC_PNUM, del.DUA_CODI, del.DBT_CODI
	OPEN Chassis
	FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumVeiculo
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- calcula o n.º de matrículas/chassis do veículo
		SET @TotalVeiculos = ISNULL(
			(SELECT COUNT(*)
			FROM PRO_DUVE WITH(NOLOCK)
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DBT_CODI = @NumVeiculo), 0)
-- atualiza o n.º unidades no veículo
		UPDATE PRO_DUBT SET 
			DBT_NVEI = @TotalVeiculos
		WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DBT_CODI = @NumVeiculo
		FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumVeiculo
	END
	CLOSE Chassis
	DEALLOCATE Chassis
-- obtem as marcas e volumes associados às matrículas/chassis removidas pertencentes a declarações IMP-CAU
	DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT dam.DUC_EANO, dam.DUC_PNUM, dam.DUA_CODI, dam.D31_IDEN
		FROM deleted AS del 
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM				
			INNER JOIN PRO_DU31 AS dam WITH(NOLOCK) ON del.DUC_EANO = dam.DUC_EANO AND del.DUC_PNUM = dam.DUC_PNUM AND del.DUA_CODI = dam.DUA_CODI AND dam.D31_AUTO = 2 AND del.DVC_IDEN = dam.DVC_IDEN
		WHERE duc.DUC_DUNO = 2		
	OPEN Chassis
	FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- remove marca e volume
		DELETE FROM PRO_DU31
		WHERE D31_IDEN = @IdRegisto
-- atualiza numero das marcas e volumes posteriores
		UPDATE PRO_DU31 SET D31_CODI = D31_CODI - 1    
		WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND D31_IDEN > @IdRegisto 
		FETCH NEXT FROM Chassis INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
	END
	CLOSE Chassis
	DEALLOCATE Chassis
-- remove o pedido “G1MTV” existente no detalhe de pedidos da adição quando a matrícula está definida
	DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT dap.id, uti.UTI_IDTY
		FROM deleted AS del 
			INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON del.DUC_EANO = adi.DUC_EANO AND del.DUC_PNUM = adi.DUC_PNUM AND del.DUA_CODI = adi.DUA_CODI
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM
			INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
			INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 18 AND del.DVC_IDEN = dap.id_chassi			
		WHERE duc.DUC_DUNO = 2 AND ISNULL(del.DVC_MATR, '') <> ''
	OPEN Chassis
	FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
	WHILE @@FETCH_STATUS = 0
	BEGIN	
		UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
		WHERE id = @IdRegisto
		DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
		WHERE id = @IdRegisto
		FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
	END
	CLOSE Chassis
	DEALLOCATE Chassis	
-- remove o pedido “G1DMV” existente no detalhe de pedidos da adição quando a data matrícula está definida
	DECLARE Chassis CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
		SELECT dap.id, uti.UTI_IDTY
		FROM deleted AS del 
			INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON del.DUC_EANO = adi.DUC_EANO AND del.DUC_PNUM = adi.DUC_PNUM AND del.DUA_CODI = adi.DUA_CODI
			INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON del.DUC_EANO = duc.DUC_EANO AND del.DUC_PNUM = duc.DUC_PNUM
			INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
			INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 19 AND del.DVC_IDEN = dap.id_chassi			
		WHERE duc.DUC_DUNO = 2 AND del.DVC_DMAT IS NOT NULL
	OPEN Chassis
	FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
	WHILE @@FETCH_STATUS = 0
	BEGIN	
		UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
		WHERE id = @IdRegisto
		DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
		WHERE id = @IdRegisto
		FETCH NEXT FROM Chassis INTO @IdRegisto, @IdUtilizador
	END
	CLOSE Chassis
	DEALLOCATE Chassis
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_DDOC_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_DDOC_IMPCAU  
GO
CREATE TRIGGER TAIU_PRO_DDOC_IMPCAU ON PRO_DDOC WITH ENCRYPTION AFTER INSERT, UPDATE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @NumProxRegisto int
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @CodDocumento varchar(5), @NomeDocumento varchar(150), @NumeroDocumento varchar(70), 
		@DataValidadeDocumento datetime, @CodPais varchar(2), @Montante numeric(38, 6), @InvoicNumber varchar(25), @TipoDocumento int, @EntidadeEmissora varchar(70), 
		@CodUnidMedida varchar(3), @Quantidade numeric(38, 6), @NumLinha int
-- se coluna do documento alterada, processa a inserção dos documentos configurados para cópia nas restantes adições
	IF UPDATE(DOC_CODI)
	BEGIN
-- insere os documentos configurados para cópia nas restantes adições e ainda não existentes no anexo de documentos da adição > 1
		DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUC_EANO, adi.DUC_PNUM, adi.DUA_CODI, ins.DOC_CODI, ins.DOC_NOME, ins.DDO_NUME, ins.DDO_DINI, ins.PAI_CODI, ins.DDO_MONT, ins.DDO_NINV, ins.DDO_TIPO, 
				ins.DDO_EEMI, ins.UME_CODI, ins.DDO_QTDE, ins.DDO_NLIN
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ins.DOC_CODI = doc.DOC_CODI
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI > 1	
			WHERE duc.DUC_DUNO = 2 AND ins.DUA_CODI = 1 AND doc.DOC_RSDA = 1 
				AND NOT EXISTS(SELECT DDO_IDEN 
								FROM PRO_DDOC WITH(NOLOCK)
								WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI AND DOC_CODI = doc.DOC_CODI AND DDO_AUTO = 0)
		OPEN Documentos
		FETCH NEXT FROM Documentos INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, 
			@Montante, @InvoicNumber, @TipoDocumento, @EntidadeEmissora, @CodUnidMedida, @Quantidade, @NumLinha
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_DINI, PAI_CODI, DDO_MONT, DDO_NINV, DDO_AUTO, DDO_TIPO, DDO_EEMI, 
				UME_CODI, DDO_QTDE, DDO_NLIN)			
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, @Montante, @InvoicNumber, 0, @TipoDocumento, @EntidadeEmissora, 
				@CodUnidMedida, @Quantidade, (CASE WHEN @NumLinha IS NOT NULL THEN @NumAdicao ELSE NULL END))				
			FETCH NEXT FROM Documentos INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, 
				@Montante, @InvoicNumber, @TipoDocumento, @EntidadeEmissora, @CodUnidMedida, @Quantidade, @NumLinha
		END
		CLOSE Documentos
		DEALLOCATE Documentos				
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_DUAD_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_DUAD_IMPCAU  
GO
CREATE TRIGGER TAIU_PRO_DUAD_IMPCAU ON PRO_DUAD WITH ENCRYPTION AFTER INSERT, UPDATE AS
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @DataAtual datetime, @IdRegisto bigint, @NumProxRegisto int, @Montante numeric(38, 6), @IdStrElementoTrib varchar(20), @SomaAdicoes int, @SomaValorAduaneiro numeric(38, 6)
	DECLARE @IdUtilizador int, @CambioFrete numeric(38, 6), @TaxaFDA numeric(38, 6), @PedeTaxaFDA bit
	DECLARE @IdAdicao int, @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @MassaLiquida numeric(38, 6), @Frete numeric(38, 6), @SomaFreteESeguro decimal(18, 2), 
		@Optativas numeric(38, 6), @VerbaTransitario numeric(38, 6), @ValorDireitosDDP numeric(38, 6), @Ajustamento numeric(38, 6), @BaseManual bit, 
		@BaseTributacao numeric(38, 6), @ETaxa bit, @TaxaValor numeric(38, 6), @NumeroCaucao varchar(24), @AnoCaucao varchar(4), @TipoCaucao varchar(1), @EntidadeCaucao int, 
		@CodAlfandegaCaucao varchar(8), @CodAcessoCaucao varchar(4), @OutrasReferenciasCaucao varchar(35), @NIFResponsavelCaucao varchar(17)
	DECLARE @CodRubricaReceita int, @NomeRubricaReceita varchar(35), @IVARubricaReceita bit, @ImposicaoRubricaReceita varchar(3)
	DECLARE @CodDocumento varchar(5), @NomeDocumento varchar(150), @NumeroDocumento varchar(70), @DataValidadeDocumento datetime, @TipoDocumento int, @CodPais varchar(2), 
		@InvoicNumber varchar(25), @EntidadeEmissora varchar(70), @CodUnidadeMedida varchar(3), @Quantidade numeric(38, 6), @NumLinha int
	DECLARE @Marca varchar(512), @NumeroObjeto varchar(20), @NomeUnidadeMedida varchar(35), @Parte bit, @VolumesZero bit, @CodigoBarras varchar(30)
	DECLARE @IdPedido int, @NumeroPedido varchar(512)	
	DECLARE @TipoAcrescimoDeducao tinyint, @CodAcrescimoDeducao varchar(2)
	DECLARE @CodUnidadeMedida2 varchar(6), @TipoOrigem int, @IdStrRegisto varchar(20)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- se colunas do artigo, massa líquida, base de tributação ou garantia/caução alteradas, processa a gestão de imposições dos artigos no detalhe de outras imposições das adições IMP-CAU inseridas/alteradas
	IF UPDATE(APA_CO33) OR UPDATE(DUA_ML38) OR UPDATE(DUA_BTRI) OR UPDATE(DUA_CAUD) OR UPDATE(DUA_CAND) OR UPDATE(DUA_CTID) OR UPDATE(DUA_CEND) OR UPDATE(ALF_CODI) OR UPDATE(DUA_CCAD) 
	OR UPDATE(DUA_CORD) OR UPDATE(DUA_CNRD)
	BEGIN
-- insere/edita as imposições configuradas no artigo no detalhe de outras imposições das adições IMP-CAU
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, ins.DUA_ML38, ISNULL(doi.DUO_BMAN, 0), 
				ISNULL((CASE ISNULL(doi.DUO_BMAN, 0) WHEN 1 THEN ISNULL(doi.DUO_BTRI, 0) ELSE NULL END), ISNULL(ins.DUA_BTRI, 0)), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CAUC ELSE NULL END), ins.DUA_CAUD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CANO ELSE NULL END), ins.DUA_CAND), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CTIP ELSE NULL END), ins.DUA_CTID), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CENT ELSE NULL END), ins.DUA_CEND), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.ALF_CODI ELSE NULL END), ins.ALF_CODI), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CCAC ELSE NULL END), ins.DUA_CCAD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CORF ELSE NULL END), ins.DUA_CORD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CNRD ELSE NULL END), ins.DUA_CNRD), 				
				rre.RRE_CODI, rre.RRE_NOME, rre.RRE_IVA, rre.RRE_IMPO, doi.DUO_IDEN, 				
				ISNULL((CASE ISNULL(doi.DUO_BMAN, 0) WHEN 1 THEN doi.DUO_TIPO ELSE NULL END), (CASE ISNULL(aoi.APO_OIMP, 0) WHEN 0 THEN CAST(0 AS bit) ELSE CAST(1 AS bit) END)), 
				ISNULL(doi.DUO_TXVL, (CASE ISNULL(aoi.APO_OIMP, 0) WHEN 0 THEN ISNULL(aoi.APO_VALO, 0) ELSE ISNULL(aoi.APO_OIMP, 0) END))
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI
				INNER JOIN TAB_APOI AS aoi WITH(NOLOCK) ON art.APA_CHVE = aoi.APA_CHVE
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON aoi.RRE_CODI = rre.RRE_CODI
				LEFT OUTER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND rre.RRE_CODI = doi.RRE_CODI AND doi.DUO_AUTO = 6
			WHERE duc.DUC_DUNO = 2 
				AND NOT EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE RRE_CDPT = rre.RRE_CODI)
				AND NOT EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE RRE_CDAL = rre.RRE_CODI)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @MassaLiquida, @BaseManual, @BaseTributacao, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, 
			@CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @CodRubricaReceita, @NomeRubricaReceita, @IVARubricaReceita, @ImposicaoRubricaReceita, 
			@IdRegisto, @ETaxa, @TaxaValor
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula a base de tributação apenas quando é valor e base não é manual
			IF (@ETaxa = 0) AND (@BaseManual = 0)
				SET @BaseTributacao = ROUND(@MassaLiquida, 2)	
-- calcula o montante em função se é taxa ou valor
			IF @ETaxa = 1
				SET @Montante = ROUND(@BaseTributacao * @TaxaValor / 100, 2)			
			ELSE
				SET @Montante = ROUND(@BaseTributacao * @TaxaValor, 2)	
-- insere ou edita a imposição do artigo
			IF @IdRegisto IS NULL
			BEGIN				
-- obtem o próximo numero de registo de outras imposições da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(DUO_CODI), 0) + 1
				FROM PRO_DUOI
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a imposição no detalhe de outras imposições da adição IMP-CAU
				INSERT INTO PRO_DUOI(DUC_EANO, DUC_PNUM, DUA_CODI, DUO_CODI, RRE_CODI, RRE_NOME, DUO_TIPO, DUO_BTRI, DUO_TXVL, DUO_MONT, RRE_LIVA, DUO_IMPO, DUO_AUTO, DUO_BMAN, DUO_CAUC, DUO_CANO, 
					DUO_CTIP, DUO_CENT, ALF_CODI, DUO_CCAC, DUO_CORF, DUO_CNRD)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodRubricaReceita, @NomeRubricaReceita, @ETaxa, @BaseTributacao, @TaxaValor, @Montante, @IVARubricaReceita, 
					@ImposicaoRubricaReceita, 6, @BaseManual, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, 
					@NIFResponsavelCaucao)			
			END
			ELSE
			BEGIN
				UPDATE PRO_DUOI SET											 
					DUO_TIPO = @ETaxa, 
					DUO_BTRI = @BaseTributacao, 
					DUO_MONT = @Montante, 													
					DUO_CAUC = @NumeroCaucao, 
					DUO_CANO = @AnoCaucao, 
					DUO_CTIP = @TipoCaucao, 
					DUO_CENT = @EntidadeCaucao, 
					ALF_CODI = @CodAlfandegaCaucao, 
					DUO_CCAC = @CodAcessoCaucao, 
					DUO_CORF = @OutrasReferenciasCaucao, 
					DUO_CNRD = @NIFResponsavelCaucao
				WHERE DUO_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @MassaLiquida, @BaseManual, @BaseTributacao, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, 
				@CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @CodRubricaReceita, @NomeRubricaReceita, @IVARubricaReceita, @ImposicaoRubricaReceita, 
				@IdRegisto, @ETaxa, @TaxaValor
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes			
-- remove as imposições existentes no detalhe de outras imposições das adições IMP-CAU mas já não existentes na configuração do artigo
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT doi.DUC_EANO, doi.DUC_PNUM, doi.DUA_CODI, doi.DUO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.DUO_AUTO = 6
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI				
				LEFT OUTER JOIN TAB_APOI AS aoi WITH(NOLOCK) ON art.APA_CHVE = aoi.APA_CHVE AND doi.RRE_CODI = aoi.RRE_CODI
			WHERE duc.DUC_DUNO = 2 AND aoi.APO_CODI IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove imposição					
			DELETE FROM PRO_DUOI
			WHERE DUO_IDEN = @IdRegisto
-- atualiza numero de imposições posteriores
			UPDATE PRO_DUOI SET DUO_CODI = DUO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DUO_IDEN > @IdRegisto
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes					
	END
-- se colunas de direitos da unidade medida, quantidade, rúbrica, imposição, base manual, base de tributação, taxa/valor, montante ou garantia/caução alteradas, processa a gestão da imposição dos direitos no detalhe de outras imposições das adições IMP-CAU inseridas/alteradas
	IF UPDATE(UME_CODI) OR UPDATE(DUA_QTDD) OR UPDATE(RRE_PREF) OR UPDATE(DUA_IMPO) OR UPDATE(DUA_BMAN) OR UPDATE(DUA_BTRI) OR UPDATE(DUA_TXCO) OR UPDATE(DUA_TXVL) OR UPDATE(DUA_MTRI) OR UPDATE(DUA_CAUD) OR UPDATE(DUA_CAND) 
	OR UPDATE(DUA_CTID) OR UPDATE(DUA_CEND) OR UPDATE(ALF_CODI) OR UPDATE(DUA_CCAD) OR UPDATE(DUA_CORD) OR UPDATE(DUA_CNRD)
	BEGIN
-- insere/edita a imposição de direitos no detalhe de outras imposições das adições IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, ins.UME_CODI, ins.DUA_IMPO, ins.DUA_BMAN, ISNULL(ins.DUA_BTRI, 0), ISNULL(ins.DUA_TXVL, 0), ISNULL(ins.DUA_MTRI, 0), ins.DUA_CAUD, 
				ins.DUA_CAND, ins.DUA_CTID, ins.DUA_CEND, ins.ALF_CODI, ins.DUA_CCAD, ins.DUA_CORD, ins.DUA_CNRD, ins.DUA_QTDD, rre.RRE_CODI, rre.RRE_NOME, rre.RRE_IVA, doi.DUO_IDEN, 
				(CASE ins.DUA_TXCO WHEN 1 THEN CAST(0 AS bit) ELSE CAST(1 AS bit) END) 
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM		
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON ins.RRE_PREF = rre.RRE_CODI	
				LEFT OUTER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.DUO_AUTO = 1								
			WHERE duc.DUC_DUNO = 2 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodUnidadeMedida, @ImposicaoRubricaReceita, @BaseManual, @BaseTributacao, @TaxaValor, @Montante, @NumeroCaucao, 
			@AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @Quantidade, @CodRubricaReceita, @NomeRubricaReceita, 
			@IVARubricaReceita, @IdRegisto, @ETaxa
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
-- obtem o próximo numero de registo de outras imposições da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(DUO_CODI), 0) + 1
				FROM PRO_DUOI
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a imposição no detalhe de outras imposições da adição IMP-CAU
				INSERT INTO PRO_DUOI(DUC_EANO, DUC_PNUM, DUA_CODI, DUO_CODI, RRE_CODI, RRE_NOME, DUO_TIPO, UME_CODI, DUO_BTRI, DUO_TXVL, DUO_MONT, RRE_LIVA, DUO_IMPO, DUO_AUTO, DUO_BMAN, 
					DUO_CAUC, DUO_CANO, DUO_CTIP, DUO_CENT, ALF_CODI, DUO_CCAC, DUO_CORF, DUO_CNRD, DUO_QTDE)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodRubricaReceita, @NomeRubricaReceita, @ETaxa, @CodUnidadeMedida, @BaseTributacao, @TaxaValor, @Montante, @IVARubricaReceita, 
					@ImposicaoRubricaReceita, 1, @BaseManual, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, 
					@NIFResponsavelCaucao, @Quantidade)
			END
			ELSE
			BEGIN
				UPDATE PRO_DUOI SET
					RRE_CODI = @CodRubricaReceita, 
					RRE_NOME = @NomeRubricaReceita, 
					DUO_TIPO = @ETaxa, 
					UME_CODI = @CodUnidadeMedida, 
					DUO_BTRI = @BaseTributacao, 
					DUO_TXVL = @TaxaValor, 
					DUO_MONT = @Montante, 
					RRE_LIVA = @IVARubricaReceita, 
					DUO_IMPO = @ImposicaoRubricaReceita, 					
					DUO_BMAN = @BaseManual, 
					DUO_CAUC = @NumeroCaucao, 
					DUO_CANO = @AnoCaucao, 
					DUO_CTIP = @TipoCaucao, 
					DUO_CENT = @EntidadeCaucao, 
					ALF_CODI = @CodAlfandegaCaucao, 
					DUO_CCAC = @CodAcessoCaucao, 
					DUO_CORF = @OutrasReferenciasCaucao, 
					DUO_CNRD = @NIFResponsavelCaucao, 
					DUO_QTDE = @Quantidade
				WHERE DUO_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodUnidadeMedida, @ImposicaoRubricaReceita, @BaseManual, @BaseTributacao, @TaxaValor, @Montante, @NumeroCaucao, 
				@AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @Quantidade, @CodRubricaReceita, @NomeRubricaReceita, 
				@IVARubricaReceita, @IdRegisto, @ETaxa
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove a imposição de direitos existente no detalhe de outras imposições das adições IMP-CAU mas já não existente nas rúbricas de receita
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT doi.DUC_EANO, doi.DUC_PNUM, doi.DUA_CODI, doi.DUO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.DUO_AUTO = 1
				LEFT OUTER JOIN TAB_RREC AS rre WITH(NOLOCK) ON doi.RRE_CODI = rre.RRE_CODI
			WHERE duc.DUC_DUNO = 2 AND rre.RRE_CODI IS NULL				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove imposição					
			DELETE FROM PRO_DUOI
			WHERE DUO_IDEN = @IdRegisto
-- atualiza numero de imposições posteriores
			UPDATE PRO_DUOI SET DUO_CODI = DUO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DUO_IDEN > @IdRegisto 
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se colunas de IVA da rúbrica, imposição, base de tributação, taxa, montante ou garantia/caução alteradas, processa a gestão da imposição do IVA no detalhe de outras imposições das adições IMP-CAU inseridas/alteradas
	IF UPDATE(RRE_CODI) OR UPDATE(DUA_IMPI) OR UPDATE(DUA_BTIV) OR UPDATE(DUA_TIVA) OR UPDATE(DUA_VIVA) OR UPDATE(DUA_CAUI) OR UPDATE(DUA_CANI) OR UPDATE(DUA_CTII) OR UPDATE(DUA_CENI) 
	OR UPDATE(ALF_CODI1) OR UPDATE(DUA_CCAI) OR UPDATE(DUA_CORI) OR UPDATE(DUA_CNRI)
	BEGIN
-- insere/edita a imposição de IVA no detalhe de outras imposições das adições IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, ins.DUA_IMPI, ISNULL(ins.DUA_BTIV, 0), ISNULL(ins.DUA_TIVA, 0), ISNULL(ins.DUA_VIVA, 0), ins.DUA_CAUI, ins.DUA_CANI, 
				ins.DUA_CTII, ins.DUA_CENI, ins.ALF_CODI1, ins.DUA_CCAI, ins.DUA_CORI, ins.DUA_CNRI, rre.RRE_CODI, rre.RRE_NOME, rre.RRE_IVA, doi.DUO_IDEN				
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM		
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON ins.RRE_CODI = rre.RRE_CODI	
				LEFT OUTER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.DUO_AUTO = 2
			WHERE duc.DUC_DUNO = 2 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @ImposicaoRubricaReceita, @BaseTributacao, @TaxaValor, @Montante, @NumeroCaucao, @AnoCaucao, @TipoCaucao, 
			@EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @CodRubricaReceita, @NomeRubricaReceita, @IVARubricaReceita, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
-- obtem o próximo numero de registo de outras imposições da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(DUO_CODI), 0) + 1
				FROM PRO_DUOI
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a imposição no detalhe de outras imposições da adição IMP-CAU
				INSERT INTO PRO_DUOI(DUC_EANO, DUC_PNUM, DUA_CODI, DUO_CODI, RRE_CODI, RRE_NOME, DUO_TIPO, DUO_BTRI, DUO_TXVL, DUO_MONT, RRE_LIVA, DUO_IMPO, DUO_AUTO, DUO_BMAN, DUO_CAUC, DUO_CANO, 
					DUO_CTIP, DUO_CENT, ALF_CODI, DUO_CCAC, DUO_CORF, DUO_CNRD)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodRubricaReceita, @NomeRubricaReceita, 1, @BaseTributacao, @TaxaValor, @Montante, @IVARubricaReceita, 
					@ImposicaoRubricaReceita, 2, 0, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao)
			END
			ELSE
			BEGIN
				UPDATE PRO_DUOI SET
					RRE_CODI = @CodRubricaReceita, 
					RRE_NOME = @NomeRubricaReceita, 					
					DUO_BTRI = @BaseTributacao, 
					DUO_TXVL = @TaxaValor, 
					DUO_MONT = @Montante, 
					RRE_LIVA = @IVARubricaReceita, 
					DUO_IMPO = @ImposicaoRubricaReceita, 										
					DUO_CAUC = @NumeroCaucao, 
					DUO_CANO = @AnoCaucao, 
					DUO_CTIP = @TipoCaucao, 
					DUO_CENT = @EntidadeCaucao, 
					ALF_CODI = @CodAlfandegaCaucao, 
					DUO_CCAC = @CodAcessoCaucao, 
					DUO_CORF = @OutrasReferenciasCaucao, 
					DUO_CNRD = @NIFResponsavelCaucao
				WHERE DUO_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @ImposicaoRubricaReceita, @BaseTributacao, @TaxaValor, @Montante, @NumeroCaucao, @AnoCaucao, @TipoCaucao, 
				@EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, @OutrasReferenciasCaucao, @NIFResponsavelCaucao, @CodRubricaReceita, @NomeRubricaReceita, @IVARubricaReceita, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove a imposição de IVA existente no detalhe de outras imposições das adições IMP-CAU mas já não existente nas rúbricas de receita
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT doi.DUC_EANO, doi.DUC_PNUM, doi.DUA_CODI, doi.DUO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.DUO_AUTO = 2
				LEFT OUTER JOIN TAB_RREC AS rre WITH(NOLOCK) ON doi.RRE_CODI = rre.RRE_CODI
			WHERE duc.DUC_DUNO = 2 AND rre.RRE_CODI IS NULL				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove imposição					
			DELETE FROM PRO_DUOI
			WHERE DUO_IDEN = @IdRegisto
-- atualiza numero de imposições posteriores
			UPDATE PRO_DUOI SET DUO_CODI = DUO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DUO_IDEN > @IdRegisto 
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se colunas da massa líquida, base de tributação ou garantia/caução alteradas, processa a gestão de imposições manuais no detalhe de outras imposições das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_ML38) OR UPDATE(DUA_BTRI) OR UPDATE(DUA_CAUD) OR UPDATE(DUA_CAND) OR UPDATE(DUA_CTID) OR UPDATE(DUA_CEND) OR UPDATE(ALF_CODI) OR UPDATE(DUA_CCAD) OR UPDATE(DUA_CORD) 
	OR UPDATE(DUA_CNRD)
	BEGIN
-- edita as imposições configuradas no artigo no detalhe de outras imposições das adições IMP-CAU
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_ML38, doi.DUO_BMAN, 
				ISNULL((CASE doi.DUO_BMAN WHEN 1 THEN ISNULL(doi.DUO_BTRI, 0) ELSE NULL END), ISNULL(ins.DUA_BTRI, 0)), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CAUC ELSE NULL END), ins.DUA_CAUD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CANO ELSE NULL END), ins.DUA_CAND), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CTIP ELSE NULL END), ins.DUA_CTID), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CENT ELSE NULL END), ins.DUA_CEND), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.ALF_CODI ELSE NULL END), ins.ALF_CODI), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CCAC ELSE NULL END), ins.DUA_CCAD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CORF ELSE NULL END), ins.DUA_CORD), 
				ISNULL((CASE duc.DUC_CGLB WHEN 0 THEN doi.DUO_CNRD ELSE NULL END), ins.DUA_CNRD), 				
				doi.DUO_IDEN, doi.DUO_TIPO, ISNULL(doi.DUO_TXVL, 0)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUOI AS doi WITH(NOLOCK) ON ins.DUC_EANO = doi.DUC_EANO AND ins.DUC_PNUM = doi.DUC_PNUM AND ins.DUA_CODI = doi.DUA_CODI AND doi.RRE_CODI <> 999 AND doi.DUO_AUTO = 0
				INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON doi.RRE_CODI = rre.RRE_CODI
			WHERE duc.DUC_DUNO = 2 
				AND NOT EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE RRE_CDPT = rre.RRE_CODI)
				AND NOT EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE RRE_CDAL = rre.RRE_CODI)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @MassaLiquida, @BaseManual, @BaseTributacao, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, 
			@OutrasReferenciasCaucao, @NIFResponsavelCaucao, @IdRegisto, @ETaxa, @TaxaValor
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula a base de tributação apenas quando é valor
			IF (@ETaxa = 0) AND (@BaseManual = 0)
				SET @BaseTributacao = ROUND(@MassaLiquida, 2)	
-- calcula o montante em função se é taxa ou valor
			IF @ETaxa = 1
				SET @Montante = ROUND(@BaseTributacao * @TaxaValor / 100, 2)			
			ELSE
				SET @Montante = ROUND(@BaseTributacao * @TaxaValor, 2)	
-- edita a imposição do artigo			
			UPDATE PRO_DUOI SET											 
				DUO_TIPO = @ETaxa, 
				DUO_BTRI = @BaseTributacao, 
				DUO_MONT = @Montante, 													
				DUO_CAUC = @NumeroCaucao, 
				DUO_CANO = @AnoCaucao, 
				DUO_CTIP = @TipoCaucao, 
				DUO_CENT = @EntidadeCaucao, 
				ALF_CODI = @CodAlfandegaCaucao, 
				DUO_CCAC = @CodAcessoCaucao, 
				DUO_CORF = @OutrasReferenciasCaucao, 
				DUO_CNRD = @NIFResponsavelCaucao
			WHERE DUO_IDEN = @IdRegisto			
			FETCH NEXT FROM Adicoes INTO @MassaLiquida, @BaseManual, @BaseTributacao, @NumeroCaucao, @AnoCaucao, @TipoCaucao, @EntidadeCaucao, @CodAlfandegaCaucao, @CodAcessoCaucao, 
				@OutrasReferenciasCaucao, @NIFResponsavelCaucao, @IdRegisto, @ETaxa, @TaxaValor
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes						
	END
-- se coluna do artigo alterada, processa a gestão de documentos do artigo no detalhe de documentos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(APA_CO33)
	BEGIN
-- insere os documentos configurados no artigo mas ainda não existentes no anexo de documentos da adição
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, 
				(CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END), 
				(CASE LEFT(doc.DOC_CODI, 1) WHEN 'N' THEN 0 ELSE 2 END)
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI
				INNER JOIN TAB_ADOC AS ado WITH(NOLOCK) ON art.APA_CHVE = ado.APA_CHVE
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND doc.DOC_CODI = dad.DOC_CODI AND dad.DDO_AUTO = 8				
			WHERE duc.DUC_DUNO = 2 AND ado.ADC_UIMP = 1 AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND dad.DDO_IDEN IS NULL	
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @TipoDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento como "Suporte"/"Referência Adicional" no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_AUTO, DDO_TIPO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, 8, @TipoDocumento)
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @TipoDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
-- remove os documentos existentes no detalhe de documentos da adição mas já não existentes na configuração do artigo
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.DUC_EANO, dad.DUC_PNUM, dad.DUA_CODI, dad.DDO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND dad.DDO_AUTO = 8
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN TAB_ADOC AS ado WITH(NOLOCK) ON art.APA_CHVE = ado.APA_CHVE AND doc.DOC_CODI = ado.DOC_CODI
			WHERE duc.DUC_DUNO = 2 AND (ado.ADC_UIMP = 0 OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 OR LEN(doc.DOC_CODI) > 4 OR ado.ADC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove documento					
			DELETE FROM PRO_DDOC
			WHERE DDO_IDEN = @IdRegisto
-- atualiza numero de documentos posteriores
			UPDATE PRO_DDOC SET DDO_CODI = DDO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DDO_IDEN > @IdRegisto 			
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes					
	END
-- se coluna do número da adição alterada, processa a inserção dos documentos configurados para cópia existentes na 1ª adição
	IF UPDATE(DUA_CODI)
	BEGIN
-- insere os documentos configurados como cópia na 1ª adição mas ainda não existentes no anexo de documentos da adição > 1
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, dad.DDO_NUME, dad.DDO_DINI, dad.PAI_CODI, dad.DDO_MONT, dad.DDO_NINV, dad.DDO_TIPO, 
				dad.DDO_EEMI, dad.UME_CODI, dad.DDO_QTDE, dad.DDO_NLIN
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI = 1
				INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON adi.DUC_EANO = dad.DUC_EANO AND adi.DUC_PNUM = dad.DUC_PNUM AND adi.DUA_CODI = dad.DUA_CODI 	
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI			
			WHERE duc.DUC_DUNO = 2 AND ins.DUA_CODI > 1 AND doc.DOC_RSDA = 1 
				AND NOT EXISTS(SELECT DDO_IDEN 
								FROM PRO_DDOC WITH(NOLOCK)
								WHERE DUC_EANO = ins.DUC_EANO AND DUC_PNUM = ins.DUC_PNUM AND DUA_CODI = ins.DUA_CODI AND DOC_CODI = doc.DOC_CODI AND DDO_AUTO = 0)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, @Montante, 
			@InvoicNumber, @TipoDocumento, @EntidadeEmissora, @CodUnidadeMedida, @Quantidade, @NumLinha
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_DINI, PAI_CODI, DDO_MONT, DDO_NINV, DDO_AUTO, DDO_TIPO, DDO_EEMI, 
				UME_CODI, DDO_QTDE, DDO_NLIN)			
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, @Montante, @InvoicNumber, 0, @TipoDocumento, @EntidadeEmissora, 
				@CodUnidadeMedida, @Quantidade, (CASE WHEN @NumLinha IS NOT NULL THEN @NumAdicao ELSE NULL END))					
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @DataValidadeDocumento, @CodPais, @Montante, 
				@InvoicNumber, @TipoDocumento, @EntidadeEmissora, @CodUnidadeMedida, @Quantidade, @NumLinha
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
	END
-- se coluna exportador alterada, processa a gestão do documento fixo "3E18" no detalhe de documentos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(FOR_CODI)
	BEGIN
-- insere o documento fixo "3E18" como "Suporte" no detalhe de documentos da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, doc.DOC_DTRA, 
				(CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END)				
			FROM inserted AS ins 	
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN TAB_FORN AS frn WITH(NOLOCK) ON ins.FOR_CODI = frn.FOR_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI	= '3E18'
				LEFT OUTER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND dad.DDO_AUTO = 9					
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_ANXB <> 'H2' AND frn.FOR_TNIF = 5 AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND dad.DDO_IDEN IS NULL	
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento como "Suporte" no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_AUTO, DDO_TIPO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, 9, @TipoDocumento)			
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o documento fixo "3E18" existente no detalhe de documentos da adição mas já não existente na configuração do exportador
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.DUC_EANO, dad.DUC_PNUM, dad.DUA_CODI, dad.DDO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND dad.DDO_AUTO = 9
				LEFT OUTER JOIN TAB_FORN AS frn WITH(NOLOCK) ON ins.FOR_CODI = frn.FOR_CODI
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI				
			WHERE duc.DUC_DUNO = 2 AND (duc.DUC_ANXB = 'H2' OR ISNULL(frn.FOR_TNIF, -1) <> 5 OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 OR LEN(doc.DOC_CODI) > 4 OR doc.DOC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove documento					
			DELETE FROM PRO_DDOC
			WHERE DDO_IDEN = @IdRegisto
-- atualiza numero de documentos posteriores
			UPDATE PRO_DDOC SET DDO_CODI = DDO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DDO_IDEN > @IdRegisto 	
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se coluna do número da adição alterada, processa a inserção/edição das marcas e volumes configuradas como parte nas restantes adições
	IF UPDATE(DUA_CODI)
	BEGIN
-- insere os documentos configurados como cópia na 1ª adição mas ainda não existentes no anexo de documentos da adição > 1
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, dam.D31_MARC, dam.D31_NUME, dam.UME_CODI, dam.UME_NOME, dam.D31_TTVL, dam.D31_LOPT
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI = 1
				INNER JOIN PRO_DU31 AS dam WITH(NOLOCK) ON adi.DUC_EANO = dam.DUC_EANO AND adi.DUC_PNUM = dam.DUC_PNUM AND adi.DUA_CODI = dam.DUA_CODI AND dam.D31_CASP = 1				
			WHERE duc.DUC_DUNO = 2 AND ins.DUA_CODI > 1
				AND NOT EXISTS(SELECT D31_IDEN 
								FROM PRO_DU31 WITH(NOLOCK)
								WHERE DUC_EANO = ins.DUC_EANO AND DUC_PNUM = ins.DUC_PNUM AND DUA_CODI = ins.DUA_CODI AND D31_AUTO = 1)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Marca, @NumeroObjeto, @CodUnidadeMedida, @NomeUnidadeMedida, @VolumesZero, @CodigoBarras
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- obtem o próximo numero de registo de marcas e volumes da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(D31_CODI), 0) + 1
			FROM PRO_DU31
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere a marca e volume no detalhe de marcas e volumes da adição IMP-CAU
			INSERT INTO PRO_DU31(DUC_EANO, DUC_PNUM, DUA_CODI, D31_CODI, D31_MARC, D31_NUME, D31_QNTD, UME_CODI, UME_NOME, D31_CASP, D31_TTVL, D31_AUTO, D31_LOPT)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @Marca, @NumeroObjeto, 0, @CodUnidadeMedida, @NomeUnidadeMedida, 0, @VolumesZero, 1, @CodigoBarras)				
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @Marca, @NumeroObjeto, @CodUnidadeMedida, @NomeUnidadeMedida, @VolumesZero, @CodigoBarras
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
	END
-- se colunas do regime, desdobramento 1 ou desdobramento 2 alteradas, processa a gestão de pedidos "G1CFA" e "I1CII" no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_RG37) OR UPDATE(DUA_R37B) OR UPDATE(DUA_R37C)
	BEGIN
-- insere o pedido "G1CFA" no detalhe de pedidos da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, NULLIF(SUBSTRING(tdp.TXM_TEXT, 1, 512), '')
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'G1CFA'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 1		
			WHERE duc.DUC_DUNO = 2 AND ((ISNULL(ins.DUA_RG37, '') IN ('4000', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') = '4FD' AND ISNULL(ins.DUA_R37C, '') IN ('', '431')) 
				OR (ISNULL(ins.DUA_RG37, '') IN ('4000', '4053', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') = 'C01')
				OR (ISNULL(ins.DUA_RG37, '') IN ('4000', '4053', '4054', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') IN ('C26', 'C27', 'C28', 'C29', 'C30', 'C31', 'C32'))
				OR (ISNULL(ins.DUA_RG37, '') IN ('4200', '4251', '4253', '4254', '4271', '4278') AND ISNULL(ins.DUA_R37B, '') IN ('C34', 'C35', 'C36', 'C37', 'C38'))
				OR (ISNULL(ins.DUA_RG37, '') IN ('4053', '4054', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') = 'C58')
				OR (ISNULL(ins.DUA_RG37, '') = '4000' AND ISNULL(ins.DUA_R37B, '') IN ('C02', 'C03', 'C04', 'C06', 'C09', 'C10', 'C11', 'C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C41', 'C42', 'C43', 'C44', 'C45', 'C46', 'C47', 'C48', 'C49', 'C50', 'C51', 'C52', 'C53', 'C54', 'C55', 'C56', 'C57', 'C59', 'C60', 'C61', 'F01', 'F02', 'F03', 'F05', 'F21', 'F22'))					
				OR (ISNULL(ins.DUA_RG37, '') = '0100' AND ISNULL(ins.DUA_R37B, '') IN ('F21', 'F22'))
				OR (ISNULL(ins.DUA_RG37, '') = '0110' AND ISNULL(ins.DUA_R37B, '') IN ('F01', 'F02', 'F03'))) AND dap.id IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN							
			INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 1, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o pedido "G1CFA" existente no detalhe de pedidos da adição mas já não satisfaz a condição do regime e/ou desdobramento 1 e/ou desdobramento 2
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 1				
			WHERE duc.DUC_DUNO = 2 AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') <> '4FD' OR ISNULL(ins.DUA_R37C, '') NOT IN ('', '431')) 
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4053', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') <> 'C01') 
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4053', '4054', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') NOT IN ('C26', 'C27', 'C28', 'C29', 'C30', 'C31', 'C32'))
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4200', '4251', '4253', '4254', '4271', '4278') OR ISNULL(ins.DUA_R37B, '') NOT IN ('C34', 'C35', 'C36', 'C37', 'C38'))
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4053', '4054', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') <> 'C58')
				AND (ISNULL(ins.DUA_RG37, '') <> '4000' OR ISNULL(ins.DUA_R37B, '') NOT IN ('C02', 'C03', 'C04', 'C06', 'C09', 'C10', 'C11', 'C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C41', 'C42', 'C43', 'C44', 'C45', 'C46', 'C47', 'C48', 'C49', 'C50', 'C51', 'C52', 'C53', 'C54', 'C55', 'C56', 'C57', 'C59', 'C60', 'C61', 'F01', 'F02', 'F03', 'F05', 'F21', 'F22'))
				AND (ISNULL(ins.DUA_RG37, '') <> '0100' OR ISNULL(ins.DUA_R37B, '') NOT IN ('F21', 'F22'))
				AND (ISNULL(ins.DUA_RG37, '') <> '0110' OR ISNULL(ins.DUA_R37B, '') NOT IN ('F01', 'F02', 'F03'))
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
-- insere o pedido "I1CII" no detalhe de pedidos da adição IMP-CAU 		
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, NULLIF(SUBSTRING(tdp.TXM_TEXT, 1, 512), '')
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'I1CII'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 20	
			WHERE duc.DUC_DUNO = 2 AND ((ISNULL(ins.DUA_RG37, '') IN ('4000', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') = '4FD' AND ISNULL(ins.DUA_R37C, '') IN ('413', '414', '415'))
				OR (ISNULL(ins.DUA_RG37, '') IN ('4000', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') IN ('454', '455', '456', '457', '458', '459'))
				OR (ISNULL(ins.DUA_RG37, '') IN ('4000', '4053', '4071', '4078') AND ISNULL(ins.DUA_R37B, '') = 'C01')				
				OR (ISNULL(ins.DUA_RG37, '') = '4000' AND ISNULL(ins.DUA_R37B, '') IN ('402', '403', '404', '405', '406', '407', '408', '409', '411', '412', '413', '414', '415', '416', '417', '418', '419', '420', '421', '422', '423', '424', '425', '426', '427', '428', '429', '430', '431', '432', '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '444', '445', '446', '447', '448', '449')))
				AND dap.id IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN							
			INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 20, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o pedido "I1CII" existente no detalhe de pedidos da adição mas já não satisfaz a condição do regime e/ou desdobramento 1
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 20			
			WHERE duc.DUC_DUNO = 2 AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') <> '4FD' OR ISNULL(ins.DUA_R37C, '') NOT IN ('413', '414', '415'))
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') NOT IN ('454', '455', '456', '457', '458', '459'))
				AND (ISNULL(ins.DUA_RG37, '') NOT IN ('4000', '4053', '4071', '4078') OR ISNULL(ins.DUA_R37B, '') <> 'C01') 
				AND (ISNULL(ins.DUA_RG37, '') <> '4000' OR ISNULL(ins.DUA_R37B, '') NOT IN ('402', '403', '404', '405', '406', '407', '408', '409', '411', '412', '413', '414', '415', '416', '417', '418', '419', '420', '421', '422', '423', '424', '425', '426', '427', '428', '429', '430', '431', '432', '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '444', '445', '446', '447', '448', '449'))
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
	END	
-- se colunas do regime ou valor aduaneiro alteradas, processa a gestão do pedido "I13CP" no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_RG37) OR UPDATE(DUA_VATO)
	BEGIN
-- insere ou altera o pedido "I13CP" no detalhe de pedidos da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, LTRIM(STR(ISNULL(ins.DUA_VATO, 0), 18, 2)), uti.UTI_IDTY, tdp.TXM_IDTY, dap.id 
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'I13CP'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 21		
			WHERE duc.DUC_DUNO = 2 AND ISNULL(LEFT(ins.DUA_RG37, 2), '') IN ('51', '53') 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumeroPedido, @IdUtilizador, @IdPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN					
			IF @IdRegisto IS NULL
			BEGIN		
				INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 21, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET					
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumeroPedido, @IdUtilizador, @IdPedido, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o pedido "I13CP" existente no detalhe de pedidos da adição mas já não satisfaz a condição do regime
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 21				
			WHERE duc.DUC_DUNO = 2 AND ISNULL(LEFT(ins.DUA_RG37, 2), '') NOT IN ('51', '53') 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
	END
-- se colunas do frete ou seguro alterada, processa a gestão do código "AK"/"BA" no detalhe de acréscimos/deduções das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_VFRE) OR UPDATE(DUA_VSEG) OR UPDATE(DUA_AJUS) /*DUA_AJUS para recalcular acrescimo/dedução uma vez que é atualizado quando nos dados gerais os campos DUC_FR20, DUC_TXFR ou DUC_TXSE são alterados*/
	BEGIN
-- insere/edita o código "AK"/"BA" no detalhe de acréscimos/deduções da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, uti.UTI_IDTY, daa.id, 
				(ROUND(ISNULL(ins.DUA_VFRE, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUA_VSEG, 0) / ISNULL(duc.DUC_TXSE, 0), 2)), 
				(CASE WHEN ISNULL(NULLIF(CHARINDEX('+', ISNULL(duc.DUC_FR20, '')), 0), 999999) > ISNULL(NULLIF(CHARINDEX('-', ISNULL(duc.DUC_FR20, '')), 0), 999999) THEN 1 ELSE 0 END)
			FROM inserted AS ins 					
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes AS daa WITH(NOLOCK) ON ins.DUA_IDEN = daa.id_adicao AND origem = 1												
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_SERV = 0 AND duc.DUC_ANXB NOT IN ('H2', 'H3', 'H4', 'H6') AND ISNULL(duc.DUC_FR20, '') <> '' 
				AND (ROUND(ISNULL(ins.DUA_VFRE, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUA_VSEG, 0) / ISNULL(duc.DUC_TXSE, 0), 2)) > 0
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdRegisto, @SomaFreteESeguro, @TipoAcrescimoDeducao
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @TipoAcrescimoDeducao = 0 --Acrescimo
				SET @CodAcrescimoDeducao = 'AK'
			ELSE
				SET @CodAcrescimoDeducao = 'BA'
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes(id_adicao, tipo, codigo, montante, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, @TipoAcrescimoDeducao, @CodAcrescimoDeducao, @SomaFreteESeguro, 1, @IdUtilizador, @DataAtual)				
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes SET
					tipo = @TipoAcrescimoDeducao, 
					codigo = @CodAcrescimoDeducao, 
					montante = @SomaFreteESeguro, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdRegisto, @SomaFreteESeguro, @TipoAcrescimoDeducao
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o código "AK"/"BA" existente no detalhe de acréscimos/deduções da adição mas já não satisfazem a condição do valor do frete + seguro
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT daa.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes AS daa WITH(NOLOCK) ON ins.DUA_IDEN = daa.id_adicao AND origem = 1			
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_SERV = 0 AND (duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H6') OR ISNULL(duc.DUC_FR20, '') = '' 
				OR (ROUND(ISNULL(ins.DUA_VFRE, 0) / ISNULL(duc.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUA_VSEG, 0) / ISNULL(duc.DUC_TXSE, 0), 2)) = 0)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes				
	END
-- se colunas de direitos DDP ou método de avaliação alterada, processa a gestão do código "BC" no detalhe de acréscimos/deduções das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_VDIR) OR UPDATE(DUA_MAVA)
	BEGIN
-- insere/edita o código "BC" no detalhe de acréscimos/deduções da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, uti.UTI_IDTY, daa.id, ISNULL(ins.DUA_VDIR, 0)
			FROM inserted AS ins 			
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL		
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes AS daa WITH(NOLOCK) ON ins.DUA_IDEN = daa.id_adicao AND origem = 2									
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_ANXB NOT IN ('H2', 'H3', 'H4', 'H6') AND ISNULL(ins.DUA_VDIR, 0) > 0 AND ISNULL(ins.DUA_MAVA, 0) <= 1
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdRegisto, @ValorDireitosDDP
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes(id_adicao, tipo, codigo, montante, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, 1, 'BC', @ValorDireitosDDP, 2, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes SET					
					montante = @ValorDireitosDDP, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdRegisto, @ValorDireitosDDP
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o código "BC" existente no detalhe de acréscimos/deduções da adição mas já não satisfaz a condição do valor dos direitos DDP
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT daa.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes AS daa WITH(NOLOCK) ON ins.DUA_IDEN = daa.id_adicao AND origem = 2				
			WHERE duc.DUC_DUNO = 2 AND (duc.DUC_ANXB IN ('H2', 'H3', 'H4', 'H6') OR ISNULL(ins.DUA_VDIR, 0) = 0 OR ISNULL(ins.DUA_MAVA, 0) > 1)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesAcrescimosDeducoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se colunas de frete, optativas, verba transitário ou ajustamento alteradas, processa a gestão do pedido “G1VDA” no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_VFRE) OR UPDATE(DUA_VOPT) OR UPDATE(DUA_VTRA) OR UPDATE(DUA_AJUS)
	BEGIN
-- insere/edita o pedido “G1VDA” no detalhe de pedidos da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ISNULL(ins.DUA_VFRE, 0), ISNULL(ins.DUA_VOPT, 0), ISNULL(ins.DUA_VTRA, 0), ins.DUA_AJUS, ins.DUA_IDEN, ISNULL(duc.DUC_TXFR, 0), ISNULL(duc.DUC_TFDA, 0), uti.UTI_IDTY, 
				mtr.MTR_PTAX, tdp.TXM_IDTY, dap.id
			FROM inserted AS ins 							
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL	
				INNER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON duc.MTR_PT18 = mtr.MTR_CODI
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'G1VDA'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 6								
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_ANXB <> 'H2' AND (ISNULL(ins.DUA_VOPT, 0) > 0 OR ISNULL(ins.DUA_VTRA, 0) > 0)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @Frete, @Optativas, @VerbaTransitario, @Ajustamento, @IdAdicao, @CambioFrete, @TaxaFDA, @IdUtilizador, @PedeTaxaFDA, @IdPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula o montante a apurar em função se meio de transporte da declaracao pede taxa FDA
			IF @PedeTaxaFDA = 1
			BEGIN
				IF @Ajustamento >= 0
					SET @Montante = ROUND((@Optativas + (@Frete / @CambioFrete / 100 * (100 - @TaxaFDA))), 2)
				ELSE
					SET @Montante = ROUND((@Optativas + (@Frete / @CambioFrete / 100 * @TaxaFDA)), 2)
			END
			ELSE
				SET @Montante = ROUND((@Optativas + @VerbaTransitario), 2)
-- calcula o número do pedido
			SET @NumeroPedido = LTRIM(STR(@Montante, 18, 2))
-- insere ou edita o pedido “G1VDA” no detalhe de pedidos da adição IMP-CAU
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 6, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET										
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @Frete, @Optativas, @VerbaTransitario, @Ajustamento, @IdAdicao, @CambioFrete, @TaxaFDA, @IdUtilizador, @PedeTaxaFDA, @IdPedido, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o pedido “G1VDA” existente no detalhe de pedidos da adição mas já não satisfaz a condição das optativas ou verba transitário
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN				
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 6			
			WHERE duc.DUC_DUNO = 2 AND ((duc.DUC_ANXB = 'H2') OR (ISNULL(ins.DUA_VOPT, 0) = 0 AND ISNULL(ins.DUA_VTRA, 0) = 0))
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se colunas do artigo, massa líquida, massa bruta ou unidades alteradas, processa a gestão dos elementos p/ tributação dos artigos no detalhe de elementos p/ tributação das adições IMP-CAU inseridas/alteradas
	IF UPDATE(APA_CO33) OR UPDATE(DUA_ML38) OR UPDATE(DUA_MB35) OR UPDATE(DUA_US41)
	BEGIN
-- insere/edita os elementos p/ tributação configurados no artigo no detalhe de elementos p/ tributação das adições IMP-CAU
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, aet.UME_CODI, ume.UME_COD2, aet.RRE_CODI, aet.RRE_NOME, rre.RRE_IMPO, aet.AET_TAXA, aet.AET_TXVL, aet.AET_IDST, det.DET_IDEN,
				(CASE WHEN ISNULL(aet.AET_ORIG, 0) IN (1, 2, 3) THEN 2 ELSE 3 END), 
				(CASE ISNULL(aet.AET_ORIG, 0) 
					WHEN 1 THEN ROUND(ISNULL(ins.DUA_US41, 0) / ISNULL(NULLIF(ume.UME_FACT, 0), 1), 3)
					WHEN 2 THEN ROUND(ins.DUA_ML38 / ISNULL(NULLIF(ume.UME_FACT, 0), 1), 3)
					WHEN 3 THEN ROUND(ins.DUA_MB35 / ISNULL(NULLIF(ume.UME_FACT, 0), 1), 3)
					ELSE 0 
				END)
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI
				INNER JOIN TAB_AETR AS aet WITH(NOLOCK) ON art.APA_CHVE = aet.APA_CHVE
				INNER JOIN TAB_UMED AS ume WITH(NOLOCK) ON aet.UME_CODI = ume.UME_CODI
				LEFT OUTER JOIN TAB_RREC AS rre WITH(NOLOCK) ON aet.RRE_CODI = rre.RRE_CODI
				LEFT OUTER JOIN PRO_DUET AS det WITH(NOLOCK) ON ins.DUC_EANO = det.DUC_EANO AND ins.DUC_PNUM = det.DUC_PNUM AND ins.DUA_CODI = det.DUA_CODI AND det.DET_AUTO = (CASE WHEN ISNULL(aet.AET_ORIG, 0) IN (1, 2, 3) THEN 2 ELSE 3 END) AND aet.AET_IDST = det.DIT_IDST
			WHERE duc.DUC_DUNO = 2 				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodUnidadeMedida, @CodUnidadeMedida2, @CodRubricaReceita, @NomeRubricaReceita, @ImposicaoRubricaReceita, 
			@ETaxa, @TaxaValor, @IdStrRegisto, @IdRegisto, @TipoOrigem, @Quantidade									
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere ou edita o elemento p/ tributação do artigo
			IF @IdRegisto IS NULL
			BEGIN				
				SET @IdStrElementoTrib = REPLACE(CONVERT(numeric(38, 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()), '.', ',')
-- obtem o próximo numero de registo de elementos p/ tributação da adição IMP-CAU
				SELECT @NumProxRegisto = ISNULL(MAX(DET_CODI), 0) + 1
				FROM PRO_DUET
				WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o elemento p/ tributação no detalhe de elementos p/ tributação da adição IMP-CAU
				INSERT INTO PRO_DUET(DUC_EANO, DUC_PNUM, DUA_CODI, DET_CODI, DET_TIPO, UME_CODI, UME_COD2, DET_QTDE, DET_AUTO, DIT_IDST, RRE_CODI, RRE_NOME, DET_IMPO, DET_TAXA, DET_TXVL, DET_IDST)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, 1, @CodUnidadeMedida, @CodUnidadeMedida2, @Quantidade, @TipoOrigem, @IdStrRegisto, @CodRubricaReceita, 
					@NomeRubricaReceita, @ImposicaoRubricaReceita, @ETaxa, @TaxaValor, @IdStrElementoTrib)
			END
			ELSE
			BEGIN
				UPDATE PRO_DUET SET					
					UME_CODI = @CodUnidadeMedida, 
					UME_COD2 = @CodUnidadeMedida2, 
					DET_QTDE = @Quantidade, 
					RRE_CODI = @CodRubricaReceita, 
					RRE_NOME = @NomeRubricaReceita, 
					DET_IMPO = @ImposicaoRubricaReceita, 
					DET_TAXA = @ETaxa, 
					DET_TXVL = @TaxaValor
				WHERE DET_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodUnidadeMedida, @CodUnidadeMedida2, @CodRubricaReceita, @NomeRubricaReceita, @ImposicaoRubricaReceita, 
				@ETaxa, @TaxaValor, @IdStrRegisto, @IdRegisto, @TipoOrigem, @Quantidade	
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes			
-- remove os elementos p/ tributação existentes no detalhe de elementos p/ tributação das adições IMP-CAU mas já não existentes na configuração do artigo
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT det.DUC_EANO, det.DUC_PNUM, det.DUA_CODI, det.DET_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DUET AS det WITH(NOLOCK) ON ins.DUC_EANO = det.DUC_EANO AND ins.DUC_PNUM = det.DUC_PNUM AND ins.DUA_CODI = det.DUA_CODI AND det.DET_AUTO IN (2, 3)
				INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON ins.APA_CO33 = art.APA_CODI				
				LEFT OUTER JOIN TAB_AETR AS aet WITH(NOLOCK) ON art.APA_CHVE = aet.APA_CHVE AND det.DIT_IDST = aet.AET_IDST
			WHERE duc.DUC_DUNO = 2 AND aet.AET_CODI IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove elemento p/ tributação					
			DELETE FROM PRO_DUET
			WHERE DET_IDEN = @IdRegisto
-- atualiza numero de elementos p/ tributação posteriores
			UPDATE PRO_DUET SET DET_CODI = DET_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DET_IDEN > @IdRegisto 
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
	END
-- se coluna do valor aduaneiro alterada, processa a atualização dos campos de total adições e total valor aduaneiro na declaração das adições IMP-CAU inseridas/alteradas
	IF (ISNULL(CONTEXT_INFO(), 0x0) <> 0x44495341424C4544) AND (UPDATE(DUA_VATO)) --"DISABLED" em binário
	BEGIN
-- obtem as declarações associadas às adições inseridas/editadas
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM
			FROM inserted AS ins
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM				
			WHERE duc.DUC_DUNO = 2
			GROUP BY ins.DUC_EANO, ins.DUC_PNUM
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula a soma do número de adições e do valor aduaneiro de todas as adições da declaração IMP-CAU
			SELECT @SomaAdicoes = COUNT(*), @SomaValorAduaneiro = SUM(ISNULL(DUA_VATO, 0))
			FROM PRO_DUAD WITH(NOLOCK)
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao
-- atualiza total de adições e valor aduaneiro total na declaração IMP-CAU
			UPDATE PRO_DUCG SET 
				DUC_ADI5 = @SomaAdicoes, 
				DUC_VATT = @SomaValorAduaneiro
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	 		
	END
-- se coluna do valor aduaneiro alterada, processa a gestão do pedido “I07CP” no detalhe de pedidos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_VATO)
	BEGIN
-- insere/edita o pedido “I07CP” no detalhe de pedidos da adição IMP-CAU 
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, LTRIM(STR(ISNULL(ins.DUA_VATO, 0), 18, 2)), uti.UTI_IDTY, tdp.TXM_IDTY, dap.id
			FROM inserted AS ins 							
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL		
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'I07CP'
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 15
			WHERE duc.DUC_DUNO = 2 AND duc.DUC_ANXB = 'H3' AND ISNULL(ins.DUA_VATO, 0) > 0
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumeroPedido, @IdUtilizador, @IdPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 15, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET										
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumeroPedido, @IdUtilizador, @IdPedido, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- remove o pedido “I07CP” existente no detalhe de pedidos da adição mas já não satisfaz a condição do valor aduaneiro
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN				
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 15
			WHERE duc.DUC_DUNO = 2 AND (duc.DUC_ANXB <> 'H3' OR ISNULL(ins.DUA_VATO, 0) = 0)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
	END
-- se coluna do regime alterada, processa a gestão do pedido “G1RED” no detalhe de pedidos ou o documento "C601" no detalhe de documentos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_RG37)
	BEGIN
-- obtem as adições IMP-CAU dos regimes "0151" ou "0153" e cujo cliente importador tenha uma autorização com o documento "C601" definida
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, cau.CAU_NDOC
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C601'
				INNER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON duc.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND doc.DOC_CODI = dad.DOC_CODI AND dad.DDO_AUTO = 12
			WHERE duc.DUC_DUNO = 2 AND ISNULL(ins.DUA_RG37, '') IN ('0151', '0153') AND doc.DOC_DESP = 1 AND doc.DOC_TRAN = 0 AND LEN(doc.DOC_CODI) <= 4 AND dad.DDO_IDEN IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento "C601" como "Documento Suporte" no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_AUTO, DDO_TIPO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, 12, 0)			
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
-- obtem os documentos "C601" das adições IMP-CAU com regime "0151" ou "0153" e cliente importador tenha uma autorização com o documento "C601" definida
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.DUC_EANO, dad.DUC_PNUM, dad.DUA_CODI, dad.DDO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND dad.DDO_AUTO = 12
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI	
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON duc.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
			WHERE duc.DUC_DUNO = 2 AND (ISNULL(ins.DUA_RG37, '') NOT IN ('0151', '0153') OR doc.DOC_DESP = 0 OR doc.DOC_TRAN = 1 OR LEN(doc.DOC_CODI) > 4 OR doc.DOC_IDTY IS NULL OR cau.CAU_IDEN IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- remove documento					
			DELETE FROM PRO_DDOC
			WHERE DDO_IDEN = @IdRegisto
-- atualiza numero de documentos posteriores
			UPDATE PRO_DDOC SET DDO_CODI = DDO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DDO_IDEN > @IdRegisto 
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem as adições IMP-CAU dos regimes "0151" ou "0153" e cujo cliente importador não tenha uma autorização com o documento "C601" definida
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, NULLIF(SUBSTRING(tdp.TXM_TEXT, 1, 512), '')
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL						
				INNER JOIN TAB_TXML AS tdp WITH(NOLOCK) ON tdp.TXM_CODI = 'G1RED'
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C601'
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON duc.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 22
			WHERE duc.DUC_DUNO = 2 AND ISNULL(ins.DUA_RG37, '') IN ('0151', '0153') AND cau.CAU_IDEN IS NULL AND dap.id IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere o pedido "G1RED" no detalhe de pedidos da adição IMP-CAU
			INSERT INTO tb_IMP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 22, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
-- obtem os pedidos "G1RED" das adições IMP-CAU com regime "0151" ou "0153" e cliente importador não tenha uma autorização com o documento "C601" definida
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dap.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN				
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(duc.DUC_UALT, duc.DUC_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON ins.DUA_IDEN = dap.id_adicao AND dap.origem = 22
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C601'
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON duc.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
			WHERE duc.DUC_DUNO = 2 AND (ISNULL(ins.DUA_RG37, '') NOT IN ('0151', '0153') OR cau.CAU_IDEN IS NOT NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
	END
-- se coluna do desdobramento 1 alterada, processa a gestão de documentos do desdobramento no detalhe de documentos das adições IMP-CAU inseridas/alteradas
	IF UPDATE(DUA_R37B)
	BEGIN
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ins.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME
			FROM inserted AS ins 
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM								
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', '417', '418') THEN '3E06' ELSE NULL END) 
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', 'C03', 'C09', '417', '418', '421') THEN '3E14' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', 'C04', '417', '418') THEN '3G14' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', '417', '418') THEN '3G21' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C02', 'C03', '418', '421') THEN '9Z08' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C09', 'C10', '421') THEN '3Z61' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C44', 'C45', 'C46', 'C47', '422', '423', '424', '426', '427', '428', '441') THEN '3X06' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('417', '418') THEN 'N041' ELSE NULL END)
				LEFT OUTER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND doc.DOC_CODI = dad.DOC_CODI AND dad.DDO_AUTO = 13
			WHERE duc.DUC_DUNO = 2 AND ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', 'C03', 'C04', 'C09', 'C10', 'C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C44', 'C45', 'C46', 'C47', '417', '418', '421', '422', '423', '424', '426', '427', '428', '441') 
				AND doc.DOC_DESP = 1 AND doc.DOC_TRAN = 0 AND LEN(doc.DOC_CODI) <= 4 AND dad.DDO_IDEN IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento do desdobramento como "Documento Suporte" no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_AUTO, DDO_TIPO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, 13, 0)			
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
-- obtem os documentos do desdobramento das adições IMP-CAU
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.DUC_EANO, dad.DUC_PNUM, dad.DUA_CODI, dad.DDO_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUA_IDEN = del.DUA_IDEN
				INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON ins.DUC_EANO = duc.DUC_EANO AND ins.DUC_PNUM = duc.DUC_PNUM
				INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON ins.DUC_EANO = dad.DUC_EANO AND ins.DUC_PNUM = dad.DUC_PNUM AND ins.DUA_CODI = dad.DUA_CODI AND dad.DDO_AUTO = 13
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON (doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', '417', '418') THEN '3E06' ELSE NULL END) 
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', 'C03', 'C09', '417', '418', '421') THEN '3E14' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', 'C04', '417', '418') THEN '3G14' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C01', 'C02', '417', '418') THEN '3G21' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C02', 'C03', '418', '421') THEN '9Z08' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C09', 'C10', '421') THEN '3Z61' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C44', 'C45', 'C46', 'C47', '422', '423', '424', '426', '427', '428', '441') THEN '3X06' ELSE NULL END)
														OR doc.DOC_CODI = (CASE WHEN ISNULL(ins.DUA_R37B, '') IN ('417', '418') THEN 'N041' ELSE NULL END))
														AND dad.DOC_CODI = doc.DOC_CODI
			WHERE duc.DUC_DUNO = 2 AND (ISNULL(ins.DUA_R37B, '') NOT IN ('C01', 'C02', 'C03', 'C04', 'C09', 'C10', 'C12', 'C13', 'C14', 'C15', 'C16', 'C17', 'C18', 'C20', 'C21', 'C22', 'C23', 'C24', 'C25', 'C33', 'C40', 'C44', 'C45', 'C46', 'C47', '417', '418', '421', '422', '423', '424', '426', '427', '428', '441') 
				OR doc.DOC_DESP = 0 OR doc.DOC_TRAN = 1 OR LEN(doc.DOC_CODI) > 4 OR doc.DOC_IDTY IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- remove documento					
			DELETE FROM PRO_DDOC
			WHERE DDO_IDEN = @IdRegisto
-- atualiza numero de documentos posteriores
			UPDATE PRO_DDOC SET DDO_CODI = DDO_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao AND DDO_IDEN > @IdRegisto 
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'tr_IMP_DeclaracoesAdicoesPedidos_Regras_IU') AND type = 'TR')
	DROP TRIGGER tr_IMP_DeclaracoesAdicoesPedidos_Regras_IU  
GO
CREATE TRIGGER tr_IMP_DeclaracoesAdicoesPedidos_Regras_IU ON tb_IMP_DeclaracoesAdicoesPedidos WITH ENCRYPTION AFTER INSERT, UPDATE AS 
BEGIN
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaracao de variaveis 
	DECLARE @NumProxRegisto int
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int
	DECLARE @CodDocumento varchar(5), @NomeDocumento varchar(150), @NumeroDocumento varchar(70), @TipoDocumento int
-- se coluna do pedido alterada, processa a gestão do documento no detalhe de documentos das adições IMP-CAU associadas aos pedidos inseridos/alterados
	IF UPDATE(id_pedido)
	BEGIN
-- insere o documento como "Suporte" no detalhe de documentos da adição IMP-CAU 
		DECLARE Pedidos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUC_EANO, adi.DUC_PNUM, adi.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, doc.DOC_DTRA, 
				(CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END)				
			FROM inserted AS ins 			
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.id_adicao = adi.DUA_IDEN				
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ins.id_pedido = ped.TXM_IDTY
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ped.DOC_CODI = doc.DOC_CODI	
				LEFT OUTER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON adi.DUC_EANO = dad.DUC_EANO AND adi.DUC_PNUM = dad.DUC_PNUM AND adi.DUA_CODI = dad.DUA_CODI AND doc.DOC_CODI = dad.DOC_CODI AND dad.DDO_AUTO = 10				
			WHERE doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND dad.DDO_IDEN IS NULL
		OPEN Pedidos
		FETCH NEXT FROM Pedidos INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
			SELECT @NumProxRegisto = ISNULL(MAX(DDO_CODI), 0) + 1
			FROM PRO_DDOC
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
-- insere o documento no detalhe de documentos da adição IMP-CAU
			INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_AUTO, DDO_TIPO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @NumProxRegisto, @CodDocumento, @NomeDocumento, @NumeroDocumento, 10, @TipoDocumento)				
			FETCH NEXT FROM Pedidos INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		END
		CLOSE Pedidos
		DEALLOCATE Pedidos	
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_EXML_EXPSAE') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_EXML_EXPSAE  
GO
CREATE TRIGGER TAIU_PRO_EXML_EXPSAE ON PRO_EXML WITH ENCRYPTION AFTER INSERT, UPDATE AS
BEGIN
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @DataAtual datetime, @PeriodoTransitorio bit, @IdDeclaracao bigint, @AnoDeclaracao int, @CodDeclaracao int, @CodOperadorDeclaracao varchar(6), @IdUtilizador int, @IdRegisto bigint, 
		@NumRegisto int
	DECLARE @CodFollowUpNatureza int
	DECLARE @IdDocumento int, @NumeroDocumento varchar(70), @TipoDocumento tinyint
	DECLARE @NumeroAutorizacao varchar(35), @TitularAutorizacao varchar(17)
	DECLARE @CodPedido varchar(5), @NumeroPedido varchar(512)	
	DECLARE @IdStatusIncidencia int, @ReleaseHoldStatusIncidencia varchar(1)
	DECLARE @CodPais varchar(2), @NomePais varchar(25)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem configuração do periodo transitório EXP-SAE dos Parâmetros de Despachos
	SELECT TOP 1 @PeriodoTransitorio = PDE_PTEX 
	FROM TAB_PDES WITH(NOLOCK)
-- processa automatismos relacionados com a alteração da natureza
	IF UPDATE(NDE_CODI)
	BEGIN
-- obtem as declarações EXP-SAE inseridas/alteradas cuja natureza tem associado um follow-up de exportação e que valida utilizador
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY , (CASE 
									WHEN ISNULL(ugr.UTI_UTIL, '') <> '' THEN fup.FUP_CODI 
									ELSE ISNULL((SELECT TOP 1 sfu.FUP_CODI
												FROM GIDWIN.dbo.FAP_FWUP AS sfu WITH(NOLOCK) 
													INNER JOIN GIDWIN.dbo.FAP_UGRU AS sug WITH (NOLOCK) ON ins.EXM_UALT = sug.UTI_UTIL AND sfu.GRU_CODI = sug.GRU_CODI
												WHERE sfu.FUP_EXPO = 1 AND sfu.FUP_VUTI = 1 AND sfu.FUP_CODI <> fup.FUP_CODI), fup.FUP_CODI) 
								END)
			FROM inserted AS ins 				
				INNER JOIN TAB_NDES AS nde WITH(NOLOCK) ON ins.NDE_CODI = nde.NDE_CODI
				INNER JOIN GIDWIN.dbo.FAP_FWUP AS fup WITH(NOLOCK) ON nde.FUP_CODI = fup.FUP_CODI
				LEFT OUTER JOIN GIDWIN.dbo.FAP_UGRU AS ugr WITH (NOLOCK) ON ins.EXM_UALT = ugr.UTI_UTIL AND fup.GRU_CODI = ugr.GRU_CODI
			WHERE ins.EXM_CNTX = 1 AND fup.FUP_EXPO = 1 AND fup.FUP_VUTI = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @CodFollowUpNatureza
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza follow-up na declaração EXP-SAE
			UPDATE PRO_EXML SET FUP_CODI = @CodFollowUpNatureza
			WHERE EXM_IDTY = @IdDeclaracao AND ISNULL(FUP_CODI, -1) <> @CodFollowUpNatureza
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @CodFollowUpNatureza
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem as declarações EXP-SAE inseridas/alteradas cuja natureza tem associado um status de incidência/cosmo code
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, uti.UTI_IDTY, ISNULL(sti.SIN_IDTY, cco.COS_IDTY), (CASE WHEN cco.COS_RELI = 1 THEN 'R' WHEN cco.COS_HOLD = 1 THEN 'H' ELSE NULL END)
			FROM inserted AS ins 				
				INNER JOIN TAB_NDES AS nde WITH(NOLOCK) ON ins.NDE_CODI = nde.NDE_CODI		
				LEFT OUTER JOIN TAB_SINC AS sti WITH(NOLOCK) ON nde.SIN_CODI = sti.SIN_CODI
				LEFT OUTER JOIN TAB_COSM AS cco WITH(NOLOCK) ON nde.SIN_CODI = cco.COS_CODE
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
			WHERE ins.EXM_CNTX = 1 AND (sti.SIN_IDTY IS NOT NULL OR cco.COS_IDTY IS NOT NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia, @ReleaseHoldStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN		
-- insere o status de incidência no detalhe de incidências da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesIncidencias(id_declaracaoEXP, id_statusIncidencia, dataInicio, dataFim, id_utilizadorCriacao, dataCriacao, releaseHold, origem, id_utilizadorControlo, 
				dataControlo)			
			VALUES(@IdDeclaracao, @IdStatusIncidencia, @DataAtual, @DataAtual, @IdUtilizador, @DataAtual, @ReleaseHoldStatusIncidencia, 1, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia, @ReleaseHoldStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- processa automatismos relacionados com a alteração do exportador (cliente)
	IF UPDATE(CLI_COD2)
	BEGIN
-- obtem as declarações EXP-SAE inseridas/alteradas cujo exportador (cliente) tem associado um cosmo code e este ainda não existe no detalhe de incidências da declaração EXP-SAE
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, uti.UTI_IDTY, cco.COS_IDTY, (CASE WHEN cco.COS_RELI = 1 THEN 'R' WHEN cco.COS_HOLD = 1 THEN 'H' ELSE NULL END)
			FROM inserted AS ins 				
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.CLI_COD2 = cli.CLI_CODI	
				INNER JOIN TAB_COSM AS cco WITH(NOLOCK) ON (CASE RIGHT(ins.EAD_CODA, 3) WHEN '015' THEN cli.COS_CDLS WHEN '020' THEN cli.COS_CDPO ELSE NULL END) = cco.COS_CODE
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
			WHERE ins.EXM_CNTX = 1 AND NOT EXISTS(SELECT 1 FROM tb_EXP_DeclaracoesIncidencias WITH(NOLOCK) WHERE id_declaracaoEXP = ins.EXM_IDTY AND id_statusIncidencia = cco.COS_IDTY)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia, @ReleaseHoldStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN		
-- insere o cosmo code no detalhe de incidências da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesIncidencias(id_declaracaoEXP, id_statusIncidencia, dataInicio, dataFim, id_utilizadorCriacao, dataCriacao, releaseHold, origem, id_utilizadorControlo, 
				dataControlo)			
			VALUES(@IdDeclaracao, @IdStatusIncidencia, @DataAtual, @DataAtual, @IdUtilizador, @DataAtual, @ReleaseHoldStatusIncidencia, 2, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia, @ReleaseHoldStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do exportador (cliente) e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND UPDATE(CLI_COD2)
	BEGIN
-- obtem o documento OEA associado ao exportador (cliente) das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, NULLIF(cli.CLI_NAOE, ''), ddo.id
			FROM inserted AS ins 	
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.CLI_COD2 = cli.CLI_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cli.DOC_CDOE = doc.DOC_CODI	
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 2					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
			WHERE ins.EXM_CNTX = 1 AND cli.CLI_FXOE IN (0, 2) AND ISNULL(cli.CLI_NAOE, '') <> '' AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere/atualiza o documento OEA como "Referência Adicional" no detalhe de documentos da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 2, @IdDocumento, @NumeroDocumento, 2, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 					
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem o documento OEA existente no detalhe de documentos da declaração EXP-SAE cuja origem é do OEA exportador mas que já não satisfaz as condições ou não existe no OEA cliente exportador
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 2					
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.CLI_COD2 = cli.CLI_CODI	
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cli.DOC_CDOE = doc.DOC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND (cli.CLI_FXOE NOT IN (0, 2) OR ISNULL(cli.CLI_NAOE, '') = '' OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento OEA existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento OEA existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
-- obtem os documentos associados ao exportador (cliente) das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, ddo.id, 
				ISNULL(NULLIF(cdo.CLD_NDOC, ''), (CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END))	
			FROM inserted AS ins 
				INNER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON ins.CLI_COD2 = cdo.CLI_CODI				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cdo.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 3
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
			WHERE ins.EXM_CNTX = 1 AND cdo.CLD_UEXP = 1 AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @IdRegisto, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento como "Suporte" no detalhe de documentos da declaração EXP-SAE
		    IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, 3, @IdUtilizador, @DataAtual)				
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesDocumentos SET					
					numero = @NumeroDocumento, 					
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @IdRegisto, @NumeroDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- obtem os documentos existentes no detalhe de documentos da declaração EXP-SAE cuja origem é do exportador mas que já não satisfazem as condições ou não existem no detalhe de documentos do cliente exportador
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 3				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY	
				LEFT OUTER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON ins.CLI_COD2 = cdo.CLI_CODI AND doc.DOC_CODI = cdo.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND (cdo.CLD_UEXP = 0 OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR cdo.DOC_CODI IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
	END
-- processa automatismos relacionados com a alteração do exportador (cliente) ou estatuto e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(CLI_COD2) OR UPDATE(EXM_TP14))
	BEGIN
-- obtem o pedido "G1PRO" associado ao estatuto das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, ped.TXM_CODI, NULLIF(cli.CLI_NDHA, ''), dpe.EXP_CHVE
			FROM inserted AS ins 				
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.CLI_COD2 = cli.CLI_CODI
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = 'G1PRO'
				LEFT OUTER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 1				
			WHERE ins.EXM_CNTX = 1 AND ISNULL(ins.EXM_TP14, 0) = 2				
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o pedido "G1PRO" no detalhe de pedidos da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				SET @NumRegisto = ISNULL((SELECT MAX(EXP_LINH) FROM PRO_EXPA WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao), 0) + 1
				INSERT INTO PRO_EXPA(EXM_EANO, EXM_CODI, EXM_COPE, EXP_LINH, TXM_CODI, TXM_DESC, EXP_ORIG)
				VALUES(@AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumRegisto, @CodPedido, @NumeroPedido, 1)
			END
			ELSE
			BEGIN
				UPDATE PRO_EXPA SET
					TXM_CODI = @CodPedido, 
					TXM_DESC = @NumeroPedido
				WHERE EXP_CHVE = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- obtem o pedido "G1PRO" existente no detalhe de pedidos da declaração EXP-SAE cuja origem é do estatuto mas que já não satisfaz a condição
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, dpe.EXP_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 1								
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.TXM_CODI = ped.TXM_CODI				
			WHERE ins.EXM_CNTX = 1 AND (ISNULL(ins.EXM_TP14, 0) <> 2 OR ped.TXM_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- remove o pedido "G1PRO" existente no detalhe de pedidos da declaração EXP-SAE
			DELETE FROM PRO_EXPA		
			WHERE EXP_CHVE = @IdRegisto
-- atualiza os pedidos posteriores da declaração EXP-SAE
			UPDATE PRO_EXPA SET EXP_LINH = EXP_LINH - 1    
			WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao AND EXP_CHVE > @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
	END
-- processa automatismos relacionados com a alteração do declarante ou estatuto e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(DEC_CO14) OR UPDATE(EXM_TP14))
	BEGIN
-- obtem o documento OEA associado ao declarante das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, NULLIF(dcl.DEC_NAOE, ''), ddo.id
			FROM inserted AS ins 	
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON ins.DEC_CO14 = dcl.DEC_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON (CASE ins.EXM_TP14 WHEN 2 THEN dcl.DOC_CDOE ELSE dcl.DOC_CODI2 END) = doc.DOC_CODI	
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 4					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
			WHERE ins.EXM_CNTX = 1 AND dcl.DEC_FXOE IN (0, 2) AND ISNULL(dcl.DEC_NAOE, '') <> '' AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere/atualiza o documento OEA como "Referência Adicional" no detalhe de documentos da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 2, @IdDocumento, @NumeroDocumento, 4, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 					
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem o documento OEA existente no detalhe de documentos da declaração EXP-SAE cuja origem é do OEA declarante mas que já não satisfaz as condições ou não existe no OEA declarante
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 4					
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON ins.DEC_CO14 = dcl.DEC_CODI
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON (CASE ins.EXM_TP14 WHEN 2 THEN dcl.DOC_CDOE ELSE dcl.DOC_CODI2 END) = doc.DOC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND (dcl.DEC_FXOE NOT IN (0, 2) OR ISNULL(dcl.DEC_NAOE, '') = '' OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento OEA existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento OEA existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do tipo declaração adicional, exportador (cliente), país do exportador ou nif do exportador e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(EXM_TPRO) OR UPDATE(CLI_COD2) OR UPDATE(CLI_PAI2) OR UPDATE(CLI_NIF2))
	BEGIN
-- obtem os documentos "C512" ou "C514" associados ao tipo declaração adicional das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, (ISNULL(ins.CLI_PAI2, '') + ISNULL(ins.CLI_NIF2, '')), uti.UTI_IDTY, doc.DOC_IDTY, ISNULL(NULLIF(cau.CAU_NDOC, ''), '*****N/A*****'), dau.id
			FROM inserted AS ins 								
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE 
																				WHEN ins.EXM_TPRO IN ('C', 'F', 'U', 'Y') THEN 'C512' 
																				WHEN ins.EXM_TPRO IN ('V', 'Z') THEN 'C514' 
																				ELSE NULL 
																			END)
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON ins.CLI_COD2 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND doc.DOC_IDTY = dau.id_documento AND dau.origem = 3				
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_TPRO IN ('C', 'F', 'U', 'V', 'Y', 'Z') AND doc.DOC_EXPT = 1 AND doc.DOC_AUTZ = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento "C513" ou "C514" no detalhe de autorizações da declaração EXP-SAE 
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesAutorizacoes(id_declaracaoEXP, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @IdDocumento, @NumeroAutorizacao, @TitularAutorizacao, 3, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesAutorizacoes SET
					id_documento = @IdDocumento, 
					numero = @NumeroAutorizacao, 	
					titular = @TitularAutorizacao, 				
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos "C512" ou "C514" existentes no detalhe de autorizações da declaração EXP-SAE cuja origem é do tipo declaração adicional mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dau.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND dau.origem = 3					
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dau.id_documento = doc.DOC_IDTY AND doc.DOC_CODI = (CASE 
																														WHEN ins.EXM_TPRO IN ('C', 'F', 'U', 'Y') THEN 'C512' 
																														WHEN ins.EXM_TPRO IN ('V', 'Z') THEN 'C514' 
																														ELSE NULL 
																													END)					
			WHERE ins.EXM_CNTX = 1 AND (doc.DOC_EXPT = 0 OR doc.DOC_AUTZ = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "C512" ou "C514" existente no detalhe de autorizações da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAutorizacoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "C512" ou "C514" existente no detalhe de autorizações da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAutorizacoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- processa automatismos relacionados com a alteração do regime, exportador (cliente), país do exportador ou nif do exportador e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(EXM_REGI) OR UPDATE(CLI_COD2) OR UPDATE(CLI_PAI2) OR UPDATE(CLI_NIF2))
	BEGIN
-- obtem os documentos "C601", "C019", "C516", "C517", "C518", "C519", "C990", "D019" ou "N990" associados ao regime das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, (ISNULL(ins.CLI_PAI2, '') + ISNULL(ins.CLI_NIF2, '')), uti.UTI_IDTY, doc.DOC_IDTY, ISNULL(NULLIF(cau.CAU_NDOC, ''), '*****N/A*****'), dau.id
			FROM inserted AS ins 								
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE 
																				WHEN (LEFT(ins.EXM_REGI, 2) = '11') OR (ISNULL(ins.EXM_REGI, '') = '3151') THEN 'C601' 
																				WHEN LEFT(ins.EXM_REGI, 2) IN ('21', '22') THEN 'C019' 																				
																				WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76') THEN 'C517'
																				WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'C990'
																				ELSE NULL 
																			END)
															OR doc.DOC_CODI = (CASE 
																				WHEN ISNULL(ins.EXM_REGI, '') = '3151' THEN 'C516'
																				WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76')  THEN 'C518'
																				WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'D019'
																				ELSE NULL 
																			END)
															OR doc.DOC_CODI = (CASE 																				
																				WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76')  THEN 'C519'
																				WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'N990'
																				ELSE NULL 
																			END)				
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON ins.CLI_COD2 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND doc.DOC_IDTY = dau.id_documento AND dau.origem = 4		
			WHERE ins.EXM_CNTX = 1 
				AND ((LEFT(ins.EXM_REGI, 2) IN ('11', '21', '22')) OR (ISNULL(ins.EXM_REGI, '') = '3151') OR (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) IN ('44', '76'))) 
				AND doc.DOC_EXPT = 1 AND doc.DOC_AUTZ = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento "C601", "C019", "C516", "C517", "C518", "C519", "C990", "D019" ou "N990" no detalhe de autorizações da declaração EXP-SAE 
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesAutorizacoes(id_declaracaoEXP, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @IdDocumento, @NumeroAutorizacao, @TitularAutorizacao, 4, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesAutorizacoes SET
					id_documento = @IdDocumento, 
					numero = @NumeroAutorizacao, 	
					titular = @TitularAutorizacao, 				
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos "C601", "C019", "C516", "C517", "C518", "C519", "C990", "D019" ou "N990" existentes no detalhe de autorizações da declaração EXP-SAE cuja origem é do regime mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dau.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND dau.origem = 4				
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dau.id_documento = doc.DOC_IDTY 
					AND (doc.DOC_CODI = (CASE 
											WHEN (LEFT(ins.EXM_REGI, 2) = '11') OR (ISNULL(ins.EXM_REGI, '') = '3151') THEN 'C601' 
											WHEN LEFT(ins.EXM_REGI, 2) IN ('21', '22') THEN 'C019' 																				
											WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76') THEN 'C517'
											WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'C990'
											ELSE NULL 
										END)
						OR doc.DOC_CODI = (CASE 
											WHEN ISNULL(ins.EXM_REGI, '') = '3151' THEN 'C516'
											WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76')  THEN 'C518'
											WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'D019'
											ELSE NULL 
										END)
						OR doc.DOC_CODI = (CASE 																				
											WHEN (ISNULL(ins.EXM_REGI, '') = '3171') OR (RIGHT(ins.EXM_REGI, 2) = '76')  THEN 'C519'
											WHEN RIGHT(ins.EXM_REGI, 2) = '44' THEN 'N990'
											ELSE NULL 
										END))
			WHERE ins.EXM_CNTX = 1 AND (doc.DOC_EXPT = 0 OR doc.DOC_AUTZ = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "C601", "C019", "C516", "C517", "C518", "C519", "C990", "D019" ou "N990" existente no detalhe de autorizações da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAutorizacoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "C601", "C019", "C516", "C517", "C518", "C519", "C990", "D019" ou "N990" existente no detalhe de autorizações da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAutorizacoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- processa automatismos relacionados com a alteração da estância de apresentação, exportador (cliente), país do exportador ou nif do exportador e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(EAD_C29A) OR UPDATE(CLI_COD2) OR UPDATE(CLI_PAI2) OR UPDATE(CLI_NIF2))
	BEGIN
-- obtem o documento "C513" associado à estância de apresentação das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, (ISNULL(ins.CLI_PAI2, '') + ISNULL(ins.CLI_NIF2, '')), uti.UTI_IDTY, doc.DOC_IDTY, ISNULL(NULLIF(cau.CAU_NDOC, ''), '*****N/A*****'), dau.id
			FROM inserted AS ins 								
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C513'
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON ins.CLI_COD2 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND doc.DOC_IDTY = dau.id_documento AND dau.origem = 2					
			WHERE ins.EXM_CNTX = 1 AND ISNULL(ins.EAD_C29A, '') <> '' AND doc.DOC_EXPT = 1 AND doc.DOC_AUTZ = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento "C513" no detalhe de autorizações da declaração EXP-SAE 
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesAutorizacoes(id_declaracaoEXP, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @IdDocumento, @NumeroAutorizacao, @TitularAutorizacao, 2, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesAutorizacoes SET
					id_documento = @IdDocumento, 
					numero = @NumeroAutorizacao, 	
					titular = @TitularAutorizacao, 				
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem o documento "C513" existente no detalhe de autorizações da declaração EXP-SAE cuja origem é da estância de apresentação mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dau.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND dau.origem = 2						
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C513' AND dau.id_documento = doc.DOC_IDTY					
			WHERE ins.EXM_CNTX = 1 AND (ISNULL(ins.EAD_C29A, '') = '' OR doc.DOC_EXPT = 0 OR doc.DOC_AUTZ = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "C513" existente no detalhe de autorizações da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAutorizacoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "C513" existente no detalhe de autorizações da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAutorizacoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do NRG, exportador (cliente), país do exportador ou nif do exportador e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(EXM_NC48) OR UPDATE(CLI_COD2) OR UPDATE(CLI_PAI2) OR UPDATE(CLI_NIF2))
	BEGIN
-- obtem os documentos "C505" e "C506" associados ao NRG das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, (ISNULL(ins.CLI_PAI2, '') + ISNULL(ins.CLI_NIF2, '')), uti.UTI_IDTY, doc.DOC_IDTY, ISNULL(NULLIF(cau.CAU_NDOC, ''), '*****N/A*****'), dau.id
			FROM inserted AS ins 								
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI IN ('C505', 'C506')
				LEFT OUTER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON ins.CLI_COD2 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND doc.DOC_IDTY = dau.id_documento AND dau.origem = 1					
			WHERE ins.EXM_CNTX = 1 AND ISNULL(ins.EXM_NC48, '') <> '' AND doc.DOC_EXPT = 1 AND doc.DOC_AUTZ = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento "C505" e "C506" no detalhe de autorizações da declaração EXP-SAE 
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_EXP_DeclaracoesAutorizacoes(id_declaracaoEXP, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @IdDocumento, @NumeroAutorizacao, @TitularAutorizacao, 1, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesAutorizacoes SET
					id_documento = @IdDocumento, 
					numero = @NumeroAutorizacao, 	
					titular = @TitularAutorizacao, 				
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @TitularAutorizacao, @IdUtilizador, @IdDocumento, @NumeroAutorizacao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos "C505" e "C506" existentes no detalhe de autorizações da declaração EXP-SAE cuja origem é do NRG mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dau.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK) ON ins.EXM_IDTY = dau.id_declaracaoEXP AND dau.origem = 1							
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI IN ('C505', 'C506') AND dau.id_documento = doc.DOC_IDTY					
			WHERE ins.EXM_CNTX = 1 AND (ISNULL(ins.EXM_NC48, '') = '' OR doc.DOC_EXPT = 0 OR doc.DOC_AUTZ = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "C505" e "C506" existente no detalhe de autorizações da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAutorizacoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "C505" e "C506" existente no detalhe de autorizações da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAutorizacoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do regime ou país destino e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND (UPDATE(EXM_REGI) OR UPDATE(EXM_P17A))
	BEGIN
-- obtem o documentos "N821" associado ao par regime/país destino das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, doc.DOC_DTRA, uti.UTI_IDTY
			FROM inserted AS ins 								
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'N821'
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 5
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
			WHERE ins.EXM_CNTX = 1 AND LEFT(ins.EXM_REGI, 2) IN ('10', '11', '21', '22', '23') AND ins.EXM_P17A IN ('NO', 'GB', 'CH', 'CY', 'IS', 'LI', 'MK', 'NO', 'RS', 'TR') 
				AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.id IS NULL 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento "N821" como "Suporte"/"Transporte" no detalhe de documentos da declaração EXP-SAE 
			INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @TipoDocumento, @IdDocumento, 5, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos "N821" existentes no detalhe de autorizações da declaração EXP-SAE cuja origem é do par regime/país destino mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 5							
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'N821' AND ddo.id_documento = doc.DOC_IDTY	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND (LEFT(ins.EXM_REGI, 2) NOT IN ('10', '11', '21', '22', '23') OR ins.EXM_P17A NOT IN ('NO', 'GB', 'CH', 'CY', 'IS', 'LI', 'MK', 'NO', 'RS', 'TR') 
				OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "N821" existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "N821" existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do tipo de declaração e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND UPDATE(TDE_COD1)
	BEGIN	
-- obtem os documentos associados ao tipo de declaração das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, 				 
				(CASE 					
					WHEN doc.DOC_TDNU = 1 THEN 'S/N' 
					WHEN doc.DOC_TDNU = 2 THEN 'N/A' 
					WHEN doc.DOC_TDNU = 3 THEN 'DEC' 
					ELSE NULL 
				END)
			FROM inserted AS ins 				
				INNER JOIN TAB_TDED AS tdd WITH(NOLOCK) ON ins.TDE_COD1 = tdd.TDE_CODI	
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON tdd.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 6	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_ASAI = 0 AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.id IS NULL
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento como "Suporte" no detalhe de documentos da declaração EXP-SAE 
			INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, 6, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos existentes no detalhe de documentos da declaração EXP-SAE cuja origem é do tipo declaração mas que já não satisfazem as condições ou não existem no detalhe de documentos do tipo de declaração
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 6		
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY	
				LEFT OUTER JOIN TAB_TDED AS tdd WITH(NOLOCK) ON ins.TDE_COD1 = tdd.TDE_CODI AND doc.DOC_CODI = tdd.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_ASAI = 0 AND (doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR tdd.DOC_CODI IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os pedidos associados ao tipo declaração das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, tdp.TXM_CODI, SUBSTRING(tdp.TDP_TEXT, 1, 512)
			FROM inserted AS ins 				
				INNER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON ins.TDE_COD1 = tdp.TDE_CODI
				LEFT OUTER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 2				
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_ASAI = 0 AND dpe.EXP_CHVE IS NULL	
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o pedido no detalhe de pedidos da declaração EXP-SAE
			SET @NumRegisto = ISNULL((SELECT MAX(EXP_LINH) FROM PRO_EXPA WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao), 0) + 1
			INSERT INTO PRO_EXPA(EXM_EANO, EXM_CODI, EXM_COPE, EXP_LINH, TXM_CODI, TXM_DESC, EXP_ORIG)
			VALUES(@AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumRegisto, @CodPedido, @NumeroPedido, 2)
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- obtem os pedidos existentes no detalhe de pedidos da declaração EXP-SAE cuja origem é do tipo declaração mas que já não existem no detalhe de pedidos do tipo declaração
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, dpe.EXP_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 2								
				LEFT OUTER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON ins.TDE_COD1 = tdp.TDE_CODI AND dpe.TXM_CODI = tdp.TXM_CODI
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_ASAI = 0 AND tdp.TXM_CODI IS NULL
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- remove o pedido existente no detalhe de pedidos da declaração EXP-SAE
			DELETE FROM PRO_EXPA		
			WHERE EXP_CHVE = @IdRegisto
-- atualiza os pedidos posteriores da declaração EXP-SAE
			UPDATE PRO_EXPA SET EXP_LINH = EXP_LINH - 1    
			WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao AND EXP_CHVE > @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração do tipo declaração adicional e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND UPDATE(EXM_TPRO)
	BEGIN
-- obtem os documentos "NMRN" e "NCLE" associados ao tipo declaração adicional das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 								
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE 																				
																				WHEN ins.EXM_TPRO IN ('X', 'Y') THEN 'NMRN'																				
																				WHEN ins.EXM_TPRO = 'Z' THEN 'NCLE'
																				ELSE NULL 
																			END)
				LEFT OUTER JOIN tb_EXP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) ON ins.EXM_IDTY = dpr.id_declaracaoEXP AND doc.DOC_IDTY = dpr.id_documento AND dpr.origem = 1										
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_TPRO IN ('X', 'Y', 'Z') AND doc.DOC_CA40 = 1 AND LEN(doc.DOC_CODI) = 4 AND doc.DOC_EXPT = 1 AND dpr.id IS NULL
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento "NMRN" ou "NCLE" no detalhe de precedentes da declaração EXP-SAE 
			INSERT INTO tb_EXP_DeclaracoesPrecedentes(id_declaracaoEXP, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @IdDocumento, '*****N/A*****', 1, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem os documentos "NMRN" e "NCLE" existentes no detalhe de precedentes da declaração EXP-SAE cuja origem é do tipo declaração adicional mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpr.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) ON ins.EXM_IDTY = dpr.id_declaracaoEXP AND dpr.origem = 1							
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY AND doc.DOC_CODI = (CASE 																				
																														WHEN ins.EXM_TPRO IN ('X', 'Y') THEN 'NMRN'																				
																														WHEN ins.EXM_TPRO = 'Z' THEN 'NCLE'
																														ELSE NULL 
																													END)	
			WHERE ins.EXM_CNTX = 1 AND (doc.DOC_CA40 = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_EXPT = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "NMRN" ou "NCLE" existente no detalhe de precedentes da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesPrecedentes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "NMRN" ou "NCLE" existente no detalhe de precedentes da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesPrecedentes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- processa automatismos relacionados com a alteração da estância de exportação e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND UPDATE(EAD_CODA)
	BEGIN		
-- obtem os documentos associados à estância de exportação das declarações EXP-SAE inseridas/alteradas 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_IDTY, doc.DOC_IDTY, doc.DOC_DTRA, uti.UTI_IDTY, 				 
				(CASE 
					WHEN doc.DOC_CODI IN ('N704', 'N705', 'N740', 'N821', 'N830') THEN NULLIF(ins.EXM_CPRT, '')
					WHEN doc.DOC_CODI = '9X01' THEN 'Nao aplicavel DL 68/2007'
					WHEN doc.DOC_TDNU = 1 THEN 'S/N' 
					WHEN doc.DOC_TDNU = 2 THEN 'N/A' 
					WHEN doc.DOC_TDNU = 3 THEN 'DEC' 
					ELSE NULL 
				END)
			FROM inserted AS ins 				
				INNER JOIN TAB_EADD AS ead WITH(NOLOCK) ON ins.EAD_CODA = ead.EAD_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ead.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 1	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL						
			WHERE ins.EXM_CNTX = 1 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.id IS NULL 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento como "Suporte"/"Transporte" no detalhe de documentos da declaração EXP-SAE 
			INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @TipoDocumento, @IdDocumento, @NumeroDocumento, 1, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador, @NumeroDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- obtem os documentos existentes no detalhe de documentos da declaração EXP-SAE cuja origem é da estância de exportação mas que já não satisfazem as condições ou não existem no detalhe de documentos da estância de exportação
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.EXM_IDTY = ddo.id_declaracaoEXP AND ddo.origem = 1			
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY	
				LEFT OUTER JOIN TAB_EADD AS ead WITH(NOLOCK) ON ins.EAD_CODA = ead.EAD_CODI AND doc.DOC_CODI = ead.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.EXM_UALT, ins.EXM_UCRI) = uti.UTI_UTIL			
			WHERE ins.EXM_CNTX = 1 AND (doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR ead.DOC_CODI IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento existente no detalhe de documentos da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento existente no detalhe de documentos da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
	END
-- processa automatismos relacionados com a alteração da estância de aperfeiçoamento e o período transitório não está ativo
	IF (@PeriodoTransitorio = 0) AND UPDATE(EAD_CODI1)
	BEGIN
-- obtem o pedido "00100" associado à estância de aperfeiçoamento das declarações EXP-SAE inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, ped.TXM_CODI, SUBSTRING(ped.TXM_TEXT, 1, 512)
			FROM inserted AS ins 								
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = '00100'
				LEFT OUTER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 3				
			WHERE ins.EXM_CNTX = 1 AND ISNULL(ins.EAD_CODI1, '') <> '' AND dpe.EXP_CHVE IS NULL		
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o pedido "00100" no detalhe de pedidos da declaração EXP-SAE
			SET @NumRegisto = ISNULL((SELECT MAX(EXP_LINH) FROM PRO_EXPA WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao), 0) + 1
			INSERT INTO PRO_EXPA(EXM_EANO, EXM_CODI, EXM_COPE, EXP_LINH, TXM_CODI, TXM_DESC, EXP_ORIG)
			VALUES(@AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumRegisto, @CodPedido, @NumeroPedido, 3)			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPedido, @NumeroPedido
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- obtem o pedido "00100" existente no detalhe de pedidos da declaração EXP-SAE cuja origem é da estância de aperfeiçoamento mas que já não satisfaz a condição
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, dpe.EXP_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN PRO_EXPA AS dpe WITH(NOLOCK) ON ins.EXM_EANO = dpe.EXM_EANO AND ins.EXM_CODI = dpe.EXM_CODI AND ins.DEC_CODI = dpe.EXM_COPE AND dpe.EXP_ORIG = 3							
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.TXM_CODI = ped.TXM_CODI				
			WHERE ins.EXM_CNTX = 1 AND (ISNULL(ins.EAD_CODI1, '') = '' OR ped.TXM_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- remove o pedido "00100" existente no detalhe de pedidos da declaração EXP-SAE
			DELETE FROM PRO_EXPA		
			WHERE EXP_CHVE = @IdRegisto
-- atualiza os pedidos posteriores da declaração EXP-SAE
			UPDATE PRO_EXPA SET EXP_LINH = EXP_LINH - 1    
			WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao AND EXP_CHVE > @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
	END
-- processa automatismos relacionados com a alteração do país destino ou do anexo B
	IF UPDATE(EXM_P17A) OR UPDATE(EXM_ANXB)
	BEGIN
-- obtem o país destino das declarações EXP-SAE inseridas/alteradas que tem segurança ativa e tem o anexo B como "A2"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.DEC_CODI, pai.PAI_CODI, pai.PAI_NOME
			FROM inserted AS ins 								
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON ins.EXM_P17A = pai.PAI_CODI
				LEFT OUTER JOIN PRO_EXPI AS dpr WITH(NOLOCK) ON ins.EXM_EANO = dpr.EXM_EANO AND ins.EXM_CODI = dpr.EXM_CODI AND ins.DEC_CODI = dpr.EXM_COPE AND dpr.EXP_ORIG = 1				
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_SEGU = 2 AND ins.EXM_ANXB = 'A2' AND dpr.EXP_CHVE IS NULL		
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPais, @NomePais
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o país no detalhe de países da rota da declaração EXP-SAE			
			INSERT INTO PRO_EXPI(EXM_EANO, EXM_CODI, EXM_COPE, PAI_CODI, PAI_NOME, EXP_ORIG)
			VALUES(@AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPais, @NomePais, 1)			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @CodPais, @NomePais
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- obtem o país destino existente no detalhe de países da rota da declaração EXP-SAE cuja origem é do país destino mas que já não satisfazem as condições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpr.EXP_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXM_IDTY = del.EXM_IDTY
				INNER JOIN PRO_EXPI AS dpr WITH(NOLOCK) ON ins.EXM_EANO = dpr.EXM_EANO AND ins.EXM_CODI = dpr.EXM_CODI AND ins.DEC_CODI = dpr.EXM_COPE AND dpr.EXP_ORIG = 1							
				LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON ins.EXM_P17A = pai.PAI_CODI
			WHERE ins.EXM_CNTX = 1 AND ins.EXM_SEGU = 2 AND (ins.EXM_ANXB <> 'A2' OR pai.PAI_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- remove o país existente no detalhe de países da rota da declaração EXP-SAE
			DELETE FROM PRO_EXPI		
			WHERE EXP_CHVE = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_EXAD_EXPSAE') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_EXAD_EXPSAE
GO
CREATE TRIGGER TAIU_PRO_EXAD_EXPSAE ON PRO_EXAD WITH ENCRYPTION AFTER INSERT, UPDATE AS
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @DataAtual datetime, @IdRegisto bigint, @AnoDeclaracao int, @CodDeclaracao int, @CodOperadorDeclaracao varchar(6), @SomaAdicoes int, 
		@SomaValorAduaneiro numeric(38, 6), @IdUtilizador int
	DECLARE @IdAdicao int, @NumAdicao int, @MassaBrtAdicao numeric(38, 6)
	DECLARE @CodDocumento varchar(5), @NomeDocumento varchar(150), @NumeroDocumento varchar(70), @TipoDocumento tinyint, @IdDocumento int, @CodUnidMedida varchar(3), 
		@NomeUnidMedida varchar(35), @IdUnidMedida int, @IdUnidMedidaVolumes int, @Volumes int
	DECLARE @IdPedido int, @NumeroPedido varchar(512)
	DECLARE @Marca varchar(512), @CodTipoEmbalagem varchar(2), @NomeTipoEmbalagem varchar(35), @VolumesZero bit, @IdStrRegisto varchar(20)	
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- processa automatismos relacionados com a alteração do número de linha
	IF UPDATE(EXA_LINH)
	BEGIN
-- insere as marcas e volumes da 1ª adição configuradas como "Parte" nas adições > 1 caso ainda não existam
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, dam.EXM_MARN, dam.TEM_CODI, dam.TEM_NOME, dam.EXM_TVOL
			FROM inserted AS ins 
				INNER JOIN PRO_EXML AS dex WITH(NOLOCK) ON ins.EXM_EANO = dex.EXM_EANO AND ins.EXM_CODI = dex.EXM_CODI AND ins.EXM_COPE = dex.DEC_CODI
				INNER JOIN PRO_EXAD AS dad WITH(NOLOCK) ON ins.EXM_EANO = dad.EXM_EANO AND ins.EXM_CODI = dad.EXM_CODI AND ins.EXM_COPE = dad.EXM_COPE AND dad.EXA_LINH = 1
				INNER JOIN PRO_EXMV AS dam WITH(NOLOCK) ON dad.EXA_CHVE = dam.EXA_CHVE AND dam.EXM_PART = 1				
			WHERE dex.EXM_CNTX = 1 AND ins.EXA_LINH > 1
				AND NOT EXISTS(SELECT EXM_CHVE
								FROM PRO_EXMV WITH(NOLOCK)
								WHERE EXA_CHVE = ins.EXA_CHVE AND EXM_AUTO = 1)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @Marca, @CodTipoEmbalagem, @NomeTipoEmbalagem, @VolumesZero
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			SET @IdStrRegisto = REPLACE(LTRIM(STR(CAST(GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT() AS numeric(20, 10)) + (CAST(@IdAdicao AS numeric(20, 10)) / 10000000000), 20, 10)), '.', ',')
-- insere a marca e volume no detalhe de marcas e volumes da adição da declaração EXP-SAE
			INSERT INTO PRO_EXMV(EXA_CHVE, EXM_MARN, TEM_CODI, TEM_NOME, EXM_NVOL, EXM_PART, EXM_TVOL, EXM_IDST, EXM_AUTO, EXM_EANO, EXM_CODI, EXM_COPE)
			VALUES(@IdAdicao, @Marca, @CodTipoEmbalagem, @NomeTipoEmbalagem, 0, 0, @VolumesZero, @IdStrRegisto, 1, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao)	
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @Marca, @CodTipoEmbalagem, @NomeTipoEmbalagem, @VolumesZero
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
	END
-- processa automatismos relacionados com a alteração do número de linha quando o período transitório está ativo
	IF (UPDATE(EXA_LINH)) AND (EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE PDE_PTEX = 1))
	BEGIN
-- obtem o documento OEA associado ao exportador (cliente) das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, NULLIF(cli.CLI_NAOE, ''), ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON exm.CLI_COD2 = cli.CLI_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cli.DOC_CDOE = doc.DOC_CODI	
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 3									
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND cli.CLI_FXOE IN (0, 2) AND ISNULL(cli.CLI_NAOE, '') <> '' AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere/atualiza o documento OEA como "Referência Adicional" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
				VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, 0, 3, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 2, @NumAdicao)
			END
			ELSE
			BEGIN
				UPDATE PRO_EXDA SET
					DOC_CODI = @CodDocumento, 
					DOC_NOME = @NomeDocumento, 
					EXD_NREF = @NumeroDocumento			
				WHERE EXD_CHVE = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o documento OEA existente no detalhe de documentos da 1ª adição das declarações EXP-SAE cuja origem é do OEA exportador mas que já não satisfaz as condições ou não existe no OEA cliente exportador
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 3					
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON exm.CLI_COD2 = cli.CLI_CODI	
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cli.DOC_CDOE = doc.DOC_CODI					
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR cli.CLI_FXOE NOT IN (0, 2) OR ISNULL(cli.CLI_NAOE, '') = '' OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 
				OR doc.DOC_IDTY IS NULL) 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento OEA existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos associados ao exportador (cliente) das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, ddo.EXD_CHVE, 			
				ISNULL(NULLIF(cdo.CLD_NDOC, ''), (CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END))	
			FROM inserted AS ins 
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON exm.CLI_COD2 = cdo.CLI_CODI				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cdo.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND doc.DOC_CODI = ddo.DOC_CODI AND ddo.EXD_AUTO = 6				
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND cdo.CLD_UEXP = 1 AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4						
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @IdRegisto, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o documento como "Suporte" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
				VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, 0, 6, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 0, @NumAdicao)
			END
			ELSE
			BEGIN
				UPDATE PRO_EXDA SET					
					EXD_NREF = @NumeroDocumento			
				WHERE EXD_CHVE = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @IdRegisto, @NumeroDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
-- obtem os documentos existentes no detalhe de documentos da 1ª adição das declarações EXP-SAE cuja origem é do exportador mas que já não satisfazem as condições ou não existem no detalhe de documentos do cliente exportador
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 6		
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.DOC_CODI = doc.DOC_CODI	
				LEFT OUTER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON exm.CLI_COD2 = cdo.CLI_CODI AND doc.DOC_CODI = cdo.DOC_CODI				
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR cdo.CLD_UEXP = 0 OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR cdo.DOC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o documento OEA associado ao declarante das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, NULLIF(dcl.DEC_NAOE, ''), ddo.EXD_CHVE			
			FROM inserted AS ins 	
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CO14 = dcl.DEC_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON (CASE exm.EXM_TP14 WHEN 2 THEN dcl.DOC_CDOE ELSE dcl.DOC_CODI2 END) = doc.DOC_CODI	
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 4									
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND dcl.DEC_FXOE IN (0, 2) AND ISNULL(dcl.DEC_NAOE, '') <> '' AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4					
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere/atualiza o documento OEA como "Referência Adicional" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
				VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, 0, 4, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 2, @NumAdicao)
			END
			ELSE
			BEGIN
				UPDATE PRO_EXDA SET
					DOC_CODI = @CodDocumento, 
					DOC_NOME = @NomeDocumento, 
					EXD_NREF = @NumeroDocumento			
				WHERE EXD_CHVE = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o documento OEA existente no detalhe de documentos da 1ª adição das declaração EXP-SAE cuja origem é do OEA declarante mas que já não satisfaz as condições ou não existe no OEA declarante
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 4					
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CO14 = dcl.DEC_CODI
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON (CASE exm.EXM_TP14 WHEN 2 THEN dcl.DOC_CDOE ELSE dcl.DOC_CODI2 END) = doc.DOC_CODI					
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR dcl.DEC_FXOE NOT IN (0, 2) OR ISNULL(dcl.DEC_NAOE, '') = '' OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 
				OR doc.DOC_IDTY IS NULL) 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o documentos "N821" associado ao par regime/país destino das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, doc.DOC_DTRA			
			FROM inserted AS ins 	
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI							
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'N821'
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND doc.DOC_CODI = ddo.DOC_CODI AND ddo.EXD_AUTO = 7				
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND LEFT(exm.EXM_REGI, 2) IN ('10', '11', '21', '22', '23') AND exm.EXM_P17A IN ('NO', 'GB', 'CH', 'CY', 'IS', 'LI', 'MK', 'NO', 'RS', 'TR') 
				AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.EXD_CHVE IS NULL				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento "N821" como "Suporte"/"Transporte" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, /*EXD_NREF, */EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
			VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, /*@NumeroDocumento, */0, 0, 7, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @TipoDocumento, @NumAdicao)					
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos "N821" existentes no detalhe de documentos da 1ª adição das declaração EXP-SAE cuja origem é do par regime/país destino mas que já não satisfazem as condições
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 7							
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'N821' AND ddo.DOC_CODI = doc.DOC_CODI
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR LEFT(exm.EXM_REGI, 2) NOT IN ('10', '11', '21', '22', '23') OR exm.EXM_P17A NOT IN ('NO', 'GB', 'CH', 'CY', 'IS', 'LI', 'MK', 'NO', 'RS', 'TR') 
				OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_IDTY IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento "N821" existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos associados ao tipo de declaração das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, 		 
				(CASE 					
					WHEN doc.DOC_TDNU = 1 THEN 'S/N' 
					WHEN doc.DOC_TDNU = 2 THEN 'N/A' 
					WHEN doc.DOC_TDNU = 3 THEN 'DEC' 
					ELSE NULL 
				END)
			FROM inserted AS ins 				
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN TAB_TDED AS tdd WITH(NOLOCK) ON exm.TDE_COD1 = tdd.TDE_CODI	
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON tdd.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND doc.DOC_CODI = ddo.DOC_CODI AND ddo.EXD_AUTO = 8					
			WHERE exm.EXM_CNTX = 1 AND exm.EXM_ASAI = 0 AND ins.EXA_LINH = 1 AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.EXD_CHVE IS NULL 				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento como "Suporte" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
			VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, 0, 8, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 0, @NumAdicao)				
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos existentes no detalhe de documentos da 1ª adição das declaração EXP-SAE cuja origem é do tipo declaração mas que já não satisfazem as condições ou não existem no detalhe de documentos do tipo de declaração
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 8	
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.DOC_CODI = doc.DOC_CODI	
				LEFT OUTER JOIN TAB_TDED AS tdd WITH(NOLOCK) ON exm.TDE_COD1 = tdd.TDE_CODI AND doc.DOC_CODI = tdd.DOC_CODI				
			WHERE exm.EXM_CNTX = 1 AND exm.EXM_ASAI = 0 AND (ins.EXA_LINH <> 1 OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR tdd.DOC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos associados à estância de exportação das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, doc.DOC_DTRA, 
				(CASE 
					WHEN doc.DOC_CODI IN ('N704', 'N705', 'N740', 'N821', 'N830') THEN NULLIF(ins.EXM_CPRT, '')
					WHEN doc.DOC_CODI = '9X01' THEN 'Nao aplicavel DL 68/2007'
					WHEN doc.DOC_TDNU = 1 THEN 'S/N' 
					WHEN doc.DOC_TDNU = 2 THEN 'N/A' 
					WHEN doc.DOC_TDNU = 3 THEN 'DEC' 
					ELSE NULL 
				END)
			FROM inserted AS ins 				
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN TAB_EADD AS ead WITH(NOLOCK) ON exm.EAD_CODA = ead.EAD_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ead.DOC_CODI = doc.DOC_CODI				
				LEFT OUTER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND doc.DOC_CODI = ddo.DOC_CODI AND ddo.EXD_AUTO = 9
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND doc.DOC_EXPT = 1 AND LEN(doc.DOC_CODI) = 4 AND ddo.EXD_CHVE IS NULL 				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento como "Suporte"/"Transporte" no detalhe de documentos da 1ª adição da declaração EXP-SAE
			INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
			VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, 0, 9, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @TipoDocumento, @NumAdicao)	
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @TipoDocumento, @NumeroDocumento
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
-- obtem os documentos existentes no detalhe de documentos da 1ª adição das declaração EXP-SAE cuja origem é da estância de exportação mas que já não satisfazem as condições ou não existem no detalhe de documentos da estância de exportação
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ddo.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN PRO_EXDA AS ddo WITH(NOLOCK) ON ins.EXA_CHVE = ddo.EXA_CHVE AND ddo.EXD_AUTO = 9			
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.DOC_CODI = doc.DOC_CODI	
				LEFT OUTER JOIN TAB_EADD AS ead WITH(NOLOCK) ON exm.EAD_CODA = ead.EAD_CODI AND doc.DOC_CODI = ead.DOC_CODI				
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR doc.DOC_EXPT = 0 OR LEN(doc.DOC_CODI) <> 4 OR ead.DOC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento existente no detalhe de documentos da 1ª adição da declaração EXP-SAE
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos "NMRN" e "NCLE" associados ao tipo declaração adicional das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXA_LINH, ISNULL(ins.EXA_MBRT, 0), doc.DOC_IDTY, ume.UME_IDTY , uti.UTI_IDTY
			FROM inserted AS ins 		
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE 																				
																				WHEN exm.EXM_TPRO IN ('X', 'Y') THEN 'NMRN'																				
																				WHEN exm.EXM_TPRO = 'Z' THEN 'NCLE'
																				ELSE NULL 
																			END)
				LEFT OUTER JOIN tb_EXP_DeclaracoesAdicoesPrecedentes AS dpr WITH(NOLOCK) ON ins.EXA_CHVE = dpr.id_adicao AND doc.DOC_IDTY = dpr.id_documento AND dpr.origem = 1						
				LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON ume.UME_CODI = 'KGM' AND ume.UME_EXPT = 1
			WHERE exm.EXM_CNTX = 1 AND exm.EXM_TPRO IN ('X', 'Y', 'Z') AND ins.EXA_LINH = 1 AND doc.DOC_CA40 = 1 AND LEN(doc.DOC_CODI) = 4 AND doc.DOC_EXPT = 1 AND dpr.id IS NULL
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumAdicao, @MassaBrtAdicao, @IdDocumento, @IdUnidMedida, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			SET @IdUnidMedidaVolumes = NULL
			SET @Volumes = NULL
-- obtem dados dos volumes da adição
			SELECT TOP 1 @Volumes = NULLIF(dam.EXM_NVOL, 0), @IdUnidMedidaVolumes = ume.UME_IDTY
			FROM PRO_EXMV AS dam WITH(NOLOCK)
				LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON dam.TEM_CODI = ume.UME_CODI
			WHERE dam.EXA_CHVE = @IdAdicao
			ORDER BY dam.EXM_CHVE
-- insere o documento "NMRN" ou "NCLE" no detalhe de precedentes da 1ª adição da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesAdicoesPrecedentes(id_adicao, id_documento, numero, numeroAdicao, id_unidadeMedidaVolumes, volumes, id_unidadeMedidaQualificador, 
				quantidade, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdDocumento, '*****N/A*****', @NumAdicao, @IdUnidMedidaVolumes, @Volumes, @IdUnidMedida, 
				@MassaBrtAdicao, 1, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @NumAdicao, @MassaBrtAdicao, @IdDocumento, @IdUnidMedida, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos "NMRN" e "NCLE" existentes no detalhe de precedentes da 1ª adição das declaração EXP-SAE cuja origem é do tipo declaração adicional mas que já não satisfazem as condições
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpr.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL			
				INNER JOIN tb_EXP_DeclaracoesAdicoesPrecedentes AS dpr WITH(NOLOCK) ON ins.EXA_CHVE = dpr.id_adicao AND dpr.origem = 1							
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY AND doc.DOC_CODI = (CASE 																				
																														WHEN exm.EXM_TPRO IN ('X', 'Y') THEN 'NMRN'																				
																														WHEN exm.EXM_TPRO = 'Z' THEN 'NCLE'
																														ELSE NULL 
																													END)	
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR doc.DOC_CA40 = 0 OR LEN(doc.DOC_CODI) <> 4 OR doc.DOC_EXPT = 0 OR doc.DOC_IDTY IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- atualiza o documento "NMRN" ou "NCLE" existente no detalhe de precedentes da 1ª adição da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAdicoesPrecedentes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o documento "NMRN" ou "NCLE" existente no detalhe de precedentes da 1ª adição da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAdicoesPrecedentes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes		
-- obtem o pedido "G1PRO" associado ao estatuto das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, uti.UTI_IDTY, ped.TXM_IDTY, NULLIF(cli.CLI_NDHA, ''), dpe.id
			FROM inserted AS ins 		
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL	
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON exm.CLI_COD2 = cli.CLI_CODI
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = 'G1PRO'
				LEFT OUTER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 1				
			WHERE exm.EXM_CNTX = 1 AND ISNULL(exm.EXM_TP14, 0) = 2 AND ins.EXA_LINH = 1			
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere/atualiza o pedido "G1PRO" no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			IF @IdRegisto IS NULL
			BEGIN				
				INSERT INTO tb_EXP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 1, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_EXP_DeclaracoesAdicoesPedidos SET
					id_pedido = @IdPedido, 
					numero = @NumeroPedido, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido, @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes				
-- obtem o pedido "G1PRO" existente no detalhe de pedidos da 1ª adição das declaração EXP-SAE cuja origem é do estatuto mas que já não satisfaz a condição
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpe.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL		
				INNER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 1									
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.id_pedido = ped.TXM_IDTY				
			WHERE exm.EXM_CNTX = 1 AND (ISNULL(exm.EXM_TP14, 0) <> 2 OR ins.EXA_LINH <> 1 OR ped.TXM_IDTY IS NULL) 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- atualiza o pedido "G1PRO" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o pedido "G1PRO" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
-- obtem os pedidos associados ao tipo declaração das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, uti.UTI_IDTY, ped.TXM_IDTY, SUBSTRING(tdp.TDP_TEXT, 1, 512)			
			FROM inserted AS ins 	
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL				
				INNER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON exm.TDE_COD1 = tdp.TDE_CODI
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON tdp.TXM_CODI = ped.TXM_CODI
				LEFT OUTER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 2				
			WHERE exm.EXM_CNTX = 1 AND exm.EXM_ASAI = 0 AND ins.EXA_LINH = 1 AND dpe.id IS NULL	
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o pedido no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 2, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes				
-- obtem os pedidos existentes no detalhe de pedidos da 1ª adição das declaração EXP-SAE cuja origem é do tipo declaração mas que já não existem no detalhe de pedidos do tipo declaração
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpe.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 2	
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.id_pedido = ped.TXM_IDTY
				LEFT OUTER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON exm.TDE_COD1 = tdp.TDE_CODI AND ped.TXM_CODI = tdp.TXM_CODI
			WHERE exm.EXM_CNTX = 1 AND exm.EXM_ASAI = 0 AND (ins.EXA_LINH <> 1 OR tdp.TXM_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- atualiza o pedido existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o pedido existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
-- obtem o pedido "00100" associado à estância de aperfeiçoamento das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, uti.UTI_IDTY, ped.TXM_IDTY, SUBSTRING(ped.TXM_TEXT, 1, 512)
			FROM inserted AS ins 				
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL					
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = '00100'
				LEFT OUTER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 3				
			WHERE exm.EXM_CNTX = 1 AND ISNULL(exm.EAD_CODI1, '') <> '' AND ins.EXA_LINH = 1 AND dpe.id IS NULL		
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o pedido "00100" no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 3, @IdUtilizador, @DataAtual)				
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes				
-- obtem o pedido "00100" existente no detalhe de pedidos da 1ª adição das declaração EXP-SAE cuja origem é da estância de aperfeiçoamento mas que já não satisfaz a condição
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpe.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 3							
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.id_pedido = ped.TXM_IDTY
			WHERE exm.EXM_CNTX = 1 AND (ISNULL(exm.EAD_CODI1, '') = '' OR ins.EXA_LINH <> 1 OR ped.TXM_IDTY IS NULL) 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- atualiza o pedido "00100" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o pedido "00100" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o pedido "E0CCE" associado aos certificados das 1ªs adições inseridas/alteradas pertencentes a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, uti.UTI_IDTY, ped.TXM_IDTY, SUBSTRING(ped.TXM_TEXT, 1, 512)
			FROM inserted AS ins 				
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL					
				INNER JOIN PRO_EXCE AS cce WITH(NOLOCK) ON exm.EXM_EANO = cce.EXM_EANO AND exm.EXM_CODI = cce.EXM_CODI AND exm.DEC_CODI = cce.EXM_COPE AND cce.EXC_LINH = 1
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = 'E0CCE'
				LEFT OUTER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 4
			WHERE exm.EXM_CNTX = 1 AND ins.EXA_LINH = 1 AND cce.EXC_CHVE IS NOT NULL AND dpe.id IS NULL				
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o pedido "E0CCE" no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdAdicao, @IdPedido, @NumeroPedido, 4, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @IdUtilizador, @IdPedido, @NumeroPedido
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem o pedido "E0CCE" existente no detalhe de pedidos da 1ª adição das declaração EXP-SAE cuja origem é de certificados mas que já não satisfaz a condição
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dpe.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON ins.EXM_EANO = exm.EXM_EANO AND ins.EXM_CODI = exm.EXM_CODI AND ins.EXM_COPE = exm.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(exm.EXM_UALT, exm.EXM_UCRI) = uti.UTI_UTIL
				INNER JOIN tb_EXP_DeclaracoesAdicoesPedidos AS dpe WITH(NOLOCK) ON ins.EXA_CHVE = dpe.id_adicao AND dpe.origem = 4					
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpe.id_pedido = ped.TXM_IDTY
				LEFT OUTER JOIN PRO_EXCE AS cce WITH(NOLOCK) ON exm.EXM_EANO = cce.EXM_EANO AND exm.EXM_CODI = cce.EXM_CODI AND exm.DEC_CODI = cce.EXM_COPE AND cce.EXC_LINH = 1
			WHERE exm.EXM_CNTX = 1 AND (ins.EXA_LINH <> 1 OR cce.EXC_CHVE IS NULL OR ped.TXM_IDTY IS NULL) 			
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN			
-- atualiza o pedido "E0CCE" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			UPDATE tb_EXP_DeclaracoesAdicoesPedidos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
-- remove o pedido "E0CCE" existente no detalhe de pedidos da 1ª adição da declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAdicoesPedidos		
			WHERE id = @IdRegisto			
			FETCH NEXT FROM Adicoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes			
	END
-- processa automatismos relacionados com a alteração do artigo
	IF UPDATE(APA_CO33)
	BEGIN
-- obtem os documentos associados ao artigo das adições inseridas/alteradas associadas a declarações EXP-SAE
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXA_CHVE, ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE, ins.EXA_LINH, doc.DOC_CODI, doc.DOC_NOME, ume.UME_CODI, ume.UME_NOME, 
				(CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END), 
				(CASE LEFT(doc.DOC_CODI, 1) WHEN 'X' THEN 0 ELSE 2 END),
				(CASE LEFT(doc.DOC_CODI, 1) WHEN 'X' THEN ISNULL(ins.EXA_MBRT, 0) ELSE 0 END)
			FROM inserted AS ins 
				INNER JOIN PRO_EXML AS dex WITH(NOLOCK) ON ins.EXM_EANO = dex.EXM_EANO AND ins.EXM_CODI = dex.EXM_CODI AND ins.EXM_COPE = dex.DEC_CODI
				INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON dex.TDE_COD1 = tde.TDE_CODI
				INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON ins.APA_CO33 = apa.APA_CODI				
				INNER JOIN TAB_ADOC AS ado WITH(NOLOCK) ON apa.APA_CHVE = ado.APA_CHVE
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN PRO_EXDA AS dad WITH(NOLOCK) ON ins.EXA_CHVE = dad.EXA_CHVE AND doc.DOC_CODI = dad.DOC_CODI AND dad.EXD_AUTO = 5					
				LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON ume.UME_CODI = 'KGM' AND LEFT(doc.DOC_CODI, 1) = 'X'
			WHERE dex.EXM_CNTX = 1 AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(doc.DOC_CODI, 1) = 'X') AND ado.ADC_UEXP = 1 AND doc.DOC_DTRA = 0 AND doc.DOC_EXPT = 1 AND doc.DOC_AUTZ = 0 
				AND LEN(doc.DOC_CODI) = 4 AND dad.EXD_CHVE IS NULL 
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @CodUnidMedida, @NomeUnidMedida, 
			@NumeroDocumento, @TipoDocumento, @MassaBrtAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- insere o documento como "Documento de Suporte" ou "Referência Adicional" no detalhe de documentos da adição da declaração EXP-SAE 
			INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_MONT, EXD_QNTD, EXD_AUTO, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, UME_CODI, UME_NOME)
			VALUES(@IdAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, 0, @MassaBrtAdicao, 5, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @TipoDocumento, @CodUnidMedida, @NomeUnidMedida)		
			FETCH NEXT FROM Adicoes INTO @IdAdicao, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @CodUnidMedida, @NomeUnidMedida, 
				@NumeroDocumento, @TipoDocumento, @MassaBrtAdicao
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes
-- obtem os documentos existentes no detalhe de documentos das adições das declarações EXP-SAE cuja origem é do artigo mas que já não satisfazem as condições ou não existem no detalhe de documentos do artigo
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.EXD_CHVE
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.EXA_CHVE = del.EXA_CHVE
				INNER JOIN PRO_EXML AS dex WITH(NOLOCK) ON ins.EXM_EANO = dex.EXM_EANO AND ins.EXM_CODI = dex.EXM_CODI AND ins.EXM_COPE = dex.DEC_CODI
				INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON dex.TDE_COD1 = tde.TDE_CODI
				INNER JOIN PRO_EXDA AS dad WITH(NOLOCK) ON ins.EXA_CHVE = dad.EXA_CHVE AND dad.EXD_AUTO = 5		
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI
				INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON ins.APA_CO33 = apa.APA_CODI	
				LEFT OUTER JOIN TAB_ADOC AS ado WITH(NOLOCK) ON apa.APA_CHVE = ado.APA_CHVE AND doc.DOC_CODI = ado.DOC_CODI				
			WHERE dex.EXM_CNTX = 1 AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(doc.DOC_CODI, 1) = 'X')
				AND (ado.ADC_UEXP = 0 OR doc.DOC_DTRA = 1 OR doc.DOC_EXPT = 0 OR doc.DOC_AUTZ = 1 OR LEN(doc.DOC_CODI) <> 4 OR ado.ADC_CODI IS NULL)
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove o documento existente no detalhe de documentos da adição da declaração EXP-SAE 
			DELETE FROM PRO_EXDA		
			WHERE EXD_CHVE = @IdRegisto
			FETCH NEXT FROM Adicoes INTO @IdRegisto
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	
	END
-- processa automatismos relacionados com a alteração do montante
	IF (ISNULL(CONTEXT_INFO(), 0x0) <> 0x44495341424C4544) AND (UPDATE(EXA_VALO)) --"DISABLED" em binário
	BEGIN
-- obtem as declarações associadas às adições inseridas/editadas
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE
			FROM inserted AS ins
				INNER JOIN PRO_EXML AS dex WITH(NOLOCK) ON ins.EXM_EANO = dex.EXM_EANO AND ins.EXM_CODI = dex.EXM_CODI AND ins.EXM_COPE = dex.DEC_CODI				
			WHERE dex.EXM_CNTX = 1
			GROUP BY ins.EXM_EANO, ins.EXM_CODI, ins.EXM_COPE
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao 
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- calcula a soma do número de adições e do montante de todas as adições da declaração EXP-SAE
			SELECT @SomaAdicoes = COUNT(*), @SomaValorAduaneiro = SUM(ISNULL(EXA_VALO, 0))
			FROM PRO_EXAD WITH(NOLOCK)
			WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND EXM_COPE = @CodOperadorDeclaracao
-- atualiza total de adições e valor aduaneiro total na declaração EXP-SAE
			UPDATE PRO_EXML SET 
				EXM_TAD5 = @SomaAdicoes, 
				EXM_VATT = @SomaValorAduaneiro
			WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @CodDeclaracao AND DEC_CODI = @CodOperadorDeclaracao
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes	 		
	END
END
GO
UPDATE TAB_PAPL SET PAP_VERS = '17.4'
GO
