ALTER TABLE tb_EXP_DeclaracoesProdutosTransformados ADD
	id_meioIdentificacao int NULL
GO
UPDATE tb_EXP_DeclaracoesProdutosTransformados SET id_meioIdentificacao = ISNULL((SELECT TOP 1 MIA_IDTY FROM TAB_MIAU WITH(NOLOCK) WHERE MIA_CODI = CAST(tb_EXP_DeclaracoesProdutosTransformados.medida AS varchar(2))), (SELECT TOP 1 MIA_IDTY FROM TAB_MIAU WITH(NOLOCK)))
GO
ALTER TABLE tb_EXP_DeclaracoesProdutosTransformados ALTER COLUMN
	id_meioIdentificacao int NOT NULL
GO
CREATE NONCLUSTERED INDEX IX_tb_EXP_DeclaracoesProdutosTransformados_id_meioIdentificacao ON tb_EXP_DeclaracoesProdutosTransformados(id_meioIdentificacao) ON [PRIMARY]
GO
ALTER TABLE tb_EXP_DeclaracoesProdutosTransformados ADD CONSTRAINT FK_tb_EXP_DeclaracoesProdutosTransformados_TAB_MIAU FOREIGN KEY(id_meioIdentificacao) REFERENCES TAB_MIAU(MIA_IDTY) ON UPDATE NO ACTION ON DELETE NO ACTION 
GO
ALTER TABLE tb_EXP_DeclaracoesProdutosTransformados DROP COLUMN 
	medida
GO
UPDATE tb_declaracoesDAR SET caucao = (SELECT TOP 1 (RIGHT(CAU_EANO, 2) + CAU_ALFA + REPLICATE('0', (7 - LEN(CAU_NUME))) + CAU_NUME) FROM vw_TBL_Caucoes WHERE CAU_CAUC = tb_declaracoesDAR.caucao)
WHERE ano = 2025 AND status < 3 AND caucao <> '' AND autorizacaoSaida = 0 AND EXISTS(SELECT 1 FROM vw_TBL_Caucoes WHERE CAU_CAUC = tb_declaracoesDAR.caucao)
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'vw_EXP_Declaracoes_ReportProdutosTransformados') AND type = 'V') 	
	DROP VIEW vw_EXP_Declaracoes_ReportProdutosTransformados
GO
CREATE VIEW vw_EXP_Declaracoes_ReportProdutosTransformados WITH ENCRYPTION AS
	SELECT dpt.id, dpt.id_declaracaoEXP, dpt.codigoPautal, dpt.designacao, mid.MIA_CODI, dpt.descricao, dpt.taxaRendimento
	FROM tb_EXP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK) 
		INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dpt.id_meioIdentificacao = mid.MIA_IDTY
GO
GRANT SELECT ON vw_EXP_Declaracoes_ReportProdutosTransformados TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'vw_TBL_Caucoes') AND type = 'V') 	
	DROP VIEW vw_TBL_Caucoes
GO
CREATE VIEW vw_TBL_Caucoes WITH ENCRYPTION AS		
	SELECT 0 AS CAU_TIPO, DEC_IDTY AS CAU_ENTI, DEC_CODI AS CAU_ENTC, 1 AS CAU_IDTY, (ISNULL(RIGHT(DEC_ACA1, 2), '') + ISNULL(ALF_CODI1, '') + REPLICATE('0', (7 - LEN(DEC_NCA1))) + DEC_NCA1) AS CAU_CAUC, 
		DEC_INA1 AS CAU_INAC, DEC_ACA1 AS CAU_EANO, DEC_NCA1 AS CAU_NUME, DEC_TCA1 AS CAU_TIPC, ALF_CODI1 AS CAU_ALFA, DEC_CCA1 AS CAU_CACE, DEC_OCA1 AS CAU_OREF
	FROM TAB_DECL WITH(NOLOCK)
	WHERE ISNULL(DEC_NCA1, '') <> ''
	UNION
	SELECT 0 AS CAU_TIPO, DEC_IDTY AS CAU_ENTI, DEC_CODI AS CAU_ENTC, 2 AS CAU_IDTY, (ISNULL(RIGHT(DEC_ACA2, 2), '') + ISNULL(ALF_CODI2, '') + REPLICATE('0', (7 - LEN(DEC_NCA2))) + DEC_NCA2) AS CAU_CAUC, 
		DEC_INA2 AS CAU_INAC, DEC_ACA2 AS CAU_EANO, DEC_NCA2 AS CAU_NUME, DEC_TCA2 AS CAU_TIPC, ALF_CODI2 AS CAU_ALFA, DEC_CCA2 AS CAU_CACE, DEC_OCA2 AS CAU_OREF
	FROM TAB_DECL WITH(NOLOCK)
	WHERE ISNULL(DEC_NCA2, '') <> ''
	UNION
	SELECT 0 AS CAU_TIPO, DEC_IDTY AS CAU_ENTI, DEC_CODI AS CAU_ENTC, 3 AS CAU_IDTY, (ISNULL(RIGHT(DEC_ACA3, 2), '') + ISNULL(ALF_CODI3, '') + REPLICATE('0', (7 - LEN(DEC_NCA3))) + DEC_NCA3) AS CAU_CAUC, 
		DEC_INA3 AS CAU_INAC, DEC_ACA3 AS CAU_EANO, DEC_NCA3 AS CAU_NUME, DEC_TCA3 AS CAU_TIPC, ALF_CODI3 AS CAU_ALFA, DEC_CCA3 AS CAU_CACE, DEC_OCA3 AS CAU_OREF
	FROM TAB_DECL WITH(NOLOCK)
	WHERE ISNULL(DEC_NCA3, '') <> ''
	UNION
	SELECT 0 AS CAU_TIPO, DEC_IDTY AS CAU_ENTI, DEC_CODI AS CAU_ENTC, 4 AS CAU_IDTY, (ISNULL(RIGHT(DEC_ACA4, 2), '') + ISNULL(ALF_CODI4, '') + REPLICATE('0', (7 - LEN(DEC_NCA4))) + DEC_NCA4) AS CAU_CAUC, 
		DEC_INA4 AS CAU_INAC, DEC_ACA4 AS CAU_EANO, DEC_NCA4 AS CAU_NUME, DEC_TCA4 AS CAU_TIPC, ALF_CODI4 AS CAU_ALFA, DEC_CCA4 AS CAU_CACE, DEC_OCA4 AS CAU_OREF
	FROM TAB_DECL WITH(NOLOCK)
	WHERE ISNULL(DEC_NCA4, '') <> ''
	UNION
	SELECT 0 AS CAU_TIPO, DEC_IDTY AS CAU_ENTI, DEC_CODI AS CAU_ENTC, 5 AS CAU_IDTY, (ISNULL(RIGHT(DEC_ACA5, 2), '') + ISNULL(ALF_CODI5, '') + REPLICATE('0', (7 - LEN(DEC_NCA5))) + DEC_NCA5) AS CAU_CAUC, 
		DEC_INA5 AS CAU_INAC, DEC_ACA5 AS CAU_EANO, DEC_NCA5 AS CAU_NUME, DEC_TCA5 AS CAU_TIPC, ALF_CODI5 AS CAU_ALFA, DEC_CCA5 AS CAU_CACE, DEC_OCA5 AS CAU_OREF
	FROM TAB_DECL WITH(NOLOCK)
	WHERE ISNULL(DEC_NCA5, '') <> ''
	UNION
	SELECT 1 AS CAU_TIPO, CLI_IDTY AS CAU_ENTI, CLI_CODI AS CAU_ENTC, 1 AS CAU_IDTY, (ISNULL(RIGHT(CLI_ANO1, 2), '') + ISNULL(ALF_CODI1, '') + REPLICATE('0', (7 - LEN(CLI_NCA1))) + CLI_NCA1) AS CAU_CAUC, 
		CLI_INA1 AS CAU_INAC, CLI_ANO1 AS CAU_EANO, CLI_NCA1 AS CAU_NUME, CLI_TCA1 AS CAU_TIPC, ALF_CODI1 AS CAU_ALFA, CLI_CCA1 AS CAU_CACE, CLI_OCA1 AS CAU_OREF
	FROM TAB_CLIE WITH(NOLOCK)
	WHERE ISNULL(CLI_NCA1, '') <> ''
	UNION
	SELECT 1 AS CAU_TIPO, CLI_IDTY AS CAU_ENTI, CLI_CODI AS CAU_ENTC, 2 AS CAU_IDTY, (ISNULL(RIGHT(CLI_ANO2, 2), '') + ISNULL(ALF_CODI2, '') + REPLICATE('0', (7 - LEN(CLI_NCA2))) + CLI_NCA2) AS CAU_CAUC, 
		CLI_INA2 AS CAU_INAC, CLI_ANO2 AS CAU_EANO, CLI_NCA2 AS CAU_NUME, CLI_TCA2 AS CAU_TIPC, ALF_CODI2 AS CAU_ALFA, CLI_CCA2 AS CAU_CACE, CLI_OCA2 AS CAU_OREF
	FROM TAB_CLIE WITH(NOLOCK)
	WHERE ISNULL(CLI_NCA2, '') <> ''
	UNION
	SELECT 1 AS CAU_TIPO, CLI_IDTY AS CAU_ENTI, CLI_CODI AS CAU_ENTC, 3 AS CAU_IDTY, (ISNULL(RIGHT(CLI_ANO3, 2), '') + ISNULL(ALF_CODI3, '') + REPLICATE('0', (7 - LEN(CLI_NCA3))) + CLI_NCA3) AS CAU_CAUC, 
		CLI_INA3 AS CAU_INAC, CLI_ANO3 AS CAU_EANO, CLI_NCA3 AS CAU_NUME, CLI_TCA3 AS CAU_TIPC, ALF_CODI3 AS CAU_ALFA, CLI_CCA3 AS CAU_CACE, CLI_OCA3 AS CAU_OREF
	FROM TAB_CLIE WITH(NOLOCK)
	WHERE ISNULL(CLI_NCA3, '') <> ''
	UNION
	SELECT 1 AS CAU_TIPO, CLI_IDTY AS CAU_ENTI, CLI_CODI AS CAU_ENTC, 4 AS CAU_IDTY, (ISNULL(RIGHT(CLI_ANO4, 2), '') + ISNULL(ALF_CODI4, '') + REPLICATE('0', (7 - LEN(CLI_NCA4))) + CLI_NCA4) AS CAU_CAUC, 
		CLI_INA4 AS CAU_INAC, CLI_ANO4 AS CAU_EANO, CLI_NCA4 AS CAU_NUME, CLI_TCA4 AS CAU_TIPC, ALF_CODI4 AS CAU_ALFA, CLI_CCA4 AS CAU_CACE, CLI_OCA4 AS CAU_OREF
	FROM TAB_CLIE WITH(NOLOCK)
	WHERE ISNULL(CLI_NCA4, '') <> ''
	UNION
	SELECT 1 AS CAU_TIPO, CLI_IDTY AS CAU_ENTI, CLI_CODI AS CAU_ENTC, 5 AS CAU_IDTY, (ISNULL(RIGHT(CLI_ANO5, 2), '') + ISNULL(ALF_CODI5, '') + REPLICATE('0', (7 - LEN(CLI_NCA5))) + CLI_NCA5) AS CAU_CAUC, 
		CLI_INA5 AS CAU_INAC, CLI_ANO5 AS CAU_EANO, CLI_NCA5 AS CAU_NUME, CLI_TCA5 AS CAU_TIPC, ALF_CODI5 AS CAU_ALFA, CLI_CCA5 AS CAU_CACE, CLI_OCA5 AS CAU_OREF
	FROM TAB_CLIE WITH(NOLOCK)
	WHERE ISNULL(CLI_NCA5, '') <> ''
GO
GRANT SELECT ON vw_TBL_Caucoes 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(duc.DUC_CNIR, '') AS "identificationNumber" 
			HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_CNIR, '') <> ''
			FOR XML PATH('PersonPayingCustomsDuty'), 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, '') <> '' AND ISNULL(duc.DUC_CCAC, '') = ''
			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", 
						CAST(NULLIF(D31_QNTD, 0) AS int) 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(ISNULL(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(duc.DUC_CNIR, '') AS "identificationNumber" 
			HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_CNIR, '') <> ''
			FOR XML PATH('PersonPayingCustomsDuty'), 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, '') <> '' AND ISNULL(duc.DUC_CCAC, '') = ''
			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", 
						CAST(NULLIF(D31_QNTD, 0) AS int) 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(ISNULL(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 
					NULLIF(duc.DUC_CNIR, '') AS "identificationNumber" 
				HAVING duc.DUC_ANXB IN ('H1', 'H3', 'H5', 'H6', 'I1') AND ISNULL(duc.DUC_CNIR, '') <> ''
				FOR XML PATH('PersonPayingCustomsDuty'), 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, '') <> '' AND ISNULL(duc.DUC_CCAC, '') = ''
				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", 
							CAST(NULLIF(D31_QNTD, 0) AS int) 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(ISNULL(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_ExportacaoXML_GeraDeclaracoesDeXML') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE SP_ExportacaoXML_GeraDeclaracoesDeXML
GO
DROP XML SCHEMA COLLECTION XMLSC_DeclaracoesExpToGIDWin
GO
CREATE XML SCHEMA COLLECTION XMLSC_DeclaracoesExpToGIDWin AS N'<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.02">
	<xs:element name="DeclaracoesExpToGIDWin">
		<xs:annotation>
			<xs:documentation>Estrutura de dados para integração de Declarações de Exportação XML no GIDWin</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Declaracao" minOccurs="0" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Declaracao">
		<xs:annotation>
			<xs:documentation>Estrutura de dados gerais da declaração</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="TipoProcedimento"/>
				<xs:element ref="CodNatureza"/>
				<xs:element ref="CodOperador"/>
				<xs:element ref="Data"/>
				<xs:element ref="VossaReferencia" minOccurs="0"/>
				<xs:element ref="CodEstanciaA"/>
				<xs:element ref="CodStatusIncidencia" minOccurs="0"/>
				<xs:element ref="CodTipoDeclaracao"/>
				<xs:element ref="NumeroCPA" minOccurs="0"/>
				<xs:element ref="TipoCarga" minOccurs="0"/>
				<xs:element ref="DataVoo" minOccurs="0"/>
				<xs:element ref="Expedidor"/>
				<xs:element ref="CodClienteServico" minOccurs="0"/>
				<xs:element ref="NumeroComercialRef" minOccurs="0"/>
				<xs:element ref="Destinatario"/>
				<xs:element ref="CodPais15A" minOccurs="0"/>
				<xs:element ref="CodPais17A" minOccurs="0"/>
				<xs:element ref="ICE" minOccurs="0"/>
				<xs:element ref="MeioTransportePartida" minOccurs="0"/>
				<xs:element ref="MeioTransporteFronteira" minOccurs="0"/>
				<xs:element ref="CodEstanciaTAC"/>
				<xs:element ref="CodEstanciaTN" minOccurs="0"/>
				<xs:element ref="LocalizacaoMercadorias" minOccurs="0"/>
				<xs:element ref="CodLocalEmbarque" minOccurs="0"/>
				<xs:element ref="CodCondEntrega" minOccurs="0"/>
				<xs:element ref="Lugar" minOccurs="0"/>
				<xs:element ref="CodNaturezaTransacao" minOccurs="0"/>
				<xs:element ref="CodPais"/>
				<xs:element ref="TotalFrete"/>
				<xs:element ref="TotalSeguro"/>
				<xs:element ref="HVLV" minOccurs="0"/>
				<xs:element ref="Origem" minOccurs="0"/>
				<xs:element ref="Anotacoes" minOccurs="0"/>
				<xs:element ref="CamposExtra" minOccurs="0"/>
				<xs:element ref="DadosManifesto" minOccurs="0"/>
				<xs:element ref="Contentores" minOccurs="0"/>
				<xs:element ref="Adicoes"/>
				<xs:element ref="Arquivos" minOccurs="0"/>
			</xs:sequence>
			<xs:attribute ref="Acao" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:attribute name="Acao">
		<xs:annotation>
			<xs:documentation>Ação a realizar na declaração (I: Insert; U: Update)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:length value="1"/>
				<xs:enumeration value="I"/>
				<xs:enumeration value="U"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:attribute>
	<xs:element name="TipoProcedimento" nillable="false">
		<xs:annotation>
			<xs:documentation>Tipo de procedimento (A: Declaração Completa; B: Declaração Incompleta; C: Declaração Simplificada; D: Declaração Completa sem apres. mercadoria; E: Declaração Incompleta sem apres. mercadoria; F: Declaração Simplificada sem apres. mercadoria; X: Declaração Complementar (código B); Y: Declaração Complementar (código C); Z: Dec. Complementar nº 1, alínea c, artº 76 do CAC)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:length value="1"/>
				<xs:enumeration value="A"/>
				<xs:enumeration value="B"/>
				<xs:enumeration value="C"/>
				<xs:enumeration value="D"/>
				<xs:enumeration value="E"/>
				<xs:enumeration value="F"/>
				<xs:enumeration value="X"/>
				<xs:enumeration value="Y"/>
				<xs:enumeration value="Z"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodNatureza" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da natureza</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="3"/>
				<xs:minLength value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodOperador" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do operador</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="6"/>
				<xs:minLength value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Data" type="xs:date" nillable="false">
		<xs:annotation>
			<xs:documentation>Data da declaração</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="VossaReferencia" nillable="true">
		<xs:annotation>
			<xs:documentation>Número de v/ referência</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodEstanciaA" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da estância aduaneira (A)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="8"/>
				<xs:minLength value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodStatusIncidencia" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do status de incidência</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="4"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodTipoDeclaracao" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do tipo de declaração</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="4"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NumeroCPA" nillable="true">
		<xs:annotation>
			<xs:documentation>Número de carta de porte</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="18"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="TipoCarga" nillable="true">
		<xs:annotation>
			<xs:documentation>Tipo de carga</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="5"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DataVoo" type="xs:date" nillable="true">
		<xs:annotation>
			<xs:documentation>Data de voo</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:complexType name="EstruturaDadosEntidade">
		<xs:annotation>
			<xs:documentation>Estrutura de dados da entidade</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element ref="Codigo" minOccurs="0"/>
			<xs:element ref="Nome"/>
			<xs:element ref="Morada"/>
			<xs:element ref="Localidade" minOccurs="0"/>
			<xs:element ref="CodPostal" minOccurs="0"/>
			<xs:element ref="LocPostal" minOccurs="0"/>
			<xs:element ref="NIF" minOccurs="0"/>
			<xs:element ref="CodPais" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:element name="Codigo" nillable="true">
		<xs:annotation>
			<xs:documentation>Código</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="18"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Nome" nillable="false">
		<xs:annotation>
			<xs:documentation>Nome</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Morada" nillable="false">
		<xs:annotation>
			<xs:documentation>Morada</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Localidade" nillable="true">
		<xs:annotation>
			<xs:documentation>Localidade</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPostal" nillable="true">
		<xs:annotation>
			<xs:documentation>Código postal</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="12"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="LocPostal" nillable="true">
		<xs:annotation>
			<xs:documentation>Localidade postal</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35" fixed="false"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NIF" nillable="true">
		<xs:annotation>
			<xs:documentation>NIF</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="18"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPais" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do país</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Expedidor" type="EstruturaDadosEntidade">
		<xs:annotation>
			<xs:documentation>Dados do expedidor</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="CodClienteServico" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do cliente de serviço de entrega</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="18"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NumeroComercialRef" nillable="true">
		<xs:annotation>
			<xs:documentation>Número comercial de referência</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Destinatario" type="EstruturaDadosEntidade">
		<xs:annotation>
			<xs:documentation>Dados do destinatário</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="CodPais15A" nillable="true">
		<xs:annotation>
			<xs:documentation>Código país 15A</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPais17A" nillable="true">
		<xs:annotation>
			<xs:documentation>Código país 17A</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="ICE" nillable="true">
		<xs:annotation>
			<xs:documentation>I.C.E.</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="1"/>
				<xs:enumeration value="A"/>
				<xs:enumeration value="B"/>
				<xs:enumeration value="E"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MeioTransportePartida">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do meio de transporte à partida</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodMeioTransporte" minOccurs="0"/>
				<xs:element ref="MatriculaMT" minOccurs="0"/>
				<xs:element ref="TipoMT" minOccurs="0"/>
				<xs:element ref="CodMeioTransporte25" minOccurs="0"/>
				<xs:element ref="CodMeioTransporte26" minOccurs="0"/>
				<xs:element ref="CodAeroporto" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodMeioTransporte" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do meio de transporte</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MatriculaMT" nillable="true">
		<xs:annotation>
			<xs:documentation>Matricula do meio de transporte</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="27"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="TipoMT" nillable="true">
		<xs:annotation>
			<xs:documentation>Tipo do meio de transporte</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
				<xs:enumeration value="VA"/>
				<xs:enumeration value="EM"/>
				<xs:enumeration value="AE"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodMeioTransporte25" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do meio de transporte (25)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodMeioTransporte26" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do meio de transporte (26)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodAeroporto" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do aeroporto de destino</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="8"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MeioTransporteFronteira">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do meio de transporte na fronteira</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodMeioTransporte" minOccurs="0"/>
				<xs:element ref="MatriculaMT" minOccurs="0"/>
				<xs:element ref="TipoMT" minOccurs="0"/>
				<xs:element ref="CodPais" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodEstanciaTAC" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da estância de saída do TAC</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="8"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodEstanciaTN" nillable="true">
		<xs:annotation>
			<xs:documentation>Código da estância de saída do TN</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="8"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="LocalizacaoMercadorias">
		<xs:annotation>
			<xs:documentation>Estrutura de dados da localização das mercadorias</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:choice>
				<xs:element ref="CodEstancia30" minOccurs="0"/>
				<xs:element ref="CodLocalEmbarque" minOccurs="0"/>
				<xs:element ref="CodLocalAutorizado" minOccurs="0"/>
				<xs:element ref="OutroLocal" minOccurs="0"/>
				<xs:element ref="Armazem" minOccurs="0"/>
			</xs:choice>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodEstancia30" nillable="true">
		<xs:annotation>
			<xs:documentation>Código da estância (30)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="8"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodLocalEmbarque" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do local de embarque</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="25"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodLocalAutorizado" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do local autorizado</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="17"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="OutroLocal">
		<xs:annotation>
			<xs:documentation>Estrutura de dados de outro local</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Morada"/>
				<xs:element ref="CodPostal" minOccurs="0"/>
				<xs:element ref="LocPostal" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Armazem">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do armazém</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodArmazem"/>
				<xs:element ref="CodTipoArmazem"/>
				<xs:element ref="CodEstadoMembro"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodArmazem" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do armazém</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="17"/>
				<xs:minLength value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodTipoArmazem" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do tipo de armazém</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:length value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodEstadoMembro" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do país do estado membro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodCondEntrega" nillable="true">
		<xs:annotation>
			<xs:documentation>Código da condição de entrega</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="3"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Lugar" nillable="true">
		<xs:annotation>
			<xs:documentation>Lugar</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodNaturezaTransacao" nillable="true">
		<xs:annotation>
			<xs:documentation>Código da natureza de transação</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="TotalFrete" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor total de frete</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="TotalSeguro" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor total de seguro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="HVLV" nillable="true">
		<xs:annotation>
			<xs:documentation>HV/LV</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Origem" type="xs:int" nillable="true">
		<xs:annotation>
			<xs:documentation>Tipo de origem da declaração</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="Anotacoes" type="xs:string" nillable="true">
		<xs:annotation>
			<xs:documentation>Anotações</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="CamposExtra">
		<xs:annotation>
			<xs:documentation>Estrutura de dados de campos extra</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CampoExtra" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CampoExtra">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do campo extra</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodigoCampoExtra"/>
				<xs:element ref="ValorCampoExtra"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodigoCampoExtra" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do campo extra</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="100"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="ValorCampoExtra" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor do campo extra</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2500"/>
				<xs:minLength value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DadosManifesto">
		<xs:annotation>
			<xs:documentation>Estrutura de dados de dados de manifesto</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodExpedidor" minOccurs="0"/>
				<xs:element ref="NomeExpedidor" minOccurs="0"/>
				<xs:element ref="MoradaExpedidor" minOccurs="0"/>
				<xs:element ref="LocalidadeExpedidor" minOccurs="0"/>
				<xs:element ref="CodPostalExpedidor" minOccurs="0"/>
				<xs:element ref="LocPostalExpedidor" minOccurs="0"/>
				<xs:element ref="CodPaisExpedidor" minOccurs="0"/>
				<xs:element ref="NIFExpedidor" minOccurs="0"/>
				<xs:element ref="CodDestinatario" minOccurs="0"/>
				<xs:element ref="NomeDestinatario" minOccurs="0"/>
				<xs:element ref="MoradaDestinatario" minOccurs="0"/>
				<xs:element ref="LocalidadeDestinatario" minOccurs="0"/>
				<xs:element ref="CodPaisDestinatario" minOccurs="0"/>
				<xs:element ref="Montante" minOccurs="0"/>
				<xs:element ref="CodPais" minOccurs="0"/>
				<xs:element ref="MassaLiqTotal" minOccurs="0"/>
				<xs:element ref="MassaBrtTotal" minOccurs="0"/>
				<xs:element ref="MiniCPA" minOccurs="0"/>
				<xs:element ref="DutyType" minOccurs="0"/>
				<xs:element ref="NomeFicheiro" minOccurs="0"/>
				<xs:element ref="PPouFC" minOccurs="0"/>
				<xs:element ref="NumeroVoo" minOccurs="0"/>
				<xs:element ref="Referencia1" minOccurs="0"/>
				<xs:element ref="Referencia2" minOccurs="0"/>
				<xs:element ref="Tracking" minOccurs="0"/>
				<xs:element ref="Shipping" minOccurs="0"/>
				<xs:element ref="VolsDirty" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="10"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NomeExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Nome do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MoradaExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Morada do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="LocalidadeExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Localidade do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPostalExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Código postal do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="12"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="LocPostalExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Localidade postal do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPaisExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do país do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NIFExpedidor" nillable="true">
		<xs:annotation>
			<xs:documentation>NIF do expedidor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="18"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodDestinatario" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do destinatário</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="10"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NomeDestinatario" nillable="true">
		<xs:annotation>
			<xs:documentation>Nome do destinatário</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MoradaDestinatario" nillable="true">
		<xs:annotation>
			<xs:documentation>Morada do destinatário</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="70"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="LocalidadeDestinatario" nillable="true">
		<xs:annotation>
			<xs:documentation>Localidade do destinatário</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPaisDestinatario" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do país do destinatário</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Montante" nillable="true">
		<xs:annotation>
			<xs:documentation>Montante</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MassaLiqTotal" nillable="true">
		<xs:annotation>
			<xs:documentation>Massa líquida total</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MassaBrtTotal" nillable="true">
		<xs:annotation>
			<xs:documentation>Massa bruta total</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MiniCPA" nillable="true">
		<xs:annotation>
			<xs:documentation>Mini carta de porte</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="20"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DutyType" nillable="true">
		<xs:annotation>
			<xs:documentation>Duty type</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NomeFicheiro" nillable="true">
		<xs:annotation>
			<xs:documentation>Nome do ficheiro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="100"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="PPouFC" nillable="true">
		<xs:annotation>
			<xs:documentation>PP ou FC</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="3"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NumeroVoo" nillable="true">
		<xs:annotation>
			<xs:documentation>Número do voo</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="20"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Referencia1" nillable="true">
		<xs:annotation>
			<xs:documentation>Referência 1</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Referencia2" nillable="true">
		<xs:annotation>
			<xs:documentation>Referência 2</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Tracking" nillable="true">
		<xs:annotation>
			<xs:documentation>Tracking</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="35"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Shipping" nillable="true">
		<xs:annotation>
			<xs:documentation>Shipping</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="11"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="VolsDirty" nillable="true">
		<xs:annotation>
			<xs:documentation>Volumes dirty</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:int">
				<xs:minInclusive value="0"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Contentores">
		<xs:annotation>
			<xs:documentation>Estrutura de dados dos contentores</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Contentor" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Contentor">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do contentor</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="NumeroContentor"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="NumeroContentor" nillable="false">
		<xs:annotation>
			<xs:documentation>Numero do contentor</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Adicoes">
		<xs:annotation>
			<xs:documentation>Estrutura de dados das adições</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Adicao" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Adicao">
		<xs:annotation>
			<xs:documentation>Estrutura de dados da adição</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="NumeroAdicao"/>
				<xs:element ref="CodArtigo"/>
				<xs:element ref="DesignacaoArtigo"/>
				<xs:element ref="CodPaisOrigem" minOccurs="0"/>
				<xs:element ref="MassaBruta"/>
				<xs:element ref="MassaLiquida"/>
				<xs:element ref="Regime"/>
				<xs:element ref="Desdobramento" minOccurs="0"/>
				<xs:element ref="QtdUnidades"/>
				<xs:element ref="ValorAdicao"/>
				<xs:element ref="ValorFrete"/>
				<xs:element ref="ValorSeguro"/>
				<xs:element ref="DocsPrecedentes" minOccurs="0"/>
				<xs:element ref="RegimesEconomicos" minOccurs="0"/>
				<xs:element ref="Documentos" minOccurs="0"/>
				<xs:element ref="MencoesEspeciais" minOccurs="0"/>
				<xs:element ref="MarcasEVolumes"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="NumeroAdicao" nillable="false">
		<xs:annotation>
			<xs:documentation>Número da adição</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:int">
				<xs:minInclusive value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodArtigo" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do artigo</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="22"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DesignacaoArtigo" nillable="false">
		<xs:annotation>
			<xs:documentation>Designação do artigo</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="150"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodPaisOrigem" nillable="true">
		<xs:annotation>
			<xs:documentation>Código do país de origem</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MassaBruta" nillable="false">
		<xs:annotation>
			<xs:documentation>Massa bruta</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
				<xs:minInclusive value="0.000000"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MassaLiquida" nillable="false">
		<xs:annotation>
			<xs:documentation>Massa líquida</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Regime" nillable="false">
		<xs:annotation>
			<xs:documentation>Regime</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="4"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Desdobramento" nillable="true">
		<xs:annotation>
			<xs:documentation>Desdobramento</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="3"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="QtdUnidades" nillable="false">
		<xs:annotation>
			<xs:documentation>Quantidade de unidades suplementares</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="ValorAdicao" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor da adição</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="ValorFrete" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor do frete</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="ValorSeguro" nillable="false">
		<xs:annotation>
			<xs:documentation>Valor do seguro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Documentos">
		<xs:annotation>
			<xs:documentation>Estrutura de dados de documentos</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Documento" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Documento">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do documento</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodDocumento"/>
				<xs:element ref="NumeroReferencia" minOccurs="0"/>
				<xs:element ref="DataEmissao" minOccurs="0"/>
				<xs:element ref="DataFimValidade" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodDocumento" nillable="false">
		<xs:annotation>
			<xs:documentation>Código do documento</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="5"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NumeroReferencia" nillable="true">
		<xs:annotation>
			<xs:documentation>Número de referência</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="50"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DataEmissao" type="xs:date" nillable="true">
		<xs:annotation>
			<xs:documentation>Data de emissão</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="DataFimValidade" type="xs:date" nillable="true">
		<xs:annotation>
			<xs:documentation>Data de fim de validade</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="MencoesEspeciais">
		<xs:annotation>
			<xs:documentation>Estrutura de dados das menções especiais</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="MencaoEspecial" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="MencaoEspecial">
		<xs:annotation>
			<xs:documentation>Estrutura de dados da menção especial</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="CodMencao"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="CodMencao" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da emnção especial</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="8"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="MarcasEVolumes">
		<xs:annotation>
			<xs:documentation>Estrutura de dados das marcas e volumes</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="MarcaEVolume" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="MarcaEVolume">
		<xs:annotation>
			<xs:documentation>Estrutura de dados da marca e volume</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Marca" minOccurs="0"/>
				<xs:element ref="CodNaturezaVols"/>
				<xs:element ref="NumeroVols"/>
				<xs:element ref="P"/>
				<xs:element ref="R"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Marca" nillable="false">
		<xs:annotation>
			<xs:documentation>Marca e Número</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="44"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodNaturezaVols" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da natureza de volumes</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="2"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="NumeroVols" nillable="false">
		<xs:annotation>
			<xs:documentation>Número de volumes</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="P" type="xs:boolean" nillable="false">
		<xs:annotation>
			<xs:documentation>Parte</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="R" type="xs:boolean" nillable="false">
		<xs:annotation>
			<xs:documentation>Resto</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="DocsPrecedentes">
		<xs:annotation>
			<xs:documentation>Estrutura de dados dos documentos precedentes</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="DocPrecedente" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="DocPrecedente">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do documento precedente</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Tipo"/>
				<xs:element ref="CodDocumento"/>
				<xs:element ref="RefDocumento"/>
				<xs:element ref="CodPais"/>
				<xs:element ref="DataDocumento" minOccurs="0"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Tipo" nillable="false">
		<xs:annotation>
			<xs:documentation>Tipo</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:length value="1"/>
				<xs:enumeration value="Y"/>
				<xs:enumeration value="Z"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="RefDocumento" nillable="false">
		<xs:annotation>
			<xs:documentation>Número de referência do documento</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="20"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DataDocumento" type="xs:date" nillable="true">
		<xs:annotation>
			<xs:documentation>Data do documento</xs:documentation>
		</xs:annotation>
	</xs:element>
	<xs:element name="RegimesEconomicos">
		<xs:annotation>
			<xs:documentation>Estrutura de dados dos regimes económicos</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="RegimeEconomico" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="RegimeEconomico">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do regime económico</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="NumeroDocPrecedente"/>
				<xs:element ref="AdicaoDocPrecedente"/>
				<xs:element ref="CodArtigoPautal"/>
				<xs:element ref="Quantidade"/>
				<xs:element ref="CodUnidMedida"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="NumeroDocPrecedente" nillable="false">
		<xs:annotation>
			<xs:documentation>Número de referência do documento precedente relacionado</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="20"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="AdicaoDocPrecedente" nillable="false">
		<xs:annotation>
			<xs:documentation>Número da adição correspondente ao documento precedente associado</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:int">
				<xs:minInclusive value="1"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodArtigoPautal" nillable="false">
		<xs:annotation>
			<xs:documentation>Código pautal do artigo</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="22"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Quantidade" nillable="false">
		<xs:annotation>
			<xs:documentation>Quantidade</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:decimal">
				<xs:minInclusive value="0.000000"/>
				<xs:totalDigits value="28"/>
				<xs:fractionDigits value="6"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="CodUnidMedida" nillable="false">
		<xs:annotation>
			<xs:documentation>Código da unidade de medida</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="3"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="Arquivos">
		<xs:annotation>
			<xs:documentation>Estrutura de dados de arquivos a anexar à declaração</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="Arquivo" maxOccurs="unbounded"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="Arquivo">
		<xs:annotation>
			<xs:documentation>Estrutura de dados do arquivo a anexar no arquivo da declaração</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="NomeArquivo"/>
				<xs:element ref="DescricaoArquivo"/>
				<xs:element ref="TipoArquivo" minOccurs="0"/>
				<xs:element ref="OrigemArquivo"/>
				<xs:element ref="FicheiroBase64"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="NomeArquivo" nillable="false">
		<xs:annotation>
			<xs:documentation>Nome do ficheiro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="100"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="DescricaoArquivo" nillable="false">
		<xs:annotation>
			<xs:documentation>Descrição do ficheiro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:minLength value="1"/>
				<xs:maxLength value="150"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="TipoArquivo" nillable="true">
		<xs:annotation>
			<xs:documentation>Tipo do ficheiro ("FATURA": Fatura; "FTINTERN": Fatura Interna; "DOCTRANS": Documento de Transporte)</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:string">
				<xs:maxLength value="8"/>
				<xs:enumeration value="FATURA"/>
				<xs:enumeration value="FTINTERN"/>
				<xs:enumeration value="DOCTRANS"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="OrigemArquivo" nillable="false">
		<xs:annotation>
			<xs:documentation>Origem do ficheiro</xs:documentation>
		</xs:annotation>
		<xs:simpleType>
			<xs:restriction base="xs:int">
				<xs:minInclusive value="0"/>
			</xs:restriction>
		</xs:simpleType>
	</xs:element>
	<xs:element name="FicheiroBase64" type="xs:string" nillable="false">
		<xs:annotation>
			<xs:documentation>Ficheiro em base64</xs:documentation>
		</xs:annotation>
	</xs:element>
</xs:schema>'
GO
CREATE PROCEDURE SP_ExportacaoXML_GeraDeclaracoesDeXML @XMLDeclaracoes xml(XMLSC_DeclaracoesExpToGIDWin), @Utilizador varchar(30), @MensagemErro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON
	SET DATEFORMAT DMY
-- declaração de variaveis
	DECLARE @TblID table (ID bigint NOT NULL)
	DECLARE @Acao varchar(1), @TipoProcedimento varchar(1), @CodNatureza varchar(3), @CodOperador varchar(6), @Data datetime, @VossaReferencia varchar(50), 
		@CodEstanciaA varchar(8), @CodStatusIncidencia varchar(4), @CodTipoDeclaracao varchar(4), @NumeroCPA varchar(18), @TipoCarga varchar(5),  @DataVoo datetime, @Expedidor_Codigo varchar(18), 
		@Expedidor_Nome varchar(70), @Expedidor_Morada varchar(70), @Expedidor_Localidade varchar(35), @Expedidor_CodPostal varchar(12), @Expedidor_LocPostal varchar(35), 
		@Expedidor_NIF varchar(18), @Expedidor_CodPais varchar(2), @CodClienteServico varchar(18), @NumeroComercialRef varchar(70), @Destinatario_Codigo varchar(18), 
		@Destinatario_Nome varchar(70), @Destinatario_Morada varchar(70), @Destinatario_Localidade varchar(35), @Destinatario_CodPostal varchar(12), @Destinatario_LocPostal varchar(35), 
		@Destinatario_NIF varchar(18), @Destinatario_CodPais varchar(2), @CodPais15A varchar(2), @CodPais17A varchar(2), @ICE varchar(1), @MTPartida_CodMT varchar(2), 
		@MTPartida_MatriculaMT varchar(27), @MTPartida_TipoMT varchar(2), @MTPartida_CodMT25 varchar(2), @MTPartida_CodMT26 varchar(2), @MTPartida_CodAeroporto varchar(8), 
		@MTFronteira_CodMT varchar(2), @MTFronteira_MatriculaMT varchar(27), @MTFronteira_TipoMT varchar(2), @MTFronteira_CodPais varchar(2), @CodEstanciaTAC varchar(8), 
		@CodEstanciaTN varchar(8), @LocMercadorias_CodEstancia30 varchar(8), @LocMercadorias_CodLocalEmbarque varchar(25), @LocMercadorias_CodLocalAutorizado varchar(17), 
		@LocMercadorias_OutroLocal_Morada varchar(70), @LocMercadorias_OutroLocal_CodPostal varchar(12), @LocMercadorias_OutroLocal_LocPostal varchar(35), 
		@LocMercadorias_Armazem_CodArmazem varchar(17), @LocMercadorias_Armazem_CodTipoArmazem varchar(1), @LocMercadorias_Armazem_CodEstadoMembro varchar(2), @CodLocalEmbarque varchar(25), 
		@CodCondEntrega varchar(3), @Lugar varchar(50), @CodNaturezaTransacao varchar(2), @CodPais varchar(2), @TotalFrete numeric(38, 6), @TotalSeguro numeric(38, 6), @HVLV varchar(6), 
		@Origem int, @Anotacoes varchar(MAX), @CamposExtra xml, @DadosManifesto_CodExpedidor varchar(10), @DadosManifesto_NomeExpedidor varchar(70), @DadosManifesto_MoradaExpedidor varchar(70), 
		@DadosManifesto_LocalidadeExpedidor varchar(35), @DadosManifesto_CodPostalExpedidor varchar(12), @DadosManifesto_LocPostalExpedidor varchar(35), 
		@DadosManifesto_CodPaisExpedidor varchar(2), @DadosManifesto_NIFExpedidor varchar(18), @DadosManifesto_CodDestinatario varchar(10), @DadosManifesto_NomeDestinatario varchar(70), 
		@DadosManifesto_MoradaDestinatario varchar(70), @DadosManifesto_LocalidadeDestinatario varchar(35), @DadosManifesto_CodPaisDestinatario varchar(2), @DadosManifesto_Montante numeric(38, 6), 
		@DadosManifesto_CodPais varchar(2), @DadosManifesto_MassaLiqTotal numeric(38, 6), @DadosManifesto_MassaBrtTotal numeric(38, 6), @DadosManifesto_MiniCPA varchar(20), 
		@DadosManifesto_DutyType varchar(2), @DadosManifesto_NomeFicheiro varchar(100), @DadosManifesto_PPouFC varchar(3), @DadosManifesto_NumeroVoo varchar(20), 
		@DadosManifesto_Referencia1 varchar(50), @DadosManifesto_Referencia2 varchar(50), @DadosManifesto_Tracking varchar(35), @DadosManifesto_Shipping varchar(11), @DadosManifesto_VolsDirty int, 
		@Contentores xml, @Adicoes xml, @Arquivos xml
	DECLARE @IdDeclaracao bigint, @AnoDeclaracao int, @NumDeclaracao int, @NomeNatureza varchar(35), @NomeDeclarante varchar(70), @NIFDeclarante varchar(18), @Casa54Declarante varchar(1), 
		@NumReferenciaLocal varchar(22), @NomeEstanciaA varchar(35), @NomeTipoDeclaracao varchar(35), @1CasaTipoDeclaracao varchar(5), @RegimeTipoDeclaracao varchar(4), @TipoNIFCliente varchar(1), 
		@TipoIdCliente varchar(2), @CodigoClienteCC varchar(18), @IndicadorRemessaFornecedor int, @TipoDeclarante int, @CodMTEstancia varchar(2), @NomeMTPartida varchar(35), 
		@NomeMTFronteira varchar(35), @CodPaisEstancia varchar(2), @NomePaisMTFronteira varchar(35), @NomeCondEntrega varchar(35), @LocalizacaoCondEntrega varchar(35), 
		@MetodoPagCondEntrega varchar(1), @CodFormula int, @DescricaoFormula varchar(70), @FormulaFOB bit, @NomeNaturezaTransacao varchar(70), @MoedaPais22 varchar(3), @CambioMoeda numeric(38, 6), 
		@NomeEstanciaTAC varchar(35), @NomeEstanciaTN varchar(35), @NomeEstancia30 varchar(35), @DescricaoLocalEmbarque varchar(70), @DescricaoLocalAutorizado varchar(70), 
		@DescricaoLocalEmbarque30A varchar(70), @NomeArmazem varchar(70), @NomeTipoArmazem varchar(35), @InterfaceSDSViaAereaActivo bit, @DescricaoStatusIncidencia varchar(60), 
		@DataStatusIncidencia datetime, @NomeClienteServico varchar(70), @NomeAeroporto varchar(35), @TotalAdicoes int, @TotalVolumes numeric(38, 6), @MontanteTotal numeric(38, 6), 
		@MassaLiquidaTotal numeric(38, 6), @MassaBrutaTotal numeric(38, 6), @CodFollowUp int, @CodPaisCondEntrega varchar(2), @TextoCondEntrega varchar(512), @CodPaisFreteSeguro varchar(2), 
		@CambioFreteSeguro numeric(38, 6), @TipoLocalizacao varchar(1), @Qualificador varchar(1), @CodPaisLocMercadorias varchar(2), @AnexoB varchar(2), @TipoMTFronteira int, 
		@CodEstanciaAperfeicoamento varchar(8), @PrazoApuramento varchar(512), @AtividadesPrevistas varchar(512), @NumMascaras int, @TipoMascara int, @CodMascara int, @1AdicaoParte bit
	DECLARE @NumLinhaContentor int, @NumeroContentor varchar(50)
	DECLARE @NumeroAdicao int, @CodArtigo varchar(22), @DesignacaoArtigo varchar(150), @CodPaisOrigem varchar(2), @MassaBruta numeric(38, 6), @MassaLiquida numeric(38, 6), @Regime varchar(4), 
		@Desdobramento varchar(3), @QtdUnidades numeric(38, 6), @ValorAdicao numeric(38, 6), @ValorFrete numeric(38, 6), @ValorSeguro numeric(38, 6), @Documentos xml, @MencoesEspeciais xml, 
		@MarcasEVolumes xml, @DocsPrecedentes xml, @RegimesEconomicos xml
	DECLARE @CodPautal varchar(22), @NomePaisOrigem varchar(35), @CodUnidSuplementar varchar(10), @NomeUnidSuplementar varchar(10), @ValorEstatistico numeric(38, 6), @IndicadorArtigo varchar(2), 
		@AnexoCArtigo bit, @AnexoDArtigo bit, @CodMercPerigosasArtigo varchar(10), @AdicionalTARIC1Artigo varchar(4), @AdicionalTARIC2Artigo varchar(4), @AdicionalTARIC3Artigo varchar(4), 
		@CodigoIC1Artigo varchar(4), @CodigoIC2Artigo varchar(4), @CodigoIC3Artigo varchar(4), @CodigoIC4Artigo varchar(4), @CodigoIC5Artigo varchar(4), @CodigoCUSArtigo varchar(9), 
		@IDAdicao int, @NumTotalAdicoesXML int, @MassaBrtTotalAdicoesXML numeric(38, 6), @ValorRestanteFrete numeric(38, 6), @IdDesdobramento int, @Ajustamento numeric(38, 6)
	DECLARE @CodDocumento varchar(5), @NumeroReferencia varchar(50), @DataEmissao datetime, @DataFimValidade datetime
	DECLARE @NomeDocumento varchar(70), @QtdDocumento numeric(38, 6), @IdDocumento int, @TipoDocumento tinyint, @NumAdicaoDocumento int
	DECLARE @CodMencao varchar(8)
	DECLARE @DesignacaoMencao varchar(150)
	DECLARE @Marca varchar(44), @CodNaturezaVols varchar(2), @NumeroVols numeric(38, 6), @P bit, @R bit
	DECLARE @NomeTipoEmbalagem varchar(35), @VolsAZeroTipoEmbalagem bit, @IDStrMarcaEVol varchar(20), @AnoDeclaracaoMarcaEVol int, @NumDeclaracaoMarcaEVol int, @CodOperadorMarcaEVol varchar(6)
	DECLARE @TipoDocPrecedente varchar(1), @RefDocPrecedente varchar(20), @DataDocumento datetime, @VolumesPrecedente int, @IdUnidadeMedidaVolumes int, @IdUnidadeMedidaQualificador int
	DECLARE @NumLinhaDocPrecedente int, @NomePais varchar(35)
	DECLARE @DataAtual datetime, @AuxMsgErro varchar(500), @DirArquivos varchar(250), @CamposAdicionais int, @IntegracaoEXPCAU bit, @PeriodoTransitorio bit, @IdUtilizador int
	DECLARE @NomeFicheiro varchar(100), @DescricaoFicheiro varchar(150), @TipoFicheiro varchar(8), @OrigemFicheiro int, @FicheiroBase64 varchar(MAX)
	DECLARE @ExtFicheiro varchar(10), @PathFicheiro varchar(500), @FicheiroImprSerie bit, @FicheiroBinario varbinary(MAX), @Obj int
	DECLARE @NumeroDocPrecedente varchar(20), @AdicaoDocPrecedente int, @CodArtigoPautal varchar(22), @Quantidade numeric(38, 6), @CodUnidMedida varchar(3)
	DECLARE @NomeUnidMedida varchar(35)
-- obtem dados dos Parametros Despachos
	SELECT TOP 1 @DirArquivos = PDE_EPDI, @CamposAdicionais = PDE_CADI, @IntegracaoEXPCAU = PDE_ECAU, @PeriodoTransitorio = PDE_PTEX
	FROM TAB_PDES WITH(NOLOCK)			
-- obtem dados dos Parametros SDS-Via Aerea			
	SELECT TOP 1 @InterfaceSDSViaAereaActivo = PSD_IXML
	FROM TAB_PSDS WITH(NOLOCK)
-- obtem dados do utilizador
	SELECT @IdUtilizador = UTI_IDTY
	FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
	WHERE UTI_UTIL = @Utilizador
-- carrega declarações XML p/ INSERT
	DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
		SELECT XML_DECL.DCL_DATA.value('@Acao[1]', 'varchar(1)'), XML_DECL.DCL_DATA.value('TipoProcedimento[1]', 'varchar(1)'), 
			XML_DECL.DCL_DATA.value('CodNatureza[1]', 'varchar(3)'), XML_DECL.DCL_DATA.value('CodOperador[1]', 'varchar(6)'), XML_DECL.DCL_DATA.value('Data[1]', 'datetime'), 
			NULLIF(XML_DECL.DCL_DATA.value('VossaReferencia[1]', 'varchar(50)'), ''), XML_DECL.DCL_DATA.value('CodEstanciaA[1]', 'varchar(8)'), 			
			NULLIF(XML_DECL.DCL_DATA.value('CodStatusIncidencia[1]', 'varchar(4)'), ''), XML_DECL.DCL_DATA.value('CodTipoDeclaracao[1]', 'varchar(4)'), 
			NULLIF(XML_DECL.DCL_DATA.value('NumeroCPA[1]', 'varchar(18)'), ''), NULLIF(XML_DECL.DCL_DATA.value('TipoCarga[1]', 'varchar(5)'), ''),  
			XML_DECL.DCL_DATA.value('DataVoo[1]', 'datetime'), NULLIF(XML_DECL.DCL_DATA.value('Expedidor/Codigo[1]', 'varchar(18)'), ''), 
			XML_DECL.DCL_DATA.value('Expedidor/Nome[1]', 'varchar(70)'), XML_DECL.DCL_DATA.value('Expedidor/Morada[1]', 'varchar(70)'), 
			NULLIF(XML_DECL.DCL_DATA.value('Expedidor/Localidade[1]', 'varchar(35)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Expedidor/CodPostal[1]', 'varchar(12)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('Expedidor/LocPostal[1]', 'varchar(35)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Expedidor/NIF[1]', 'varchar(18)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('Expedidor/CodPais[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('CodClienteServico[1]', 'varchar(18)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('NumeroComercialRef[1]', 'varchar(70)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Destinatario/Codigo[1]', 'varchar(18)'), ''), 
			XML_DECL.DCL_DATA.value('Destinatario/Nome[1]', 'varchar(70)'), XML_DECL.DCL_DATA.value('Destinatario/Morada[1]', 'varchar(70)'), 
			NULLIF(XML_DECL.DCL_DATA.value('Destinatario/Localidade[1]', 'varchar(35)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Destinatario/CodPostal[1]', 'varchar(12)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('Destinatario/LocPostal[1]', 'varchar(35)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Destinatario/NIF[1]', 'varchar(18)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('Destinatario/CodPais[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('CodPais15A[1]', 'varchar(2)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('CodPais17A[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('ICE[1]', 'varchar(1)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('MeioTransportePartida/CodMeioTransporte[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('MeioTransportePartida/MatriculaMT[1]', 'varchar(27)'), ''),  
			NULLIF(XML_DECL.DCL_DATA.value('MeioTransportePartida/TipoMT[1]', 'varchar(2)'),  ''),  NULLIF(XML_DECL.DCL_DATA.value('MeioTransportePartida/CodMeioTransporte25[1]', 'varchar(2)'), ''), 
			XML_DECL.DCL_DATA.value('MeioTransportePartida/CodMeioTransporte26[1]', 'varchar(2)'), NULLIF(XML_DECL.DCL_DATA.value('MeioTransportePartida/CodAeroporto[1]', 'varchar(8)'), ''), 			
			NULLIF(XML_DECL.DCL_DATA.value('MeioTransporteFronteira/CodMeioTransporte[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('MeioTransporteFronteira/MatriculaMT[1]', 'varchar(27)'), ''),  
			NULLIF(XML_DECL.DCL_DATA.value('MeioTransporteFronteira/TipoMT[1]', 'varchar(2)'),  ''),  NULLIF(XML_DECL.DCL_DATA.value('MeioTransporteFronteira/CodPais[1]', 'varchar(2)'), ''), 			
			XML_DECL.DCL_DATA.value('CodEstanciaTAC[1]', 'varchar(8)'), NULLIF(XML_DECL.DCL_DATA.value('CodEstanciaTN[1]', 'varchar(8)'), ''), 			
			NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/CodEstancia30[1]', 'varchar(8)'), ''), NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/CodLocalEmbarque[1]', 'varchar(25)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/CodLocalAutorizado[1]', 'varchar(17)'), ''), NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/OutroLocal/Morada[1]', 'varchar(70)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/OutroLocal/CodPostal[1]', 'varchar(12)'), ''), NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/OutroLocal/LocPostal[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/Armazem/CodArmazem[1]', 'varchar(17)'), ''), NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/Armazem/CodTipoArmazem[1]', 'varchar(1)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('LocalizacaoMercadorias/Armazem/CodEstadoMembro[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('CodLocalEmbarque[1]', 'varchar(25)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('CodCondEntrega[1]', 'varchar(3)'), ''), NULLIF(XML_DECL.DCL_DATA.value('Lugar[1]', 'varchar(50)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('CodNaturezaTransacao[1]', 'varchar(2)'), ''), XML_DECL.DCL_DATA.value('CodPais[1]', 'varchar(2)'), 
			ISNULL(XML_DECL.DCL_DATA.value('TotalFrete[1]', 'numeric(38, 6)'), 0), ISNULL(XML_DECL.DCL_DATA.value('TotalSeguro[1]', 'numeric(38, 6)'), 0), 	
			NULLIF(XML_DECL.DCL_DATA.value('HVLV[1]', 'varchar(6)'), ''), ISNULL(XML_DECL.DCL_DATA.value('Origem[1]', 'int'), 0), 
			NULLIF(XML_DECL.DCL_DATA.value('Anotacoes[1]', 'varchar(MAX)'), ''), XML_DECL.DCL_DATA.query('CamposExtra'), 			
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodExpedidor[1]', 'varchar(10)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/NomeExpedidor[1]', 'varchar(70)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/MoradaExpedidor[1]', 'varchar(70)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/LocalidadeExpedidor[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodPostalExpedidor[1]', 'varchar(12)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/LocPostalExpedidor[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodPaisExpedidor[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/NIFExpedidor[1]', 'varchar(18)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodDestinatario[1]', 'varchar(10)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/NomeDestinatario[1]', 'varchar(70)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/MoradaDestinatario[1]', 'varchar(70)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/LocalidadeDestinatario[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodPaisDestinatario[1]', 'varchar(2)'), ''), ISNULL(XML_DECL.DCL_DATA.value('DadosManifesto/Montante[1]', 'numeric(38, 6)'), 0), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/CodPais[1]', 'varchar(2)'), ''), ISNULL(XML_DECL.DCL_DATA.value('DadosManifesto/MassaLiqTotal[1]', 'numeric(38, 6)'), 0), 
			ISNULL(XML_DECL.DCL_DATA.value('DadosManifesto/MassaBrtTotal[1]', 'numeric(38, 6)'), 0), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/MiniCPA[1]', 'varchar(20)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/DutyType[1]', 'varchar(2)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/NomeFicheiro[1]', 'varchar(100)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/PPouFC[1]', 'varchar(3)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/NumeroVoo[1]', 'varchar(20)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/Referencia1[1]', 'varchar(50)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/Referencia2[1]', 'varchar(50)'), ''), 
			NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/Tracking[1]', 'varchar(35)'), ''), NULLIF(XML_DECL.DCL_DATA.value('DadosManifesto/Shipping[1]', 'varchar(11)'), ''), 
			XML_DECL.DCL_DATA.value('DadosManifesto/VolsDirty[1]', 'int'), XML_DECL.DCL_DATA.query('Contentores'), XML_DECL.DCL_DATA.query('Adicoes'), XML_DECL.DCL_DATA.query('Arquivos')
		FROM @XMLDeclaracoes.nodes('DeclaracoesExpToGIDWin/Declaracao') as XML_DECL(DCL_DATA)	
		WHERE XML_DECL.DCL_DATA.value('@Acao[1]', 'varchar(1)') in ('I', 'U')	
	OPEN Declaracoes
	FETCH NEXT FROM Declaracoes INTO @Acao, @TipoProcedimento, @CodNatureza, @CodOperador, @Data, @VossaReferencia, @CodEstanciaA, @CodStatusIncidencia, @CodTipoDeclaracao, @NumeroCPA, @TipoCarga, 
		@DataVoo, @Expedidor_Codigo, @Expedidor_Nome, @Expedidor_Morada, @Expedidor_Localidade, @Expedidor_CodPostal, @Expedidor_LocPostal, @Expedidor_NIF, @Expedidor_CodPais, @CodClienteServico, 
		@NumeroComercialRef, @Destinatario_Codigo, @Destinatario_Nome, @Destinatario_Morada, @Destinatario_Localidade, @Destinatario_CodPostal, @Destinatario_LocPostal, @Destinatario_NIF, 
		@Destinatario_CodPais, @CodPais15A, @CodPais17A, @ICE, @MTPartida_CodMT, @MTPartida_MatriculaMT, @MTPartida_TipoMT, @MTPartida_CodMT25, @MTPartida_CodMT26, @MTPartida_CodAeroporto, 
		@MTFronteira_CodMT, @MTFronteira_MatriculaMT,  @MTFronteira_TipoMT, @MTFronteira_CodPais, @CodEstanciaTAC, @CodEstanciaTN, @LocMercadorias_CodEstancia30, @LocMercadorias_CodLocalEmbarque, 
		@LocMercadorias_CodLocalAutorizado, @LocMercadorias_OutroLocal_Morada, @LocMercadorias_OutroLocal_CodPostal, @LocMercadorias_OutroLocal_LocPostal, @LocMercadorias_Armazem_CodArmazem, 
		@LocMercadorias_Armazem_CodTipoArmazem, @LocMercadorias_Armazem_CodEstadoMembro, @CodLocalEmbarque, @CodCondEntrega, @Lugar, @CodNaturezaTransacao, @CodPais, @TotalFrete, @TotalSeguro, 
		@HVLV, @Origem, @Anotacoes, @CamposExtra, @DadosManifesto_CodExpedidor, @DadosManifesto_NomeExpedidor, @DadosManifesto_MoradaExpedidor, @DadosManifesto_LocalidadeExpedidor, 
		@DadosManifesto_CodPostalExpedidor, @DadosManifesto_LocPostalExpedidor, @DadosManifesto_CodPaisExpedidor, @DadosManifesto_NIFExpedidor, @DadosManifesto_CodDestinatario, 
		@DadosManifesto_NomeDestinatario, @DadosManifesto_MoradaDestinatario, @DadosManifesto_LocalidadeDestinatario, @DadosManifesto_CodPaisDestinatario, @DadosManifesto_Montante, 
		@DadosManifesto_CodPais, @DadosManifesto_MassaLiqTotal, @DadosManifesto_MassaBrtTotal, @DadosManifesto_MiniCPA, @DadosManifesto_DutyType, @DadosManifesto_NomeFicheiro, 
		@DadosManifesto_PPouFC, @DadosManifesto_NumeroVoo, @DadosManifesto_Referencia1, @DadosManifesto_Referencia2, @DadosManifesto_Tracking, @DadosManifesto_Shipping, @DadosManifesto_VolsDirty, 
		@Contentores, @Adicoes, @Arquivos
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- inicia transacção para inserção dados da declaração
		BEGIN TRANSACTION	
		BEGIN TRY		
			DELETE FROM @TblID
			SET @IdDeclaracao = NULL
-- obtem data atual GMT
			SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()					
-- obtem dados da Natureza
			SELECT @NomeNatureza = NDE_NOME, @CodFollowUp = FUP_CODI
			FROM TAB_NDES WITH(NOLOCK)
			WHERE NDE_CODI = @CodNatureza	
-- obtem dados das Estâncias
			SELECT @NomeEstanciaA = EAD_NOME, @CodPaisEstancia = PAI_CODI, @CodMTEstancia = (CASE @Origem WHEN 0 THEN MTR_CODI ELSE NULL END)
			FROM TAB_EADU WITH(NOLOCK)
			WHERE EAD_CODI = @CodEstanciaA
			SELECT @NomeEstanciaTAC = EAD_NOME
			FROM TAB_EADU WITH(NOLOCK)
			WHERE EAD_CODI = @CodEstanciaTAC
			SELECT @NomeEstanciaTN = EAD_NOME
			FROM TAB_EADU WITH(NOLOCK)
			WHERE EAD_CODI = @CodEstanciaTN
			SELECT @NomeEstancia30 = EAD_NOME
			FROM TAB_EADU WITH(NOLOCK)
			WHERE EAD_CODI = @LocMercadorias_CodEstancia30
-- obtem dados do Tipo de Declaração
			SELECT @NomeTipoDeclaracao = TDE_NOME, @1CasaTipoDeclaracao = TDE_1CAS, @RegimeTipoDeclaracao = TDE_REGI, 
				@TipoCarga = ISNULL(@TipoCarga, (CASE @InterfaceSDSViaAereaActivo WHEN 1 THEN TDE_TPCG ELSE NULL END))
			FROM TAB_TDEC WITH(NOLOCK)
			WHERE TDE_CODI = @CodTipoDeclaracao			  			
-- obtem dados do Expedidor se este estiver preenchido
			IF @Expedidor_Codigo IS NOT NULL
			BEGIN
				SELECT @Expedidor_Nome = CLI_NOME, @Expedidor_Morada = CLI_MORA, @Expedidor_Localidade = ISNULL(CLI_LOCA, @Expedidor_Localidade), 
					@Expedidor_CodPostal = ISNULL(CLI_CPOS, @Expedidor_CodPostal), @Expedidor_LocPostal = ISNULL(CLI_LPOS, @Expedidor_LocPostal), @Expedidor_NIF = ISNULL(CLI_NIF, @Expedidor_NIF), 
					@Expedidor_CodPais = ISNULL(PAI_CODI, @Expedidor_CodPais), @CodClienteServico = ISNULL(@CodClienteServico, CLI_SENT), @CodigoClienteCC = ISNULL(NULLIF(CLI_CCOR, ''), CLI_CODI), 
					@TipoNIFCliente = (CASE CLI_TNIF WHEN 1 THEN 'S' WHEN 2 THEN 'P' ELSE 'C' END), @TipoIdCliente = (CASE CLI_TNIF WHEN 2 THEN 'BI' ELSE NULL END)					
				FROM TAB_CLIE WITH(NOLOCK)
				WHERE CLI_CODI = @Expedidor_Codigo			
			END
			ELSE
				SELECT @Expedidor_Codigo = '', @TipoNIFCliente = 'C'
-- obtem dados do Cliente de Serviço se este estiver preenchido
			SELECT @NomeClienteServico = CLI_NOME
			FROM TAB_CLIE WITH(NOLOCK)
			WHERE CLI_CODI = @CodClienteServico					
-- obtem dados do Destinatário se este estiver preenchido
			IF @Destinatario_Codigo IS NOT NULL
			BEGIN
				SELECT @Destinatario_Nome = ISNULL(FOR_NOME, @Destinatario_Nome), @Destinatario_Morada = ISNULL(FOR_MORA, @Destinatario_Morada), 
					@Destinatario_Localidade = ISNULL(FOR_LOCA, @Destinatario_Localidade), @Destinatario_CodPostal = ISNULL(FOR_CPOS, @Destinatario_CodPostal), 
					@Destinatario_LocPostal = ISNULL(FOR_LPOS, @Destinatario_LocPostal), @Destinatario_NIF = ISNULL(FOR_NIF, @Destinatario_NIF), 
					@Destinatario_CodPais = ISNULL(PAI_CODI, @Destinatario_CodPais), @IndicadorRemessaFornecedor = FOR_IROR
				FROM TAB_FORN WITH(NOLOCK)
				WHERE FOR_CODI = @Destinatario_Codigo				
			END
			ELSE
				SELECT @IndicadorRemessaFornecedor = 0		
-- obtem dados do pais "PT" se Pais 15A não preenchido
			IF @CodPais15A IS NULL	
			BEGIN
				SELECT @CodPais15A = PAI_CODI 
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = 'PT'
			END		
-- obtem dados em falta
			SELECT @AnoDeclaracao = YEAR(@Data), @CodPais17A = ISNULL(@CodPais17A, @Destinatario_CodPais), 
				@MTPartida_CodMT = ISNULL(@MTPartida_CodMT, @CodMTEstancia), @MTFronteira_CodPais = ISNULL(@MTFronteira_CodPais, @CodPaisEstancia), 
				@DataVoo = ISNULL(@DataVoo, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime)), @NumeroComercialRef = ISNULL(@NumeroComercialRef, @NumeroCPA)
-- obtem dados dos Meios de Transporte
			SELECT @NomeMTPartida = MTR_NOME
			FROM TAB_MTRA WITH(NOLOCK)
			WHERE MTR_CODI = @MTPartida_CodMT	
			SELECT @NomeMTFronteira = MTR_NOME, @TipoMTFronteira = MTR_TIPO
			FROM TAB_MTRA WITH(NOLOCK)
			WHERE MTR_CODI = @MTFronteira_CodMT
-- inicia Tipos de Meio de Transporte c/ "VA" quando Tipo de Meio de Transporte não preenchido
			IF (@MTPartida_TipoMT IS NULL) and (@MTPartida_CodMT = '90')
				SELECT @MTPartida_TipoMT = 'VA'
			IF (@MTFronteira_TipoMT IS NULL) and (@MTFronteira_CodMT = '90')
				SELECT @MTFronteira_TipoMT = 'VA'													
-- obtem câmbio do País da Moeda
			SELECT @CambioMoeda = dbo.FNT_Geral_ObtemCambio(1, @CodPais, @Data)
-- obtem dados da Condição Entrega
			SELECT @NomeCondEntrega = CEN_NOME, @MetodoPagCondEntrega = CEN_MPAG, 
				@LocalizacaoCondEntrega = (CASE WHEN ISNULL(CEN_LOCT, 0) = 0 THEN NULL WHEN ISNULL(CEN_LOCD, 0) = 0 THEN @Expedidor_Localidade ELSE @Destinatario_Localidade END), 
				@CodFormula = (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 0 END), 
				@CodPaisCondEntrega = (CASE WHEN ISNULL(CEN_LOCT, 0) = 0 THEN NULL WHEN ISNULL(CEN_LOCD, 0) = 0 THEN @Expedidor_CodPais ELSE @Destinatario_CodPais END)
			FROM TAB_CENT WITH(NOLOCK)
			WHERE CEN_CODI = @CodCondEntrega			
-- obtem dados da Formula
			SELECT @CodFormula = FIN_CODI, @DescricaoFormula = FIN_DESC, @FormulaFOB = FIN_VFOB
			FROM TAB_FINC WITH(NOLOCK)
			WHERE FIN_CODI = ISNULL(@CodFormula, 0)
-- obtem dados da Natureza de Transação
			SELECT @NomeNaturezaTransacao = NTR_NOME
			FROM TAB_NTRA WITH(NOLOCK)
			WHERE NTR_CODI = @CodNaturezaTransacao			
-- obtem dados dos vários Países		
			SELECT @NomePaisMTFronteira = PAI_NOME
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @MTFronteira_CodPais
			SELECT @MoedaPais22 = PAI_PREF
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @CodPais
-- obtem dados dos Locais de Embarque
			SELECT @DescricaoLocalEmbarque = LEM_DESC
			FROM TAB_LEMB WITH(NOLOCK)
			WHERE LEM_CODI = @LocMercadorias_CodLocalEmbarque
			SELECT @DescricaoLocalEmbarque30A = LEM_DESC
			FROM TAB_LEMB WITH(NOLOCK)
			WHERE LEM_CODI = @CodLocalEmbarque
-- obtem dados do Local Autorizado
			SELECT @DescricaoLocalAutorizado = LME_NOME
			FROM TAB_LMER WITH(NOLOCK)
			WHERE LME_CODI = @LocMercadorias_CodLocalAutorizado
-- obtem dados do Armazém
			SELECT @NomeArmazem = ARM_NOME
			FROM TAB_ARMZ WITH(NOLOCK)
			WHERE ARM_CODI = @LocMercadorias_Armazem_CodArmazem	
-- obtem dados do Tipo de Armazém
			SELECT @NomeTipoArmazem = TAR_DESC
			FROM TAB_TARM WITH(NOLOCK)	
			WHERE TAR_CODI = @LocMercadorias_Armazem_CodTipoArmazem
-- ontem dados do Status de Incidência
			SELECT @DescricaoStatusIncidencia = SIN_DESP, @DataStatusIncidencia = CAST(CONVERT(varchar(10), @DataAtual, 105) as datetime)
			FROM TAB_SINC WITH(NOLOCK)
			WHERE SIN_CODI = @CodStatusIncidencia
-- obtem dados do Aeroporto
			SELECT @NomeAeroporto = PAE_NOME
			FROM TAB_PAER WITH(NOLOCK)
			WHERE PAE_CODI = @MTPartida_CodAeroporto
-- obtem dados de Declarante
			SELECT @NomeDeclarante = DEC_NOME, @NIFDeclarante = DEC_NIF, @TipoDeclarante = DEC_TIPO, 
				@NumDeclaracao = (CASE @Acao WHEN 'I' THEN ISNULL(DEC_NPRO, 1) ELSE (SELECT TOP 1 EXM_CODI FROM PRO_EXML WITH(NOLOCK) WHERE EXM_EANO = YEAR(@Data) and EXM_CPRT = @NumeroCPA ORDER BY EXM_DATA DESC) END), 				
				@Casa54Declarante = (CASE WHEN ISNULL(DEC_CEDU, '') <> '' THEN 'C' WHEN ISNULL(DEC_NIF, '') <> '' THEN 'N' ELSE 'E' END)
			FROM TAB_DECL WITH(NOLOCK)
			WHERE DEC_CODI = @CodOperador									
-- obtem mais dados em falta
			SELECT @MTPartida_CodMT25 = ISNULL(@MTPartida_CodMT25, ISNULL(@MTFronteira_CodMT, @MTPartida_CodMT)), @MTPartida_CodMT26 = ISNULL(@MTPartida_CodMT26, @MTPartida_CodMT), 
				@Lugar = ISNULL(@Lugar, @LocalizacaoCondEntrega), @CambioMoeda = (CASE @CambioMoeda WHEN 0 THEN 1 ELSE @CambioMoeda END), @TotalAdicoes = 0, 
				@TotalVolumes = 0, @MontanteTotal = 0, @MassaLiquidaTotal = 0, @MassaBrutaTotal = 0, @NumLinhaContentor = 0, @ValorRestanteFrete = @TotalFrete
-- processa calculos específicos relacionados com contexto EXP-CAU ou EXP/XML
			IF @IntegracaoEXPCAU = 1
			BEGIN				
				SET @IndicadorRemessaFornecedor = 0
				SET @MTPartida_MatriculaMT = NULL
				SET @MTPartida_TipoMT = NULL
				SET @MTFronteira_TipoMT = NULL
				SET @MTPartida_CodMT25 = NULL
				SET @CodLocalEmbarque = NULL
				SET @DescricaoLocalEmbarque30A = NULL
				SET @LocMercadorias_Armazem_CodEstadoMembro = NULL
				SET @Casa54Declarante = 'C'
				SET @CodStatusIncidencia = NULL 
				SET @DescricaoStatusIncidencia = NULL
				SET @DataStatusIncidencia = NULL
				SET @DadosManifesto_VolsDirty = 0
				SET @ICE = NULL				
				SET @MetodoPagCondEntrega = NULL
				SET @CodEstanciaTN = NULL
				SET @NomeEstanciaTN = NULL
				IF @TipoDeclarante <> 2 
					SET @TipoDeclarante = NULL
				IF @TipoProcedimento IN ('B', 'C', 'E', 'F')
					SET @Contentores = NULL
				SET @NumReferenciaLocal = (RIGHT(STR(@AnoDeclaracao, 4), 2)  + 'PT' + REPLICATE('0', 9 - LEN(@NIFDeclarante)) + @NIFDeclarante + REPLICATE('0', 9 - LEN(CAST(@NumDeclaracao AS varchar(9)))) + CAST(@NumDeclaracao AS varchar(9)))
-- obtém o Anexo B 
				IF (ISNULL(@CamposAdicionais, 0) = 3) AND (ISNULL(@CodTipoDeclaracao, '') = 'COM1') --DHL
					SET @AnexoB = 'B4'
				ELSE
					IF ISNULL(@CamposAdicionais, 0) = 8 --ENTREPOSTO
					BEGIN
						SET @AnexoB = ISNULL(NULLIF((SELECT t.c.value('ValorCampoExtra[1]', 'varchar(2)')
													FROM @CamposExtra.nodes('CamposExtra/CampoExtra') AS t(c)
													WHERE t.c.value('CodigoCampoExtra[1]', 'varchar(10)') = 'ANEXOB' 
														AND t.c.value('ValorCampoExtra[1]', 'varchar(5)') IN ('B1', 'B2', 'B3', 'B4', 'C1', 'C2', 'A1', 'A2')), ''), 'B1')						
					END
					ELSE
						SET @AnexoB = 'B1'
				IF (@AnexoB IN ('B1', 'B2')) AND (ISNULL(@1CasaTipoDeclaracao, '') <> 'EX')
					RAISERROR('Tipo de Declaração "%s" inválido.', 16, 1, @CodTipoDeclaracao)				
-- se Estância de Exportação for "PT000236", assume como Meio Transporte Partida o valor "50"
				IF ISNULL(@CodEstanciaA, '') = 'PT000236'
				BEGIN
					SELECT @MTPartida_CodMT = MTR_CODI, @NomeMTPartida = MTR_NOME
					FROM TAB_MTRA WITH(NOLOCK)
					WHERE MTR_CODI = '50'
				END
				ELSE
				BEGIN
					SET @MTPartida_CodMT = NULL
					SET @NomeMTPartida = NULL
				END													
-- gere a existência do Meio Transporte Fronteira
				IF (LEFT(ISNULL(@RegimeTipoDeclaracao, ''), 2) IN ('21', '22')) OR ((ISNULL(@1CasaTipoDeclaracao, '') = 'CO') AND (LEFT(ISNULL(@RegimeTipoDeclaracao, ''), 2) <> '76'))
				BEGIN
					SET @MTFronteira_CodMT = NULL
					SET @NomeMTFronteira = NULL
				END
				ELSE
					IF (ISNULL(@MTFronteira_CodMT, '') = '') AND (ISNULL(@CodEstanciaA, '') = ISNULL(@CodEstanciaTAC, ''))
					BEGIN
						SELECT @MTFronteira_CodMT = MTR_CODI, @NomeMTFronteira = MTR_NOME
						FROM TAB_MTRA WITH(NOLOCK)
						WHERE MTR_CODI = @CodMTEstancia						
					END
					ELSE
						IF (ISNULL(@MTFronteira_CodMT, '') = '') AND (@TipoProcedimento NOT IN ('B', 'C', 'E', 'F'))
						BEGIN
							SELECT @MTFronteira_CodMT = MTR_CODI, @NomeMTFronteira = MTR_NOME
							FROM TAB_MTRA WITH(NOLOCK)
							WHERE MTR_CODI = @MTPartida_CodMT						
						END		
-- se Meio Transporte Fronteira	não definido, limpa restantes campos associados
				IF (ISNULL(@MTFronteira_CodMT, '') = '') OR (LEFT(@MTFronteira_CodMT, 1) IN ('5', '7')) 								
				BEGIN
					SET @MTFronteira_MatriculaMT = NULL
					SET @TipoMTFronteira = NULL
					SET @MTFronteira_CodPais = NULL
					SET @NomePaisMTFronteira = NULL					
				END
-- se Estância de Exportação igual a Estância de Saída, limpa Meio Transporte Interior
				IF ISNULL(@CodEstanciaA, '') = ISNULL(@CodEstanciaTAC, '')
					SET @MTPartida_CodMT26 = NULL
-- gere campos da Condição de Entega
				IF ISNULL(@CodCondEntrega, '') = 'XXX'
				BEGIN
					SET @Lugar = NULL
					SET @CodPaisCondEntrega = NULL
					SET @TextoCondEntrega = 'Livre de Encargos'
				END
				ELSE
					SET @TextoCondEntrega = NULL
-- gere a existência da Natureza de Transação
				IF (LEFT(ISNULL(@RegimeTipoDeclaracao, ''), 2) IN ('71', '76')) OR (@TipoProcedimento IN ('B', 'C', 'E', 'F'))
				BEGIN
					SET @CodNaturezaTransacao = NULL
					SET @NomeNaturezaTransacao = NULL
				END
				ELSE	
					IF ISNULL(@CodNaturezaTransacao, '') = ''
					BEGIN
						SELECT @CodNaturezaTransacao = NTR_CODI, @NomeNaturezaTransacao = NTR_NOME
						FROM TAB_NTRA WITH(NOLOCK)
						WHERE NTR_CODI = '11'
					END
-- gere a existência do Follow-Up
				IF (@CodFollowUp IS NOT NULL) AND (EXISTS(SELECT 1 FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK) WHERE FUP_CODI = @CodFollowUp AND FUP_VUTI = 1))
					SET @CodFollowUp = NULL										
-- se cliente (exportador) não existir, assume como cliente o "Consumidor Final"							
				IF ISNULL(@Expedidor_Codigo, '') = '' 
				BEGIN
					SELECT TOP 1 @Expedidor_Codigo = CLI_CODI, @CodigoClienteCC = ISNULL(NULLIF(CLI_CCOR, ''), CLI_CODI)
					FROM TAB_CLIE WITH(NOLOCK) 
					WHERE CLI_INAC = 0 AND CLI_DESP = 1 AND CLI_NIF = '999999990'
				END
-- obtem o País e respetivo Câmbio para o Frete e Seguro							
				SELECT @CodPaisFreteSeguro = PAI_CODI 
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = 'EU'		
				SET @CambioFreteSeguro = dbo.FNT_Geral_ObtemCambio(1, @CodPaisFreteSeguro, @Data)
-- preenche o Tipo de Localização e Qualificador
				IF ISNULL(@LocMercadorias_CodLocalAutorizado, '') <> ''
				BEGIN
					SET @TipoLocalizacao = 'B'
					SET @Qualificador = 'Y'
				END
				ELSE
					IF ISNULL(@LocMercadorias_CodEstancia30, '') <> ''
					BEGIN
						SET @TipoLocalizacao = 'A'
						SET @Qualificador = 'V'
					END
					ELSE					
						IF ISNULL(@LocMercadorias_OutroLocal_Morada, '') <> ''
						BEGIN
							SET @TipoLocalizacao = 'D'
							SET @Qualificador = 'Z'
						END
						ELSE
							IF ISNULL(@LocMercadorias_CodLocalEmbarque, '') <> ''
							BEGIN
								SET @TipoLocalizacao = 'A'
								SET @Qualificador = 'U'
							END
							ELSE
							BEGIN
								SET @TipoLocalizacao = 'A'
								SET @Qualificador = 'V'
								SET @LocMercadorias_CodEstancia30 = @CodEstanciaA
							END						
-- se Morada da Localização das Mercadorias definida, preenche o País da Morada
				IF ISNULL(@LocMercadorias_OutroLocal_Morada, '') <> ''
					SET @CodPaisLocMercadorias = @Expedidor_CodPais
				ELSE
					SET @CodPaisLocMercadorias = NULL	
-- obtém dados do Aperfeiçoamento
				IF (@TipoProcedimento IN ('A', 'D')) AND (LEFT(ISNULL(@RegimeTipoDeclaracao, ''), 2) IN ('21', '22')) AND (@TipoDeclarante = 1) --tipo declarante como "Próprio"	
				BEGIN
					SET @CodEstanciaAperfeicoamento = @CodEstanciaA
					SET @PrazoApuramento = '*****N/A*****'
					SET @AtividadesPrevistas = '*****N/A*****'
				END	
				ELSE
				BEGIN
					SET @CodEstanciaAperfeicoamento = NULL
					SET @PrazoApuramento = NULL
					SET @AtividadesPrevistas = NULL
				END		
-- obtém a máscara de faturação do cliente/natureza
				SET @NumMascaras = 1
				SET @TipoMascara = 0
				SET @CodMascara = 0
				EXEC SP_ObtemMascaraFacturacao @CodigoClienteCC, @CodNatureza, @NumMascaras OUTPUT, @TipoMascara OUTPUT, @CodMascara OUTPUT
-- obtém se 1ª adição é "P" (Parte)
				SELECT TOP 1 @1AdicaoParte = a.m.value('P[1]', 'bit')
				FROM @Adicoes.nodes('Adicoes/Adicao[1]/MarcasEVolumes/MarcaEVolume') AS a(m)
			END
			ELSE
			BEGIN				
				SET @CodPaisCondEntrega = NULL
				SET @TextoCondEntrega = NULL
				SET @CodPaisFreteSeguro = NULL
				SET @CambioFreteSeguro = 0
				SET @TipoLocalizacao = 'B'
				SET @Qualificador = 'Y'
				SET @CodPaisLocMercadorias = NULL
				SET @AnexoB = 'B1'
				SET @RegimeTipoDeclaracao = NULL				
				SET @TipoMTFronteira = NULL
				SET @CodEstanciaAperfeicoamento = NULL
				SET @PrazoApuramento = NULL
				SET @AtividadesPrevistas = NULL
				SET @TipoMascara = 0 
				SET @CodMascara = NULL
				SET @1AdicaoParte = 0
				SET @NumReferenciaLocal = (STR(@AnoDeclaracao, 4) + 'PT' + REPLICATE('0', 9 - LEN(@NIFDeclarante)) + @NIFDeclarante + REPLICATE('0', 7 - LEN(CAST(@NumDeclaracao as varchar(10)))) + CAST(@NumDeclaracao as varchar(10)))
-- se Follow-Up não definido obtem Follow-Up do contexto "Exportação" configurado como estado inicial
				IF @CodFollowUp IS NULL 
				BEGIN
					SELECT TOP 1 @CodFollowUp = FUP_CODI 
					FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK) 
					WHERE FUP_EINI = 1 and FUP_EXPO = 1
				END
			END
-- se ação for de "Insert"
			IF @Acao = 'I'
			BEGIN													
-- insere Dados Gerais da declaração			
				INSERT INTO PRO_EXML(EXM_EANO, EXM_CODI, DEC_CODI, EXM_TPRO, NDE_CODI, NDE_NOME, DEC_NOME, EXM_DATA, EXM_NRIN, EXM_NRLO, EXM_STAT, EAD_CODA, EAD_NOMA, TDE_COD1, TDE_NOM1, CLI_COD2, 
					CLI_NOM2, CLI_MOR2, CLI_LOC2, CLI_CPO2, CLI_LPO2, CLI_NIF2, CLI_PAI2, EXM_TP2A, EXM_TI2B, FOR_COD8, FOR_NOM8, FOR_MOR8, FOR_LOC8, FOR_CPO8, FOR_LPO8, FOR_NIF8, FOR_PAI8, 
					EXM_IROR, DEC_CO14, DEC_NO14, EXM_TP14, EXM_P15A, EXM_P17A, MTR_CO18, MTR_NO18, EXM_TP18, EXM_MT18, EXM_P18C, MTR_CO21, MTR_NO21, EXM_TP21, EXM_MT21, PAI_CO21, PAI_NO21, 
					MTR_CO25, MTR_CO26, CEN_CO20, CEN_NO20, EXM_FR20, EXM_LG20, NTR_CO24, NTR_NO24, PAI_CO22, PAI_MO22, EXM_UFOB, EXM_VFOB, EXM_TX23, EXM_TFRT, EXM_TSEG, EAD_CO29, EAD_NO29, 
					EAD_C29A, EAD_N29A, EAD_CO30, EAD_NO30, LEM_CO30, LEM_NO30, LME_CO30, LME_NO30, EXM_MR30, EXM_CP30, EXM_LP30, LEM_C30A, LEM_N30A, ARM_CO49, ARM_NO49, TAR_CO49, TAR_DE49, 
					EXM_ESTM, EXM_Q30C, EXM_UCRI, EXM_DTCR, EXM_UALT, EXM_DTAL, EXM_MASC, EXM_VLRC, EXM_CA54, FIN_CODI, EXM_NRII, EXM_NVRF, EXM_EXNO, EXM_EXMO, EXM_EXLC, EXM_EXCP, EXM_EXLP, 
					EXM_EXPS, EXM_EXCT, EXM_DENO, EXM_DEMO, EXM_DELC, EXM_DEPS, EXM_2P22, EXM_2M22, EXM_2MLQ, EXM_2MBR, EXM_CPRT, EXM_MCPA, EXM_TPCG, EXM_DTVO, EXM_DTYP, EXM_FUPS, EXM_CIEX, 
					EXM_CIDE, EXM_PPFC, EXM_NVOO, EXM_REF1, EXM_REF2, EXM_TRAC, EXM_SHIP, EXM_VDIR, SIN_CODI, SIN_DESP, EXM_INCE, EXM_NCMR, EXM_DTMP, EXM_TMSF, CLI_CODI, CLI_NOME, PAE_CODI, 
					PAE_NOME, EXM_ANOT, EXM_DINC, FUP_CODI, EXM_HVLV, EXM_CMPX, EXM_CNTX, PAI_CODI, EXM_TXTC, PAI_CODI2, EXM_CFRE, PAI_CODI3, EXM_CSEG, EXM_TLOC, EXM_QUAL, PAI_CODI5, EAD_CODI1, 
					EXM_PRZA, EXM_ATVP, EXM_ANXB, EXM_REGI, EXM_MTFT)
				OUTPUT inserted.EXM_IDTY INTO @TblID		
				VALUES(@AnoDeclaracao, @NumDeclaracao, @CodOperador, @TipoProcedimento, @CodNatureza, @NomeNatureza, @NomeDeclarante, @Data, CAST(@NumDeclaracao AS varchar(20)), @NumReferenciaLocal, 0, @CodEstanciaA, @NomeEstanciaA, @CodTipoDeclaracao, @NomeTipoDeclaracao, @Expedidor_Codigo, 
					@Expedidor_Nome, @Expedidor_Morada, @Expedidor_Localidade, @Expedidor_CodPostal, @Expedidor_LocPostal, @Expedidor_NIF, @Expedidor_CodPais, @TipoNIFCliente, @TipoIdCliente, @Destinatario_Codigo, @Destinatario_Nome, @Destinatario_Morada, @Destinatario_Localidade, @Destinatario_CodPostal, @Destinatario_LocPostal, @Destinatario_NIF, @Destinatario_CodPais, 
					@IndicadorRemessaFornecedor, @CodOperador, @NomeDeclarante, @TipoDeclarante, @CodPais15A, @CodPais17A, @MTPartida_CodMT, @NomeMTPartida, @MTPartida_TipoMT, @MTPartida_MatriculaMT, 0, @MTFronteira_CodMT, @NomeMTFronteira, @MTFronteira_TipoMT, @MTFronteira_MatriculaMT, @MTFronteira_CodPais, @NomePaisMTFronteira, 										
					@MTPartida_CodMT25, @MTPartida_CodMT26, @CodCondEntrega, @NomeCondEntrega, @DescricaoFormula, @Lugar, @CodNaturezaTransacao, @NomeNaturezaTransacao, @CodPais, @MoedaPais22, @FormulaFOB, 0, @CambioMoeda, @TotalFrete, @TotalSeguro, @CodEstanciaTAC, @NomeEstanciaTAC, 
					@CodEstanciaTN, @NomeEstanciaTN, @LocMercadorias_CodEstancia30, @NomeEstancia30, @LocMercadorias_CodLocalEmbarque, @DescricaoLocalEmbarque, @LocMercadorias_CodLocalAutorizado, @DescricaoLocalAutorizado, @LocMercadorias_OutroLocal_Morada, @LocMercadorias_OutroLocal_CodPostal, @LocMercadorias_OutroLocal_LocPostal, @CodLocalEmbarque, @DescricaoLocalEmbarque30A, @LocMercadorias_Armazem_CodArmazem, @NomeArmazem, @LocMercadorias_Armazem_CodTipoArmazem, @NomeTipoArmazem, 
					@LocMercadorias_Armazem_CodEstadoMembro, 0, @Utilizador, @DataAtual, @Utilizador, @DataAtual, @CodMascara, 0, @Casa54Declarante, @CodFormula, @NumDeclaracao, @VossaReferencia, @DadosManifesto_NomeExpedidor, @DadosManifesto_MoradaExpedidor, @DadosManifesto_LocalidadeExpedidor, @DadosManifesto_CodPostalExpedidor, @DadosManifesto_LocPostalExpedidor, 
					@DadosManifesto_CodPaisExpedidor, @DadosManifesto_NIFExpedidor, @DadosManifesto_NomeDestinatario, @DadosManifesto_MoradaDestinatario, @DadosManifesto_LocalidadeDestinatario, @DadosManifesto_CodPaisDestinatario, @DadosManifesto_CodPais, @DadosManifesto_Montante, @DadosManifesto_MassaLiqTotal, @DadosManifesto_MassaBrtTotal, @NumeroCPA, @DadosManifesto_MiniCPA, @TipoCarga, @DataVoo, @DadosManifesto_DutyType, @DadosManifesto_NomeFicheiro, @DadosManifesto_CodExpedidor, 
					@DadosManifesto_CodDestinatario, @DadosManifesto_PPouFC, @DadosManifesto_NumeroVoo, @DadosManifesto_Referencia1, @DadosManifesto_Referencia2, @DadosManifesto_Tracking, @DadosManifesto_Shipping, @DadosManifesto_VolsDirty, @CodStatusIncidencia, @DescricaoStatusIncidencia, @ICE, @NumeroComercialRef, @MetodoPagCondEntrega, @TipoMascara, @CodClienteServico, @NomeClienteServico, @MTPartida_CodAeroporto, 
					@NomeAeroporto, @Anotacoes, @DataStatusIncidencia, @CodFollowUp, @HVLV, @CamposExtra, @IntegracaoEXPCAU, @CodPaisCondEntrega, @TextoCondEntrega, @CodPaisFreteSeguro, @CambioFreteSeguro, @CodPaisFreteSeguro, @CambioFreteSeguro, @TipoLocalizacao, @Qualificador, @CodPaisLocMercadorias, @CodEstanciaAperfeicoamento, 
					@PrazoApuramento, @AtividadesPrevistas, @AnexoB, @RegimeTipoDeclaracao, @TipoMTFronteira)		
-- obtém ID da Declaração inserida
				SELECT @IdDeclaracao = ID
				FROM @TblID			
-- actualiza Nº. Prox. Declaração no Declarante
				IF @IntegracaoEXPCAU = 0
				BEGIN
					UPDATE TAB_DECL SET DEC_NPRO = ISNULL(DEC_NPRO, 0) + 1
					WHERE DEC_CODI = @CodOperador
				END
			END
			ELSE			
			BEGIN				
-- edita Dados Gerais da declaração	
				IF ISNULL(@CamposAdicionais, 0) = 8 --ENTREPOSTO
				BEGIN					
					SELECT @NumDeclaracao = t.c.value('ValorCampoExtra[1]', 'varchar(20)')
					FROM @CamposExtra.nodes('CamposExtra/CampoExtra') AS t(c)
					WHERE t.c.value('CodigoCampoExtra[1]', 'varchar(100)') = 'EXM_CODI'
				END
				ELSE
				BEGIN		
					UPDATE PRO_EXML SET EXM_TPRO = @TipoProcedimento, NDE_CODI = @CodNatureza, NDE_NOME = @NomeNatureza, DEC_NOME = @NomeDeclarante, EXM_DATA = @Data, 
						EXM_NRLO = @NumReferenciaLocal, EAD_CODA = @CodEstanciaA, EAD_NOMA = @NomeEstanciaA, TDE_COD1 = @CodTipoDeclaracao, TDE_NOM1 = @NomeTipoDeclaracao, 
						CLI_COD2 = @Expedidor_Codigo, CLI_NOM2 = @Expedidor_Nome, CLI_MOR2 = @Expedidor_Morada, CLI_LOC2 = @Expedidor_Localidade, CLI_CPO2 = @Expedidor_CodPostal, 
						CLI_LPO2 = @Expedidor_LocPostal, CLI_NIF2 = @Expedidor_NIF, CLI_PAI2 = @Expedidor_CodPais, EXM_TP2A = @TipoNIFCliente, EXM_TI2B = @TipoIdCliente, 
						FOR_COD8 = @Destinatario_Codigo, FOR_NOM8 = @Destinatario_Nome, FOR_MOR8 = @Destinatario_Morada, FOR_LOC8 = @Destinatario_Localidade, FOR_CPO8 = @Destinatario_CodPostal, 
						FOR_LPO8 = @Destinatario_LocPostal, FOR_NIF8 = @Destinatario_NIF, FOR_PAI8 = @Destinatario_CodPais, EXM_IROR = @IndicadorRemessaFornecedor, DEC_CO14 = @CodOperador, 
						DEC_NO14 = @NomeDeclarante, EXM_TP14 = @TipoDeclarante, EXM_P15A = @CodPais15A, EXM_P17A = @CodPais17A, MTR_CO18 = @MTPartida_CodMT, MTR_NO18 = @NomeMTPartida, 
						EXM_TP18 = @MTPartida_TipoMT, EXM_MT18 = @MTPartida_MatriculaMT, MTR_CO21 = @MTFronteira_CodMT, MTR_NO21 = @NomeMTFronteira, EXM_TP21 = @MTFronteira_TipoMT, 
						EXM_MT21 = @MTFronteira_MatriculaMT, PAI_CO21 = @MTFronteira_CodPais, PAI_NO21 = @NomePaisMTFronteira, MTR_CO25 = @MTPartida_CodMT25, MTR_CO26 = @MTPartida_CodMT26, 
						CEN_CO20 = @CodCondEntrega, CEN_NO20 = @NomeCondEntrega, EXM_FR20 = @DescricaoFormula, EXM_LG20 = @Lugar, NTR_CO24 = @CodNaturezaTransacao, 
						NTR_NO24 = @NomeNaturezaTransacao, PAI_CO22 = @CodPais, PAI_MO22 = @MoedaPais22, EXM_TX23 = @CambioMoeda, EXM_TFRT = @TotalFrete, EXM_TSEG = @TotalSeguro, 
						EAD_CO29 = @CodEstanciaTAC, EAD_NO29 = @NomeEstanciaTAC, EAD_C29A = @CodEstanciaTN, EAD_N29A = @NomeEstanciaTN, EAD_CO30 = @LocMercadorias_CodEstancia30, 
						EAD_NO30 = @NomeEstancia30, LEM_CO30 = @LocMercadorias_CodLocalEmbarque, LEM_NO30 = @DescricaoLocalEmbarque, LME_CO30 = @LocMercadorias_CodLocalAutorizado, 
						LME_NO30 = @DescricaoLocalAutorizado, EXM_MR30 = @LocMercadorias_OutroLocal_Morada, EXM_CP30 = @LocMercadorias_OutroLocal_CodPostal, 
						EXM_LP30 = @LocMercadorias_OutroLocal_LocPostal, LEM_C30A = @CodLocalEmbarque, LEM_N30A = @DescricaoLocalEmbarque30A, ARM_CO49 = @LocMercadorias_Armazem_CodArmazem, 
						ARM_NO49 = @NomeArmazem, TAR_CO49 = @LocMercadorias_Armazem_CodTipoArmazem, TAR_DE49 = @NomeTipoArmazem, EXM_ESTM = @LocMercadorias_Armazem_CodEstadoMembro, 
						EXM_UALT = @Utilizador, EXM_DTAL = @DataAtual, EXM_CA54 = @Casa54Declarante, FIN_CODI = @CodFormula, EXM_NVRF = @VossaReferencia, EXM_EXNO = @DadosManifesto_NomeExpedidor, 
						EXM_EXMO = @DadosManifesto_MoradaExpedidor, EXM_EXLC = @DadosManifesto_LocalidadeExpedidor, EXM_EXCP = @DadosManifesto_CodPostalExpedidor, 
						EXM_EXLP = @DadosManifesto_LocPostalExpedidor, EXM_EXPS = @DadosManifesto_CodPaisExpedidor, EXM_EXCT = @DadosManifesto_NIFExpedidor, 
						EXM_DENO = @DadosManifesto_NomeDestinatario, EXM_DEMO = @DadosManifesto_MoradaDestinatario, EXM_DELC = @DadosManifesto_LocalidadeDestinatario, 
						EXM_DEPS = @DadosManifesto_CodPaisDestinatario, EXM_2P22 = @DadosManifesto_CodPais, EXM_2M22 = @DadosManifesto_Montante, EXM_2MLQ = @DadosManifesto_MassaLiqTotal, 
						EXM_2MBR = @DadosManifesto_MassaBrtTotal, EXM_CPRT = @NumeroCPA, EXM_MCPA = @DadosManifesto_MiniCPA, EXM_TPCG = @TipoCarga, EXM_DTVO = @DataVoo, 
						EXM_DTYP = @DadosManifesto_DutyType, EXM_FUPS = @DadosManifesto_NomeFicheiro, EXM_CIEX = @DadosManifesto_CodExpedidor, EXM_CIDE = @DadosManifesto_CodDestinatario, 
						EXM_PPFC = @DadosManifesto_PPouFC, EXM_NVOO = @DadosManifesto_NumeroVoo, EXM_REF1 = @DadosManifesto_Referencia1, EXM_REF2 = @DadosManifesto_Referencia2, 
						EXM_TRAC = @DadosManifesto_Tracking, EXM_SHIP = @DadosManifesto_Shipping, EXM_VDIR = @DadosManifesto_VolsDirty, SIN_CODI = @CodStatusIncidencia, 
						SIN_DESP = @DescricaoStatusIncidencia, EXM_INCE = @ICE, EXM_NCMR = @NumeroComercialRef, EXM_DTMP = @MetodoPagCondEntrega, CLI_CODI = @CodClienteServico, 
						CLI_NOME = @NomeClienteServico, PAE_CODI = @MTPartida_CodAeroporto, PAE_NOME = @NomeAeroporto, EXM_DINC = @DataStatusIncidencia, FUP_CODI = @CodFollowUp, EXM_HVLV = @HVLV, 
						EXM_CMPX = @CamposExtra
					WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @NumDeclaracao AND DEC_CODI = @CodOperador
				END
-- remove todos os Contentores existentes na declaração
				DELETE FROM PRO_EXCT
				WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @NumDeclaracao AND EXM_COPE = @CodOperador
-- remove todas as Adições existentes na declaração
				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_EXAD				
				WHERE EXM_EANO = @AnoDeclaracao AND EXM_CODI = @NumDeclaracao AND EXM_COPE = @CodOperador
				SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
			END
-- carrega Contentores XML da declaração
			DECLARE Contentores CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT XML_CONT.CON_DATA.value('NumeroContentor[1]', 'varchar(50)')
				FROM @Contentores.nodes('Contentores/Contentor') as XML_CONT(CON_DATA)
			OPEN Contentores
			FETCH NEXT from Contentores into @NumeroContentor
			WHILE @@FETCH_STATUS = 0
			BEGIN			
-- obtem dados em falta
				SELECT @NumLinhaContentor = @NumLinhaContentor + 1
-- insere Contentor na declaração
				INSERT INTO PRO_EXCT(EXM_EANO, EXM_CODI, EXM_COPE, EXC_LINH, EXC_CONT)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @CodOperador, @NumLinhaContentor, @NumeroContentor)				
				FETCH NEXT from Contentores into @NumeroContentor
			END
			CLOSE Contentores
			DEALLOCATE Contentores
-- carrega Documentos da 1ª adição na declaração EXP-CAU quando o período transitório inativo
			IF (@Acao = 'I') AND (@IntegracaoEXPCAU = 1) AND (@PeriodoTransitorio = 0)
			BEGIN
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT a.d.value('CodDocumento[1]', 'varchar(5)'), NULLIF(a.d.value('NumeroReferencia[1]', 'varchar(50)'), '')
					FROM @Adicoes.nodes('Adicoes/Adicao[1]/Documentos/Documento') AS a(d)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @CodDocumento, @NumeroReferencia
				WHILE @@FETCH_STATUS = 0
				BEGIN	
-- inicia variáveis
					SET @IdDocumento = NULL
					SET @TipoDocumento = NULL
-- obtem dados do documento
					SELECT @IdDocumento = DOC_IDTY, @TipoDocumento = DOC_DTRA, 
						@NumeroReferencia = ISNULL(@NumeroReferencia, (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 DOC_CODI = @CodDocumento									
-- insere o documento no detalhe de documentos e certificados na nova declaracao EXP-CAU
					INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, id_utilizadorControlo, dataControlo)
					VALUES (@IdDeclaracao, @TipoDocumento, @IdDocumento, @NumeroReferencia, @IdUtilizador, @DataAtual)	
					FETCH NEXT FROM Documentos INTO @CodDocumento, @NumeroReferencia
				END
				CLOSE Documentos
				DEALLOCATE Documentos
			END
-- obtem o total de massa bruta e número de adições total existentes no xml da declaração
			SELECT @MassaBrtTotalAdicoesXML = SUM(ISNULL(XML_ADIC.ADI_DATA.value('MassaBruta[1]', 'numeric(38, 6)'), 0)), @NumTotalAdicoesXML = COUNT(*)
			FROM @Adicoes.nodes('Adicoes/Adicao') as XML_ADIC(ADI_DATA)			
-- carrega Adições XML da declaração
			DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT XML_ADIC.ADI_DATA.value('NumeroAdicao[1]', 'int'), XML_ADIC.ADI_DATA.value('CodArtigo[1]', 'varchar(22)'), XML_ADIC.ADI_DATA.value('DesignacaoArtigo[1]', 'varchar(150)'), 
					NULLIF(XML_ADIC.ADI_DATA.value('CodPaisOrigem[1]', 'varchar(2)'), ''), ISNULL(XML_ADIC.ADI_DATA.value('MassaBruta[1]', 'numeric(38, 6)'), 0), 
					ISNULL(XML_ADIC.ADI_DATA.value('MassaLiquida[1]', 'numeric(38, 6)'), 0),  XML_ADIC.ADI_DATA.value('Regime[1]', 'varchar(4)'), 
					NULLIF(XML_ADIC.ADI_DATA.value('Desdobramento[1]', 'varchar(3)'), ''), ISNULL(XML_ADIC.ADI_DATA.value('QtdUnidades[1]', 'numeric(38, 6)'), 0), 
					ISNULL(XML_ADIC.ADI_DATA.value('ValorAdicao[1]', 'numeric(38, 6)'), 0), ISNULL(XML_ADIC.ADI_DATA.value('ValorFrete[1]', 'numeric(38, 6)'), 0), 
					ISNULL(XML_ADIC.ADI_DATA.value('ValorSeguro[1]', 'numeric(38, 6)'), 0), XML_ADIC.ADI_DATA.query('DocsPrecedentes'), XML_ADIC.ADI_DATA.query('RegimesEconomicos'), 
					XML_ADIC.ADI_DATA.query('Documentos'), XML_ADIC.ADI_DATA.query('MencoesEspeciais'), XML_ADIC.ADI_DATA.query('MarcasEVolumes')
				FROM @Adicoes.nodes('Adicoes/Adicao') as XML_ADIC(ADI_DATA)
			OPEN Adicoes
			FETCH NEXT from Adicoes into @NumeroAdicao, @CodArtigo, @DesignacaoArtigo, @CodPaisOrigem, @MassaBruta, @MassaLiquida, @Regime, @Desdobramento, @QtdUnidades, @ValorAdicao, @ValorFrete, @ValorSeguro, 
				@DocsPrecedentes, @RegimesEconomicos, @Documentos, @MencoesEspeciais, @MarcasEVolumes
			WHILE @@FETCH_STATUS = 0
			BEGIN	
				DELETE FROM @TblID
				SET @IDAdicao = NULL	
-- obtem dados do Artigo Pautal
				SELECT @CodPautal = APA_CPAU, @CodUnidSuplementar = USU_CODI, @IndicadorArtigo = APA_INDI, @AnexoCArtigo = APA_ANXC, @AnexoDArtigo = APA_ANXD, @CodMercPerigosasArtigo = APA_ATAR, 
					@CodigoIC1Artigo = APA_AIC1, @CodigoIC2Artigo = APA_AIC2, @CodigoIC3Artigo = APA_AIC3, @CodigoIC4Artigo = APA_AIC4, @CodigoIC5Artigo = APA_AIC5, @CodigoCUSArtigo = APA_CCUS, 
					@QtdUnidades = (CASE WHEN (@QtdUnidades > 0) AND (ISNULL(USU_CODI, '') = '') THEN 0 ELSE @QtdUnidades END)
				FROM TAB_APAU WITH (NOLOCK)
				WHERE APA_CODI = @CodArtigo					
-- obtem dados da Unidade Suplementar
				SELECT @NomeUnidSuplementar = USU_SIGL
				FROM TAB_USUP WITH (NOLOCK)
				WHERE USU_CODI = @CodUnidSuplementar
-- se declaração tiver valor de frete e adição não descrimar frete, efetua o calculo do frete p/ a adição c/ base no valor da massa bruta
				IF (@TotalFrete > 0) AND (@ValorFrete = 0)
				BEGIN
					IF @NumeroAdicao < @NumTotalAdicoesXML						
						SET @ValorFrete = ROUND(@TotalFrete * @MassaBruta / @MassaBrtTotalAdicoesXML, 3)
					ELSE
						SET @ValorFrete = @ValorRestanteFrete
					SET @ValorRestanteFrete = @ValorRestanteFrete - @ValorFrete
				END				
-- obtem dados do País Origem
				SELECT @NomePaisOrigem = PAI_NOME
				FROM TAB_PAIS WITH (NOLOCK)
				WHERE PAI_CODI = @CodPaisOrigem	
-- processa calculos específicos relacionados com contexto EXP-CAU ou EXP/XML
				IF @IntegracaoEXPCAU = 1
				BEGIN	
					SET @CodMercPerigosasArtigo = NULL
					IF @AnexoB <> 'B1'
						SET @CodigoCUSArtigo = NULL
					SET @RegimesEconomicos = NULL
					SET @MencoesEspeciais = NULL
					IF (@PeriodoTransitorio = 0) AND (@NumeroAdicao = 1)
						SET @Documentos = NULL
					IF (@1AdicaoParte = 1) AND (@NumeroAdicao > 1)
						SET @MarcasEVolumes = NULL
					IF @Regime <> ISNULL(@RegimeTipoDeclaracao, '')
						RAISERROR('Regime "%s" inválido.', 16, 2, @Regime)
-- calcula adicionais TARIC
					SET @AdicionalTARIC1Artigo = SUBSTRING(@CodPautal, 11, 4)
					SET @AdicionalTARIC2Artigo = SUBSTRING(@CodPautal, 15, 4)
					SET @AdicionalTARIC3Artigo = SUBSTRING(@CodPautal, 19, 4)
-- calcula ajustamento (usa a função IMP porque a formula de cálculo é a mesma para EXP)
					SET @Ajustamento = dbo.fn_IMP_CalculaAjustamento(@DescricaoFormula, 0, @CambioFreteSeguro, @CambioFreteSeguro, @valorFrete, @valorSeguro, 0, 0, 0)
-- calcula valor estatístico
					SET @ValorEstatistico = (ROUND(@ValorAdicao / @CambioMoeda, 2) + @Ajustamento)
-- obtém o ID do desdobramento do regime
					SELECT TOP 1 @IdDesdobramento = id
					FROM tb_TBL_Desdobramentos WITH(NOLOCK)
					WHERE tipoDeclaracao = ISNULL(@1CasaTipoDeclaracao, '') AND regime = @Regime AND desdobramento1 = ISNULL(@Desdobramento, '')
				END
				ELSE
				BEGIN
					SET @AdicionalTARIC1Artigo = NULL
					SET @AdicionalTARIC2Artigo = NULL
					SET @AdicionalTARIC3Artigo = NULL
					SET @CodigoIC1Artigo = NULL
					SET @CodigoIC2Artigo = NULL
					SET @CodigoIC3Artigo = NULL
					SET @CodigoIC4Artigo = NULL
					SET @CodigoIC5Artigo = NULL
					SET @CodigoCUSArtigo = NULL
					SET @IdDesdobramento = NULL
					SET @Ajustamento = 0
-- calcula valor estatístico
					SET @ValorEstatistico = (ROUND(@ValorAdicao / @CambioMoeda, 3) - @ValorFrete - @ValorSeguro)
-- obtem dados do pais "PT"/"EU" se Pais Origem não preenchido
					IF @CodPaisOrigem IS NULL	
					BEGIN
						IF @IndicadorArtigo = 'RE'
						BEGIN
							SELECT @CodPaisOrigem = PAI_CODI 
							FROM TAB_PAIS WITH (NOLOCK)
							WHERE PAI_CODI = 'EU'
						END
						ELSE
						BEGIN
							SELECT @CodPaisOrigem = PAI_CODI 
							FROM TAB_PAIS WITH (NOLOCK)
							WHERE PAI_CODI = 'PT'
						END
					END	
				END
-- insere Adições na declaração		
				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_EXAD(EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, APA_CO33, APA_CP33, APA_DESG, PAI_CODI, PAI_NOME, EXA_MBRT, EXA_DESD, EXA_MLQD, EXA_QUSU, USU_CODI, USU_SIGL, EXA_VALO, 
					EXA_VFRE, EXA_VSEG, EXA_VEST, EXA_IRES, EXA_ANXC, EXA_ANXD, TDE_REGI, EXA_ATAR, EXA_ATA1, EXA_ATA2, EXA_ATA3, EXA_AIC1, EXA_AIC2, EXA_AIC3, EXA_AIC4, EXA_AIC5, EXA_CCUS, 
					id_desdobramento, EXA_AJUS)
				OUTPUT inserted.EXA_CHVE INTO @TblID	
				VALUES(@AnoDeclaracao, @NumDeclaracao, @CodOperador, @NumeroAdicao, @CodArtigo, @CodPautal, @DesignacaoArtigo, @CodPaisOrigem, @NomePaisOrigem, @MassaBruta, @Desdobramento, @MassaLiquida, @QtdUnidades, @CodUnidSuplementar, @NomeUnidSuplementar, @ValorAdicao, 
					@ValorFrete, @ValorSeguro, @ValorEstatistico, @IndicadorArtigo, @AnexoCArtigo, @AnexoDArtigo, @Regime, @CodMercPerigosasArtigo, @AdicionalTARIC1Artigo, @AdicionalTARIC2Artigo, @AdicionalTARIC3Artigo, @CodigoIC1Artigo, @CodigoIC2Artigo, @CodigoIC3Artigo, @CodigoIC4Artigo, @CodigoIC5Artigo, @CodigoCUSArtigo, 
					@IdDesdobramento, @Ajustamento)
				SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
-- obtém ID da Adição inserida
				SELECT @IDAdicao = ID
				FROM @TblID
-- incrementa variaveis
				SELECT @TotalAdicoes = @TotalAdicoes + 1, @MontanteTotal = @MontanteTotal + @ValorAdicao, @MassaLiquidaTotal = @MassaLiquidaTotal + @MassaLiquida, 
					@MassaBrutaTotal = @MassaBrutaTotal + @MassaBruta, @NumLinhaDocPrecedente = 0					
-- carrega Documentos XML da adição
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_DOCS.DOC_DATA.value('CodDocumento[1]', 'varchar(5)'), NULLIF(XML_DOCS.DOC_DATA.value('NumeroReferencia[1]', 'varchar(50)'), ''), 
						XML_DOCS.DOC_DATA.value('DataEmissao[1]', 'datetime'), XML_DOCS.DOC_DATA.value('DataFimValidade[1]', 'datetime')				
					FROM @Documentos.nodes('Documentos/Documento') as XML_DOCS(DOC_DATA)
				OPEN Documentos
				FETCH NEXT from Documentos into @CodDocumento, @NumeroReferencia, @DataEmissao, @DataFimValidade
				WHILE @@FETCH_STATUS = 0
				BEGIN	
-- obtem dados do Documento
					SELECT @NomeDocumento = DOC_NOME, @TipoDocumento = DOC_DTRA, 
						@NumeroReferencia = ISNULL(@NumeroReferencia, (CASE DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END)), 
						@DataEmissao = ISNULL(@DataEmissao, (CASE DOC_TDDT WHEN 1 THEN @Data ELSE NULL END))
					FROM TAB_DOCU WITH (NOLOCK)	
					WHERE DOC_CODI = @CodDocumento				
-- processa calculos específicos relacionados com contexto EXP-CAU ou EXP/XML
					IF @IntegracaoEXPCAU = 1
					BEGIN	
						SET @DataEmissao = NULL 
						SET @DataFimValidade = NULL
						IF ISNULL(@NumeroReferencia, '') = ''
							SET @NumeroReferencia = '*****N/A*****'
						IF (@TipoDocumento = 0) AND (LEFT(@CodDocumento, 1) = 'X') 
						BEGIN
							SET @QtdDocumento = @MassaBruta
-- obtem dados da Unidade de Medida "KGM"
							SELECT @CodUnidMedida = UME_CODI, @NomeUnidMedida = UME_NOME
							FROM TAB_UMED WITH (NOLOCK)
							WHERE UME_CODI = 'KGM'
						END
						ELSE
						BEGIN
							SET @QtdDocumento = 0
							SET @CodUnidMedida = NULL
							SET @NomeUnidMedida = NULL
						END
						IF @TipoDocumento = 0
							SET @NumAdicaoDocumento = @NumeroAdicao
						ELSE
							SET @NumAdicaoDocumento = NULL
					END
					ELSE
					BEGIN
						SET @QtdDocumento = (CASE @CodDocumento WHEN 'X001' THEN @MassaLiquida ELSE 0 END)
						SET @CodUnidMedida = NULL
						SET @NomeUnidMedida = NULL
						SET @NumAdicaoDocumento = NULL
					END
-- insere Documento na adição
					INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_DTEM, EXD_DTFV, EXD_MONT, EXD_QNTD, UME_CODI, UME_NOME, EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, 
						EXD_NADI)
					VALUES(@IDAdicao, @CodDocumento, @NomeDocumento, @NumeroReferencia, @DataEmissao, @DataFimValidade, 0, @QtdDocumento, @CodUnidMedida, @NomeUnidMedida, @AnoDeclaracao, @NumDeclaracao, @CodOperador, @NumeroAdicao, @TipoDocumento, 
						@NumAdicaoDocumento)			
					FETCH NEXT from Documentos into @CodDocumento, @NumeroReferencia, @DataEmissao, @DataFimValidade
				END
				CLOSE Documentos
				DEALLOCATE Documentos
-- carrega Menções Especiais XML da adição
				DECLARE Mencoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_MENS.MEN_DATA.value('CodMencao[1]', 'varchar(8)')
					FROM @MencoesEspeciais.nodes('MencoesEspeciais/MencaoEspecial') as XML_MENS(MEN_DATA)
				OPEN Mencoes
				FETCH NEXT from Mencoes into @CodMencao
				WHILE @@FETCH_STATUS = 0
				BEGIN	
-- obtem dados da Menção Especial
					SELECT @DesignacaoMencao = INF_DESI
					FROM TAB_INFC WITH (NOLOCK)
					WHERE INF_CODI = @CodMencao				
-- insere Menção Especial na adição
					INSERT INTO PRO_EXME(EXA_CHVE, INF_CODI, INF_DESI)
					VALUES(@IDAdicao, @CodMencao, @DesignacaoMencao)			
					FETCH NEXT from Mencoes into @CodMencao
				END
				CLOSE Mencoes
				DEALLOCATE Mencoes								
-- carrega Marcas e Volumes XML da adição
				DECLARE MarcasEVols CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT NULLIF(XML_VOLS.VOL_DATA.value('Marca[1]', 'varchar(44)'), ''), XML_VOLS.VOL_DATA.value('CodNaturezaVols[1]', 'varchar(2)'),  
						XML_VOLS.VOL_DATA.value('NumeroVols[1]', 'numeric(38, 6)'), XML_VOLS.VOL_DATA.value('P[1]', 'bit'), XML_VOLS.VOL_DATA.value('R[1]', 'bit') 
					FROM @MarcasEVolumes.nodes('MarcasEVolumes/MarcaEVolume') AS XML_VOLS(VOL_DATA)
				OPEN MarcasEVols
				FETCH NEXT FROM MarcasEVols INTO @Marca, @CodNaturezaVols, @NumeroVols, @P, @R
				WHILE @@FETCH_STATUS = 0
				BEGIN	
-- obtem dados do Tipo de Embalagem
					SELECT @NomeTipoEmbalagem = TEM_NOME, @VolsAZeroTipoEmbalagem = TEM_TVOL
					FROM TAB_TEMB WITH (NOLOCK)
					WHERE TEM_CODI = @CodNaturezaVols	
-- processa calculos específicos relacionados com contexto EXP-CAU ou EXP/XML
					IF @IntegracaoEXPCAU = 1
					BEGIN	
						SET @AnoDeclaracaoMarcaEVol = @AnoDeclaracao
						SET @NumDeclaracaoMarcaEVol = @NumDeclaracao
						SET @CodOperadorMarcaEVol = @CodOperador
						SET @R = 0
						IF @VolsAZeroTipoEmbalagem = 1
						BEGIN
							SET @NumeroVols = 0
							SET @Marca = NULL
						END
						ELSE
							IF @NumeroVols = 0
								RAISERROR('Volumes inválido.', 16, 3)
							ELSE
								IF (ISNULL(@Marca, '') = '') AND (@CodNaturezaVols NOT IN ('NE', 'NF', 'NG'))
									RAISERROR('Marcas inválidas.', 16, 4)
					END
					ELSE
					BEGIN
						SET @AnoDeclaracaoMarcaEVol = NULL
						SET @NumDeclaracaoMarcaEVol = NULL
						SET @CodOperadorMarcaEVol = NULL						
					END								
-- obtem dados em falta
					SELECT @IDStrMarcaEVol = REPLACE(CONVERT(numeric(38, 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()), '.', ',')
-- insere Marcas e Volumes na adição
					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_EXMV(EXA_CHVE, EXM_MARN, TEM_CODI, TEM_NOME, EXM_NVOL, EXM_PART, EXM_REST, EXM_TVOL, EXM_IDST, EXM_EANO, EXM_CODI, EXM_COPE)
					VALUES(@IDAdicao, @Marca, @CodNaturezaVols, @NomeTipoEmbalagem, @NumeroVols, @P, @R, @VolsAZeroTipoEmbalagem, @IDStrMarcaEVol, @AnoDeclaracaoMarcaEVol, @NumDeclaracaoMarcaEVol, @CodOperadorMarcaEVol)
					SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
-- incrementa variaveis
					IF (@IntegracaoEXPCAU = 1) OR ((@IntegracaoEXPCAU = 0) AND (((@P = 0) AND (@R = 0)) OR (@R = 1)))
						SET @TotalVolumes = @TotalVolumes + @NumeroVols				
					FETCH NEXT FROM MarcasEVols INTO @Marca, @CodNaturezaVols, @NumeroVols, @P, @R
				END
				CLOSE MarcasEVols
				DEALLOCATE MarcasEVols
-- carrega Documentos Precedentes XML da adição
				DECLARE DocsPrecedentes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_DOCS.DOC_DATA.value('Tipo[1]', 'varchar(1)'), XML_DOCS.DOC_DATA.value('CodDocumento[1]', 'varchar(5)'), 
						XML_DOCS.DOC_DATA.value('RefDocumento[1]', 'varchar(20)'), XML_DOCS.DOC_DATA.value('CodPais[1]', 'varchar(2)'), 
						XML_DOCS.DOC_DATA.value('DataDocumento[1]', 'datetime')
					FROM @DocsPrecedentes.nodes('DocsPrecedentes/DocPrecedente') as XML_DOCS(DOC_DATA)
				OPEN DocsPrecedentes
				FETCH NEXT from DocsPrecedentes into @TipoDocPrecedente, @CodDocumento, @RefDocPrecedente, @CodPais, @DataDocumento
				WHILE @@FETCH_STATUS = 0
				BEGIN										
-- processa inserção de Documento Precedente na adição em função se EXP-CAU ou EXP/XML
					IF @IntegracaoEXPCAU = 1
					BEGIN
						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_CODI = @CodDocumento
-- obtem dados da unidade de medida de volumes no detalhe de Marcas&Volumes da adição
						SELECT TOP 1 @VolumesPrecedente = NULLIF(dam.EXM_NVOL, 0), @IdUnidadeMedidaVolumes = 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
-- obtem dados da unidade de medida do qualificador
						SELECT @IdUnidadeMedidaQualificador = UME_IDTY
						FROM TAB_UMED WITH(NOLOCK)
						WHERE UME_EXPT = 1 AND UME_CODI = 'KGM'
-- insere Documento Precedente na adição
						INSERT INTO tb_EXP_DeclaracoesAdicoesPrecedentes(id_adicao, id_documento, numero, numeroAdicao, id_unidadeMedidaVolumes, volumes, 
							id_unidadeMedidaQualificador, quantidade, id_utilizadorControlo, dataControlo)
						VALUES(@IDAdicao, @IdDocumento, @RefDocPrecedente, @NumeroAdicao, @IdUnidadeMedidaVolumes, @VolumesPrecedente, 
							@IdUnidadeMedidaQualificador, @MassaBruta, @IdUtilizador, @DataAtual)
					END
					ELSE
					BEGIN
						SET @NumLinhaDocPrecedente = @NumLinhaDocPrecedente + 1
-- obtem dados do País
						SELECT @NomePais = PAI_NOME
						FROM TAB_PAIS WITH (NOLOCK)
						WHERE PAI_CODI = @CodPais									
-- insere Documento Precedente na adição
						INSERT INTO PRO_EXDS(EXA_CHVE, EXD_TIMP, DOC_CODI, EXD_DESC, PAI_CODI, PAI_NOME, EXD_DATA, EXD_NUME)
						VALUES(@IDAdicao, @TipoDocPrecedente, @CodDocumento, @RefDocPrecedente, @CodPais, @NomePais, @DataDocumento, @NumLinhaDocPrecedente)
					END
					FETCH NEXT from DocsPrecedentes into @TipoDocPrecedente, @CodDocumento, @RefDocPrecedente, @CodPais, @DataDocumento
				END
				CLOSE DocsPrecedentes
				DEALLOCATE DocsPrecedentes
-- carrega Regimes Económicos XML da adição
				DECLARE RegsEconomicos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_REGE.REG_DATA.value('NumeroDocPrecedente[1]', 'varchar(20)'), XML_REGE.REG_DATA.value('AdicaoDocPrecedente[1]', 'int'), 
						XML_REGE.REG_DATA.value('CodArtigoPautal[1]', 'varchar(22)'), XML_REGE.REG_DATA.value('Quantidade[1]', 'numeric(38, 6)'), 
						XML_REGE.REG_DATA.value('CodUnidMedida[1]', 'varchar(3)')
					FROM @RegimesEconomicos.nodes('RegimesEconomicos/RegimeEconomico') as XML_REGE(REG_DATA)
				OPEN RegsEconomicos
				FETCH NEXT FROM RegsEconomicos INTO @NumeroDocPrecedente, @AdicaoDocPrecedente, @CodArtigoPautal, @Quantidade, @CodUnidMedida
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @CodArtigo = NULL
					SET @DesignacaoArtigo = NULL
					SET @NomeUnidMedida = NULL
					SET @NumLinhaDocPrecedente = NULL				
-- obtem dados do Artigo
					SELECT TOP 1 @CodArtigo = APA_CODI, @DesignacaoArtigo = APA_DESG
					FROM TAB_APAU WITH (NOLOCK)
					WHERE APA_INAC = 0 AND APA_CPAU = @CodArtigoPautal	
-- obtem dados da Unidade de Medida
					SELECT @NomeUnidMedida = UME_NOME
					FROM TAB_UMED WITH (NOLOCK)
					WHERE UME_EXPT = 1 AND UME_CODI = @CodUnidMedida
-- obtem dados do documento precedente na adição
					SELECT TOP 1 @NumLinhaDocPrecedente = EXD_NUME
					FROM PRO_EXDS WITH(NOLOCK)
					WHERE EXA_CHVE = @IDAdicao AND EXD_TIMP = 'Z' AND EXD_DESC = @NumeroDocPrecedente
-- insere Regime Económico na adição
					INSERT INTO PRO_EXCR(EXA_CHVE, APA_CODI, APA_DESG, EXC_QNTD, UME_CODI, UME_NOME, EXC_LINH, EXC_NADI)
					VALUES(@IDAdicao, @CodArtigo, @DesignacaoArtigo, @Quantidade, @CodUnidMedida, @NomeUnidMedida, @NumLinhaDocPrecedente, @AdicaoDocPrecedente)								
					FETCH NEXT FROM RegsEconomicos INTO @NumeroDocPrecedente, @AdicaoDocPrecedente, @CodArtigoPautal, @Quantidade, @CodUnidMedida
				END
				CLOSE RegsEconomicos
				DEALLOCATE RegsEconomicos
				FETCH NEXT from Adicoes into @NumeroAdicao, @CodArtigo, @DesignacaoArtigo, @CodPaisOrigem, @MassaBruta, @MassaLiquida, @Regime, @Desdobramento, @QtdUnidades, @ValorAdicao, @ValorFrete, @ValorSeguro, 
					@DocsPrecedentes, @RegimesEconomicos, @Documentos, @MencoesEspeciais, @MarcasEVolumes
			END
			CLOSE Adicoes
			DEALLOCATE Adicoes
-- processa criação de diretoria no arquivo documental para os arquivos a anexar unicamente para declaração de Exportação/XML
			IF (@IntegracaoEXPCAU = 0) AND (ISNULL(CAST(@Arquivos AS varchar(MAX)), '') <> '')
			BEGIN
-- procede à alteração da diretoria de dicionários para a diretoria de arquivo documental
				SET @DirArquivos = REPLACE(@DirArquivos, '\MSGS\DICS', '\DOCUMENTOS\EXPORTACAO')
-- verifica se diretoria tem backslash no final	
				IF SUBSTRING(REVERSE(@DirArquivos), 1, 1) <> '\'
					SET @DirArquivos = @DirArquivos + '\'					
-- constroi path completa diretoria dos anexos da declaração de Exportação
				SET @DirArquivos = @DirArquivos + CAST(@AnoDeclaracao AS varchar(4)) + '\' + @CodOperador + '\DEC' + @NumReferenciaLocal + '\'
-- processa a criação diretoria dos anexos da declaração de Exportação
				EXEC GIDWIN.dbo.SP_Externo_CriaDiretoria @DirArquivos, @AuxMsgErro OUTPUT
				IF ISNULL(@AuxMsgErro, '') <> ''
					RAISERROR ('Não foi possível criar a diretoria "%s"! ERRO: "%s".', 16, 5, @PathFicheiro, @AuxMsgErro)								
			END
-- carrega arquivos XML da declaração
			DECLARE Arquivos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT t.a.value('NomeArquivo[1]', 'varchar(100)'), 
					t.a.value('DescricaoArquivo[1]', 'varchar(150)'), 
					NULLIF(t.a.value('TipoArquivo[1]', 'varchar(8)'), ''), 
					t.a.value('OrigemArquivo[1]', 'int'),
					t.a.value('FicheiroBase64[1]', 'varchar(MAX)')
				FROM @Arquivos.nodes('Arquivos/Arquivo') AS t(a)
			OPEN Arquivos
			FETCH NEXT FROM Arquivos INTO @NomeFicheiro, @DescricaoFicheiro, @TipoFicheiro, @OrigemFicheiro, @FicheiroBase64
			WHILE @@FETCH_STATUS = 0
			BEGIN							
-- obtem extensão do ficheiro a anexar
				SET @ExtFicheiro = REVERSE(SUBSTRING(REVERSE(@NomeFicheiro), 1, CHARINDEX('.', REVERSE(@NomeFicheiro))))
-- converte o Base64 para varbinary 
				SET @FicheiroBinario = CAST('' AS XML).value('xs:base64Binary(sql:variable("@FicheiroBase64"))', 'varbinary(MAX)')
-- processa calculos específicos relacionados com contexto EXP-CAU ou EXP/XML
				IF @IntegracaoEXPCAU = 1
				BEGIN
					SET @PathFicheiro = NULL
					IF ISNULL(@TipoFicheiro, '') = ''
					BEGIN
						SET @TipoFicheiro = 'OUTRO'
						SET @FicheiroImprSerie = 0
					END
					ELSE
						SET @FicheiroImprSerie = 1											
				END
				ELSE
				BEGIN
					SET @FicheiroImprSerie = 0
-- constroi path completa c/ novo nome p/ ficheiro a anexar
					SET @PathFicheiro = @DirArquivos + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(varchar(50), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT(), 121), '-', ''), ':', ''), '.', ''), ' ', '') + REPLICATE('0', (8 - LEN(CAST(@NumDeclaracao AS varchar(8))))) + CAST(@NumDeclaracao AS varchar(8)) + @ExtFicheiro
-- gera o ficheiro a anexar no arquivo documental
					BEGIN TRY
						EXEC sp_OACreate 'ADODB.Stream', @Obj OUTPUT
						EXEC sp_OASetProperty @Obj, 'Type', 1
						EXEC sp_OAMethod @Obj, 'Open'
						EXEC sp_OAMethod @Obj, 'Write', NULL, @FicheiroBinario
						EXEC sp_OAMethod @Obj, 'SaveToFile', NULL, @PathFicheiro, 2
						EXEC sp_OAMethod @Obj, 'Close'
						EXEC sp_OADestroy @Obj
					END TRY    
					BEGIN CATCH
						EXEC sp_OADestroy @Obj
					END CATCH
					SET @FicheiroBinario = NULL
				END						
-- insere arquivo na declaração
				INSERT INTO PRO_EXFI(EXM_EANO, EXM_CODI, DEC_CODI, EXF_DESC, EXF_LINK, EXF_DATA, EXF_UTIL, EXF_NOMF, EXF_ISER, EXF_TMSG, EXF_ORIG, EXF_FICH)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @CodOperador, @DescricaoFicheiro, @PathFicheiro, @DataAtual, @Utilizador, @NomeFicheiro, @FicheiroImprSerie, @TipoFicheiro, @OrigemFicheiro, @FicheiroBinario)						
				FETCH NEXT FROM Arquivos INTO @NomeFicheiro, @DescricaoFicheiro, @TipoFicheiro, @OrigemFicheiro, @FicheiroBase64
			END
			CLOSE Arquivos
			DEALLOCATE Arquivos
-- actualiza campos totalizadores na declaração
			UPDATE PRO_EXML SET EXM_TAD5 = @TotalAdicoes, EXM_TVL6 = @TotalVolumes, EXM_CT19 = (CASE @NumLinhaContentor WHEN 0 THEN 0 ELSE 1 END), 
				EXM_MT22 = (CASE (SELECT COUNT(*) FROM PRO_EXAD AS adi INNER JOIN PRO_EXDA AS doc ON adi.EXA_CHVE = doc.EXA_CHVE WHERE adi.EXM_EANO = PRO_EXML.EXM_EANO and adi.EXM_CODI = PRO_EXML.EXM_CODI and adi.EXM_COPE = PRO_EXML.DEC_CODI and doc.DOC_CODI = '9E06') WHEN 0 THEN @MontanteTotal ELSE 0 END), 
				EXM_TMLQ = @MassaLiquidaTotal, EXM_TMBR = @MassaBrutaTotal, EXM_TREM = @MassaBrutaTotal, EXM_VEUR = ROUND(@MontanteTotal / @CambioMoeda, 2), EXM_VATT = @MontanteTotal
			WHERE EXM_EANO = @AnoDeclaracao and EXM_CODI = @NumDeclaracao and DEC_CODI = @CodOperador
		END TRY
		BEGIN CATCH							
-- constroi mensagem de erro detalhada
			SELECT @MensagemErro = @MensagemErro + 
								   '**********************************************************************************************************' + CHAR(12) + 
								   '** ERRO DE DECLARACAO NAO INSERIDA ***********************************************************************' + CHAR(12) + 
								   '**********************************************************************************************************' + CHAR(12) + 
								   '.Carta de Porte N.º:' + ISNULL(@NumeroCPA, (@CodOperador + '/' + CONVERT(varchar(10), @Data, 105))) + CHAR(12) +
								   '.Detalhe Erro:       ' + CHAR(12) +
								   '		*Data do Erro:       ' + CONVERT(varchar(23),@DataAtual, 126) + CHAR(12) + 
								   '		*Numero do Erro:     ' + CAST(ERROR_NUMBER() as varchar) + CHAR(12) + 
								   '		*Nivel do Erro:      ' + CAST(ERROR_SEVERITY() as varchar) + CHAR(12) + 
								   '		*Estado do Erro:     ' + CAST(ERROR_STATE() as varchar) + CHAR(12) + 
								   '		*Objeto do Erro:     ' + ERROR_PROCEDURE() + CHAR(12) + 
								   '		*Nº Linha do Erro:   ' + CAST(ERROR_LINE() as varchar) + CHAR(12) + 
								   '		*Mensagem do Erro:   ' + ERROR_MESSAGE() + CHAR(12)
-- em caso de erro faz rollback da transacção iniciada						           
			IF @@TRANCOUNT > 0
				ROLLBACK TRANSACTION	
		END CATCH	
-- se sucesso faz commit da transacção iniciada
		IF @@TRANCOUNT > 0
			COMMIT TRANSACTION			
		FETCH NEXT FROM Declaracoes INTO @Acao, @TipoProcedimento, @CodNatureza, @CodOperador, @Data, @VossaReferencia, @CodEstanciaA, @CodStatusIncidencia, @CodTipoDeclaracao, @NumeroCPA, @TipoCarga, 
			@DataVoo, @Expedidor_Codigo, @Expedidor_Nome, @Expedidor_Morada, @Expedidor_Localidade, @Expedidor_CodPostal, @Expedidor_LocPostal, @Expedidor_NIF, @Expedidor_CodPais, @CodClienteServico, 
			@NumeroComercialRef, @Destinatario_Codigo, @Destinatario_Nome, @Destinatario_Morada, @Destinatario_Localidade, @Destinatario_CodPostal, @Destinatario_LocPostal, @Destinatario_NIF, 
			@Destinatario_CodPais, @CodPais15A, @CodPais17A, @ICE, @MTPartida_CodMT, @MTPartida_MatriculaMT, @MTPartida_TipoMT, @MTPartida_CodMT25, @MTPartida_CodMT26, @MTPartida_CodAeroporto, 
			@MTFronteira_CodMT, @MTFronteira_MatriculaMT,  @MTFronteira_TipoMT, @MTFronteira_CodPais, @CodEstanciaTAC, @CodEstanciaTN, @LocMercadorias_CodEstancia30, @LocMercadorias_CodLocalEmbarque, 
			@LocMercadorias_CodLocalAutorizado, @LocMercadorias_OutroLocal_Morada, @LocMercadorias_OutroLocal_CodPostal, @LocMercadorias_OutroLocal_LocPostal, @LocMercadorias_Armazem_CodArmazem, 
			@LocMercadorias_Armazem_CodTipoArmazem, @LocMercadorias_Armazem_CodEstadoMembro, @CodLocalEmbarque, @CodCondEntrega, @Lugar, @CodNaturezaTransacao, @CodPais, @TotalFrete, @TotalSeguro, 
			@HVLV, @Origem, @Anotacoes, @CamposExtra, @DadosManifesto_CodExpedidor, @DadosManifesto_NomeExpedidor, @DadosManifesto_MoradaExpedidor, @DadosManifesto_LocalidadeExpedidor, 
			@DadosManifesto_CodPostalExpedidor, @DadosManifesto_LocPostalExpedidor, @DadosManifesto_CodPaisExpedidor, @DadosManifesto_NIFExpedidor, @DadosManifesto_CodDestinatario, 
			@DadosManifesto_NomeDestinatario, @DadosManifesto_MoradaDestinatario, @DadosManifesto_LocalidadeDestinatario, @DadosManifesto_CodPaisDestinatario, @DadosManifesto_Montante, 
			@DadosManifesto_CodPais, @DadosManifesto_MassaLiqTotal, @DadosManifesto_MassaBrtTotal, @DadosManifesto_MiniCPA, @DadosManifesto_DutyType, @DadosManifesto_NomeFicheiro, 
			@DadosManifesto_PPouFC, @DadosManifesto_NumeroVoo, @DadosManifesto_Referencia1, @DadosManifesto_Referencia2, @DadosManifesto_Tracking, @DadosManifesto_Shipping, @DadosManifesto_VolsDirty, 
			@Contentores, @Adicoes, @Arquivos
	END
	CLOSE Declaracoes
	DEALLOCATE Declaracoes
END
GO
GRANT EXECUTE ON SP_ExportacaoXML_GeraDeclaracoesDeXML TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_EXP_Declaracoes_MensagemGeraXMLPT515C') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_EXP_Declaracoes_MensagemGeraXMLPT515C
GO
CREATE PROCEDURE sp_EXP_Declaracoes_MensagemGeraXMLPT515C @IdDeclaracao int, @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime, @PeriodoTransitorio bit
-- 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)
-- constroi XML para ficheiro XML da mensagem PT515C - Criação da Declaração de Exportação	
	SET @FicheiroXML = 				
		(SELECT
			NULLIF(dco.DEC_WSUS, '') AS "messageSender", 
			'AT' AS "messageRecipient", 
			CONVERT(varchar(19), @DataAtual, 120) AS "preparationDateAndTime", 
			'EXP-CAU' AS "messageIdentification", 
			'PT515C' AS "messageType", 
			NULLIF(exm.EXM_NRLO, '') AS "correlationIdentifier", 			
			(SELECT								
				NULLIF(exm.EXM_NRLO, '') AS "LRN", 
				NULLIF(tde.TDE_1CAS, '') AS "declarationType", 
				exm.EXM_TPRO AS "additionalDeclarationType", 
				exm.EXM_SEGU AS "security", 
				(CASE exm.EXM_SEGU WHEN 2 THEN NULLIF((CASE exm.EXM_INCE WHEN 'A' THEN 'A20' ELSE NULL END), '') ELSE NULL END) AS "specificCircumstanceIndicator", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' THEN CAST(ISNULL(exm.EXM_MT22, 0) AS decimal(18, 2)) ELSE NULL END) AS "totalAmountInvoiced", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' AND NOT EXISTS(SELECT 1 FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 0 AND doc.DOC_CODI = '9E06') THEN NULLIF(exm.PAI_MO22, '') ELSE NULL END) AS "invoiceCurrency" 
			FOR XML PATH('ExportOperation'), TYPE),
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
				doc.DOC_CODI AS "type", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dau.numero, '')) AS "referenceNumber", 
				NULLIF(dau.titular, '') AS "holderOfAuthorisation"
			FROM tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK)
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dau.id_documento = doc.DOC_IDTY
			WHERE id_declaracaoEXP = exm.EXM_IDTY
			FOR XML PATH('Authorisation'), TYPE),
			(SELECT
				NULLIF(exm.EAD_C29A, '') AS "referenceNumber"
			HAVING exm.EXM_DCEN = 1 AND exm.EXM_TPRO <> 'R' AND ISNULL(exm.EAD_C29A, '') <> ''
			FOR XML PATH('CustomsOfficeOfPresentation'), TYPE),
			(SELECT
				NULLIF(exm.EAD_CODA, '') AS "referenceNumber"			
			FOR XML PATH('CustomsOfficeOfExport'), TYPE), 
			(SELECT
				NULLIF(exm.EAD_CO29, '') AS "referenceNumber"			
			FOR XML PATH('CustomsOfficeOfExitDeclared'), TYPE), 
			(SELECT 
				NULLIF(exm.EAD_CODI, '') AS "referenceNumber"
			HAVING LEFT(exm.EXM_REGI, 2) IN ('21', '22') AND ISNULL(exm.EAD_CODI, '') <> ''
			FOR XML PATH('SupervisingCustomsOffice'), TYPE), 
			(SELECT 
				(CASE WHEN ISNULL(exm.CLI_PAI2, '') = 'PT' OR exm.EXM_TP2A IN ('C', 'S') THEN NULLIF((ISNULL(exm.CLI_PAI2, '') + ISNULL(exm.CLI_NIF2, '')), '') ELSE NULLIF(exm.CLI_NIF2, '') END) AS "identificationNumber", 
				(CASE WHEN ISNULL(exm.CLI_PAI2, '') <> 'PT' AND exm.EXM_TP2A = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_NOM2, 35) ELSE exm.CLI_NOM2 END), '')) ELSE NULL END) AS "name", 					
				(SELECT
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_MOR2, 35) ELSE exm.CLI_MOR2 END), '')) AS "streetAndNumber", 					
					NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_CPO2, 9) ELSE exm.CLI_CPO2 END), '') AS "postcode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_LOC2, 20) ELSE exm.CLI_LOC2 END), '')) AS "city", 
					NULLIF(exm.CLI_PAI2, '') AS "country"
				HAVING ISNULL(exm.CLI_PAI2, '') <> 'PT' AND exm.EXM_TP2A = 'P'
				FOR XML PATH('Address'), TYPE)			
			FOR XML PATH('Exporter'), TYPE), 
			(SELECT 		
				NULLIF((ISNULL(dcl.PAI_CODI, '') + NULLIF(dcl.DEC_NIF, '')), '') AS "identificationNumber"				
			FOR XML PATH('Declarant'), TYPE), 				
			(SELECT 				
				NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(dcl.DEC_NIF, '')), '') AS "identificationNumber",
				exm.EXM_TP14 AS "status"			
			HAVING ISNULL(exm.EXM_TP14, -1) = 2
			FOR XML PATH('Representative'), TYPE), 			
			(SELECT 				
				NULLIF(exm.EXM_NC48, '') AS "deferredPayment"
			HAVING exm.EXM_ANXB NOT IN ('B3', 'B4') AND ISNULL(exm.EXM_NC48, '') <> ''
			FOR XML PATH('DeferredPayment'), TYPE),
			(SELECT		
				1 AS "sequenceNumber", 		
				(CASE WHEN exm.EXM_TPRO IN ('V', 'Z') THEN CONVERT(varchar(10), exm.EXM_DDGA, 120) ELSE NULL END) AS "declarationAcceptanceDate", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('71', '76') THEN NULLIF(exm.NTR_CO24, '') ELSE NULL END) AS "natureOfTransaction",
				NULLIF(exm.EXM_P15A, '') AS "countryOfExport", 
				NULLIF(exm.EXM_P17A, '') AS "countryOfDestination", 				 						
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "identificationNumber"
				FROM tb_EXP_DeclaracoesIntervenientes WITH(NOLOCK) 		
				WHERE id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('AdditionalSupplyChainActor'), TYPE),
				(SELECT
					NULLIF(exm.CEN_CO20, '') AS "incotermCode", 
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE NULLIF(exm.PAE_CODI1, '') END) AS "UNLOCODE", 
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_LG20, '')) END) AS "location",
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE NULLIF(exm.PAI_CODI, '') END) AS "country", 										
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_TXTC, '')) ELSE NULL END) AS "text"
				HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' AND ISNULL(exm.CEN_CO20, '') <> ''
				FOR XML PATH('DeliveryTerms'), TYPE), 
				(SELECT
					NULLIF(exm.TAR_CO49, '') AS "type", 
					NULLIF(exm.ARM_CO49, '') AS "identifier"
				HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND ISNULL(exm.TAR_CO49, '') <> ''
				FOR XML PATH('Warehouse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.numero, '')) AS "referenceNumber"
				FROM tb_EXP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
				WHERE dpr.id_declaracaoEXP = exm.EXM_IDTY AND exm.EXM_TPRO NOT IN ('U', 'V')
				FOR XML PATH('PreviousDocument'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 					
					ddo.numeroAdicao AS "documentLineItemNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.entidadeEmissora, '')) AS "issuingAuthorityName", 			
					CONVERT(varchar(10), ddo.dataValidade, 120) AS "validityDate"			
				FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 0 
				FOR XML PATH('SupportingDocument'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber"
				FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO'
				FOR XML PATH('AdditionalReference'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY EXP_LINH) AS "sequenceNumber", 
					NULLIF(TXM_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(TXM_DESC, '')) AS "text"
				FROM PRO_EXPA WITH(NOLOCK) 					
				WHERE EXM_EANO = exm.EXM_EANO AND EXM_CODI = exm.EXM_CODI AND EXM_COPE = exm.DEC_CODI
				FOR XML PATH('AdditionalInformation'), TYPE),
				(SELECT
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') THEN exm.EXM_CT19 ELSE NULL END) AS "containerIndicator", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EAD_CODA <> exm.EAD_CO29 THEN NULLIF(LEFT(exm.MTR_CO26, 1), '') ELSE NULL END) AS "inlandModeOfTransport", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') THEN NULLIF(LEFT(exm.MTR_CO21, 1), '') ELSE NULL END) AS "modeOfTransportAtTheBorder", 		
					(CASE WHEN ISNULL(exm.EXM_TAD5, 0) > 1 THEN ISNULL(exm.EXM_TMBR, 0) ELSE NULL END) AS "grossMass", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_NCMR, '')) AS "referenceNumberUCR", 																		
					(SELECT 
						NULLIF(exm.EXM_NTRP, '') AS "identificationNumber"
					HAVING exm.EXM_SEGU = 2 AND ISNULL(exm.EXM_NTRP, '') <> ''
					FOR XML PATH('Carrier'), TYPE),
					(SELECT 
						(CASE WHEN ISNULL(exm.PAI_CODI1, '') = 'PT' OR exm.CLI_TNIF1 IN ('C', 'S') THEN NULLIF((ISNULL(exm.PAI_CODI1, '') + ISNULL(exm.CLI_NIF1, '')), '') ELSE NULLIF(exm.CLI_NIF1, '') END) AS "identificationNumber", 
						(CASE WHEN ISNULL(exm.PAI_CODI1, '') <> 'PT' AND exm.CLI_TNIF1 = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_NOME1, '')) ELSE NULL END) AS "name", 					
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_MORA1, '')) AS "streetAndNumber", 					
							NULLIF(exm.CLI_CPOS1, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_LOCA1, '')) AS "city", 
							NULLIF(exm.PAI_CODI1, '') AS "country"
						HAVING ISNULL(exm.PAI_CODI1, '') <> 'PT' AND exm.CLI_TNIF1 = 'P'
						FOR XML PATH('Address'), TYPE)									
					HAVING exm.EXM_SEGU = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO' AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND ISNULL(exm.CLI_NOME1, '') <> ''			
					FOR XML PATH('Consignor'), TYPE), 
					(SELECT 						
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_NOM8, 35) ELSE exm.FOR_NOM8 END), '')) AS "name", 			
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_MOR8, 35) ELSE exm.FOR_MOR8 END), '')) AS "streetAndNumber", 							
							NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_CPO8, 9) ELSE exm.FOR_CPO8 END), '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_LOC8, 20) ELSE exm.FOR_LOC8 END), '')) AS "city", 
							NULLIF(exm.FOR_PAI8, '') AS "country"
						FOR XML PATH('Address'), TYPE)
					HAVING ISNULL(exm.FOR_NOM8, '') <> ''
					FOR XML PATH('Consignee'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dco.EXC_CONT) AS "sequenceNumber",
						NULLIF(dco.EXC_CONT, '') AS "containerIdentificationNumber", 
						(SELECT COUNT(*) FROM tb_EXP_DeclaracoesContentoresSelos WITH(NOLOCK) WHERE id_contentor = dco.EXC_CHVE) AS "numberOfSeals", 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber",
							NULLIF(numeroSelo, '') AS "identifier"
						FROM tb_EXP_DeclaracoesContentoresSelos WITH(NOLOCK) 
						WHERE id_contentor = dco.EXC_CHVE AND exm.EXM_SEGU = 2
						FOR XML PATH('Seal'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY dad.EXA_LINH) AS "sequenceNumber",
							dad.EXA_LINH AS "declarationGoodsItemNumber"
						FROM tb_EXP_DeclaracoesAdicoesContentores AS dac WITH(NOLOCK)
							INNER JOIN PRO_EXAD AS dad WITH(NOLOCK) ON dac.id_adicao = dad.EXA_CHVE
						WHERE dac.id_contentor = dco.EXC_CHVE			
						FOR XML PATH('GoodsReference'), TYPE)
					FROM PRO_EXCT AS dco WITH(NOLOCK)						
					WHERE dco.EXM_EANO = exm.EXM_EANO AND dco.EXM_CODI = exm.EXM_CODI AND dco.EXM_COPE = exm.DEC_CODI AND exm.EXM_CT19 = 1
					FOR XML PATH('TransportEquipment'), TYPE),
					(SELECT 
						NULLIF(exm.EXM_TLOC, '') AS "typeOfLocation", 
						NULLIF(exm.EXM_QUAL, '') AS "qualifierOfIdentification", 
						(CASE ISNULL(exm.EXM_QUAL, '') WHEN 'Y' THEN NULLIF(exm.LME_CO30, '') ELSE NULL END) AS "authorisationNumber", 
						NULLIF(exm.EXM_IADI, '') AS "additionalIdentifier", 
						(CASE ISNULL(exm.EXM_QUAL, '') WHEN 'U' THEN NULLIF(exm.LEM_CO30, '') ELSE NULL END) AS "UNLocode", 												
						(SELECT 
							NULLIF(exm.EAD_CO30, '') AS "referenceNumber"
						HAVING ISNULL(exm.EXM_QUAL, '') = 'V' AND ISNULL(exm.EAD_CO30, '') <> ''
						FOR XML PATH('CustomsOffice'), TYPE),				 						
						(SELECT 
							NULLIF(exm.EXM_ONIF, '') AS "identificationNumber"
						HAVING ISNULL(exm.EXM_QUAL, '') = 'X' AND ISNULL(exm.EXM_ONIF, '') <> ''
						FOR XML PATH('EconomicOperator'), TYPE),
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_MR30, '')) AS "streetAndNumber", 
							NULLIF(exm.EXM_CP30, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_LP30, '')) AS "city", 
							NULLIF(exm.PAI_CODI5, '') AS "country"					
						HAVING ISNULL(exm.EXM_QUAL, '') = 'Z' AND ISNULL(exm.EXM_MR30, '') <> ''				
						FOR XML PATH('Address'), TYPE)
					HAVING exm.EXM_TPRO NOT IN ('D', 'E', 'F') 
					FOR XML PATH('LocationOfGoods'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY t.id) AS "sequenceNumber",
						t.tipoIdentificacao AS "typeOfIdentification", 
						NULLIF(t.numeroIdentificacao, '') AS "identificationNumber", 
						NULLIF(t.codigoPais, '') AS "nationality"
					FROM (SELECT 0 AS id, exm.EXM_MTIT AS tipoIdentificacao, exm.EXM_MT18 AS numeroIdentificacao, exm.PAI_CODI4 AS codigoPais
						UNION ALL
						SELECT dmp.id, mtr.MTR_TIPO, dmp.identificacao, pai.PAI_CODI
						FROM tb_EXP_DeclaracoesMeiosTransportePartida AS dmp WITH(NOLOCK)
							INNER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON dmp.id_meioTransporte = mtr.MTR_IDTY
							LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dmp.id_pais = pai.PAI_IDTY
						WHERE dmp.id_declaracaoEXP = exm.EXM_IDTY AND LEFT(exm.MTR_CO18, 1) IN ('2', '3')) AS t
					WHERE exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') AND ISNULL(t.numeroIdentificacao, '') <> '' 					
					FOR XML PATH('DepartureTransportMeans'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXP_CHVE) AS "sequenceNumber",
						NULLIF(PAI_CODI, '') AS "country"
					FROM PRO_EXPI WITH(NOLOCK)
					WHERE EXM_EANO = exm.EXM_EANO AND EXM_CODI = exm.EXM_CODI AND EXM_COPE = exm.DEC_CODI AND exm.EXM_SEGU = 2
					FOR XML PATH('CountryOfRoutingOfConsignment'), TYPE),
					(SELECT
						exm.EXM_MTFT AS "typeOfIdentification", 
						NULLIF(exm.EXM_MT21, '') AS "identificationNumber", 
						NULLIF(exm.PAI_CO21, '') AS "nationality"
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') AND ISNULL(exm.EXM_MT21, '') <> ''
					FOR XML PATH('ActiveBorderTransportMeans'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 						
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber"
					FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT
						NULLIF(exm.EXM_DTMP, '') AS "methodOfPayment" 
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EXM_SEGU = 2 AND ISNULL(exm.EXM_DTMP, '') <> ''
					FOR XML PATH('TransportCharges'), TYPE)
				FOR XML PATH('Consignment'), TYPE), 						
				(SELECT
					ROW_NUMBER() OVER(ORDER BY adi.EXA_LINH) AS "sequenceNumber", 
					adi.EXA_LINH AS "declarationGoodsItemNumber", 					
					(CASE WHEN (@PeriodoTransitorio = 1) OR (exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F')) THEN CAST(ISNULL(adi.EXA_VEST, 0) AS decimal(18, 2)) ELSE NULL END) AS "statisticalValue", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') THEN NULLIF(adi.NTR_CODI, '') ELSE NULL END) AS "natureOfTransaction", 					
					NULLIF(adi.PAI_CODI2, '') AS "countryOfExport", 
					NULLIF(adi.PAI_CODI4, '') AS "countryOfDestination", 				 						
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.EXA_NRUR, '')) AS "referenceNumberUCR", 			
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY aau.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(aau.numero, '')) AS "referenceNumber", 	
						NULLIF(aau.titular, '') AS "holderOfAuthorisation"			
					FROM tb_EXP_DeclaracoesAdicoesAutorizacoes AS aau WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON aau.id_documento = doc.DOC_IDTY
					WHERE aau.id_adicao = adi.EXA_CHVE
					FOR XML PATH('Authorisation'), TYPE), 
					(SELECT
						NULLIF(LEFT(adi.TDE_REGI, 2), '') AS "requestedProcedure",
						NULLIF(RIGHT(adi.TDE_REGI, 2), '') AS "previousProcedure",
						(SELECT
							ROW_NUMBER() OVER(ORDER BY t.coluna) AS "sequenceNumber",
							NULLIF(t.desdobramento, '') AS "type"									
						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
						FOR XML PATH('AdditionalProcedure'), TYPE) 
					FOR XML PATH('Procedure'), TYPE), 	
					(SELECT 
						(CASE WHEN ISNULL(adi.PAI_CODI1, '') = 'PT' OR adi.CLI_TNIF IN ('C', 'S') THEN NULLIF((ISNULL(adi.PAI_CODI1, '') + ISNULL(adi.CLI_NIF, '')), '') ELSE NULLIF(adi.CLI_NIF, '') END) AS "identificationNumber", 
						(CASE WHEN ISNULL(adi.PAI_CODI1, '') <> 'PT' AND adi.CLI_TNIF = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_NOME, '')) ELSE NULL END) AS "name", 					
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_MORA, '')) AS "streetAndNumber", 					
							NULLIF(adi.CLI_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_LPOS, '')) AS "city", 
							NULLIF(adi.PAI_CODI1, '') AS "country"
						HAVING ISNULL(adi.PAI_CODI1, '') <> 'PT' AND adi.CLI_TNIF = 'P'
						FOR XML PATH('Address'), TYPE)									
					HAVING exm.EXM_SEGU = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO' AND LEFT(adi.TDE_REGI, 2) NOT IN ('21', '22') AND ISNULL(adi.CLI_NOME, '') <> ''	
					FOR XML PATH('Consignor'), 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.FOR_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS, '')) AS "city", 
							NULLIF(adi.PAI_CODI3, '') AS "country"
						FOR XML PATH('Address'), TYPE)
					HAVING ISNULL(adi.FOR_NOME, '') <> ''
					FOR XML PATH('Consignee'), TYPE), 								
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "identificationNumber"
					FROM tb_EXP_DeclaracoesAdicoesIntervenientes WITH(NOLOCK) 								
					WHERE id_adicao = adi.EXA_CHVE
					FOR XML PATH('AdditionalSupplyChainActor'), TYPE), 
					(SELECT
						NULLIF(adi.PAI_CODI, '') AS "countryOfOrigin", 
						(CASE WHEN (exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND (LEFT(adi.TDE_REGI, 2) <> '76')) THEN NULLIF(res.RES_NUTS, '') ELSE NULL END) AS "regionOfDispatch"
					HAVING ISNULL(adi.PAI_CODI, '') <> ''
					FOR XML PATH('Origin'), TYPE), 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.APA_DESG, '')) AS "descriptionOfGoods", 
						(CASE WHEN exm.EXM_ANXB = 'B1' THEN NULLIF(adi.EXA_CCUS, '') ELSE NULL END) AS "cusCode", 						
						(SELECT 
							NULLIF(LEFT(adi.APA_CP33, 6), '') AS "harmonizedSystemSubHeadingCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 7, 2), '') AS "combinedNomenclatureCode", 							
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.EXA_ORDE) AS "sequenceNumber",
								NULLIF(t.EXA_ATAR, '') AS "taricAdditionalCode"
							FROM (
								SELECT 1 AS EXA_ORDE, adi.EXA_ATA1 AS EXA_ATAR
								UNION
								SELECT 2, adi.EXA_ATA2
								UNION
								SELECT 3, adi.EXA_ATA3
								UNION
								SELECT 4, adi.EXA_ATA4
								UNION
								SELECT 5, adi.EXA_ATA5
							) AS t
							WHERE ISNULL(t.EXA_ATAR, '') <> '' AND ISNULL(t.EXA_ATAR, '') <> '0000'
							FOR XML PATH('TARICAdditionalCode'), TYPE),
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.EXA_ORDE) AS "sequenceNumber",
								NULLIF(t.EXA_ANAC, '') AS "nationalAdditionalCode"						
							FROM (
								SELECT 1 AS EXA_ORDE, adi.EXA_AIC1 AS EXA_ANAC
								UNION
								SELECT 2, adi.EXA_AIC2
								UNION
								SELECT 3, adi.EXA_AIC3 
								UNION
								SELECT 4, adi.EXA_AIC4 
								UNION
								SELECT 5, adi.EXA_AIC5 
							) AS t
							WHERE ISNULL(t.EXA_ANAC, '') <> '' AND ISNULL(t.EXA_ANAC, '') <> '0000'
							FOR XML PATH('NationalAdditionalCode'), TYPE) 
						FOR XML PATH('CommodityCode'), TYPE), 
						(SELECT
							1 AS "sequenceNumber", 
							NULLIF(adi.EXA_ATAR, '') AS "UNNumber"
						HAVING exm.EXM_SEGU = 2 AND ISNULL(adi.EXA_ATAR, '') <> ''
						FOR XML PATH('DangerousGoods'), TYPE), 
						(SELECT
							(CASE WHEN EXISTS(SELECT 1 FROM PRO_EXMV WITH(NOLOCK) WHERE EXA_CHVE = adi.EXA_CHVE GROUP BY EXA_CHVE HAVING SUM(EXM_NVOL) > 0) THEN ISNULL(adi.EXA_MBRT, 0) ELSE NULL END) AS "grossMass", 
							ISNULL(adi.EXA_MLQD, 0) AS "netMass", 
							NULLIF(adi.EXA_QUSU, 0) AS "supplementaryUnits"
						FOR XML PATH('GoodsMeasure'), TYPE), 
						(SELECT
							CAST(ISNULL((SELECT SUM(montante) FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK) WHERE id_adicao = adi.EXA_CHVE), 0) AS decimal(18, 2)) AS "totalDutiesAndTaxesAmount", 								
							(SELECT
								ROW_NUMBER() OVER(ORDER BY aoi.imposicao, aoi.metodoPagamento) AS "sequenceNumber", 
								NULLIF(aoi.imposicao, '') AS "taxType", 												
								CAST(aoi.montante AS decimal(18, 2)) AS "payableTaxAmount", 
								NULLIF(aoi.metodoPagamento, '') AS "methodOfPayment", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY itx.id) AS "sequenceNumber", 
									CAST((CASE itx.tipoCalculo WHEN 1 THEN (itx.taxaValor / 100) ELSE itx.taxaValor END) AS decimal(18, 3)) AS "taxRate", 
									ume.UME_CODI AS "measurementUnitAndQualifier", 
									NULLIF(itx.quantidade, 0) AS "quantity", 
									NULLIF(itx.valor, 0) AS "amount", 
									CAST(itx.montante AS decimal(18, 2)) AS "taxAmount"
								FROM tb_EXP_DeclaracoesAdicoesImposicoesTaxas AS itx WITH(NOLOCK)
									LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON itx.id_unidadeMedida = ume.UME_IDTY
								WHERE itx.id_imposicao = aoi.id 
								FOR XML PATH('TaxBase'), TYPE) 
							FROM tb_EXP_DeclaracoesAdicoesImposicoes AS aoi WITH(NOLOCK)
							WHERE aoi.id_adicao = adi.EXA_CHVE								
							FOR XML PATH('DutiesAndTaxes'), TYPE)
						HAVING (SELECT SUM(montante) FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK) WHERE id_adicao = adi.EXA_CHVE) > 0 
							AND ((exm.EXM_P17A IN ('AD', 'AL', 'BA', 'CL', 'DZ', 'EG', 'FO', 'HR', 'IL', 'JO', 'MA', 'ME', 'MK', 'MX', 'PS', 'TN', 'TR', 'XC', 'XL')) OR (adi.TDE_REGI = '3151'))
						FOR XML PATH('CalculationOfTaxes'), TYPE)						
					FOR XML PATH('Commodity'), TYPE),
					(SELECT
						ROW_NUMBER() OVER(ORDER BY EXM_CHVE) AS "sequenceNumber", 
						NULLIF(TEM_CODI, '') AS "typeOfPackages", 
						CAST(EXM_NVOL AS int) AS "numberOfPackages",
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXM_MARN, '')) AS "shippingMarks"
					FROM PRO_EXMV WITH(NOLOCK)
					WHERE EXA_CHVE = adi.EXA_CHVE
					FOR XML PATH('Packaging'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY apr.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(apr.numero, '')) AS "referenceNumber", 										
						apr.numeroAdicao AS "goodsItemNumber", 
						umv.UME_CODI AS "typeOfPackages", 
						apr.volumes AS "numberOfPackages", 
						umq.UME_CODI AS "measurementUnitAndQualifier", 
						apr.quantidade AS "quantity"						 
					FROM tb_EXP_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.EXA_CHVE AND exm.EXM_TPRO NOT IN ('X', 'Y', 'Z')
					FOR XML PATH('PreviousDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber", 	
						EXD_NADI AS "documentLineItemNumber", 									
						NULLIF(EEM_DESC, '') AS "issuingAuthorityName", 
						CONVERT(varchar(10), EXD_DTEM, 120) AS "validityDate", 
						NULLIF(UME_CODI, '') AS "measurementUnitAndQualifier", 
						NULLIF(EXD_QNTD, 0) AS "quantity", 						
						NULLIF(PAI_MOED, '') AS "currency", 						
						CAST(ISNULL(EXD_MONT, 0) AS decimal(18, 2)) AS "amount"
					FROM PRO_EXDA WITH(NOLOCK) 												
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 0
					FOR XML PATH('SupportingDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber"
					FROM PRO_EXDA WITH(NOLOCK) 						
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber"									
					FROM PRO_EXDA WITH(NOLOCK) 						
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO'
					FOR XML PATH('AdditionalReference'), 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_EXP_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.EXA_CHVE
					FOR XML PATH('AdditionalInformation'), TYPE), 															
					(SELECT
						NULLIF(adi.EXA_MPAG, '') AS "methodOfPayment" 					
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EXM_SEGU = 2 AND ISNULL(adi.EXA_MPAG, '') <> ''
					FOR XML PATH('TransportCharges'), TYPE) 
				FROM PRO_EXAD AS adi WITH(NOLOCK) 
					LEFT OUTER JOIN TAB_REST AS res WITH(NOLOCK) ON adi.RES_CODI = res.RES_CODI		
				WHERE adi.EXM_EANO = exm.EXM_EANO AND adi.EXM_CODI = exm.EXM_CODI AND adi.EXM_COPE = exm.DEC_CODI
				FOR XML PATH('GoodsItem'), TYPE)
			FOR XML PATH('GoodsShipment'), TYPE), 
			(SELECT
				NULLIF(exm.EAD_CODI1, '') AS "customsOfficeOfDischargeCode", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_PRZA, '')) AS "dischargeDeadline", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_ATVP, '')) AS "plannedActivitiesDetails", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_INFA, '')) AS "additionalInformation", 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY dlt.id) AS "sequenceNumber", 
					dlt.tipo AS "typeOfLocation", 
					dlt.qualificador AS "qualifierOfLocation",
					(CASE dlt.qualificador WHEN 'U' THEN lau.LME_CODI ELSE NULL END) AS "UNLocode",
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.morada, '')) AS "streetAndNumber", 					
						NULLIF(dlt.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.localidade, '')) AS "city", 
						pai.PAI_CODI AS "country"
					HAVING dlt.qualificador <> 'U'
					FOR XML PATH('Address'), TYPE)					
				FROM tb_EXP_DeclaracoesLocaisTransformacao AS dlt WITH(NOLOCK)
					LEFT OUTER JOIN TAB_LMER AS lau WITH(NOLOCK) ON dlt.id_localAutorizado = lau.LME_IDTY
					LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dlt.id_pais = pai.PAI_IDTY
				WHERE dlt.id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('PlaceOrPlacesOfProcessingOrUse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpt.id) AS "sequenceNumber", 
					dpt.codigoPautal AS "commodityCode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.designacao, '')) AS "descriptionOfGoods", 
					(SELECT
						1 AS "sequenceNumber", 
						mid.MIA_CODI AS "identificationMeasureCode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.descricao, '')) AS "identificationMeasureDescription"
					FOR XML PATH('GoodsIdentification'), TYPE),
					(SELECT	
						1 AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.taxaRendimento, '')) AS "freeText"					
					HAVING ISNULL(dpt.taxaRendimento, '') <> ''
					FOR XML PATH('YieldRate'), TYPE)
				FROM tb_EXP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK)
					INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dpt.id_meioIdentificacao = mid.MIA_IDTY
				WHERE dpt.id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('ProcessedProducts'), TYPE)				
			HAVING exm.EXM_TPRO IN ('A', 'D') AND ISNULL(exm.EAD_C29A, '') = '' AND LEFT(exm.EXM_REGI, 2) IN ('21', '22') AND ISNULL(exm.EAD_CODI1, '') <> ''			
			FOR XML PATH('AuthorizationRequestsOutwardProcessing'), TYPE),
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY dcc.EXC_CHVE) AS "sequenceNumber", 
				NULLIF(dcc.EXC_FNIF, '') AS "supplierVATNumber", 
				NULLIF(dcc.EXC_NFAC, '') AS "invoiceNumber", 
				CONVERT(varchar(10), dcc.EXC_DFAC, 120) AS "invoiceIssueDate", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dcc.EXC_DCOM, '')) AS "goodsDescription", 
				ISNULL(dcc.EXC_PBRT, 0) AS "grossMass", 
				ISNULL(dcc.EXC_PLIQ, 0) AS "netMass", 
				ISNULL(dcc.EXC_VALO, 0) AS "amountInvoiced", 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
					NULLIF(TEM_CODI, '') AS "typeOfPackages", 
					CAST(EXD_QTDE AS int) AS "numberOfPackages"
				FROM PRO_EXCD WITH(NOLOCK)
				WHERE EXM_EANO = dcc.EXM_EANO AND EXM_CODI = dcc.EXM_CODI AND EXM_COPE = dcc.EXM_COPE AND EXC_LINH = dcc.EXC_LINH
				FOR XML PATH('Packaging'), TYPE)
			FROM PRO_EXCE AS dcc WITH(NOLOCK)
			WHERE dcc.EXM_EANO = exm.EXM_EANO AND dcc.EXM_CODI = exm.EXM_CODI AND dcc.EXM_COPE = exm.DEC_CODI AND LEFT(exm.EXM_REGI, 2) = '10'
			FOR XML PATH('CCEElements'), TYPE)
		FROM PRO_EXML AS exm WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dco WITH(NOLOCK) ON exm.DEC_CODI = dco.DEC_CODI	
			INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON exm.TDE_COD1 = tde.TDE_CODI
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CO14 = dcl.DEC_CODI
		WHERE exm.EXM_IDTY = @IdDeclaracao
		FOR XML PATH('PT515C'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_EXP_Declaracoes_MensagemGeraXMLPT515C TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_EXP_Declaracoes_MensagemGeraXMLPT513C') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_EXP_Declaracoes_MensagemGeraXMLPT513C
GO
CREATE PROCEDURE sp_EXP_Declaracoes_MensagemGeraXMLPT513C @IdDeclaracao int, @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime, @PeriodoTransitorio bit
-- 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)
-- constroi XML para ficheiro XML da mensagem PT513C - Pedido de Alteração da Declaração de Exportação	
	SET @FicheiroXML = 				
		(SELECT
			NULLIF(dco.DEC_WSUS, '') AS "messageSender", 
			'AT' AS "messageRecipient", 
			CONVERT(varchar(19), @DataAtual, 120) AS "preparationDateAndTime", 
			'EXP-CAU' AS "messageIdentification", 
			'PT513C' AS "messageType", 
			NULLIF(exm.EXM_NRLO, '') AS "correlationIdentifier", 			
			(SELECT								
				NULLIF(exm.EXM_NRLO, '') AS "LRN",
				NULLIF(exm.EXM_NDGA, '') AS "MRN",  
				NULLIF(tde.TDE_1CAS, '') AS "declarationType", 
				exm.EXM_TPRO AS "additionalDeclarationType", 
				exm.EXM_SEGU AS "security", 
				(CASE exm.EXM_SEGU WHEN 2 THEN NULLIF((CASE exm.EXM_INCE WHEN 'A' THEN 'A20' ELSE NULL END), '') ELSE NULL END) AS "specificCircumstanceIndicator", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' THEN CAST(ISNULL(exm.EXM_MT22, 0) AS decimal(18, 2)) ELSE NULL END) AS "totalAmountInvoiced", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' AND NOT EXISTS(SELECT 1 FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 0 AND doc.DOC_CODI = '9E06') THEN NULLIF(exm.PAI_MO22, '') ELSE NULL END) AS "invoiceCurrency" 
			FOR XML PATH('ExportOperation'), TYPE),
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
				doc.DOC_CODI AS "type", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dau.numero, '')) AS "referenceNumber", 
				NULLIF(dau.titular, '') AS "holderOfAuthorisation"
			FROM tb_EXP_DeclaracoesAutorizacoes AS dau WITH(NOLOCK)
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dau.id_documento = doc.DOC_IDTY
			WHERE id_declaracaoEXP = exm.EXM_IDTY
			FOR XML PATH('Authorisation'), TYPE),
			(SELECT
				NULLIF(exm.EAD_C29A, '') AS "referenceNumber"
			HAVING exm.EXM_DCEN = 1 AND exm.EXM_TPRO <> 'R' AND ISNULL(exm.EAD_C29A, '') <> ''
			FOR XML PATH('CustomsOfficeOfPresentation'), TYPE),
			(SELECT
				NULLIF(exm.EAD_CODA, '') AS "referenceNumber"			
			FOR XML PATH('CustomsOfficeOfExport'), TYPE), 
			(SELECT
				NULLIF(exm.EAD_CO29, '') AS "referenceNumber"			
			FOR XML PATH('CustomsOfficeOfExitDeclared'), TYPE), 
			(SELECT 
				NULLIF(exm.EAD_CODI, '') AS "referenceNumber"
			HAVING LEFT(exm.EXM_REGI, 2) IN ('21', '22') AND ISNULL(exm.EAD_CODI, '') <> ''
			FOR XML PATH('SupervisingCustomsOffice'), TYPE), 
			(SELECT 
				(CASE WHEN ISNULL(exm.CLI_PAI2, '') = 'PT' OR exm.EXM_TP2A IN ('C', 'S') THEN NULLIF((ISNULL(exm.CLI_PAI2, '') + ISNULL(exm.CLI_NIF2, '')), '') ELSE NULLIF(exm.CLI_NIF2, '') END) AS "identificationNumber", 
				(CASE WHEN ISNULL(exm.CLI_PAI2, '') <> 'PT' AND exm.EXM_TP2A = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_NOM2, 35) ELSE exm.CLI_NOM2 END), '')) ELSE NULL END) AS "name", 
				(SELECT
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_MOR2, 35) ELSE exm.CLI_MOR2 END), '')) AS "streetAndNumber", 					
					NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_CPO2, 9) ELSE exm.CLI_CPO2 END), '') AS "postcode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.CLI_LOC2, 20) ELSE exm.CLI_LOC2 END), '')) AS "city", 
					NULLIF(exm.CLI_PAI2, '') AS "country"
				HAVING ISNULL(exm.CLI_PAI2, '') <> 'PT' AND exm.EXM_TP2A = 'P'
				FOR XML PATH('Address'), TYPE)			
			FOR XML PATH('Exporter'), TYPE), 
			(SELECT 		
				NULLIF((ISNULL(dcl.PAI_CODI, '') + NULLIF(dcl.DEC_NIF, '')), '') AS "identificationNumber"				
			FOR XML PATH('Declarant'), TYPE), 				
			(SELECT 				
				NULLIF((ISNULL(dcl.PAI_CODI, '') + ISNULL(dcl.DEC_NIF, '')), '') AS "identificationNumber",
				exm.EXM_TP14 AS "status"			
			HAVING ISNULL(exm.EXM_TP14, -1) = 2
			FOR XML PATH('Representative'), TYPE), 			
			(SELECT 				
				NULLIF(exm.EXM_NC48, '') AS "deferredPayment"
			HAVING exm.EXM_ANXB NOT IN ('B3', 'B4') AND ISNULL(exm.EXM_NC48, '') <> ''
			FOR XML PATH('DeferredPayment'), TYPE),
			(SELECT		
				1 AS "sequenceNumber", 		
				(CASE WHEN exm.EXM_TPRO IN ('V', 'Z') THEN CONVERT(varchar(10), exm.EXM_DDGA, 120) ELSE NULL END) AS "declarationAcceptanceDate", 
				(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('71', '76') THEN NULLIF(exm.NTR_CO24, '') ELSE NULL END) AS "natureOfTransaction",
				NULLIF(exm.EXM_P15A, '') AS "countryOfExport", 
				NULLIF(exm.EXM_P17A, '') AS "countryOfDestination", 				 						
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
					NULLIF(funcao, '') AS "role", 
					NULLIF(nif, '') AS "identificationNumber"
				FROM tb_EXP_DeclaracoesIntervenientes WITH(NOLOCK) 		
				WHERE id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('AdditionalSupplyChainActor'), TYPE),
				(SELECT
					NULLIF(exm.CEN_CO20, '') AS "incotermCode", 
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE NULLIF(exm.PAE_CODI1, '') END) AS "UNLOCODE", 
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_LG20, '')) END) AS "location",
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN NULL ELSE NULLIF(exm.PAI_CODI, '') END) AS "country", 										
					(CASE ISNULL(exm.CEN_CO20, '') WHEN 'XXX' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_TXTC, '')) ELSE NULL END) AS "text"
				HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) <> '76' AND ISNULL(exm.CEN_CO20, '') <> ''
				FOR XML PATH('DeliveryTerms'), TYPE), 
				(SELECT
					NULLIF(exm.TAR_CO49, '') AS "type", 
					NULLIF(exm.ARM_CO49, '') AS "identifier"
				HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND ISNULL(exm.TAR_CO49, '') <> ''
				FOR XML PATH('Warehouse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpr.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpr.numero, '')) AS "referenceNumber"
				FROM tb_EXP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
				WHERE dpr.id_declaracaoEXP = exm.EXM_IDTY AND exm.EXM_TPRO NOT IN ('U', 'V')
				FOR XML PATH('PreviousDocument'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber", 					
					ddo.numeroAdicao AS "documentLineItemNumber", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.entidadeEmissora, '')) AS "issuingAuthorityName", 			
					CONVERT(varchar(10), ddo.dataValidade, 120) AS "validityDate"			
				FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 0 
				FOR XML PATH('SupportingDocument'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 
					doc.DOC_CODI AS "type", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber"
				FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
					INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO'
				FOR XML PATH('AdditionalReference'), TYPE),
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY EXP_LINH) AS "sequenceNumber", 
					NULLIF(TXM_CODI, '') AS "code", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(TXM_DESC, '')) AS "text"
				FROM PRO_EXPA WITH(NOLOCK) 					
				WHERE EXM_EANO = exm.EXM_EANO AND EXM_CODI = exm.EXM_CODI AND EXM_COPE = exm.DEC_CODI
				FOR XML PATH('AdditionalInformation'), TYPE),
				(SELECT
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') THEN exm.EXM_CT19 ELSE NULL END) AS "containerIndicator", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EAD_CODA <> exm.EAD_CO29 THEN NULLIF(LEFT(exm.MTR_CO26, 1), '') ELSE NULL END) AS "inlandModeOfTransport", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') THEN NULLIF(LEFT(exm.MTR_CO21, 1), '') ELSE NULL END) AS "modeOfTransportAtTheBorder", 		
					(CASE WHEN ISNULL(exm.EXM_TAD5, 0) > 1 THEN ISNULL(exm.EXM_TMBR, 0) ELSE NULL END) AS "grossMass", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_NCMR, '')) AS "referenceNumberUCR", 																		
					(SELECT 
						NULLIF(exm.EXM_NTRP, '') AS "identificationNumber"
					HAVING exm.EXM_SEGU = 2 AND ISNULL(exm.EXM_NTRP, '') <> ''
					FOR XML PATH('Carrier'), TYPE),
					(SELECT 
						(CASE WHEN ISNULL(exm.PAI_CODI1, '') = 'PT' OR exm.CLI_TNIF1 IN ('C', 'S') THEN NULLIF((ISNULL(exm.PAI_CODI1, '') + ISNULL(exm.CLI_NIF1, '')), '') ELSE NULLIF(exm.CLI_NIF1, '') END) AS "identificationNumber", 
						(CASE WHEN ISNULL(exm.PAI_CODI1, '') <> 'PT' AND exm.CLI_TNIF1 = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_NOME1, '')) ELSE NULL END) AS "name", 					
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_MORA1, '')) AS "streetAndNumber", 					
							NULLIF(exm.CLI_CPOS1, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.CLI_LOCA1, '')) AS "city", 
							NULLIF(exm.PAI_CODI1, '') AS "country"
						HAVING ISNULL(exm.PAI_CODI1, '') <> 'PT' AND exm.CLI_TNIF1 = 'P'
						FOR XML PATH('Address'), TYPE)									
					HAVING exm.EXM_SEGU = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO' AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND ISNULL(exm.CLI_NOME1, '') <> ''			
					FOR XML PATH('Consignor'), TYPE), 
					(SELECT 						
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_NOM8, 35) ELSE exm.FOR_NOM8 END), '')) AS "name", 			
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_MOR8, 35) ELSE exm.FOR_MOR8 END), '')) AS "streetAndNumber", 							
							NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_CPO8, 9) ELSE exm.FOR_CPO8 END), '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF((CASE @PeriodoTransitorio WHEN 1 THEN LEFT(exm.FOR_LOC8, 20) ELSE exm.FOR_LOC8 END), '')) AS "city", 
							NULLIF(exm.FOR_PAI8, '') AS "country"
						FOR XML PATH('Address'), TYPE)
					HAVING ISNULL(exm.FOR_NOM8, '') <> ''
					FOR XML PATH('Consignee'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY dco.EXC_CONT) AS "sequenceNumber",
						NULLIF(dco.EXC_CONT, '') AS "containerIdentificationNumber", 
						(SELECT COUNT(*) FROM tb_EXP_DeclaracoesContentoresSelos WITH(NOLOCK) WHERE id_contentor = dco.EXC_CHVE) AS "numberOfSeals", 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber",
							NULLIF(numeroSelo, '') AS "identifier"
						FROM tb_EXP_DeclaracoesContentoresSelos WITH(NOLOCK) 
						WHERE id_contentor = dco.EXC_CHVE AND exm.EXM_SEGU = 2
						FOR XML PATH('Seal'), TYPE), 
						(SELECT 
							ROW_NUMBER() OVER(ORDER BY dad.EXA_LINH) AS "sequenceNumber",
							dad.EXA_LINH AS "declarationGoodsItemNumber"
						FROM tb_EXP_DeclaracoesAdicoesContentores AS dac WITH(NOLOCK)
							INNER JOIN PRO_EXAD AS dad WITH(NOLOCK) ON dac.id_adicao = dad.EXA_CHVE
						WHERE dac.id_contentor = dco.EXC_CHVE			
						FOR XML PATH('GoodsReference'), TYPE)
					FROM PRO_EXCT AS dco WITH(NOLOCK)						
					WHERE dco.EXM_EANO = exm.EXM_EANO AND dco.EXM_CODI = exm.EXM_CODI AND dco.EXM_COPE = exm.DEC_CODI AND exm.EXM_CT19 = 1
					FOR XML PATH('TransportEquipment'), TYPE),
					(SELECT 
						NULLIF(exm.EXM_TLOC, '') AS "typeOfLocation", 
						NULLIF(exm.EXM_QUAL, '') AS "qualifierOfIdentification", 
						(CASE ISNULL(exm.EXM_QUAL, '') WHEN 'Y' THEN NULLIF(exm.LME_CO30, '') ELSE NULL END) AS "authorisationNumber", 
						NULLIF(exm.EXM_IADI, '') AS "additionalIdentifier", 
						(CASE ISNULL(exm.EXM_QUAL, '') WHEN 'U' THEN NULLIF(exm.LEM_CO30, '') ELSE NULL END) AS "UNLocode", 												
						(SELECT 
							NULLIF(exm.EAD_CO30, '') AS "referenceNumber"
						HAVING ISNULL(exm.EXM_QUAL, '') = 'V' AND ISNULL(exm.EAD_CO30, '') <> ''
						FOR XML PATH('CustomsOffice'), TYPE),				 						
						(SELECT 
							NULLIF(exm.EXM_ONIF, '') AS "identificationNumber"
						HAVING ISNULL(exm.EXM_QUAL, '') = 'X' AND ISNULL(exm.EXM_ONIF, '') <> ''
						FOR XML PATH('EconomicOperator'), TYPE),
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_MR30, '')) AS "streetAndNumber", 
							NULLIF(exm.EXM_CP30, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_LP30, '')) AS "city", 
							NULLIF(exm.PAI_CODI5, '') AS "country"					
						HAVING ISNULL(exm.EXM_QUAL, '') = 'Z' AND ISNULL(exm.EXM_MR30, '') <> ''				
						FOR XML PATH('Address'), TYPE)
					HAVING exm.EXM_TPRO NOT IN ('D', 'E', 'F') 
					FOR XML PATH('LocationOfGoods'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY t.id) AS "sequenceNumber",
						t.tipoIdentificacao AS "typeOfIdentification", 
						NULLIF(t.numeroIdentificacao, '') AS "identificationNumber", 
						NULLIF(t.codigoPais, '') AS "nationality"
					FROM (SELECT 0 AS id, exm.EXM_MTIT AS tipoIdentificacao, exm.EXM_MT18 AS numeroIdentificacao, exm.PAI_CODI4 AS codigoPais
						UNION ALL
						SELECT dmp.id, mtr.MTR_TIPO, dmp.identificacao, pai.PAI_CODI
						FROM tb_EXP_DeclaracoesMeiosTransportePartida AS dmp WITH(NOLOCK)
							INNER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON dmp.id_meioTransporte = mtr.MTR_IDTY
							LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dmp.id_pais = pai.PAI_IDTY
						WHERE dmp.id_declaracaoEXP = exm.EXM_IDTY AND LEFT(exm.MTR_CO18, 1) IN ('2', '3')) AS t
					WHERE exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') AND ISNULL(t.numeroIdentificacao, '') <> '' 					
					FOR XML PATH('DepartureTransportMeans'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXP_CHVE) AS "sequenceNumber",
						NULLIF(PAI_CODI, '') AS "country"
					FROM PRO_EXPI WITH(NOLOCK)
					WHERE EXM_EANO = exm.EXM_EANO AND EXM_CODI = exm.EXM_CODI AND EXM_COPE = exm.DEC_CODI AND exm.EXM_SEGU = 2
					FOR XML PATH('CountryOfRoutingOfConsignment'), TYPE),
					(SELECT
						exm.EXM_MTFT AS "typeOfIdentification", 
						NULLIF(exm.EXM_MT21, '') AS "identificationNumber", 
						NULLIF(exm.PAI_CO21, '') AS "nationality"
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND LEFT(exm.EXM_REGI, 2) NOT IN ('21', '22') AND (ISNULL(tde.TDE_1CAS, '') <> 'CO' OR LEFT(exm.EXM_REGI, 2) = '76') AND ISNULL(exm.EXM_MT21, '') <> ''
					FOR XML PATH('ActiveBorderTransportMeans'), TYPE),
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY ddo.id) AS "sequenceNumber", 						
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(ddo.numero, '')) AS "referenceNumber"
					FROM tb_EXP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoEXP = exm.EXM_IDTY AND ddo.tipo = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT
						NULLIF(exm.EXM_DTMP, '') AS "methodOfPayment" 
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EXM_SEGU = 2 AND ISNULL(exm.EXM_DTMP, '') <> ''
					FOR XML PATH('TransportCharges'), TYPE)
				FOR XML PATH('Consignment'), TYPE), 						
				(SELECT
					ROW_NUMBER() OVER(ORDER BY adi.EXA_LINH) AS "sequenceNumber", 
					adi.EXA_LINH AS "declarationGoodsItemNumber", 					
					(CASE WHEN (@PeriodoTransitorio = 1) OR (exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F')) THEN CAST(ISNULL(adi.EXA_VEST, 0) AS decimal(18, 2)) ELSE NULL END) AS "statisticalValue", 
					(CASE WHEN exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') THEN NULLIF(adi.NTR_CODI, '') ELSE NULL END) AS "natureOfTransaction", 					
					NULLIF(adi.PAI_CODI2, '') AS "countryOfExport", 
					NULLIF(adi.PAI_CODI4, '') AS "countryOfDestination", 				 						
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.EXA_NRUR, '')) AS "referenceNumberUCR", 			
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY aau.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(aau.numero, '')) AS "referenceNumber", 	
						NULLIF(aau.titular, '') AS "holderOfAuthorisation"			
					FROM tb_EXP_DeclaracoesAdicoesAutorizacoes AS aau WITH(NOLOCK) 		
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON aau.id_documento = doc.DOC_IDTY
					WHERE aau.id_adicao = adi.EXA_CHVE
					FOR XML PATH('Authorisation'), TYPE), 
					(SELECT
						NULLIF(LEFT(adi.TDE_REGI, 2), '') AS "requestedProcedure",
						NULLIF(RIGHT(adi.TDE_REGI, 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
						FOR XML PATH('AdditionalProcedure'), TYPE) 
					FOR XML PATH('Procedure'), TYPE), 	
					(SELECT 
						(CASE WHEN ISNULL(adi.PAI_CODI1, '') = 'PT' OR adi.CLI_TNIF IN ('C', 'S') THEN NULLIF((ISNULL(adi.PAI_CODI1, '') + ISNULL(adi.CLI_NIF, '')), '') ELSE NULLIF(adi.CLI_NIF, '') END) AS "identificationNumber", 
						(CASE WHEN ISNULL(adi.PAI_CODI1, '') <> 'PT' AND adi.CLI_TNIF = 'P' THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_NOME, '')) ELSE NULL END) AS "name", 					
						(SELECT
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_MORA, '')) AS "streetAndNumber", 					
							NULLIF(adi.CLI_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.CLI_LPOS, '')) AS "city", 
							NULLIF(adi.PAI_CODI1, '') AS "country"
						HAVING ISNULL(adi.PAI_CODI1, '') <> 'PT' AND adi.CLI_TNIF = 'P'
						FOR XML PATH('Address'), TYPE)									
					HAVING exm.EXM_SEGU = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO' AND LEFT(adi.TDE_REGI, 2) NOT IN ('21', '22') AND ISNULL(adi.CLI_NOME, '') <> ''	
					FOR XML PATH('Consignor'), 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.FOR_CPOS, '') AS "postcode", 
							dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.FOR_LPOS, '')) AS "city", 
							NULLIF(adi.PAI_CODI3, '') AS "country"
						FOR XML PATH('Address'), TYPE)
					HAVING ISNULL(adi.FOR_NOME, '') <> ''
					FOR XML PATH('Consignee'), TYPE), 								
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY id) AS "sequenceNumber", 
						NULLIF(funcao, '') AS "role", 
						NULLIF(nif, '') AS "identificationNumber"
					FROM tb_EXP_DeclaracoesAdicoesIntervenientes WITH(NOLOCK) 								
					WHERE id_adicao = adi.EXA_CHVE
					FOR XML PATH('AdditionalSupplyChainActor'), TYPE), 
					(SELECT
						NULLIF(adi.PAI_CODI, '') AS "countryOfOrigin", 
						(CASE WHEN (exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND (LEFT(adi.TDE_REGI, 2) <> '76')) THEN NULLIF(res.RES_NUTS, '') ELSE NULL END) AS "regionOfDispatch"
					HAVING ISNULL(adi.PAI_CODI, '') <> ''
					FOR XML PATH('Origin'), TYPE), 
					(SELECT
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(adi.APA_DESG, '')) AS "descriptionOfGoods", 
						(CASE WHEN exm.EXM_ANXB = 'B1' THEN NULLIF(adi.EXA_CCUS, '') ELSE NULL END) AS "cusCode", 						
						(SELECT 
							NULLIF(LEFT(adi.APA_CP33, 6), '') AS "harmonizedSystemSubHeadingCode", 
							NULLIF(SUBSTRING(adi.APA_CP33, 7, 2), '') AS "combinedNomenclatureCode", 							
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.EXA_ORDE) AS "sequenceNumber",
								NULLIF(t.EXA_ATAR, '') AS "taricAdditionalCode"
							FROM (
								SELECT 1 AS EXA_ORDE, adi.EXA_ATA1 AS EXA_ATAR
								UNION
								SELECT 2, adi.EXA_ATA2
								UNION
								SELECT 3, adi.EXA_ATA3
								UNION
								SELECT 4, adi.EXA_ATA4
								UNION
								SELECT 5, adi.EXA_ATA5
							) AS t
							WHERE ISNULL(t.EXA_ATAR, '') <> '' AND ISNULL(t.EXA_ATAR, '') <> '0000'
							FOR XML PATH('TARICAdditionalCode'), TYPE),
							(SELECT
								ROW_NUMBER() OVER(ORDER BY t.EXA_ORDE) AS "sequenceNumber",
								NULLIF(t.EXA_ANAC, '') AS "nationalAdditionalCode"						
							FROM (
								SELECT 1 AS EXA_ORDE, adi.EXA_AIC1 AS EXA_ANAC
								UNION
								SELECT 2, adi.EXA_AIC2
								UNION
								SELECT 3, adi.EXA_AIC3 
								UNION
								SELECT 4, adi.EXA_AIC4 
								UNION
								SELECT 5, adi.EXA_AIC5 
							) AS t
							WHERE ISNULL(t.EXA_ANAC, '') <> '' AND ISNULL(t.EXA_ANAC, '') <> '0000'
							FOR XML PATH('NationalAdditionalCode'), TYPE) 
						FOR XML PATH('CommodityCode'), TYPE), 
						(SELECT
							1 AS "sequenceNumber", 
							NULLIF(adi.EXA_ATAR, '') AS "UNNumber"
						HAVING exm.EXM_SEGU = 2 AND ISNULL(adi.EXA_ATAR, '') <> ''
						FOR XML PATH('DangerousGoods'), TYPE), 
						(SELECT
							(CASE WHEN EXISTS(SELECT 1 FROM PRO_EXMV WITH(NOLOCK) WHERE EXA_CHVE = adi.EXA_CHVE GROUP BY EXA_CHVE HAVING SUM(EXM_NVOL) > 0) THEN ISNULL(adi.EXA_MBRT, 0) ELSE NULL END) AS "grossMass", 
							ISNULL(adi.EXA_MLQD, 0) AS "netMass", 
							NULLIF(adi.EXA_QUSU, 0) AS "supplementaryUnits"
						FOR XML PATH('GoodsMeasure'), TYPE), 
						(SELECT
							CAST(ISNULL((SELECT SUM(montante) FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK) WHERE id_adicao = adi.EXA_CHVE), 0) AS decimal(18, 2)) AS "totalDutiesAndTaxesAmount", 								
							(SELECT
								ROW_NUMBER() OVER(ORDER BY aoi.imposicao, aoi.metodoPagamento) AS "sequenceNumber", 
								NULLIF(aoi.imposicao, '') AS "taxType", 												
								CAST(aoi.montante AS decimal(18, 2)) AS "payableTaxAmount", 
								NULLIF(aoi.metodoPagamento, '') AS "methodOfPayment", 
								(SELECT
									ROW_NUMBER() OVER(ORDER BY itx.id) AS "sequenceNumber", 
									CAST((CASE itx.tipoCalculo WHEN 1 THEN (itx.taxaValor / 100) ELSE itx.taxaValor END) AS decimal(18, 3)) AS "taxRate", 
									ume.UME_CODI AS "measurementUnitAndQualifier", 
									NULLIF(itx.quantidade, 0) AS "quantity", 
									NULLIF(itx.valor, 0) AS "amount", 
									CAST(itx.montante AS decimal(18, 2)) AS "taxAmount"
								FROM tb_EXP_DeclaracoesAdicoesImposicoesTaxas AS itx WITH(NOLOCK)
									LEFT OUTER JOIN TAB_UMED AS ume WITH(NOLOCK) ON itx.id_unidadeMedida = ume.UME_IDTY
								WHERE itx.id_imposicao = aoi.id 
								FOR XML PATH('TaxBase'), TYPE) 
							FROM tb_EXP_DeclaracoesAdicoesImposicoes AS aoi WITH(NOLOCK)
							WHERE aoi.id_adicao = adi.EXA_CHVE								
							FOR XML PATH('DutiesAndTaxes'), TYPE)
						HAVING (SELECT SUM(montante) FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK) WHERE id_adicao = adi.EXA_CHVE) > 0 
							AND ((exm.EXM_P17A IN ('AD', 'AL', 'BA', 'CL', 'DZ', 'EG', 'FO', 'HR', 'IL', 'JO', 'MA', 'ME', 'MK', 'MX', 'PS', 'TN', 'TR', 'XC', 'XL')) OR (adi.TDE_REGI = '3151'))
						FOR XML PATH('CalculationOfTaxes'), TYPE)						
					FOR XML PATH('Commodity'), TYPE),
					(SELECT
						ROW_NUMBER() OVER(ORDER BY EXM_CHVE) AS "sequenceNumber", 
						NULLIF(TEM_CODI, '') AS "typeOfPackages", 
						CAST(EXM_NVOL AS int) AS "numberOfPackages",
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXM_MARN, '')) AS "shippingMarks"
					FROM PRO_EXMV WITH(NOLOCK)
					WHERE EXA_CHVE = adi.EXA_CHVE
					FOR XML PATH('Packaging'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY apr.id) AS "sequenceNumber", 
						doc.DOC_CODI AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(apr.numero, '')) AS "referenceNumber", 										
						apr.numeroAdicao AS "goodsItemNumber", 
						umv.UME_CODI AS "typeOfPackages", 
						apr.volumes AS "numberOfPackages", 
						umq.UME_CODI AS "measurementUnitAndQualifier", 
						apr.quantidade AS "quantity"						 
					FROM tb_EXP_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.EXA_CHVE AND exm.EXM_TPRO NOT IN ('X', 'Y', 'Z')
					FOR XML PATH('PreviousDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber", 	
						EXD_NADI AS "documentLineItemNumber", 									
						NULLIF(EEM_DESC, '') AS "issuingAuthorityName", 
						CONVERT(varchar(10), EXD_DTEM, 120) AS "validityDate", 
						NULLIF(UME_CODI, '') AS "measurementUnitAndQualifier", 
						NULLIF(EXD_QNTD, 0) AS "quantity", 						
						NULLIF(PAI_MOED, '') AS "currency", 						
						CAST(ISNULL(EXD_MONT, 0) AS decimal(18, 2)) AS "amount"
					FROM PRO_EXDA WITH(NOLOCK) 												
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 0
					FOR XML PATH('SupportingDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber"
					FROM PRO_EXDA WITH(NOLOCK) 						
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 1
					FOR XML PATH('TransportDocument'), TYPE), 
					(SELECT 
						ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
						NULLIF(DOC_CODI, '') AS "type", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(EXD_NREF, '')) AS "referenceNumber"									
					FROM PRO_EXDA WITH(NOLOCK) 						
					WHERE EXA_CHVE = adi.EXA_CHVE AND EXD_TIPO = 2 AND ISNULL(tde.TDE_1CAS, '') <> 'CO'
					FOR XML PATH('AdditionalReference'), 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_EXP_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.EXA_CHVE
					FOR XML PATH('AdditionalInformation'), TYPE), 															
					(SELECT
						NULLIF(adi.EXA_MPAG, '') AS "methodOfPayment" 					
					HAVING exm.EXM_TPRO NOT IN ('B', 'C', 'E', 'F') AND exm.EXM_SEGU = 2 AND ISNULL(adi.EXA_MPAG, '') <> ''
					FOR XML PATH('TransportCharges'), TYPE) 
				FROM PRO_EXAD AS adi WITH(NOLOCK) 
					LEFT OUTER JOIN TAB_REST AS res WITH(NOLOCK) ON adi.RES_CODI = res.RES_CODI		
				WHERE adi.EXM_EANO = exm.EXM_EANO AND adi.EXM_CODI = exm.EXM_CODI AND adi.EXM_COPE = exm.DEC_CODI
				FOR XML PATH('GoodsItem'), TYPE)
			FOR XML PATH('GoodsShipment'), TYPE), 
			(SELECT
				NULLIF(exm.EAD_CODI1, '') AS "customsOfficeOfDischargeCode", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_PRZA, '')) AS "dischargeDeadline", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_ATVP, '')) AS "plannedActivitiesDetails", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(exm.EXM_INFA, '')) AS "additionalInformation", 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY dlt.id) AS "sequenceNumber", 
					dlt.tipo AS "typeOfLocation", 
					dlt.qualificador AS "qualifierOfLocation",
					(CASE dlt.qualificador WHEN 'U' THEN lau.LME_CODI ELSE NULL END) AS "UNLocode",
					(SELECT 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.morada, '')) AS "streetAndNumber", 					
						NULLIF(dlt.codigoPostal, '') AS "postcode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dlt.localidade, '')) AS "city", 
						pai.PAI_CODI AS "country"
					HAVING dlt.qualificador <> 'U'
					FOR XML PATH('Address'), TYPE)					
				FROM tb_EXP_DeclaracoesLocaisTransformacao AS dlt WITH(NOLOCK)
					LEFT OUTER JOIN TAB_LMER AS lau WITH(NOLOCK) ON dlt.id_localAutorizado = lau.LME_IDTY
					LEFT OUTER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dlt.id_pais = pai.PAI_IDTY
				WHERE dlt.id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('PlaceOrPlacesOfProcessingOrUse'), TYPE), 
				(SELECT 
					ROW_NUMBER() OVER(ORDER BY dpt.id) AS "sequenceNumber", 
					dpt.codigoPautal AS "commodityCode", 
					dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.designacao, '')) AS "descriptionOfGoods", 
					(SELECT
						1 AS "sequenceNumber", 
						mid.MIA_CODI AS "identificationMeasureCode", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.descricao, '')) AS "identificationMeasureDescription"
					FOR XML PATH('GoodsIdentification'), TYPE),
					(SELECT	
						1 AS "sequenceNumber", 
						dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dpt.taxaRendimento, '')) AS "freeText"					
					HAVING ISNULL(dpt.taxaRendimento, '') <> ''
					FOR XML PATH('YieldRate'), TYPE)
				FROM tb_EXP_DeclaracoesProdutosTransformados AS dpt WITH(NOLOCK)
					INNER JOIN TAB_MIAU AS mid WITH(NOLOCK) ON dpt.id_meioIdentificacao = mid.MIA_IDTY
				WHERE dpt.id_declaracaoEXP = exm.EXM_IDTY
				FOR XML PATH('ProcessedProducts'), TYPE)				
			HAVING exm.EXM_TPRO IN ('A', 'D') AND ISNULL(exm.EAD_C29A, '') = '' AND LEFT(exm.EXM_REGI, 2) IN ('21', '22') AND ISNULL(exm.EAD_CODI1, '') <> ''			
			FOR XML PATH('AuthorizationRequestsOutwardProcessing'), TYPE),
			(SELECT 
				ROW_NUMBER() OVER(ORDER BY dcc.EXC_CHVE) AS "sequenceNumber", 
				NULLIF(dcc.EXC_FNIF, '') AS "supplierVATNumber", 
				NULLIF(dcc.EXC_NFAC, '') AS "invoiceNumber", 
				CONVERT(varchar(10), dcc.EXC_DFAC, 120) AS "invoiceIssueDate", 
				dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(NULLIF(dcc.EXC_DCOM, '')) AS "goodsDescription", 
				ISNULL(dcc.EXC_PBRT, 0) AS "grossMass", 
				ISNULL(dcc.EXC_PLIQ, 0) AS "netMass", 
				ISNULL(dcc.EXC_VALO, 0) AS "amountInvoiced", 
				(SELECT
					ROW_NUMBER() OVER(ORDER BY EXD_CHVE) AS "sequenceNumber", 
					NULLIF(TEM_CODI, '') AS "typeOfPackages", 
					CAST(EXD_QTDE AS int) AS "numberOfPackages"
				FROM PRO_EXCD WITH(NOLOCK)
				WHERE EXM_EANO = dcc.EXM_EANO AND EXM_CODI = dcc.EXM_CODI AND EXM_COPE = dcc.EXM_COPE AND EXC_LINH = dcc.EXC_LINH
				FOR XML PATH('Packaging'), TYPE)
			FROM PRO_EXCE AS dcc WITH(NOLOCK)
			WHERE dcc.EXM_EANO = exm.EXM_EANO AND dcc.EXM_CODI = exm.EXM_CODI AND dcc.EXM_COPE = exm.DEC_CODI AND LEFT(exm.EXM_REGI, 2) = '10'
			FOR XML PATH('CCEElements'), TYPE)
		FROM PRO_EXML AS exm WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dco WITH(NOLOCK) ON exm.DEC_CODI = dco.DEC_CODI	
			INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON exm.TDE_COD1 = tde.TDE_CODI
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CO14 = dcl.DEC_CODI
		WHERE exm.EXM_IDTY = @IdDeclaracao
		FOR XML PATH('PT513C'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_EXP_Declaracoes_MensagemGeraXMLPT513C TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_MensagensObtemResposta') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_MensagensObtemResposta
GO
CREATE PROCEDURE sp_IMP_Declaracoes_MensagensObtemResposta @Ambito tinyint, @Tipo varchar(3), @Id int, @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, @NumeroRefLocal varchar(22), @CodTipoDeclaracao varchar(4), @NomeTipoDeclaracao varchar(35), @AutorizacaoSaida bit, 
		@EnderecoWS varchar(250), @LoginWS varchar(50), @PwdWS varchar(100), @PathCertificado varchar(250), @PwdCertificado varchar(100), @MensagemSoapAction varchar(250), 
		@PublicKeyCertificadoAT nvarchar(4000), @PwdWSEncriptada nvarchar(4000), @DataSistemaEncriptada nvarchar(4000), @ChvSimetricaEncriptada nvarchar(4000), @RequestXML xml, @Resultado int, 
		@ResponseXML xml, @FaultCode varchar(100), @FaultMessage varchar(MAX), @RespostaXML xml, @FicheirosXML xml, @MensagemXMLBase64 varchar(MAX), @MensagemXML xml, @TipoMensagem varchar(100), 
		@CodigoOperacao int, @EstadoOperacao varchar(3), @XMLNumeroNRM varchar(25), @XMLDataNRM datetime, @XMLNumeroProvisorio varchar(20), @XMLDataControlo datetime, @XMLCodigoFuncao varchar(6), 
		@XMLNumeroLiquidacao varchar(20), @XMLDataLiquidacao datetime, @XMLDataPagamento datetime, @XMLMontante decimal(18, 2), @NumMensagem int, @NomeFicheiro varchar(100), 
		@FicheiroBinario varbinary(MAX), @IndiceInicial int, @IndiceFinal int
-- inicia variáveis	
	SET @PassPhrase = '16345678901234567'
-- inicia processo de obtenção de respostas 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 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, @NumeroRefLocal = duc.DUC_NRLO, @CodTipoDeclaracao = duc.TDE_CODI, @NomeTipoDeclaracao = duc.TDE_NOME, 
			@AutorizacaoSaida = duc.DUC_ASAI, @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)	
-- processa obtenção das mensagens de resposta
		IF @Ambito IN (0, 1)
		BEGIN
-- em função do âmbito, assume o respetivo soap action
			IF @Ambito = 0
				SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauObterMensagensNaoEntreguesRequest'				                           
			ELSE
				SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauObterMensagensEntreguesRequest'
-- 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 a enviar à 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 
								(SELECT
									NULLIF(@NumeroRefLocal, '') AS "numeroReferenciaLocal"									
								FOR XML PATH('listaNRLs'), TYPE),
								@Tipo AS "tipo"
							FOR XML PATH('obterMensagensNaoEntreguesInput'), TYPE)	
						HAVING @Ambito = 0 -- Mensagens Não Entregues		
						FOR XML PATH('net:IMPCauObterMensagensNaoEntregues'), TYPE), 
						(SELECT 
							(SELECT 
								NULLIF(@NumeroRefLocal, '') AS "numeroReferenciaLocal",
								@Tipo AS "tipo"
							FOR XML PATH('obterMensagensEntreguesInput'), TYPE)	
						HAVING @Ambito = 1 -- Mensagens Entregues						
						FOR XML PATH('net:IMPCauObterMensagensEntregues'), 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)					
-- em função do âmbito, obtem o resultado "OK"/"NOK" retornados do WS			
			IF @Ambito = 0
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauObterMensagensNaoEntreguesResponse/return') AS t(c)					
								
			END
			ELSE
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauObterMensagensEntreguesResponse/return') AS t(c)										
			END
			IF @FaultCode <> '0'
				RAISERROR('O envio da mensagem gerou o erro "%s".', 16, 4, @FaultMessage)
-- obtem o resultado de sucesso resultante da obtenção dos dados do WS
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)'),
				@FicheirosXML = t.c.query('ficheiroResposta')
			FROM @RespostaXML.nodes('declaracao') AS t(c)							
			IF (@FaultCode <> '100') AND (@FaultCode <> '101')
				RAISERROR('A declaração gerou o erro "%s".', 16, 5, @FaultMessage)	
-- obtem todos os ficheiros de resposta associados à declaração
			DECLARE FicheirosXML CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
				SELECT 
					t.c.value('nomeFicheiro[1]', 'varchar(100)'), 
					t.c.value('ficheiro[1]', 'varchar(MAX)')
				FROM @FicheirosXML.nodes('ficheiroResposta') AS t(c)
			OPEN FicheirosXML
			FETCH NEXT FROM FicheirosXML INTO @NomeFicheiro, @MensagemXMLBase64
			WHILE @@FETCH_STATUS = 0
			BEGIN 
				SET @CodigoOperacao = NULL
				SET @EstadoOperacao = NULL
-- converte o Base64 para varbinary e depois para xml
				SET @MensagemXML = CAST('' AS XML).value('xs:base64Binary(sql:variable("@MensagemXMLBase64"))', 'varbinary(max)')					
-- obtem da mensagem xml o nome do elemento root como tipo da mensagem obtida
				SELECT @TipoMensagem = t.c.value('local-name(.)', 'varchar(100)')
				FROM @MensagemXML.nodes('*') AS t(c)
-- atualiza declaração em função da mensagem de resposta obtida
				IF @TipoMensagem = 'CC428A'
				BEGIN
					SET @CodigoOperacao = 6
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem CC428A - Aceitação da Declaração
					SELECT @XMLNumeroProvisorio = NULLIF(t.c.value('(ImportOperation/customsRegistrationNumber)[1]', 'varchar(19)'), ''), 
						@XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), ''),
						@XMLDataNRM = t.c.value('(ImportOperation/declarationAcceptanceDateAndTime)[1]', 'datetime')						
					FROM @MensagemXML.nodes('CC428A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º provisório, n.º NRM e data NRM
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_NPRO = ISNULL(@XMLNumeroProvisorio, DUC_NPRO), 
						DUC_NORD = ISNULL(@XMLNumeroNRM, DUC_NORD), 
						DUC_NDAT = ISNULL(@XMLDataNRM, DUC_NDAT), 
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC456A'
				BEGIN
					SET @CodigoOperacao = 7
					SET @EstadoOperacao = 'RE' 
-- obtem dados da mensagem CC456A - Rejeição da Declaração
					SELECT @XMLNumeroProvisorio = NULLIF(t.c.value('(ImportOperation/customsRegistrationNumber)[1]', 'varchar(19)'), ''), 
						@XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')					
					FROM @MensagemXML.nodes('CC456A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º provisório e n.º NRM 
					UPDATE PRO_DUCG SET 
						DUC_STAT = (CASE 
										WHEN ISNULL(ISNULL(@XMLNumeroNRM, DUC_NORD), '') <> '' THEN 2 
										WHEN ISNULL(ISNULL(@XMLNumeroProvisorio, DUC_NPRO), '') <> '' AND DUC_ESTO = 'NR' THEN 2 
										ELSE 0 
									END), 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_NPRO = ISNULL(@XMLNumeroProvisorio, DUC_NPRO), 
						DUC_NORD = ISNULL(@XMLNumeroNRM, DUC_NORD), 						
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC426A'
				BEGIN
					SET @CodigoOperacao = 8
					SET @EstadoOperacao = 'NR' 
-- obtem dados da mensagem CC426A - Notificação de Registo da Declaração
					SELECT @XMLNumeroProvisorio = NULLIF(t.c.value('(ImportOperation/customsRegistrationNumber)[1]', 'varchar(19)'), '')
					FROM @MensagemXML.nodes('CC426A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação e n.º provisório 
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_NPRO = ISNULL(@XMLNumeroProvisorio, DUC_NPRO), 							
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC457A'
				BEGIN
					SET @CodigoOperacao = 9
					SET @EstadoOperacao = 'NR' 
-- obtem dados da mensagem CC457A - Notificação de Registo EIDR da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC457A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação e n.º NRM
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_NORD = ISNULL(@XMLNumeroNRM, DUC_NORD), 							
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC404A'
				BEGIN
					SET @CodigoOperacao = 10
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem CC404A - Aceitação da Alteração da Declaração
					SELECT @XMLNumeroProvisorio = NULLIF(t.c.value('(ImportOperation/customsRegistrationNumber)[1]', 'varchar(19)'), ''), 
						@XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC404A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º provisório e n.º NRM 
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_NPRO = ISNULL(@XMLNumeroProvisorio, DUC_NPRO), 
						DUC_NORD = ISNULL(@XMLNumeroNRM, DUC_NORD), 						
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC460A'
				BEGIN
					SET @CodigoOperacao = 11					
-- obtem dados da mensagem CC460A - Notificação de Controlo da Declaração
					SELECT @EstadoOperacao = (CASE 
												WHEN t.c.value('(ImportOperation/notificationType)[1]', 'int') = 1 THEN 'PDA' 
												WHEN (t.c.value('(ImportOperation/notificationType)[1]', 'int') IN (0, 2)) AND (@AutorizacaoSaida = 1) THEN 'CAP' 
												ELSE 'CA' 
											END), 
						@XMLDataControlo = t.c.value('(ImportOperation/notificationDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('CC460A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, data do controlo e flags de CD e CAP
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 						
						DUC_DTCD = @XMLDataControlo, 
						DUC_CRTD = (CASE WHEN @EstadoOperacao IN ('PDA', 'CA') THEN 1 ELSE DUC_CRTD END), 						
						DUC_CRTA = (CASE @EstadoOperacao WHEN 'CAP' THEN 1 ELSE DUC_CRTA END), 						
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC438A'
				BEGIN
					SET @CodigoOperacao = 12
					SET @EstadoOperacao = 'LED' 
-- obtem dados da mensagem CC438A - Lembrete p/ Envio de Documentos da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC438A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC444A'
				BEGIN
					SET @CodigoOperacao = 13
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem CC444A - Notificação do Resultado do CF da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLCodigoFuncao = t.c.value('(Function/functionCode)[1]', 'varchar(6)')
					FROM @MensagemXML.nodes('CC444A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 
						DUC_CRTF = 1, 	
						DUC_CJUS = @XMLCodigoFuncao, 									
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC447A'
				BEGIN
					SET @CodigoOperacao = 14
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem CC447A - Notificação do Resultado do CD da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC447A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT499A'
				BEGIN
					SET @CodigoOperacao = 15
					SET @EstadoOperacao = 'ND' 
-- obtem dados da mensagem PT499A - Notificação de Dívida da Declaração
					SELECT @XMLNumeroLiquidacao = NULLIF(t.c.value('(DebtNotification/settlement/settlementNumber)[1]', 'varchar(20)'), ''), 
						@XMLDataLiquidacao = t.c.value('(DebtNotification/settlement/settlementDate)[1]', 'datetime'),
						@XMLDataPagamento = t.c.value('(DebtNotification/settlement/paymentTerm)[1]', 'datetime'),
						@XMLMontante = t.c.value('(DebtNotification/settlement/amount)[1]', 'decimal(18, 2)')
					FROM @MensagemXML.nodes('PT499A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º liquidação, data liquidação, data pagamento e dívida aduaneira
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 	
						DUC_REGL = ISNULL(@XMLNumeroLiquidacao, DUC_REGL), 
						DUC_DTRL = ISNULL(@XMLDataLiquidacao, DUC_DTRL), 
						DUC_DPAG = ISNULL(@XMLDataPagamento, DUC_DPAG), 
						DUC_VLRC = ISNULL(@XMLMontante, DUC_VLRC),											
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC451A'
				BEGIN
					SET @CodigoOperacao = 16
					SET @EstadoOperacao = 'SNA' 
-- obtem dados da mensagem CC451A - Saída Não Autorizada da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC451A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC429A'
				BEGIN
					SET @CodigoOperacao = 17
					SET @EstadoOperacao = 'AS' 
-- obtem dados da mensagem CC429A - Autorização de Saída da Declaração
					SELECT @XMLDataControlo = t.c.value('(ImportOperation/releaseDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('CC429A') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, AS, data AS e bloqueio
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_ASAI = 1, 
						DUC_DTAS = @XMLDataControlo, 
						DUC_BLOQ = (CASE WHEN TDE_2CAS NOT IN ('B', 'C', 'D', 'E', 'F') THEN 1 ELSE 0 END), 						
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC431A'
				BEGIN
					SET @CodigoOperacao = 18
					SET @EstadoOperacao = 'LDC' 
-- obtem dados da mensagem CC431A - Lembrete de Expiração do Prazo DC da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC431A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'CC410A'
				BEGIN
					SET @CodigoOperacao = 19
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem CC410A - Anulação da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ImportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('CC410A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 3, 
						DUC_ESTO = @EstadoOperacao, 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT400A'
				BEGIN
					SET @CodigoOperacao = 20
-- obtem o estado da operação atual da declaração (existência de SELECT porque outras mensagens anteriores poderão ter alterado o estado da operação)
					SELECT @EstadoOperacao = DUC_ESTO 
					FROM PRO_DUCG WITH(NOLOCK)
					WHERE DUC_IDTY = @Id
-- obtem dados da mensagem PT400A - Informação Adicional
					SELECT @XMLNumeroProvisorio = NULLIF(t.c.value('(ImportOperation/customsRegistrationNumber)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('PT400A') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_DUCG SET 
						DUC_STAT = 2, 
						DUC_ESTO = @EstadoOperacao, 
						DUC_NPRO = ISNULL(@XMLNumeroProvisorio, DUC_NPRO), 												
						DUC_UALT = @CodUtilizador, DUC_DTAL = @DataAtual
					WHERE DUC_IDTY = @Id
				END
				ELSE
					SET @CodigoOperacao = 99 --Mensagem desconhecida
-- 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 obtenção da mensagem
				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, 0, @DataAtual, @CodigoOperacao, @EstadoOperacao, @CodTipoDeclaracao, @NomeTipoDeclaracao, @CodUtilizador, 
					@RequestXML, @MensagemXML, 1, @NomeFicheiro, CAST(@MensagemXML AS varbinary(MAX)))	
-- para as mensagens CC460A - Notificação de Controlo e CC438A - Lembrete p/ Envio de Documentos, processa o envio de emails de notificação de controlo para spool de acordo com as configurações
				IF (@TipoMensagem = 'CC460A') OR (@TipoMensagem = 'CC438A')
					EXEC sp_IMP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo @id, @Erro OUTPUT
				FETCH NEXT FROM FicheirosXML INTO @NomeFicheiro, @MensagemXMLBase64
			END
			CLOSE FicheirosXML
			DEALLOCATE FicheirosXML
		END
	END TRY
	BEGIN CATCH		
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = 'Detalhes do Erro: ' + 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()
-- insere no detalhe de mensagens os dados da obtenção da declaração
		IF (@RequestXML IS NOT NULL) AND (ISNULL(@RespostaXML, @ResponseXML) IS NOT NULL)
		BEGIN
-- 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 obtenção da mensagem
			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, 0, @DataAtual, ISNULL(@CodigoOperacao, 99), @EstadoOperacao, @CodTipoDeclaracao, @NomeTipoDeclaracao, 
				@CodUtilizador, @RequestXML, ISNULL(@RespostaXML, @ResponseXML), 0, ISNULL(@NomeFicheiro, 'Erro.xml'), CAST(ISNULL(@RespostaXML, @ResponseXML) AS varbinary(MAX)))							
		END
	END CATCH	
-- processa obtenção dos documentos PDF
	IF @Ambito IN (0, 2)
	BEGIN
-- inicia processo de obtenção de documentos PDF da declaração
		BEGIN TRY	
			SET @FaultCode = NULL
			SET @FaultMessage = NULL
			SET @RespostaXML = NULL
			SET @FicheirosXML = NULL
-- em função do âmbito, assume o respetivo soap action
			IF @Ambito = 0
				SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauObterDocumentosPDFNaoEntreguesRequest'
			ELSE
				SET @MensagemSoapAction = 'http://net.atos.at.impcau.canalWS/IMPCAUCanalWebService/IMPCauObterDocumentosPDFEntreguesRequest'
-- 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 a enviar à 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 
								(SELECT
									NULLIF(@NumeroRefLocal, '') AS "numeroReferenciaLocal"								
								FOR XML PATH('listaNRLs'), TYPE),
								@Tipo AS "tipo"
							FOR XML PATH('obterDocumentosPDFNaoEntreguesInput'), TYPE)
						HAVING @Ambito = 0 -- Documentos PDF Não Entregues
						FOR XML PATH('net:IMPCauObterDocumentosPDFNaoEntregues'), TYPE), 
						(SELECT 
							(SELECT 
								NULLIF(@NumeroRefLocal, '') AS "numeroReferenciaLocal",
								@Tipo AS "tipo"
							FOR XML PATH('obterDocumentosEntreguesInput'), TYPE)
						HAVING @Ambito = 2 -- Documentos PDF Entregues
						FOR XML PATH('net:IMPCauObterDocumentosPDFEntregues'), 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, 6, @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, 7, @FaultMessage)					
-- em função do âmbito, obtem o resultado "OK"/"NOK" retornados do WS			
			IF @Ambito = 0
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauObterDocumentosPDFNaoEntreguesResponse/return') AS t(c)					
			END
			ELSE
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impcau.canalWS/' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:IMPCauObterDocumentosPDFEntreguesResponse/return') AS t(c)					
			END
			IF @FaultCode <> '0'
				RAISERROR('O envio da mensagem gerou o erro "%s".', 16, 8, @FaultMessage)			
-- obtem o resultado de sucesso resultante da obtenção dos dados do WS			
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)'),
				@FicheirosXML = t.c.query('ficheiroResposta')
			FROM @RespostaXML.nodes('declaracao') AS t(c)							
			IF (@FaultCode <> '100') AND (@FaultCode <> '101')
				RAISERROR('A declaração gerou o erro "%s".', 16, 9, @FaultMessage)		
-- obtem todos os ficheiros de resposta associados à declaração
			DECLARE FicheirosPDF CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
				SELECT t.c.value('nomeFicheiro[1]', 'varchar(200)'), 
					t.c.value('ficheiro[1]', 'varchar(MAX)')
				FROM @FicheirosXML.nodes('ficheiroResposta') AS t(c)
			OPEN FicheirosPDF
			FETCH NEXT FROM FicheirosPDF INTO @NomeFicheiro, @MensagemXMLBase64
			WHILE @@FETCH_STATUS = 0
			BEGIN 							
-- converte o Base64 para varbinary 
				SET @FicheiroBinario = CAST('' AS XML).value('xs:base64Binary(sql:variable("@MensagemXMLBase64"))', 'varbinary(max)')
-- obtem do nome do ficheiro o tipo de mensagem
				IF CHARINDEX('.RLQ.', @NomeFicheiro) > 0
					SET @TipoMensagem = 'PT499A'
				ELSE
					IF CHARINDEX('.AUT.', @NomeFicheiro) > 0
						SET @TipoMensagem = 'CC429A'
					ELSE
						IF CHARINDEX('.ANU.', @NomeFicheiro) > 0
							SET @TipoMensagem = 'CC410A'
						ELSE
							IF CHARINDEX('.IAD.', @NomeFicheiro) > 0
								SET @TipoMensagem = 'PT400A'
							ELSE
								IF CHARINDEX('.TRI.', @NomeFicheiro) > 0
									SET @TipoMensagem = 'CC460A'
								ELSE
								BEGIN
									SET @IndiceInicial = CHARINDEX('.CC', @NomeFicheiro) + 1
									SET @IndiceFinal = CHARINDEX('A.', @NomeFicheiro, @IndiceInicial) + 1
									SET @TipoMensagem = SUBSTRING(@NomeFicheiro, @IndiceInicial, (@IndiceFinal - @IndiceInicial))
									IF ISNULL(@TipoMensagem, '') = ''
										SET @TipoMensagem = 'OUTRO'
								END									
-- insere no detalhe de arquivos o ficheiro obtido 
				INSERT INTO PRO_DUFI(DUC_PNUM, DUC_EANO, DUF_DESC, DUF_DATA, DUF_NOMF, DUF_UTIL, DUF_TMSG, DUF_ORIG, DUF_FICH)
				VALUES(@NumDeclaracao, @AnoDeclaracao, @TipoMensagem, @DataAtual, @NomeFicheiro, @CodUtilizador, @TipoMensagem, 1, @FicheiroBinario)
-- processa o envio de emails dos ficheiros das mensagens de PT499A - Notificação de Dívida e CC429A - Autorização de Saída para spool de acordo com as configurações
				IF (@TipoMensagem = 'PT499A') OR (@TipoMensagem = 'CC429A')
					EXEC sp_IMP_Declaracoes_ProcessaEnvioEmailArquivosResposta @AnoDeclaracao, @NumDeclaracao, @TipoMensagem, @NomeFicheiro, @FicheiroBinario, @Erro OUTPUT
				FETCH NEXT FROM FicheirosPDF INTO @NomeFicheiro, @MensagemXMLBase64
			END
			CLOSE FicheirosPDF
			DEALLOCATE FicheirosPDF
		END TRY
		BEGIN CATCH		
-- constroi mensagem de erro detalhada
			SET @NumErro = 1 
			SET @Erro = 'Detalhes do Erro: ' + 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()
		END CATCH	
	END
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_MensagensObtemResposta TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo
GO
CREATE PROCEDURE sp_IMP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo @Id 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, @EstadoOperacao varchar(3), @EmailDeclarante varchar(50), @Assunto varchar(250), @Texto varchar(MAX)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- inicia processo de envio de email de notificação de controlo para spool
	BEGIN TRY	
		SET @NumErro = 0
-- obtem os dados para envio na declaração
		SELECT @EstadoOperacao = duc.DUC_ESTO, @EmailDeclarante = dcl.DEC_EMAI, 
			@Assunto = 'Aviso de ' + (CASE duc.DUC_ESTO 
										WHEN 'CA' THEN 'Controlo Aduaneiro' 										
										WHEN 'CAP' THEN 'Controlo Aduaneiro à Posteriori' 
										WHEN 'PDA' THEN 'Pedido Documentos Adicionais' 
										WHEN 'LED' THEN 'Lembrete de Envio de Documentos' 
										ELSE '?????' 
									END), 
			@Texto = 'Dados da declaração IMP-CAU:' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) +
			         '		.Declaração N.º....: ' + CAST(duc.DUC_PNUM AS varchar(10)) + CHAR(13) + CHAR(10) +
					 '		.NRL.....................: ' + duc.DUC_NRLO + CHAR(13) + CHAR(10) +
					 '		.NRM....................: ' + ISNULL(duc.DUC_NORD, '') + CHAR(13) + CHAR(10) +
					 '		.Cliente.................: ' + ISNULL(duc.DUC_DNOM, '') + CHAR(13) + CHAR(10) +
					 '		.Doc. Transporte...: ' + ISNULL(duc.DUC_CPRT, '') + CHAR(13) + CHAR(10) +
					 '		.Tipo de Controlo..: ' + (CASE duc.DUC_ESTO
														WHEN 'CA' THEN 'Controlo Aduaneiro' 										
														WHEN 'CAP' THEN 'Controlo Aduaneiro à Posteriori' 
														WHEN 'PDA' THEN 'Pedido Documentos Adicionais' 
														WHEN 'LED' THEN 'Lembrete de Envio de Documentos'  
														ELSE '?????' 
													END) + CHAR(13) + CHAR(10) 
		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
-- insere os dados do email de notificação de controlo no spool para os emails configurados
		INSERT INTO GIDWIN.dbo.FAP_SIMF(IMF_DTCR, IMF_IMPR, IMF_STAT, IMF_DTST, IMF_TIPO, IMF_FROM, IMF_PARA, IMF_ASSU, IMF_TEXT)
		SELECT @DataAtual, 'SMTP', 0, @DataAtual, 1, @EmailDeclarante, DCA_EMAI, @Assunto, @Texto
		FROM TAB_PDCA WITH(NOLOCK)
		WHERE (@EstadoOperacao = 'CAP' AND DCA_ECAI = 1) OR (@EstadoOperacao = 'CA' AND DCA_ECFI = 1) OR (@EstadoOperacao = 'PDA' AND DCA_ECDI = 1) 
			OR (@EstadoOperacao = 'LED' AND (DCA_ECDI = 1 OR DCA_ECFI = 1 OR DCA_ECAI = 1))
	END TRY
	BEGIN CATCH		
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = 'Detalhes do Erro: ' + 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()
	END CATCH	
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_EXP_Declaracoes_MensagensObtemResposta') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_EXP_Declaracoes_MensagensObtemResposta
GO
CREATE PROCEDURE sp_EXP_Declaracoes_MensagensObtemResposta @Ambito tinyint, @Tipo varchar(3), @Id int, @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, @CodDeclaracao int, @CodOperadorDeclaracao varchar(6), @NRLDeclaracao varchar(22), @AutorizacaoSaida bit, @EnderecoWS varchar(250), 
		@LoginWS varchar(50), @PwdWS varchar(100), @PathCertificado varchar(250), @PwdCertificado varchar(100), @MensagemSoapAction varchar(250), @PublicKeyCertificadoAT nvarchar(4000), 
		@PwdWSEncriptada nvarchar(4000), @DataSistemaEncriptada nvarchar(4000), @ChvSimetricaEncriptada nvarchar(4000), @RequestXML xml, @Resultado int, @ResponseXML xml, @FaultCode varchar(100), 
		@FaultMessage varchar(MAX), @RespostaXML xml, @FicheirosXML xml, @NomeFicheiro varchar(100), @MensagemXMLBase64 varchar(MAX), @MensagemXML xml, @TipoMensagem varchar(100), 
		@EstadoOperacao varchar(3), @XMLNumeroNRM varchar(25), @XMLDataNRM datetime, @XMLDataLimite datetime, @XMLDataSaida datetime, @XMLDataControlo datetime, @FicheiroBinario varbinary(MAX), 
		@IndiceInicial int, @IndiceFinal int
-- inicia variáveis	
	SET @PassPhrase = '16345678901234567'
-- inicia processo de obtenção de respostas 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 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 = exm.EXM_EANO, @CodDeclaracao = exm.EXM_CODI, @CodOperadorDeclaracao = exm.DEC_CODI, @NRLDeclaracao = EXM_NRLO, @AutorizacaoSaida = exm.EXM_ASAI, 
			@EnderecoWS = dcl.DEC_WSEX, @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_EXML AS exm WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CODI = dcl.DEC_CODI	
		WHERE exm.EXM_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 818 = Ambiente de Testes)
		SET @PublicKeyCertificadoAT = GIDWIN.dbo.fn_Geral_ChavePublicaRSAWebservicesAT((CASE WHEN CHARINDEX(':818', @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)	
-- processa obtenção das mensagens de resposta
		IF @Ambito IN (0, 1)
		BEGIN
-- em função do âmbito, assume o respetivo soap action
			IF @Ambito = 0
				SET @MensagemSoapAction = 'http://pt.atos.expcau.ws/WebServiceBean/obterMensagensNaoEntreguesRequest'				                           
			ELSE
				SET @MensagemSoapAction = 'http://pt.atos.expcau.ws/WebServiceBean/obterMensagensEntreguesRequest'
-- 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 a enviar à AT		
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 'http://pt.atos.expcau.ws' AS web, '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 
								(SELECT
									NULLIF(@NRLDeclaracao, '') AS "numeroReferenciaLocal"									
								FOR XML PATH('listaNRLs'), TYPE),
								@Tipo AS "tipo"
							FOR XML PATH('obterMensagensNaoEntreguesInput'), TYPE)	
						HAVING @Ambito = 0 -- Mensagens Não Entregues		
						FOR XML PATH('web:obterMensagensNaoEntregues'), TYPE), 
						(SELECT 
							(SELECT 
								NULLIF(@NRLDeclaracao, '') AS "numeroReferenciaLocal",
								@Tipo AS "tipo"
							FOR XML PATH('obterMensagensEntreguesInput'), TYPE)	
						HAVING @Ambito = 1 -- Mensagens Entregues						
						FOR XML PATH('web:obterMensagensEntregues'), 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)					
-- em função do âmbito, obtem o resultado "OK"/"NOK" retornados do WS			
			IF @Ambito = 0
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://pt.atos.expcau.ws' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:obterMensagensNaoEntreguesResponse/return') AS t(c)								
			END
			ELSE
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://pt.atos.expcau.ws' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:obterMensagensEntreguesResponse/return') AS t(c)										
			END
			IF @FaultCode <> '0'
				RAISERROR('A obtençao das mensagens gerou o erro "%s".', 16, 4, @FaultMessage)
-- obtem o resultado de sucesso resultante da obtenção dos dados do WS
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)'),
				@FicheirosXML = t.c.query('ficheiroResposta')
			FROM @RespostaXML.nodes('declaracao') AS t(c)							
			IF (@FaultCode <> '100') AND (@FaultCode <> '101')
				RAISERROR('A declaração gerou o erro "%s".', 16, 5, @FaultMessage)	
-- obtem todos os ficheiros de resposta associados à declaração
			DECLARE FicheirosXML CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
				SELECT 
					t.c.value('nomeFicheiro[1]', 'varchar(100)'), 
					t.c.value('ficheiro[1]', 'varchar(MAX)')
				FROM @FicheirosXML.nodes('ficheiroResposta') AS t(c)
			OPEN FicheirosXML
			FETCH NEXT FROM FicheirosXML INTO @NomeFicheiro, @MensagemXMLBase64
			WHILE @@FETCH_STATUS = 0
			BEGIN 
				SET @MensagemXML = NULL
				SET @TipoMensagem = NULL
				SET @EstadoOperacao = NULL
-- converte o Base64 para varbinary e depois para xml
				SET @MensagemXML = CAST('' AS XML).value('xs:base64Binary(sql:variable("@MensagemXMLBase64"))', 'varbinary(max)')					
-- obtem da mensagem xml o nome do elemento root como tipo da mensagem obtida
				SELECT @TipoMensagem = t.c.value('local-name(.)', 'varchar(100)')
				FROM @MensagemXML.nodes('*') AS t(c)
-- atualiza declaração em função da mensagem de resposta obtida
				IF @TipoMensagem = 'PT504C'
				BEGIN
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem PT504C - Aceitação da Alteração da Declaração
					SELECT 
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLDataControlo = t.c.value('(ExportOperation/amendmentAcceptanceDateAndTime)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT504C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º provisório e n.º NRM 
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_NDGA = ISNULL(@XMLNumeroNRM, EXM_NDGA), 						
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT509C'
				BEGIN					
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem PT509C - Aceitação da Anulação da Declaração
					SELECT 
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLDataControlo = t.c.value('(ExportOperation/invalidationDecisionDateAndTime)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT509C') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_EXML SET 
						EXM_STAT = 3, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT528C'
				BEGIN					
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem PT528C - Aceitação da Declaração
					SELECT 
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''),
						@XMLDataNRM = t.c.value('(ExportOperation/declarationAcceptanceDate)[1]', 'datetime')						
					FROM @MensagemXML.nodes('PT528C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, n.º NRM e data NRM
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_NDGA = @XMLNumeroNRM,  
						EXM_DDGA = @XMLDataNRM,  
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT529C'
				BEGIN					
					SET @EstadoOperacao = 'AS' 
-- obtem dados da mensagem PT529C - Autorização de Saída da Declaração
					SELECT @XMLDataSaida = t.c.value('(ExportOperation/releaseDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT529C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, AS, data AS e data 6A
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_ASAI = 1, 
						EXM_DTAS = @XMLDataSaida, 
						EXM_DT6A = @DataAtual, 						
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT531C'
				BEGIN					
					SET @EstadoOperacao = 'LDC' 
-- obtem dados da mensagem PT531C - Lembrete de Expiração do Prazo DC da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('PT531C') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT551C'
				BEGIN					
					SET @EstadoOperacao = 'SNA' 
-- obtem dados da mensagem PT551C - Saída Não Autorizada da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('PT551C') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT556C'
				BEGIN					
					SET @EstadoOperacao = 'RE' 
-- obtem dados da mensagem PT556C - Rejeição da Declaração
					SELECT 						
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLDataControlo = t.c.value('(ExportOperation/rejectionDateAndTime)[1]', 'datetime')			
					FROM @MensagemXML.nodes('PT556C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação e n.º NRM 
					UPDATE PRO_EXML SET 
						EXM_STAT = (CASE WHEN ISNULL(ISNULL(@XMLNumeroNRM, EXM_NDGA), '') <> '' THEN 2 ELSE 0 END), 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_NDGA = ISNULL(NULLIF(@XMLNumeroNRM, ''), EXM_NDGA), 						
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT560C'
				BEGIN									
-- obtem dados da mensagem PT560C - Notificação de Controlo da Declaração					
					SELECT @EstadoOperacao = (CASE 
												WHEN t.c.value('(ExportOperation/notificationType)[1]', 'int') = 1 THEN 'PDA' 
												WHEN (t.c.value('(ExportOperation/notificationType)[1]', 'int') IN (0, 2)) AND (@AutorizacaoSaida = 1) THEN 'CAP' 
												ELSE 'CA' 
											END), 
						@XMLDataControlo = t.c.value('(ExportOperation/controlNotificationDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT560C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, data do controlo e flags de CD e CAP
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 						
						EXM_DTCD = @XMLDataControlo, 
						EXM_CRTD = (CASE WHEN @EstadoOperacao IN ('PDA', 'CA') THEN 1 ELSE EXM_CRTD END), 				
						EXM_CRTA = (CASE @EstadoOperacao WHEN 'CAP' THEN 1 ELSE EXM_CRTA END), 						
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE				
				IF @TipoMensagem = 'PT582C'
				BEGIN					
					SET @EstadoOperacao = 'PIL' 
-- obtem dados da mensagem PT582C - Pedido Sobre Exportação Sem Saída da Declaração
					SELECT 
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLDataLimite = t.c.value('(ExportOperation/limitForResponseDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT582C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação e data limite 
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 
						EXM_DTLM = @XMLDataLimite,												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PT599C'
				BEGIN					
					SET @EstadoOperacao = 'CS' 
-- obtem dados da mensagem PT599C - Certificação de Saída da Declaração
					SELECT 
						@XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), ''), 
						@XMLDataSaida = t.c.value('(ExportOperation/releaseDate)[1]', 'datetime')
					FROM @MensagemXML.nodes('PT599C') AS t(c)
-- atualiza declaração p/ alteração do status, estado operação, data CS e bloqueio
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 
						EXM_DTCS = @XMLDataSaida,					
						EXM_BLOQ = 1,							
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END
				ELSE
				IF @TipoMensagem = 'PTE38C'
				BEGIN					
					SET @EstadoOperacao = 'LED' 
-- obtem dados da mensagem PTE38C - Lembrete p/ Envio de Documentos da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('PTE38C') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END	
				ELSE
				IF @TipoMensagem = 'PTE44C'
				BEGIN					
					SET @EstadoOperacao = 'AP' 
-- obtem dados da mensagem PTE44C - Notificação do Resultado do Controlo da Declaração
					SELECT @XMLNumeroNRM = NULLIF(t.c.value('(ExportOperation/MRN)[1]', 'varchar(18)'), '')
					FROM @MensagemXML.nodes('PTE44C') AS t(c)
-- atualiza declaração p/ alteração do status e estado operação
					UPDATE PRO_EXML SET 
						EXM_STAT = 2, 
						EXM_ESTO = @EstadoOperacao, 												
						EXM_UALT = @CodUtilizador, EXM_DTAL = @DataAtual
					WHERE EXM_IDTY = @Id
				END																
				ELSE
					SET @TipoMensagem = 'PT???C' --Mensagem desconhecida
-- insere no detalhe de mensagens os dados da obtenção da mensagem
				INSERT INTO tb_EXP_DeclaracoesMensagens(id_declaracaoEXP, fluxo, mensagem, id_utilizadorMensagem, dataMensagem, pedido, resposta, sucesso, estadoOperacao, 
					id_utilizadorControlo, dataControlo, nomeFicheiro, ficheiro)
				VALUES(@Id, 0, @TipoMensagem, @IdUtilizador, @DataAtual, @RequestXML, @MensagemXML, 1, @EstadoOperacao, 
					@IdUtilizador, @DataAtual, ISNULL(@NomeFicheiro, 'SemNome.xml'), CAST(@MensagemXML AS varbinary(MAX)))
-- para a mensagem PT560C - Notificação de Controlo e PTE38C - Lembrete p/ Envio de Documentos, processa o envio de emails de notificação de controlo para spool de acordo com as configurações
				IF (@TipoMensagem = 'PT560C') OR (@TipoMensagem = 'PTE38C')
					EXEC sp_EXP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo @id, @Erro OUTPUT
				FETCH NEXT FROM FicheirosXML INTO @NomeFicheiro, @MensagemXMLBase64
			END
			CLOSE FicheirosXML
			DEALLOCATE FicheirosXML
		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)) + '}'		
-- insere no detalhe de mensagens os dados da obtenção da declaração
		IF (@RequestXML IS NOT NULL) AND (ISNULL(ISNULL(@MensagemXML, @RespostaXML), @ResponseXML) IS NOT NULL)
		BEGIN
			INSERT INTO tb_EXP_DeclaracoesMensagens(id_declaracaoEXP, fluxo, mensagem, id_utilizadorMensagem, dataMensagem, pedido, resposta, sucesso, estadoOperacao, 
				id_utilizadorControlo, dataControlo, nomeFicheiro, ficheiro)
			VALUES(@Id, 0, ISNULL(@TipoMensagem, 'PT???C'), @IdUtilizador, @DataAtual, @RequestXML, ISNULL(ISNULL(@MensagemXML, @RespostaXML), @ResponseXML), 0, @EstadoOperacao, 
				@IdUtilizador, @DataAtual, ISNULL(@NomeFicheiro, 'Erro.xml'), CAST(ISNULL(ISNULL(@MensagemXML, @RespostaXML), @ResponseXML) AS varbinary(MAX)))				
		END
	END CATCH	
-- processa obtenção dos documentos PDF
	IF @Ambito IN (0, 2)
	BEGIN
-- inicia processo de obtenção de documentos PDF da declaração
		BEGIN TRY	
			SET @FaultCode = NULL
			SET @FaultMessage = NULL
			SET @RespostaXML = NULL
			SET @FicheirosXML = NULL
-- em função do âmbito, assume o respetivo soap action
			IF @Ambito = 0
				SET @MensagemSoapAction = 'http://pt.atos.expcau.ws/WebServiceBean/obterDocumentosPDFNaoEntreguesRequest'
			ELSE
				SET @MensagemSoapAction = 'http://pt.atos.expcau.ws/WebServiceBean/obterDocumentosPDFEntreguesRequest'
-- 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 a enviar à AT		
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 'http://pt.atos.expcau.ws' 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 
								(SELECT
									NULLIF(@NRLDeclaracao, '') AS "numeroReferenciaLocal"								
								FOR XML PATH('listaNRLs'), TYPE),
								@Tipo AS "tipo"
							FOR XML PATH('obterDocumentosPDFNaoEntreguesInput'), TYPE)
						HAVING @Ambito = 0 -- Documentos PDF Não Entregues
						FOR XML PATH('net:obterDocumentosPDFNaoEntregues'), TYPE), 
						(SELECT 
							(SELECT 
								NULLIF(@NRLDeclaracao, '') AS "numeroReferenciaLocal",
								@Tipo AS "tipo"
							FOR XML PATH('obterDocumentosEntreguesInput'), TYPE)
						HAVING @Ambito = 2 -- Documentos PDF Entregues
						FOR XML PATH('net:obterDocumentosPDFEntregues'), 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, 6, @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, 7, @FaultMessage)					
-- em função do âmbito, obtem o resultado "OK"/"NOK" retornados do WS			
			IF @Ambito = 0
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://pt.atos.expcau.ws' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:obterDocumentosPDFNaoEntreguesResponse/return') AS t(c)					
			END
			ELSE
			BEGIN
				;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://pt.atos.expcau.ws' AS m)		
				SELECT 
					@FaultCode = t.c.value('(resultadoProcessamento/codigoResultado)[1]', 'nvarchar(100)'), 
					@FaultMessage = t.c.value('(resultadoProcessamento/descricaoResultado)[1]', 'nvarchar(MAX)'),
					@RespostaXML = t.c.query('declaracao')
				FROM @ResponseXML.nodes('env:Envelope/env:Body/m:obterDocumentosPDFEntreguesResponse/return') AS t(c)					
			END
			IF @FaultCode <> '0'
				RAISERROR('A obtençao dos documentos gerou o erro "%s".', 16, 8, @FaultMessage)				
-- obtem o resultado de sucesso resultante da obtenção dos dados do WS			
			SELECT 
				@FaultCode = t.c.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = t.c.value('descricaoResultado[1]', 'nvarchar(MAX)'),
				@FicheirosXML = t.c.query('ficheiroResposta')
			FROM @RespostaXML.nodes('declaracao') AS t(c)							
			IF (@FaultCode <> '100') AND (@FaultCode <> '101')
				RAISERROR('A declaração gerou o erro "%s".', 16, 9, @FaultMessage)		
-- obtem todos os ficheiros de resposta associados à declaração
			DECLARE FicheirosPDF CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
				SELECT 
					t.c.value('nomeFicheiro[1]', 'varchar(100)'), 
					t.c.value('ficheiro[1]', 'varchar(MAX)')
				FROM @FicheirosXML.nodes('ficheiroResposta') AS t(c)
			OPEN FicheirosPDF
			FETCH NEXT FROM FicheirosPDF INTO @NomeFicheiro, @MensagemXMLBase64
			WHILE @@FETCH_STATUS = 0
			BEGIN 							
-- converte o Base64 para varbinary 
				SET @FicheiroBinario = CAST('' AS XML).value('xs:base64Binary(sql:variable("@MensagemXMLBase64"))', 'varbinary(max)')
-- obtem do nome do ficheiro o tipo de mensagem
				IF CHARINDEX('.AUT.', @NomeFicheiro) > 0
					SET @TipoMensagem = 'PT529C'
				ELSE
					IF CHARINDEX('.CSAI.', @NomeFicheiro) > 0
						SET @TipoMensagem = 'PT599C'
					ELSE					
					BEGIN
						SET @IndiceInicial = CHARINDEX('.CC', @NomeFicheiro) + 1
						SET @IndiceFinal = CHARINDEX('A.', @NomeFicheiro, @IndiceInicial) + 1
						SET @TipoMensagem = SUBSTRING(@NomeFicheiro, @IndiceInicial, (@IndiceFinal - @IndiceInicial))
						IF ISNULL(@TipoMensagem, '') = ''
							SET @TipoMensagem = 'OUTRO'
					END									
-- insere no detalhe de arquivos o ficheiro obtido 
				INSERT INTO PRO_EXFI(EXM_EANO, EXM_CODI, DEC_CODI, EXF_DESC, EXF_DATA, EXF_UTIL, EXF_NOMF, EXF_TMSG, EXF_ORIG, EXF_FICH)
				VALUES(@AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @TipoMensagem, @DataAtual, @CodUtilizador, @NomeFicheiro, @TipoMensagem, 1, @FicheiroBinario)
-- processa o envio de emails dos ficheiros das mensagens de PT529C - Autorização de Saída e PT599C - Certificação de Saída para spool de acordo com as configurações
				IF (@TipoMensagem = 'PT529C') OR (@TipoMensagem = 'PT599C')
					EXEC sp_EXP_Declaracoes_ProcessaEnvioEmailArquivosResposta @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @TipoMensagem, @NomeFicheiro, @FicheiroBinario, @Erro OUTPUT
				FETCH NEXT FROM FicheirosPDF INTO @NomeFicheiro, @MensagemXMLBase64
			END
			CLOSE FicheirosPDF
			DEALLOCATE FicheirosPDF
		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	
	END
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_EXP_Declaracoes_MensagensObtemResposta TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_EXP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_EXP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo
GO
CREATE PROCEDURE sp_EXP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo @Id 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, @EstadoOperacao varchar(3), @EmailDeclarante varchar(50), @Assunto varchar(250), @Texto varchar(MAX)
-- inicia processo de envio de email de notificação de controlo para spool
	BEGIN TRY	
		SET @NumErro = 0
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem os dados para envio na declaração
		SELECT @EstadoOperacao = exm.EXM_ESTO, @EmailDeclarante = dcl.DEC_EMAI, 
			@Assunto = 'Aviso de ' + dbo.fn_EXP_Declaracoes_ObtemDescricaoEstadoOperacao(exm.EXM_ESTO), 
			@Texto = 'Dados da declaração EXP-SAE:' + CHAR(13) + CHAR(10) + CHAR(13) + CHAR(10) +
			         '		.Declaração N.º....: ' + CAST(exm.EXM_NRII AS varchar(10)) + CHAR(13) + CHAR(10) +
					 '		.NRL.....................: ' + exm.EXM_NRLO + CHAR(13) + CHAR(10) +
					 '		.NRM....................: ' + ISNULL(exm.EXM_NDGA, '') + CHAR(13) + CHAR(10) +
					 '		.Cliente.................: ' + ISNULL(exm.CLI_NOM2, '') + CHAR(13) + CHAR(10) +
					 '		.Doc. Transporte...: ' + ISNULL(exm.EXM_CPRT, '') + CHAR(13) + CHAR(10) +
					 '		.Tipo de Controlo..: ' + dbo.fn_EXP_Declaracoes_ObtemDescricaoEstadoOperacao(exm.EXM_ESTO) + CHAR(13) + CHAR(10) 
		FROM PRO_EXML AS exm WITH(NOLOCK) 
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON exm.DEC_CO14 = dcl.DEC_CODI
		WHERE exm.EXM_IDTY = @Id
-- insere os dados do email de notificação de controlo no spool para os emails configurados
		INSERT INTO GIDWIN.dbo.FAP_SIMF(IMF_DTCR, IMF_IMPR, IMF_STAT, IMF_DTST, IMF_TIPO, IMF_FROM, IMF_PARA, IMF_ASSU, IMF_TEXT)
		SELECT @DataAtual, 'SMTP', 0, @DataAtual, 1, @EmailDeclarante, DCA_EMAI, @Assunto, @Texto
		FROM TAB_PDCA WITH(NOLOCK)
		WHERE (@EstadoOperacao = 'CAP' AND DCA_ECAE = 1) OR (@EstadoOperacao = 'CA' AND DCA_ECFE = 1) OR (@EstadoOperacao = 'PDA' AND DCA_ECDE = 1) 
			OR (@EstadoOperacao = 'LED' AND (DCA_ECDE = 1 OR DCA_ECFE = 1 OR DCA_ECAE = 1))		
	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_EXP_Declaracoes_ProcessaEnvioEmailNotificacaoControlo TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_ImportaFicheiroCTT') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_ImportaFicheiroCTT
GO
CREATE PROCEDURE sp_IMP_Declaracoes_ImportaFicheiroCTT @FicheiroXML xml, @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS 
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON	
	SET DATEFORMAT DMY
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @XMLDeclaracao xml(XMLSC_DeclaracoesIMPCAUToGIDWin)
-- inicia variaveis
	SET @NumErro = 0
-- inicia processo de importação da declaração IMP-CAU
	BEGIN TRY	
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para declaração IMP-CAU a partir do ficheiro XML no formato CTT
		SET @XMLDeclaracao = 
			(SELECT	
				(SELECT t.c.value('@Acao[1]', 'varchar(1)') AS "@acao", 
					(CONVERT(varchar(10), t.c.value('Data[1]', 'datetime'), 127) + 'Z') AS "data", 
					CAST(0 AS bit) AS "despachoCentralizado", 
					'H6' AS "anexoB", 
					NULLIF(t.c.value('CodNatureza[1]', 'varchar(3)'), '') AS "natureza", 
					NULLIF(t.c.value('NumDocTransporte[1]', 'varchar(18)'), '') AS "documentoTransporte", 
					(SELECT 
						(SELECT 
							NULLIF(t.c.value('NIFExpedidor[1]', 'varchar(17)'), '') AS "nif", 
							NULLIF(t.c.value('NomeExpedidor[1]', 'varchar(70)'), '') AS "nome", 
							NULLIF(t.c.value('MoradaExpedidor[1]', 'varchar(70)'), '') AS "morada", 
							NULLIF(t.c.value('LocalidadeExpedidor[1]', 'varchar(35)'), '') AS "localidade", 
							NULLIF(t.c.value('CodPostalExpedidor[1]', 'varchar(12)'), '') AS "codigoPostal", 
							NULLIF(t.c.value('LocPostalExpedidor[1]', 'varchar(35)'), '') AS "localidadePostal", 
							NULLIF(t.c.value('CodPaisExpedidor[1]', 'varchar(2)'), '') AS "pais"
						HAVING ISNULL(t.c.value('NomeExpedidor[1]', 'varchar(70)'), '') <> ''
						FOR XML PATH('exportador'), TYPE), 
						(SELECT 
							ISNULL(NULLIF(t.c.value('NIFDestinatario[1]', 'varchar(17)'), ''), '999999990') AS "nif", 
							t.c.value('TipoDestinatario[1]', 'int') AS "tipoNIF", 
							NULLIF(t.c.value('NomeDestinatario[1]', 'varchar(70)'), '') AS "nome", 
							NULLIF(t.c.value('MoradaDestinatario[1]', 'varchar(70)'), '') AS "morada", 
							NULLIF(t.c.value('LocalidadeDestinatario[1]', 'varchar(35)'), '') AS "localidade", 
							NULLIF(t.c.value('CodPostalDestinatario[1]', 'varchar(12)'), '') AS "codigoPostal", 
							NULLIF(t.c.value('LocalidadeDestinatario[1]', 'varchar(35)'), '') AS "localidadePostal", 
							NULLIF(t.c.value('CodPaisDestinatario[1]', 'varchar(2)'), '') AS "pais" 			
						FOR XML PATH('importador'), TYPE),
						NULLIF(t.c.value('CodPais17[1]', 'varchar(2)'), '') AS "paisDestino",
						(SELECT
							NULLIF(t.c.value('CodDeclarante[1]', 'varchar(6)'), '') AS "codigoDeclarante"
						FOR XML PATH('declarante'), TYPE)
					FOR XML PATH('operadores'), TYPE), 
					NULLIF(t.c.value('CodEstancia[1]', 'varchar(8)'), '') AS "estancia", 
					(CASE 
						WHEN (ISNULL(t.c.value('CodNatureza[1]', 'varchar(3)'), '') = '40') AND (ISNULL(t.c.value('CodTipoDeclaracao[1]', 'varchar(4)'), '') IN ('FREU', 'FRIM')) THEN 
							(CASE 
								WHEN ISNULL(t.c.value('CodPais15A[1]', 'varchar(2)'), '') IN ('CH', 'NO', 'IS', 'LI', 'TR', 'MK', 'XS', 'GB') THEN 'FREU' 
								ELSE 'FRIM' 
							END) 						
						ELSE 'RPIM' 
					END) AS "tipoDeclaracao", 
					NULLIF(t.c.value('CodCondEntrega[1]', 'varchar(3)'), '') AS "condicaoEntrega", 
					(SELECT 
						(SELECT
							NULLIF(t.c.value('CodPais22[1]', 'varchar(2)'), '') AS "pais", 							
							CAST(ISNULL(t.c.value('sum(Adicoes/Adicao/PrecoAdicao)', 'float'), 0) AS decimal(18, 3)) AS "valorTotal"
						FOR XML PATH('fatura'), TYPE), 
						(SELECT
							ISNULL(NULLIF(t.c.value('MoedaFrete[1]', 'varchar(2)'), ''), 'EU') AS "pais", 							
							CAST(ISNULL(t.c.value('sum(Adicoes/Adicao/ValorFrete)', 'float'), 0) AS decimal(18, 3)) AS "valorTotal"
						FOR XML PATH('frete'), TYPE), 
						(SELECT
							ISNULL(NULLIF(t.c.value('MoedaSeguro[1]', 'varchar(2)'), ''), 'EU') AS "pais", 							
							CAST(ISNULL(t.c.value('sum(Adicoes/Adicao/ValorSeguro)', 'float'), 0) AS decimal(18, 3)) AS "valorTotal"
						FOR XML PATH('seguro'), TYPE), 
						(SELECT
							CAST(ISNULL(t.c.value('sum(Adicoes/Adicao/MassaLiquida)', 'float'), 0) AS decimal(18, 6)) AS "massaLiquida", 							
							CAST(ISNULL(t.c.value('sum(Adicoes/Adicao/MassaBruta)', 'float'), 0) AS decimal(18, 6)) AS "massaBruta"
						FOR XML PATH('pesos'), TYPE)
					FOR XML PATH('totais'), TYPE), 
					(SELECT
						NULLIF(t.c.value('NumDocTransporte[1]', 'varchar(18)'), '') AS "numeroNRUR", 
						NULLIF(t.c.value('CodMeioTransporte18[1]', 'varchar(2)'), '') AS "meioTransporteChegada", 
						0 AS "contentorizada"
					FOR XML PATH('transporte'), TYPE), 
					(SELECT
						t.c.value('CodFollowUp[1]', 'int') AS "codigoFollowUp"
					HAVING ISNULL(t.c.value('CodFollowUp[1]', 'int'), -1) <> -1
					FOR XML PATH('followUp'), TYPE), 					
					(SELECT 
						0 AS "tipoDocumento", 
						NULLIF(d.c.value('CodDocumento[1]', 'varchar(5)'), '') AS "codigoDocumento",
						NULLIF(d.c.value('NumeroReferencia[1]', 'varchar(70)'), '') AS "numeroDocumento", 
						(CONVERT(varchar(10), d.c.value('DataEmissao[1]', 'datetime'), 127) + 'Z') AS "dataValidade"					
					FROM t.c.nodes('Adicoes/Adicao/Documentos/Documento') AS d(c)
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON d.c.value('CodDocumento[1]', 'varchar(5)') = doc.DOC_CODI																	
					WHERE d.c.value('(../../NumAdicao)[1]', 'int') = 1 AND doc.DOC_DTRA = 0						
					FOR XML PATH('documento'), ROOT('documentosECertificados'), TYPE),	
					(SELECT 
						doc.DOC_CODI AS "codigoDocumento", 
						NULLIF(d.c.value('NumeroReferencia[1]', 'varchar(70)'), '') AS "numeroDocumento"			
					FROM t.c.nodes('Adicoes/Adicao/Documentos/Documento') AS d(c) 
						INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON d.c.value('CodDocumento[1]', 'varchar(5)') = doc.DOC_CODI												
					WHERE d.c.value('(../../NumAdicao)[1]', 'int') = 1 AND doc.DOC_CODI = 'N337' AND ISNULL(d.c.value('NumeroReferencia[1]', 'varchar(70)'), '') <> ''								
					FOR XML PATH('documentoPrecedente'), ROOT('documentosPrecedentes'), TYPE),																											
					(SELECT
						(SELECT 
							a.c.value('NumAdicao[1]', 'int') AS "numeroAdicao", 
							ISNULL((SELECT TOP 1 NULLIF(APA_CPAU, '') FROM TAB_APAU WITH(NOLOCK) WHERE APA_CODI = NULLIF(a.c.value('CodArtigoPautal[1]', 'varchar(22)'), '')), '9999999999') AS "codigoPautal", 							
							ISNULL(NULLIF(a.c.value('Designacao[1]', 'varchar(150)'), ''), 'NÃO CLASSIFICADO') AS "designacao", 	
							NULLIF(a.c.value('C37B[1]', 'varchar(6)'), '') AS "regimeAdicional", 						
							NULLIF(a.c.value('CodPaisOrigem[1]', 'varchar(2)'), '') AS "paisOrigem",		
							a.c.value('MassaLiquida[1]', 'decimal(18, 6)') AS "massaLiquida", 					
							a.c.value('MassaBruta[1]', 'decimal(18, 6)') AS "massaBruta",																					
							a.c.value('PrecoAdicao[1]', 'decimal(18, 3)') AS "montanteAd", 						
							(SELECT 
								m.c.value('QtdVolumes[1]', 'int') AS "volumes", 
								NULLIF(m.c.value('Numero[1]', 'varchar(20)'), '') AS "numeroObjeto", 
								NULLIF(m.c.value('Loptica[1]', 'varchar(30)'), '') AS "codigoBarras", 
								m.c.value('P[1]', 'bit') AS "parte"		
							FROM a.c.nodes('MarcasEVolumes/MarcaEVolume') AS m(c)	
							WHERE (a.c.value('NumAdicao[1]', 'int') = 1) OR ((a.c.value('NumAdicao[1]', 'int') > 1) AND (m.c.value('P[1]', 'bit') = 0) AND (m.c.value('R[1]', 'bit') = 0))															
							FOR XML PATH('marcaEVolume'), ROOT('marcasEVolumes'), TYPE)
						FROM t.c.nodes('Adicoes/Adicao') as a(c) 			
						FOR XML PATH('adicao'), TYPE)
					FOR XML PATH('adicoes'), TYPE)
				FROM @FicheiroXML.nodes('DeclaracoesImpToGIDWin/Declaracao') AS t(c)
				WHERE NOT EXISTS(SELECT 1 FROM PRO_DUCG WITH(NOLOCK) WHERE (DUC_EANO = YEAR(@DataAtual) OR DUC_EANO = (YEAR(@DataAtual) - 1)) AND DUC_CPRT = NULLIF(t.c.value('NumDocTransporte[1]', 'varchar(18)'), ''))
				FOR XML PATH('declaracao'), TYPE)		
			FOR XML PATH('declaracoesIMPToGIDWin'), ELEMENTS)
-- processa a geração da(s) declaração(ões) IMP-CAU
		EXEC @NumErro = sp_IMP_Declaracoes_ImportaDeXML @XMLDeclaracao, @IdUtilizador, @Erro OUTPUT								
	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_IMP_Declaracoes_ImportaFicheiroCTT TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_DeclaracoesDAR_SubmetePedidoRegisto') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_DeclaracoesDAR_SubmetePedidoRegisto
GO
CREATE PROCEDURE sp_DeclaracoesDAR_SubmetePedidoRegisto @TipoMensagem varchar(4), @Id int, @Motivo varchar(2000), @CodMotivoAnulacao varchar(4), @XMLMencoesAnulacao xml, @AcaoResposta int, 
	@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, @DataAtual datetime, @PassPhrase varchar(50), @EnderecoWS varchar(250), @LoginWS varchar(50), @PwdWS varchar(100), @PathCertificado varchar(250), 
		@PwdCertificado varchar(100), @ProxyAuthentication bit, @ProxyServer varchar(100), @ProxyPort int, @ProxyUser varchar(100), @ProxyPassword varchar(100), @DiasFreeADT tinyint, 
		@dataContramarca datetime, @Resultado int, @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, @ResponseXML xml, @FaultCode varchar(100), @FaultMessage varchar(MAX)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()	
	SET @PassPhrase = '16345678901234567'
-- inicia processo de submissão de pedido da declaração
	BEGIN TRY	
		SET @NumErro = 0
-- obtem configurações do Webservice e do Proxy Authentication
		SELECT @EnderecoWS = wsEndereco, @LoginWS = wsUtilizador, @PwdWS = CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, wsPassword)), @PathCertificado = wsPathCertificado, 
			@PwdCertificado = CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, wsPasswordCertificado)), @ProxyAuthentication = proxyAuthentication, @ProxyServer = ISNULL(proxyServer, ''), 
			@ProxyPort = ISNULL(proxyPort, 0), @ProxyUser = ISNULL(proxyUser, ''), @ProxyPassword = ISNULL(CONVERT(varchar(100), DecryptByPassphrase(@PassPhrase, proxyPassword)), ''),
			@DiasFreeADT = diasFreeADT
		FROM tb_ConfiguracoesDAR WITH(NOLOCK)	
-- obtem a chave pública do sistema de autenticação na AT para ambiente de produção
		SET @PublicKeyCertificadoAT = GIDWIN.dbo.fn_Geral_ChavePublicaRSAWebservicesAT(0)
-- 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)	
-- processa recalculo de optativas se o tipo de mensagem for submissão e o n.º dias free/ADT está configurado e a declaração tem status "Por Enviar" e tem "Meio Transporte" definido
		IF (@TipoMensagem = '0110') AND (@DiasFreeADT > 0) AND (EXISTS(SELECT id FROM tb_DeclaracoesDAR WITH(NOLOCK) WHERE id = @Id AND status = 0 AND id_meioTransporte IS NOT NULL))
		BEGIN
-- obtem data da contramarca da declaração
			SET @dataContramarca = ISNULL((SELECT TOP 1 dataContramarca 
										FROM tb_DeclaracoesDARPrecedentes WITH(NOLOCK) 
										WHERE id_declaracaoDAR = @Id), @dataAtual)
-- processa recalculo de optativas se diferença de dias uteis superior ao n.º dias free/ADT configurado
			IF dbo.FNT_CalculaDifDiasUteis(CAST(CONVERT(varchar(10), @dataContramarca, 105) AS datetime), CAST(CONVERT(varchar(10), @dataAtual, 105) AS datetime), 1, 1) > @DiasFreeADT
			BEGIN
				UPDATE tb_DeclaracoesDAR SET totalOptativas = dbo.fn_IMP_CalculaValorTotalOptativas(id_meioTransporte, NULL, totalMassaBruta, totalMontanteEUR)				
				WHERE id = @Id
			END
		END
-- constroi o XML de acordo com o tipo de mensagem
		IF @TipoMensagem = '0710'
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impec.canalWS/STADAIMPCAUCanalWebService/processaMensagemICAUM007A'
			SET @MensagemXML =
				(SELECT 
					1 AS "@versao", 
					(SELECT
						(SELECT
							(SELECT								
								dar.numeroReferenciaLocal AS "numeroReferenciaLocal", 
								NULLIF(dar.numeroProvisorio, '') AS "numeroProvisorio", 
								alf.ALF_CODI AS "codigoEstancia", 
								NULLIF(dar.numeroNRM, '') AS "numeroAceitacao", 
								dar.versao AS "numeroVersao", 								
								@TipoMensagem AS "codigoOperacao", 
								CONVERT(varchar(10), @DataAtual, 120) AS "dataAnulacao", 
								NULLIF(@CodMotivoAnulacao, '') AS "motivoAnulacao", 
								NULLIF(@Motivo, '') AS "justificacaoAnulacao", 
								(SELECT 
									NULLIF(XML_MENC.MEN_DATA.value('codigo[1]', 'varchar(6)'), '') AS "codigoMencao", 
									NULLIF(XML_MENC.MEN_DATA.value('numero[1]', 'varchar(35)'), '') AS "numeroMencao", 
									CONVERT(varchar(10), XML_MENC.MEN_DATA.value('data[1]', 'datetime'), 120) AS "dataDocumento"
								FROM @XMLMencoesAnulacao.nodes('mencoesAnulacao/mencao') AS XML_MENC(MEN_DATA)
								FOR XML PATH('mencoes'), TYPE)
							FOR XML PATH('cabecalho'), TYPE), 
							(SELECT 
								(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN NULL ELSE (pcl.PAI_CODI + dar.nifCliente) END) AS "numeroIdentificacao", 
								(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.nomeCliente) ELSE NULL END) AS "nome", 
								(SELECT 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.moradaCliente) ELSE NULL END) AS "ruaNumero", 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.localidadeCliente) ELSE NULL END) AS "localidade", 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dar.codPostalCliente ELSE NULL END)AS "codigoPostal", 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN pcl.PAI_CODI ELSE NULL END) AS "pais"
								HAVING (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9')))
								FOR XML PATH('endereco'), TYPE)
							FOR XML PATH('importador'), TYPE), 
							(SELECT 
								(pdc.PAI_CODI + dar.nifDeclarante) AS "numeroIdentificacao"
							FOR XML PATH('declarante'), TYPE), 
							(SELECT 
								(CASE dar.estatutoDeclarante WHEN 1 THEN 2 ELSE dar.estatutoDeclarante END) AS "estatuto", 
								NULLIF(dar.nifRepresentante, '') AS "numeroIdentificacao"
							HAVING dar.estatutoDeclarante IS NOT NULL
							FOR XML PATH('representante'), TYPE)				
						FROM tb_DeclaracoesDAR AS dar WITH(NOLOCK) INNER JOIN TAB_ALFA AS alf WITH(NOLOCK) ON dar.id_estancia = alf.ALF_IDTY							
							INNER JOIN TAB_PAIS AS pcl WITH(NOLOCK) ON dar.id_paisCliente = pcl.PAI_IDTY	
							INNER JOIN TAB_PAIS AS pdc WITH(NOLOCK) ON dar.id_paisDeclarante = pdc.PAI_IDTY				
						WHERE id = @Id
						FOR XML PATH('icaum007a'), TYPE)
					FOR XML PATH('mensagens'), TYPE)
				FOR XML PATH('mensagemICAUM007A'), ELEMENTS)
		END
		ELSE
		BEGIN
			SET @MensagemSoapAction = 'http://net.atos.at.impec.canalWS/STADAIMPCAUCanalWebService/processaMensagemICAUM001A'
			SET @MensagemXML =
				(SELECT 
					1 AS "@versao", 
					(SELECT
						(SELECT
							(SELECT
								dar.tipoDeclaracao AS "tipoDeclaracaoAdicional",
								NULLIF(dar.numeroNRUR, '') AS "numeroReferencia", 
								dar.numeroReferenciaLocal AS "numeroReferenciaLocal", 
								NULLIF(dar.numeroProvisorio, '') AS "numeroProvisorio", 
								alf.ALF_CODI AS "codigoEstancia", 
								NULLIF(dar.numeroNRM, '') AS "numeroAceitacao", 
								dar.versao AS "numeroVersao", 
								CONVERT(varchar(10), dar.dataNRM, 120) AS "dataAceitacao", 
								@TipoMensagem AS "codigoOperacao", 
								(CASE 
									WHEN @TipoMensagem IN ('0140', '0150') THEN CONVERT(varchar(10), @DataAtual, 120)
									ELSE NULL 
								END) AS "dataAlteracao", 
								(CASE 
									WHEN @TipoMensagem IN ('0140', '0150') THEN NULLIF(@Motivo, '')
									ELSE NULL 
								END) AS "motivoAlteracao", 
								(SELECT 
									@AcaoResposta AS "indicador", 
									NULLIF(@Motivo, '') AS "justificacao", 
									CONVERT(varchar(10), @DataAtual, 120) AS "data"
								HAVING @TipoMensagem IN ('0160', '0190')
								FOR XML PATH('resposta'), TYPE),								
								NULLIF(dar.caucao, '') AS "diferimentoPagamento", 
								dar.totalMassaBruta AS "massaBruta", 
								(SELECT 
									NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.nomeFornecedor), '') AS "nome",
									(SELECT
										NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.moradaFornecedor), '') AS "ruaNumero", 
										NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.localidadeFornecedor), '') AS "localidade", 
										NULLIF(dar.codPostalFornecedor, '') AS "codigoPostal", 
										pfr.PAI_CODI AS "pais"
									HAVING ISNULL(dar.moradaFornecedor, '') <> ''
									FOR XML PATH('endereco'), TYPE)
								HAVING ISNULL(dar.nomeFornecedor, '') <> ''
								FOR XML PATH('exportador'), TYPE),
								(SELECT 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN NULL ELSE (pcl.PAI_CODI + dar.nifCliente) END) AS "numeroIdentificacao", 
									(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.nomeCliente) ELSE NULL END) AS "nome", 
									(SELECT 
										(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.moradaCliente) ELSE NULL END) AS "ruaNumero", 
										(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dar.localidadeCliente) ELSE NULL END) AS "localidade", 
										(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN dar.codPostalCliente ELSE NULL END)AS "codigoPostal", 
										(CASE WHEN (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9'))) THEN pcl.PAI_CODI ELSE NULL END) AS "pais"
									HAVING (dar.nifCliente = '999999990') OR ((dar.regimeIVA = 1) AND (SUBSTRING(dar.nifCliente, 1, 1) IN ('5', '6', '7', '8', '9')))
									FOR XML PATH('endereco'), TYPE)
								FOR XML PATH('importador'), TYPE), 
								(SELECT 
									(pdc.PAI_CODI + dar.nifDeclarante) AS "numeroIdentificacao"
								FOR XML PATH('declarante'), TYPE), 
								(SELECT 
									(CASE dar.estatutoDeclarante WHEN 1 THEN 2 ELSE dar.estatutoDeclarante END) AS "estatuto", 
									NULLIF(pdc.PAI_CODI + dar.nifRepresentante, '') AS "numeroIdentificacao"
								HAVING dar.estatutoDeclarante IS NOT NULL
								FOR XML PATH('representante'), TYPE), 
								(SELECT 
									(SELECT 
										NULLIF(dar.funcaoRegimeIOSS, '') AS "funcao", 									
										NULLIF(dar.numeroIdentificacaoIVA, '') AS "numeroIdentificacaoIva"
									HAVING dar.regimeIVA = 1
									FOR XML PATH('referenciaFiscalAdicional'), TYPE)
								HAVING dar.regimeIVA = 1
								FOR XML PATH('identificacaoRefFiscalAdicional'), TYPE), 
								(SELECT 
									 'EUR' AS "moeda", 
									 CAST((ROUND(dar.totalCustosTransporte / dar.cambioCustosTransporte, 2) + dar.totalOptativas) AS decimal(18, 2)) AS "montante"
								FOR XML PATH('custoTransporteDestino'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										doc.DOC_CODI AS "tipo", 
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(dpr.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARPrecedentes AS dpr WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
									WHERE dpr.id_declaracaoDAR = dar.id
									FOR XML PATH('documento'), TYPE)
								FROM tb_DeclaracoesDARPrecedentes WITH(NOLOCK)
								WHERE id_declaracaoDAR = dar.id
								FOR XML PATH('docPrecedente'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										men.INF_CODI AS "codigo", 
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ISNULL(NULLIF(dme.texto, ''), NULLIF(men.INF_DESI, ''))) AS "texto"
									FROM tb_DeclaracoesDARMencoes AS dme WITH(NOLOCK) INNER JOIN TAB_INFC AS men WITH(NOLOCK) ON dme.id_mencao = men.INF_IDTY
									WHERE dme.id_declaracaoDAR = dar.id
									FOR XML PATH('informacao'), TYPE)
								FROM tb_DeclaracoesDARMencoes WITH(NOLOCK)
								WHERE id_declaracaoDAR = dar.id
								FOR XML PATH('informacoesAdicionais'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ddo.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
									WHERE ddo.id_declaracaoDAR = dar.id AND ddo.tipo = 0
									FOR XML PATH('documentosSuporte'), TYPE),
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ddo.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
									WHERE ddo.id_declaracaoDAR = dar.id AND ddo.tipo = 2
									FOR XML PATH('referenciasAdicionais'), TYPE), 
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ddo.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
									WHERE ddo.id_declaracaoDAR = dar.id AND ddo.tipo = 1
									FOR XML PATH('documentoTransporte'), TYPE)
								FROM tb_DeclaracoesDARDocumentos WITH(NOLOCK)
								WHERE id_declaracaoDAR = dar.id
								FOR XML PATH('documentosCertificados'), TYPE), 
								(SELECT 
									dar.localizacaoMercadorias AS "tipoLocalizacao", 
									dar.qualificador AS "qualificadorIdentificacao", 
									ame.ALF_CODI AS "numeroReferencia", 
									lme.LME_CODI AS "numeroAutorizacao"
								FOR XML PATH('localizacaoMercadorias'), TYPE)
							FOR XML PATH('cabecalho'), TYPE), 
							(SELECT 
								adi.numeroAdicao AS "numeroAdicao", 
								NULLIF(adi.numeroNRUR, '') AS "numeroReferencia", 
								NULLIF(adi.metodoPagamento, '') AS "metodoPagamento", 
								NULLIF(adi.unidades, 0) AS "unidadesSuplementares", 								
								dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(adi.designacao) AS "descricaoMercadorias", 
								(CASE alf.ALF_CODI WHEN 'PT000236' THEN NULL ELSE adi.volumes END) AS "numeroVolumes", 
								adi.codigoPautal AS "codigoSubposicaoSistHarmonizado", 
								(SELECT 
									pmm.PAI_PREF AS "moeda", 
									adi.montante AS "montante"
								FOR XML PATH('valor'), TYPE), 
								(SELECT 
									(SELECT 
										dar.regimeAdicional AS "codigoRegimeAdicional"
									FOR XML PATH(''), TYPE), 
									(SELECT 
										NULLIF(adi.regimeAdicional, '') AS "codigoRegimeAdicional"	
									FOR XML PATH(''), TYPE)
								FOR XML PATH('regimeAdicional'), TYPE), 
								(SELECT 
									NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(adi.nomeFornecedor), '') AS "nome",
									(SELECT
										NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(adi.moradaFornecedor), '') AS "ruaNumero", 
										NULLIF(dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(adi.localidadeFornecedor), '') AS "localidade", 
										NULLIF(adi.codPostalFornecedor, '') AS "codigoPostal", 
										paf.PAI_CODI AS "pais"
									HAVING ISNULL(adi.moradaFornecedor, '') <> ''
									FOR XML PATH('endereco'), TYPE)
								HAVING ISNULL(adi.nomeFornecedor, '') <> ''
								FOR XML PATH('exportador'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										doc.DOC_CODI AS "tipo", 
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(apr.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARAdicoesPrecedentes AS apr WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON apr.id_documento = doc.DOC_IDTY
									WHERE apr.id_adicao = adi.id
									FOR XML PATH('documento'), TYPE)
								FROM tb_DeclaracoesDARAdicoesPrecedentes WITH(NOLOCK)
								WHERE id_adicao = adi.id
								FOR XML PATH('docPrecedente'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										men.INF_CODI AS "codigo", 
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ISNULL(NULLIF(ame.texto, ''), NULLIF(men.INF_DESI, ''))) AS "texto"
									FROM tb_DeclaracoesDARAdicoesMencoes AS ame WITH(NOLOCK) INNER JOIN TAB_INFC AS men WITH(NOLOCK) ON ame.id_mencao = men.INF_IDTY
									WHERE ame.id_adicao = adi.id
									FOR XML PATH('informacao'), TYPE)
								FROM tb_DeclaracoesDARAdicoesMencoes WITH(NOLOCK)
								WHERE id_adicao = adi.id
								FOR XML PATH('informacoesAdicionais'), TYPE), 
								(SELECT TOP 1
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ado.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARAdicoesDocumentos AS ado WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.id_documento = doc.DOC_IDTY
									WHERE ado.id_adicao = adi.id AND ado.tipo = 2
									FOR XML PATH('documentosSuporte'), TYPE),
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ado.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARAdicoesDocumentos AS ado WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.id_documento = doc.DOC_IDTY
									WHERE ado.id_adicao = adi.id AND ado.tipo = 0
									FOR XML PATH('referenciasAdicionais'), TYPE), 
									(SELECT 
										doc.DOC_CODI AS "tipo",									
										dbo.FNT_Geral_SubstituiCaracteresXMLInvalidos(ado.numero) AS "numeroReferencia"
									FROM tb_DeclaracoesDARAdicoesDocumentos AS ado WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.id_documento = doc.DOC_IDTY
									WHERE ado.id_adicao = dar.id AND ado.tipo = 1
									FOR XML PATH('documentoTransporte'), TYPE)
								FROM tb_DeclaracoesDARAdicoesDocumentos WITH(NOLOCK)
								WHERE id_adicao = adi.id
								FOR XML PATH('documentosCertificados'), TYPE), 								
								(SELECT 
									por.PAI_CODI AS "paisOrigem", 
									NULLIF(adi.codigoNC, '') AS "codigoNomenclaturaCombinada", 
									NULLIF(adi.codigoTARIC, '') AS "codigoTaric", 
									(SELECT 
										(SELECT 
											NULLIF(adi.adicionalNacional1, '') AS "codigoNacional"
										FOR XML PATH(''), TYPE), 
										(SELECT 
											NULLIF(adi.adicionalNacional2, '') AS "codigoNacional"	
										FOR XML PATH(''), TYPE), 
										(SELECT 
											NULLIF(adi.adicionalNacional3, '') AS "codigoNacional"	
										FOR XML PATH(''), TYPE)
									HAVING ISNULL(adi.adicionalNacional1, '') <> '' OR ISNULL(adi.adicionalNacional2, '') <> '' OR ISNULL(adi.adicionalNacional3, '') <> ''
									FOR XML PATH('codigosNacionaisAdicionais'), TYPE), 
									(SELECT 
										(SELECT 
											NULLIF(adi.adicionalTARIC1, '') AS "codigoAdicional"
										FOR XML PATH(''), TYPE), 
										(SELECT 
											NULLIF(adi.adicionalTARIC2, '') AS "codigoAdicional"	
										FOR XML PATH(''), TYPE), 
										(SELECT 
											NULLIF(adi.adicionalTARIC3, '') AS "codigoAdicional"	
										FOR XML PATH(''), TYPE)
									HAVING ISNULL(adi.adicionalTARIC1, '') <> '' OR ISNULL(adi.adicionalTARIC2, '') <> '' OR ISNULL(adi.adicionalTARIC3, '') <> ''
									FOR XML PATH('codigosAdicionaisTaric'), TYPE)
								FOR XML PATH('elementosTecnicos'), TYPE)
							FROM tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) INNER JOIN TAB_PAIS AS pmm WITH(NOLOCK) ON adi.id_paisMoedaMontante = pmm.PAI_IDTY
								LEFT OUTER JOIN TAB_PAIS AS paf WITH(NOLOCK) ON adi.id_paisFornecedor = paf.PAI_IDTY
								INNER JOIN TAB_PAIS AS pmc WITH(NOLOCK) ON adi.id_paisMoedaCustosTransporte = pmc.PAI_IDTY
								LEFT OUTER JOIN TAB_PAIS AS por WITH(NOLOCK) ON adi.id_paisOrigem = por.PAI_IDTY
							WHERE adi.id_declaracaoDAR = dar.id
							FOR XML PATH('adicao'), TYPE)
						FROM tb_DeclaracoesDAR AS dar WITH(NOLOCK) INNER JOIN TAB_ALFA AS alf WITH(NOLOCK) ON dar.id_estancia = alf.ALF_IDTY
							LEFT OUTER JOIN TAB_PAIS AS pfr WITH(NOLOCK) ON dar.id_paisFornecedor = pfr.PAI_IDTY
							INNER JOIN TAB_PAIS AS pcl WITH(NOLOCK) ON dar.id_paisCliente = pcl.PAI_IDTY
							INNER JOIN TAB_PAIS AS pdc WITH(NOLOCK) ON dar.id_paisDeclarante = pdc.PAI_IDTY							
							LEFT OUTER JOIN TAB_ALFA AS ame WITH(NOLOCK) ON dar.id_estanciaMercadorias = ame.ALF_IDTY
							LEFT OUTER JOIN TAB_LMER AS lme WITH(NOLOCK) ON dar.id_localAutorizado = lme.LME_IDTY
						WHERE id = @Id
						FOR XML PATH('icaum001a'), TYPE)
					FOR XML PATH('mensagens'), TYPE)
				FOR XML PATH('mensagemICAUM001A'), ELEMENTS)
		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 submitMessages a enviar à AT
		IF @TipoMensagem = '0710'
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 
				'http://net.atos.at.impec.canalWS/' AS web, 
				'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"
							FOR XML PATH('processaMensagemInput'), TYPE)
						FOR XML PATH('web:processaMensagemICAUM007A'), TYPE)						
					FOR XML PATH('soapenv:Body'), ELEMENTS, TYPE)
				FOR XML PATH('soapenv:Envelope'), ELEMENTS)
		END
		ELSE
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/ws/2002/12/secext' AS wss, 
				'http://net.atos.at.impec.canalWS/' AS web, 
				'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"
							FOR XML PATH('processaMensagemInput'), TYPE)
						FOR XML PATH('web:processaMensagemICAUM001A'), TYPE)		
					FOR XML PATH('soapenv:Body'), ELEMENTS, TYPE)
				FOR XML PATH('soapenv:Envelope'), ELEMENTS)		
		END
-- 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 = XML_MSGR.MSG_DATA.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = XML_MSGR.MSG_DATA.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('SOAP-ENV:Envelope/SOAP-ENV:Body/SOAP-ENV:Fault') AS XML_MSGR(MSG_DATA)
		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 = XML_MSGR.MSG_DATA.value('faultcode[1]', 'nvarchar(100)'), 
			@FaultMessage = XML_MSGR.MSG_DATA.value('faultstring[1]', 'nvarchar(MAX)')
		FROM @ResponseXML.nodes('env:Envelope/env:Body/env:Fault') AS XML_MSGR(MSG_DATA)
		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 = '0710'
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impec.canalWS/' AS m)		
			SELECT 
				@FaultCode = XML_MSGR.MSG_DATA.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = XML_MSGR.MSG_DATA.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:processaMensagemICAUM007AResponse/return/resultadoProcessamento') AS XML_MSGR(MSG_DATA)	
		END
		ELSE
		BEGIN
			;WITH XMLNAMESPACES ('http://schemas.xmlsoap.org/soap/envelope/' AS env, 'http://net.atos.at.impec.canalWS/' AS m)		
			SELECT 
				@FaultCode = XML_MSGR.MSG_DATA.value('codigoResultado[1]', 'nvarchar(100)'), 
				@FaultMessage = XML_MSGR.MSG_DATA.value('descricaoResultado[1]', 'nvarchar(MAX)')
			FROM @ResponseXML.nodes('env:Envelope/env:Body/m:processaMensagemICAUM001AResponse/return/resultadoProcessamento') AS XML_MSGR(MSG_DATA)			
		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 DAR p/ alteração do status e utilizador/data
		UPDATE tb_DeclaracoesDAR SET [status] = 1, dataEnvio = @DataAtual, id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual 
		WHERE id = @Id
	END TRY
	BEGIN CATCH
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = 'Detalhes do Erro: ' + 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()
	END CATCH	
-- insere no detalhe de mensagens os dados da submissão da declaração DAR
	INSERT INTO tb_DeclaracoesDARMensagens(id_declaracaoDAR, fluxo, mensagem, id_utilizadorMensagem, dataMensagem, pedido, resposta, sucesso, estadoOperacao, id_utilizadorControlo, dataControlo)
	VALUES(@id, 1, (CASE WHEN @TipoMensagem IN ('0110', '0140', '0150', '0160', '0190') THEN ('ICAUM001A-' + @TipoMensagem) WHEN @TipoMensagem = '0710' THEN 'ICAUM007A-0710' ELSE NULL END), @IdUtilizador, @DataAtual, @MensagemXML, 
		@ResponseXML, (CASE @NumErro WHEN 1 THEN 0 ELSE 1 END), NULL, @IdUtilizador, @DataAtual)			
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_DeclaracoesDAR_SubmetePedidoRegisto 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 ('H2', '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)
-- 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, 45, @CodigoMeioTransporteFronteira, @anexoB)
			ELSE
				IF (@anexoB = 'H2') AND (ISNULL(@CodigoMeioTransporteFronteira, '') = '') 
					RAISERROR('O anexo B "%s" obriga ao preenchimento do meio de transporte fronteira.', 16, 46, @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, 47, @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, 48, @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, 49, @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, 50, @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, 51, @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, 52, @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, 53, @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, 54, @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, 55, @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, 56, @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, 57, @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, 58, @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, 59, @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, 60, @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, 61, @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, 62, @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, 63, @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, 64, @identificacaoTransporte)
-- 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, 65, @anexoB)
			ELSE
				IF (@contentorizada = 0) AND (ISNULL(@numeroContentor, '') <> '')
					RAISERROR('Número do contentor "%s" inválido quando a mercadoria não é contentorizada.', 16, 66, @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, 67, @tipoLocalizacao, @anexoB)
			ELSE
				IF (@anexoB <> 'H6') AND (ISNULL(@tipoLocalizacao, '') = '')
					RAISERROR('O anexo B "%s" obriga ao preenchimento do tipo de localização.', 16, 68, @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, 69, @CodigoArmazem, @anexoB)
			ELSE
				IF (@anexoB = 'H2') AND (ISNULL(@CodigoArmazem, '') = '')
					RAISERROR('O anexo B "%s" obriga ao preenchimento do armazém.', 16, 70, @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, 71, @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, 72, @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, 73, @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, 74, @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, 75, @CodigoLocalizacaoMercadorias, @qualificador)
			ELSE
				IF (@qualificador IN ('U', 'Y')) AND (ISNULL(@CodigoLocalizacaoMercadorias, '') = '')
					RAISERROR('O qualificador "%s" obriga ao preenchimento da localização das mercadorias.', 16, 76, @qualificador)
				ELSE
					IF (@qualificador <> 'V') AND (ISNULL(@CodigoAlfandegaLM, '') <> '')
						RAISERROR('Estância das mercadorias "%s" inválida para o qualificador "%s".', 16, 77, @CodigoAlfandegaLM, @qualificador)
					ELSE
						IF (@qualificador = 'V') AND (ISNULL(@CodigoAlfandegaLM, '') = '')
							RAISERROR('O qualificador "%s" obriga ao preenchimento da estância das mercadorias.', 16, 78, @qualificador)
						ELSE
							IF (@qualificador <> 'X') AND (ISNULL(@nifOperadorEconomico, '') <> '')
								RAISERROR('NIF do operador económico das mercadorias "%s" inválido para o qualificador "%s".', 16, 79, @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, 80, @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, 81, @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, 82, @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, 83, @CodigoArmazem)
			ELSE
				IF (ISNULL(@CodigoArmazem, '') <> '') AND (ISNULL(@CodigoDocumentoArmazem, '') = '')
					RAISERROR('O armazém "%s" obriga ao preenchimento do documento do armazém.', 16, 84, @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, 85, @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, 86, @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, 87)			
-- 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, 88, @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, 89, @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, 90, @pais)
					ELSE
						IF (@IdPais IS NULL) AND (@montante > 0) 
							RAISERROR('Montante inválido quando não se especifica país.', 16, 91)
						ELSE
							IF (@IdPais IS NOT NULL) AND (@montante = 0) 
								RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 92, @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, 93, @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, 94, @pais)
					ELSE
						IF (@IdPais IS NULL) AND (@montante > 0) 
							RAISERROR('Montante inválido quando não se especifica país.', 16, 95)
						ELSE
							IF (@IdPais IS NOT NULL) AND (@montante = 0) 
								RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 96, @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, 97, @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, 98, @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, 99, @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 TXM_CODI = @codigoPedido
-- verifica se o pedido é válido
					IF @IdPedido IS NULL
						RAISERROR('Pedido "%s" inválido.', 16, 100, @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, 101, @codigoIncidencia)		
					ELSE
						IF @dataFim < @dataInicio
							RAISERROR('Data de fim inferior à data de início.', 16, 102)		
-- 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, 103, @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, 104, @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, 105, @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, 106, @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, 107, @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, 108, @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, 109, @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, 110, @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, 111, @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, 112, @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, 113, @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, 114, @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, 115, @unidadeMedida)
					ELSE
						IF (@anexoB = 'H6') AND (ISNULL(@CodigoUnidadeMedida, '') <> '')
							RAISERROR('Unidade de medida "%s" inválida para o anexo B "%s".', 16, 116, @CodigoUnidadeMedida, @anexoB)
						ELSE
							IF (@anexoB <> 'H6') AND (ISNULL(@CodigoUnidadeMedida, '') = '')
								RAISERROR('O anexo B "%s" obriga ao preenchimento da unidade de medida.', 16, 117, @anexoB)							
							ELSE
								IF (ISNULL(@CodigoUnidadeMedida, '') NOT IN ('NE', 'NF', 'NG')) AND (@volumes = 0)
									RAISERROR('Unidade de medida "%s" obriga ao preenchimento dos volumes.', 16, 118, @unidadeMedida)
								ELSE
									IF (ISNULL(@CodigoUnidadeMedida, '') <> '') AND (@VolumesAZero = 1) AND (@volumes > 0)
										RAISERROR('Volumes inválidos para a Unidade de medida "%s".', 16, 119, @unidadeMedida)
-- verifica se as marcas é válida
					IF (@anexoB = 'H6') AND (ISNULL(@marcas, '') <> '')
						RAISERROR('Marcas "%s" inválida para o anexo B "%s".', 16, 120, @marcas, @anexoB)
					ELSE
						IF (@anexoB NOT IN ('H6', 'I1')) AND (ISNULL(@marcas, '') = '')
							RAISERROR('O anexo B "%s" obriga ao preenchimento das marcas.', 16, 121, @anexoB)
-- verifica restantes regras														
					IF (@numeroAdicao > 1) AND (@parte = 1)
						RAISERROR('"Parte" apenas é válido na 1ª adição.', 16, 122)
					IF (@CamposAdicionais <> 5) AND (ISNULL(@numeroObjeto, '') <> '')
						RAISERROR('Número do objeto "%s" inválido neste contexto.', 16, 123, @numeroObjeto)
					IF (@CamposAdicionais <> 5) AND (ISNULL(@codigoBarras, '') <> '')
						RAISERROR('Código de barras "%s" inválido neste contexto.', 16, 124, @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, 125, @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, 126, @pais)
						ELSE
							IF (@IdPais IS NULL) AND (@montante > 0) 
								RAISERROR('Montante inválido quando não se especifica país.', 16, 127)
							ELSE
								IF (@IdPais IS NOT NULL) AND (@montante = 0) 
									RAISERROR('O país "%s" obriga ao preenchimento do montante.', 16, 128, @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, 129, @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, 130, @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 TXM_CODI = @codigoPedido
-- verifica se o pedido é válido
						IF @IdPedido IS NULL
							RAISERROR('Pedido "%s" inválido.', 16, 132, @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, 133, @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, 134, @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, 135, @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, 136, @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, 137, @tabela)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@qualificadorV, '') = '') 
							RAISERROR('Sem adicional ISV obriga ao preenchimento do qualificador.', 16, 138)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@CodigoTipoVeiculo, '') = '') 
							RAISERROR('Sem adicional ISV obriga ao preenchimento do tipo de veículo.', 16, 139)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (ISNULL(@CodigoCategoria, '') = '') 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento da categoria.', 16, 140)
						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, 141)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (@cilindrada = 0) 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento da cilindrada.', 16, 142)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = '') AND (ISNULL(@particulas, '') = '') 
							RAISERROR('Sem adicional ISV e sem tabela obriga ao preenchimento das partículas.', 16, 143)
						IF (ISNULL(@adicionalISV, '') = '') AND (ISNULL(@tabela, '') = 'A') AND (@co2 = 0) 
							RAISERROR('A tabela "%s" sem adicional ISV obriga ao preenchimento do co2.', 16, 144, @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, 145, @tabela)
						IF (LEFT(@Regime, 2) IN ('40', '61')) AND (ISNULL(@documentoIMT, '') = '')
							RAISERROR('O regime "%s" obriga ao preenchimento do documento IMT.', 16, 146, @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, 147, @qualificadorV)
							ELSE
								IF (ISNULL(@qualificadorV, '') IN ('', 'A')) AND (@dataMatricula IS NULL)
									RAISERROR('O qualificador "%s" obriga ao preenchimento da data da matrícula.', 16, 148, @qualificadorV)
								ELSE
									IF (ISNULL(@qualificadorV, '') IN ('N', 'U')) AND (ISNULL(@numeroChassi, '') = '')
										RAISERROR('O qualificador "%s" obriga ao preenchimento do chassi.', 16, 149, @qualificadorV)
									ELSE
										IF (ISNULL(@qualificadorV, '') IN ('N', 'U')) AND (@dataChassi IS NULL)
											RAISERROR('O qualificador "%s" obriga ao preenchimento da data do chassi.', 16, 150, @qualificadorV)
							IF (ISNULL(@matricula, '') = '') AND (@dataMatricula IS NOT NULL)
								RAISERROR('Data da matrícula inválida.', 16, 151)
							IF (ISNULL(@numeroChassi, '') = '') AND (@dataChassi IS NOT NULL)
								RAISERROR('Data do chassi inválida.', 16, 152)
-- 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'sp_APL_DeclaracoesImportaFicheirosXMLStandardDeSFTP') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_APL_DeclaracoesImportaFicheirosXMLStandardDeSFTP
GO
CREATE PROC sp_APL_DeclaracoesImportaFicheirosXMLStandardDeSFTP @TipoDeclaracao varchar(3), @psFTPAppPath varchar(1000), @ServidorSFTP varchar(100), 
	@UtilizadorSFTP varchar(100), @PasswordSFTP varchar(100), @PortaSFTP int, @HostKeyServidorSFTP varchar(100), @DirOrigemFicheirosSFTP varchar(100), 
	@DirDestinoFicheirosSFTP varchar(100), @DirFicheirosTmpLocal varchar(500), @DirDestinoFicheiroErros varchar(500), @ConverteStandardIMPToStandardIMPCAU bit, 
	@Utilizador varchar(30) WITH ENCRYPTION AS	
BEGIN
	SET NOCOUNT ON
-- declaração de variáveis
	DECLARE @psFPTAppArgs varchar(2000), @PathFicheiroComandosFTP varchar(1000), @Erros varchar(MAX), @Linha varchar(MAX), @DirFicheirosDestinoTmpLocal varchar(500)
-- valida se a aplicação p/ sFTP é a correta
	IF REVERSE(SUBSTRING(REVERSE(@psFTPAppPath), 1, CHARINDEX('\', REVERSE(@psFTPAppPath)) - 1)) <> 'psftp.exe'
	BEGIN
		RAISERROR('A aplicação de envio de ficheiros p/ sFTP especificada não é válida!', 16, 1)
		RETURN 1
	END
-- substitui caracteres especiais p/ utilização no comando "echo"
	SET @ServidorSFTP = REPLACE(REPLACE(REPLACE(REPLACE(@ServidorSFTP, '|', '^|'), '<', '^<'), '>', '^>'), '&', '^&')
	SET @UtilizadorSFTP = REPLACE(REPLACE(REPLACE(REPLACE(@UtilizadorSFTP, '|', '^|'), '<', '^<'), '>', '^>'), '&', '^&')
	SET @PasswordSFTP = REPLACE(REPLACE(REPLACE(REPLACE(@PasswordSFTP, '|', '^|'), '<', '^<'), '>', '^>'), '&', '^&')
	SET @DirOrigemFicheirosSFTP = REPLACE(REPLACE(REPLACE(REPLACE(@DirOrigemFicheirosSFTP, '|', '^|'), '<', '^<'), '>', '^>'), '&', '^&')
	SET @DirDestinoFicheirosSFTP = REPLACE(REPLACE(REPLACE(REPLACE(@DirDestinoFicheirosSFTP, '|', '^|'), '<', '^<'), '>', '^>'), '&', '^&')
-- verifica se diretorias SFTP tem separador no início
	IF SUBSTRING(@DirOrigemFicheirosSFTP, 1, 1) <> '/'
		SET @DirOrigemFicheirosSFTP = '/' + @DirOrigemFicheirosSFTP
	IF SUBSTRING(@DirDestinoFicheirosSFTP, 1, 1) <> '/'
		SET @DirDestinoFicheirosSFTP = '/' + @DirDestinoFicheirosSFTP
-- verfica se diretorias locais tem backslash no final
	IF SUBSTRING(REVERSE(@DirFicheirosTmpLocal), 1, 1) <> '\'
		SET @DirFicheirosTmpLocal = @DirFicheirosTmpLocal + '\'		
	IF SUBSTRING(REVERSE(@DirDestinoFicheiroErros), 1, 1) <> '\'
		SET @DirDestinoFicheiroErros = @DirDestinoFicheiroErros + '\'					
-- constroi nome p/ diretoria local tmp
	SET @DirFicheirosTmpLocal = @DirFicheirosTmpLocal + REPLACE(CAST(CONVERT(numeric(38, 12), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()) as varchar(20)), '.', '_') + '\'	
-- processa a criação da diretoria local tmp 
	EXEC GIDWIN.dbo.SP_Externo_CriaDiretoria @DirFicheirosTmpLocal, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível criar a diretoria "%s"! ERRO: "%s".', 16, 2, @DirFicheirosTmpLocal, @Erros)
-- constroi nome p/ diretoria local tmp para destino de ficheiros
	SET @DirFicheirosDestinoTmpLocal = @DirFicheirosTmpLocal + 'tmpOUT\'
-- processa a criação da diretoria local tmp para destino de ficheiros
	EXEC GIDWIN.dbo.SP_Externo_CriaDiretoria @DirFicheirosDestinoTmpLocal, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível criar a diretoria "%s"! ERRO: "%s".', 16, 3, @DirFicheirosDestinoTmpLocal, @Erros)
-- gera o ficheiro de comandos SFTP na diretoria local tmp p/ download de ficheiros XML
	SET @PathFicheiroComandosFTP = @DirFicheirosTmpLocal + 'comandosSFTP.txt'			
	SET @Linha = 'cd ' + @DirOrigemFicheirosSFTP
	EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroComandosFTP, @Linha, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 4, @PathFicheiroComandosFTP, @Erros)	
	SET @Linha = 'lcd ' + @DirFicheirosTmpLocal
	EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroComandosFTP, @Linha, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 5, @PathFicheiroComandosFTP, @Erros)					
	SET @Linha = 'mget *.xml'
	EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroComandosFTP, @Linha, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 6, @PathFicheiroComandosFTP, @Erros)			
	SET @Linha = 'mv *.xml ' + @DirDestinoFicheirosSFTP
	EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroComandosFTP, @Linha, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 7, @PathFicheiroComandosFTP, @Erros)									
	SET @Linha = 'quit'
	EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroComandosFTP, @Linha, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 8, @PathFicheiroComandosFTP, @Erros)				
-- constroi os argumentos p/ a aplicação sFTP
	SET @psFPTAppArgs = @ServidorSFTP
	IF @PortaSFTP IS NOT NULL
		SET @psFPTAppArgs = @psFPTAppArgs + ' -P ' + CAST(@PortaSFTP as varchar(5)) 
	SET @psFPTAppArgs = @psFPTAppArgs + ' -l ' + @UtilizadorSFTP + ' -pw ' + @PasswordSFTP + ' -b "' + @PathFicheiroComandosFTP + '" -batch' 
	IF ISNULL(@HostKeyServidorSFTP, '') <> ''
		SET @psFPTAppArgs = @psFPTAppArgs + ' -hostkey ' + @HostKeyServidorSFTP /* hostkey no formato: "db:4f:fc:cc:ac:92:38:d5:be:57:5b:20:e0:86:b6:96"*/
	/*DECLARE @CommandString AS varchar(8000) --SCRIPT P/ EXTRAIR A hostkey
	--Create Batch fle with login credentials
    SET @CommandString = 'echo ' + @@psFTPAppPath + ' ' + @ServidorSFTP + ' -l ' + @UtilizadorSFTP + ' -pw ' + @PasswordSFTP + ' -b "' + @PathFicheiroComandosFTP + '" > "' + @DirFicheirosTmpLocal + 'SFTPUploadScript.bat"'
    EXEC master..xp_cmdshell @CommandString
	--Run the Batch File
    SET @CommandString = @DirFicheirosTmpLocal + 'SFTPUploadScript.bat'
    EXEC master..xp_cmdshell @CommandString */
-- processa o download dos ficheiros XML do sFTP p/ diretoria local tmp 
	EXEC GIDWIN.dbo.SP_Externo_ExecutaPrograma @psFTPAppPath, @psFPTAppArgs, @Erros OUTPUT		
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível efetuar o download dos ficheiros "*.xml" do servidor SFTP "%s"! ERRO: "%s".', 16, 9, @ServidorSFTP, @Erros)
-- remove o ficheiro de comandos sFTP na diretoria local tmp
	EXEC GIDWIN.dbo.SP_Externo_RemoveFicheiro @PathFicheiroComandosFTP, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível remover o ficheiro "%s"! ERRO: "%s".', 16, 10, @PathFicheiroComandosFTP, @Erros)	
-- processa a importação ficheiros XML obtidos do sFTP
	EXEC sp_APL_DeclaracoesImportaFicheirosXMLStandard @TipoDeclaracao, @DirFicheirosTmpLocal, @DirFicheirosDestinoTmpLocal, @DirDestinoFicheiroErros, @Utilizador, @ConverteStandardIMPToStandardIMPCAU	
-- processo a remoção da diretoria local tmp para destino de ficheiros
	EXEC GIDWIN.dbo.SP_Externo_RemoveDiretoria @DirFicheirosDestinoTmpLocal, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível remover a diretoria "%s"! ERRO: "%s".', 16, 11, @DirFicheirosDestinoTmpLocal, @Erros)
-- processo a remoção da diretoria local tmp
	EXEC GIDWIN.dbo.SP_Externo_RemoveDiretoria @DirFicheirosTmpLocal, @Erros OUTPUT
	IF ISNULL(@Erros, '') <> ''
		RAISERROR('Não foi possível remover a diretoria "%s"! ERRO: "%s".', 16, 12, @DirFicheirosTmpLocal, @Erros)
END
GO
GRANT EXECUTE ON sp_APL_DeclaracoesImportaFicheirosXMLStandardDeSFTP TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_EXP_Declaracoes_Duplica') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_EXP_Declaracoes_Duplica
GO
CREATE PROCEDURE sp_EXP_Declaracoes_Duplica @Id bigint, @NovoNumero int, @DuplicaContentores bit, @DuplicaSelos bit, @DuplicaMeiosTransportePartida bit, @DuplicaOutrosIntervenientes bit, 
	@DuplicaPaisesRota bit, @DuplicaLocaisTransformacao bit, @DuplicaProdutosTransformados bit, @DuplicaCertificados bit, @DuplicaVolumesCertificados bit, @DuplicaAutorizacoes bit, 
	@DuplicaDocumentos bit, @DuplicaPrecedentes bit, @DuplicaPedidos bit, @DuplicaAdicoes bit, @DuplicaImposicoes bit, @DuplicaTaxasImposicoes bit, @DuplicaMarcasEVolumes bit, 
	@DuplicaDocumentosAdicoes bit, @DuplicaPrecedentesAdicoes bit, @DuplicaPedidosAdicoes bit, @DuplicaContentoresAdicoes bit, @DuplicaAutorizacoesAdicoes bit, 
	@DuplicaOutrosIntervenientesAdicoes bit, @DuplicaVeiculos bit, @DuplicaChassis bit, @IdUtilizador int, @NovoId bigint OUTPUT, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @TblID table (ID int NOT NULL, CODIGO int NOT NULL)
	DECLARE @NumErro int, @DataAtual datetime, @CodUtilizador varchar(30), @Ano smallint, @Codigo int, @CodDeclOperador varchar(6), @NIFDeclOperador varchar(17), @NovoCodigo int, 
		@NRL varchar(22), @NovoAno smallint, @NumAdicao int, @IdAdicao bigint, @NovoIdAdicao bigint
-- inicia transacção para duplicação da declaração EXP-SAE
	BEGIN TRANSACTION TspEXPDuplicacao
	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 dados da declaração EXP-SAE de origem
		SELECT @Ano = dex.EXM_EANO, @Codigo = dex.EXM_CODI, @CodDeclOperador = dex.DEC_CODI, @NIFDeclOperador = dcl.DEC_NIF
		FROM PRO_EXML AS dex WITH(NOLOCK)
			INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON dex.DEC_CODI = dcl.DEC_CODI
		WHERE dex.EXM_IDTY = @Id
-- calcula o ano da nova declaração
		IF (@Ano < YEAR(@DataAtual)) AND (EXISTS(SELECT EMP_CODI FROM GIDWIN.dbo.FAP_EANO WITH(NOLOCK) WHERE EMP_CODI = DB_NAME() and EAN_ANO = YEAR(@DataAtual)))		
			SET @NovoAno = YEAR(@DataAtual)
		ELSE
			SET @NovoAno = @Ano
-- obtem o número para a nova declaração
		SELECT @NovoCodigo = ISNULL(DEC_NPRO, 1), @NovoNumero = (CASE DEC_XNRA WHEN 0 THEN ISNULL(@NovoNumero, 0) ELSE ISNULL(DEC_NPRO, 1) END)
		FROM TAB_DECL		
		WHERE DEC_CODI = @CodDeclOperador
-- verifica se o número é válido
		IF @NovoNumero = 0
			RAISERROR('Número da declaração não foi especificado.', 16, 1)	
-- constroi NRL
		SET @NRL = RIGHT(STR(@NovoAno, 4), 2) + 'PT' + REPLICATE('0', 9 - LEN(@NIFDeclOperador)) + @NIFDeclOperador + REPLICATE('0', 9 - LEN(LTRIM(STR(@NovoCodigo, 9)))) + LTRIM(STR(@NovoCodigo, 9))
-- insere os dados gerais da nova declaração EXP-SAE
		INSERT INTO PRO_EXML(EXM_EANO, EXM_CODI, DEC_CODI, EXM_TPRO, NDE_CODI, NDE_NOME, DEC_NOME, EXM_DATA, EXM_NRIN, EXM_NRLO, EXM_STAT, EXM_VERS, EXM_REVI, EAD_CODA, EAD_NOMA, TDE_COD1, 
			TDE_NOM1, CLI_COD2, CLI_NOM2, CLI_MOR2, CLI_LOC2, CLI_CPO2, CLI_LPO2, CLI_NIF2, CLI_PAI2, EXM_TP2A, EXM_TI2B, EXM_TAD5, EXM_TVL6, FOR_COD8, FOR_NOM8, FOR_MOR8, FOR_LOC8, FOR_CPO8, 
			FOR_LPO8, FOR_NIF8, FOR_PAI8, EXM_IROR, DEC_CO14, DEC_NO14, EXM_TP14, EXM_P15A, EXM_P17A, EXM_CT19, MTR_CO18, MTR_NO18, EXM_MT18, EXM_P18C, MTR_CO21, MTR_NO21, EXM_MT21, PAI_CO21, 
			PAI_NO21, MTR_CO26, CEN_CO20, CEN_NO20, EXM_FR20, EXM_LG20, NTR_CO24, NTR_NO24, PAI_CO22, PAI_MO22, EXM_MT22, EXM_UFOB, EXM_VFOB, EXM_TX23, EXM_TFRT, EXM_TSEG, EXM_TMLQ, EXM_TMBR, 
			EXM_TREM, EXM_VEUR, EXM_VATT, EAD_CO29, EAD_NO29, EAD_C29A, EAD_N29A, EAD_CO30, EAD_NO30, LEM_CO30, LEM_NO30, LME_CO30, LME_NO30, EXM_MR30, EXM_CP30, EXM_LP30, EXM_NC48, EXM_AC48, 
			EXM_TC48, ARM_CO49, ARM_NO49, TAR_CO49, TAR_DE49, EXM_Q30C, EXM_UCRI, EXM_DTCR, EXM_UALT, EXM_DTAL, EXM_MASC, EXM_VLRC, FIN_CODI, EXM_NRII, EXM_NVRF, EXM_CPRT, EXM_MCPA, EXM_TPCG, 
			EXM_DTVO, EXM_DTYP, EXM_CIEX, EXM_CIDE, EXM_PPFC, EXM_NVOO, EXM_REF1, EXM_REF2, EXM_TRAC, EXM_SHIP, EXM_VDIR, EXM_VCLE, EXM_INCE, EXM_NCMR, EXM_DTMP, EXM_TMSF, CLI_CODI, CLI_NOME, 
			PAE_CODI, PAE_NOME, EXM_ANOT, EXM_HVLV, EXM_CNTX, EXM_SEGU, EXM_DGEN, EXM_DCMP, CLI_CODI1, CLI_NOME1, CLI_MORA1, CLI_LOCA1, CLI_CPOS1, CLI_LPOS1, CLI_NIF1, PAI_CODI1, EXM_NTRP, 
			EAD_CODI, PAI_CODI, PAE_CODI1, EXM_TXTC, PAI_CODI2, EXM_CFRE, PAI_CODI3, EXM_CSEG, EXM_VRBA, PAI_CODI4, EXM_TLOC, EXM_QUAL, PAI_CODI5, EXM_IADI, EXM_NAUT, EXM_ONIF, EAD_CODI1, 
			EXM_PRZA, EXM_ATVP, EXM_INFA, EXM_VSCA, EXM_ANXB, EXM_REGI, EXM_DCEN, EXM_MTIT, EXM_MTFT, CLI_TNIF1)						
		OUTPUT inserted.EXM_IDTY, inserted.EXM_CODI INTO @TblID
		SELECT @NovoAno, @NovoCodigo, DEC_CODI, EXM_TPRO, NDE_CODI, NDE_NOME, DEC_NOME, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), @NovoNumero, @NRL, 0, 0, 0, EAD_CODA, EAD_NOMA, TDE_COD1, 
			TDE_NOM1, CLI_COD2, CLI_NOM2, CLI_MOR2, CLI_LOC2, CLI_CPO2, CLI_LPO2, CLI_NIF2, CLI_PAI2, EXM_TP2A, EXM_TI2B, 0, 0, FOR_COD8, FOR_NOM8, FOR_MOR8, FOR_LOC8, FOR_CPO8, 
			FOR_LPO8, FOR_NIF8, FOR_PAI8, EXM_IROR, DEC_CO14, DEC_NO14, EXM_TP14, EXM_P15A, EXM_P17A, EXM_CT19, MTR_CO18, MTR_NO18, EXM_MT18, EXM_P18C, MTR_CO21, MTR_NO21, EXM_MT21, PAI_CO21, 
			PAI_NO21, MTR_CO26, CEN_CO20, CEN_NO20, EXM_FR20, EXM_LG20, NTR_CO24, NTR_NO24, PAI_CO22, PAI_MO22, EXM_MT22, EXM_UFOB, EXM_VFOB, EXM_TX23, EXM_TFRT, EXM_TSEG, EXM_TMLQ, EXM_TMBR, 
			EXM_TREM, EXM_VEUR, 0, EAD_CO29, EAD_NO29, EAD_C29A, EAD_N29A, EAD_CO30, EAD_NO30, LEM_CO30, LEM_NO30, LME_CO30, LME_NO30, EXM_MR30, EXM_CP30, EXM_LP30, EXM_NC48, EXM_AC48, 
			EXM_TC48, ARM_CO49, ARM_NO49, TAR_CO49, TAR_DE49, EXM_Q30C, @CodUtilizador, @DataAtual, @CodUtilizador, @DataAtual, EXM_MASC, 0, FIN_CODI, @NovoNumero, EXM_NVRF, EXM_CPRT, EXM_MCPA, EXM_TPCG, 
			(CASE WHEN EXM_DTVO IS NULL THEN NULL ELSE CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime) END), EXM_DTYP, EXM_CIEX, EXM_CIDE, EXM_PPFC, EXM_NVOO, EXM_REF1, EXM_REF2, EXM_TRAC, EXM_SHIP, 0, 0, EXM_INCE, EXM_NCMR, EXM_DTMP, EXM_TMSF, CLI_CODI, CLI_NOME, 
			PAE_CODI, PAE_NOME, EXM_ANOT, EXM_HVLV, EXM_CNTX, EXM_SEGU, EXM_DGEN, EXM_DCMP, CLI_CODI1, CLI_NOME1, CLI_MORA1, CLI_LOCA1, CLI_CPOS1, CLI_LPOS1, CLI_NIF1, PAI_CODI1, EXM_NTRP, 
			EAD_CODI, PAI_CODI, PAE_CODI1, EXM_TXTC, PAI_CODI2, EXM_CFRE, PAI_CODI3, EXM_CSEG, EXM_VRBA, PAI_CODI4, EXM_TLOC, EXM_QUAL, PAI_CODI5, EXM_IADI, EXM_NAUT, EXM_ONIF, EAD_CODI1, 
			EXM_PRZA, EXM_ATVP, EXM_INFA, 0, EXM_ANXB, EXM_REGI, EXM_DCEN, EXM_MTIT, EXM_MTFT, CLI_TNIF1						
		FROM PRO_EXML WITH(NOLOCK)
		WHERE EXM_IDTY = @Id
-- obtem o ID da nova declaração EXP-SAE
		SELECT @NovoId = ID, @NovoCodigo = CODIGO
		FROM @TblID
-- gere o detalhe de contentores na nova declaração EXP-SAE
		IF @DuplicaContentores = 1
		BEGIN
-- remove o detalhe de contentores já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM PRO_EXCT
			WHERE EXM_EANO = @NovoAno AND EXM_CODI = @NovoCodigo AND EXM_COPE = @CodDeclOperador
-- insere o detalhe de contentores na nova declaração EXP-SAE
			INSERT INTO PRO_EXCT(EXM_EANO, EXM_CODI, EXM_COPE, EXC_LINH, EXC_CONT)
			SELECT @NovoAno, @NovoCodigo, EXM_COPE, EXC_LINH, EXC_CONT
			FROM PRO_EXCT WITH(NOLOCK)
			WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador
		END
-- insere o detalhe de selos dos contentores na nova declaração EXP-SAE
		IF @DuplicaSelos = 1
		BEGIN
-- remove o detalhe de selos de contentores já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesContentoresSelos
			WHERE id_contentor IN (SELECT EXC_CHVE
									FROM PRO_EXCT WITH(NOLOCK)
									WHERE EXM_EANO = @NovoAno AND EXM_CODI = @NovoCodigo AND EXM_COPE = @CodDeclOperador)
-- insere o detalhe de selos de contentores na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesContentoresSelos(id_contentor, numeroSelo, id_utilizadorControlo, dataControlo)
			SELECT nco.EXC_CHVE, dcs.numeroSelo, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesContentoresSelos AS dcs WITH(NOLOCK)
				INNER JOIN PRO_EXCT AS dco WITH(NOLOCK) ON dcs.id_contentor = dco.EXC_CHVE
				INNER JOIN PRO_EXCT AS nco WITH(NOLOCK) ON nco.EXM_EANO = @NovoAno AND nco.EXM_CODI = @NovoCodigo AND dco.EXM_COPE = nco.EXM_COPE AND dco.EXC_LINH = nco.EXC_LINH
			WHERE dco.EXM_EANO = @Ano AND dco.EXM_CODI = @Codigo AND dco.EXM_COPE = @CodDeclOperador
		END
-- gere o detalhe de meios de transporte partida na nova declaração EXP-SAE
		IF @DuplicaMeiosTransportePartida = 1
		BEGIN
-- remove o detalhe de meios de transporte partida já criados por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesMeiosTransportePartida
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de meios de transporte partida na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesMeiosTransportePartida(id_declaracaoEXP, id_meioTransporte, identificacao, id_pais, origem, id_utilizadorControlo, dataControlo)
			SELECT @NovoId, id_meioTransporte, identificacao, id_pais, origem, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesMeiosTransportePartida WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id
		END
-- gere o detalhe de outros intervenientes na nova declaração EXP-SAE
		IF @DuplicaOutrosIntervenientes = 1
		BEGIN
-- remove o detalhe de outros intervenientes já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesIntervenientes
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de outros intervenientes na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesIntervenientes(id_declaracaoEXP, funcao, nif, origem, id_utilizadorControlo, dataControlo)
			SELECT @NovoId, funcao, nif, origem, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesIntervenientes WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id
		END
-- gere o detalhe de países da rota na nova declaração EXP-SAE
		IF @DuplicaPaisesRota = 1
		BEGIN
-- remove o detalhe de países da rota já criadas por algum automatismo da nova declaração EXP-SAE
			DELETE FROM PRO_EXPI
			WHERE EXM_EANO = @NovoAno AND EXM_CODI = @NovoCodigo AND EXM_COPE = @CodDeclOperador
-- insere o detalhe de países da rota na nova declaração EXP-SAE
			INSERT INTO PRO_EXPI(EXM_EANO, EXM_CODI, EXM_COPE, PAI_CODI, PAI_NOME, EXP_ORIG)
			SELECT @NovoAno, @NovoCodigo, EXM_COPE, PAI_CODI, PAI_NOME, EXP_ORIG
			FROM PRO_EXPI WITH(NOLOCK)
			WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador
		END
-- gere o detalhe de locais de transformação na nova declaração EXP-SAE
		IF @DuplicaLocaisTransformacao = 1
		BEGIN
-- remove o detalhe de locais de transformação já criados por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesLocaisTransformacao
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de locais de transformação na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesLocaisTransformacao(id_declaracaoEXP, tipo, qualificador, id_localAutorizado, morada, localidade, codigoPostal, id_pais, origem, id_utilizadorControlo, 
				dataControlo, texto)
			SELECT @NovoId, tipo, qualificador, id_localAutorizado, morada, localidade, codigoPostal, id_pais, origem, @IdUtilizador, 
				@DataAtual, texto				
			FROM tb_EXP_DeclaracoesLocaisTransformacao WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id
		END		
-- gere o detalhe de produtos transformados na nova declaração EXP-SAE
		IF @DuplicaProdutosTransformados = 1
		BEGIN
-- remove o detalhe de produtos transformados já criados por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesProdutosTransformados
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de produtos transformados na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesProdutosTransformados(id_declaracaoEXP, id_artigo, codigoPautal, designacao, descricao, taxaRendimento, origem, id_utilizadorControlo, 
				dataControlo, id_meioIdentificacao)
			SELECT @NovoId, id_artigo, codigoPautal, designacao, descricao, taxaRendimento, origem, @IdUtilizador, 
				@DataAtual, id_meioIdentificacao
			FROM tb_EXP_DeclaracoesProdutosTransformados WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id
		END		
-- gere o detalhe de certificados CCE na nova declaração EXP-SAE
		IF @DuplicaCertificados = 1
		BEGIN
-- remove o detalhe de certificados CCE já criadas por algum automatismo da nova declaração EXP-SAE
			DELETE FROM PRO_EXCE
			WHERE EXM_EANO = @NovoAno AND EXM_CODI = @NovoCodigo AND EXM_COPE = @CodDeclOperador
-- insere o detalhe de certificados CCE na nova declaração EXP-SAE
			INSERT INTO PRO_EXCE(EXM_EANO, EXM_CODI, EXM_COPE, EXC_LINH, EXC_FNIF, EXC_NFAC, EXC_DFAC, EXC_QNTD, EXC_DCOM, EXC_PLIQ, EXC_PBRT, EXC_VALO)
			SELECT @NovoAno, @NovoCodigo, EXM_COPE, EXC_LINH, EXC_FNIF, EXC_NFAC, EXC_DFAC, EXC_QNTD, EXC_DCOM, EXC_PLIQ, EXC_PBRT, EXC_VALO
			FROM PRO_EXCE WITH(NOLOCK)
			WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador
		END		
-- insere o detalhe de volumes dos certificados CCE na nova declaração EXP-SAE
		IF @DuplicaVolumesCertificados = 1
		BEGIN
-- remove o detalhe de volumes dos certificados CCE já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM PRO_EXCD
			WHERE EXD_CHVE IN (SELECT ncv.EXD_CHVE
									FROM PRO_EXCE AS ncc WITH(NOLOCK)
										INNER JOIN PRO_EXCD AS ncv WITH(NOLOCK) ON ncc.EXM_EANO = ncv.EXM_EANO AND ncc.EXM_CODI = ncv.EXM_CODI AND ncc.EXM_COPE = ncv.EXM_COPE AND ncc.EXC_LINH = ncv.EXC_LINH
									WHERE ncc.EXM_EANO = @NovoAno AND ncc.EXM_CODI = @NovoCodigo AND ncc.EXM_COPE = @CodDeclOperador)
-- insere o detalhe de volumes dos certificados CCE na nova declaração EXP-SAE
			INSERT INTO PRO_EXCD(EXM_EANO, EXM_CODI, EXM_COPE, EXC_LINH, EXD_QTDE, TEM_CODI, TEM_NOME)			
			SELECT @NovoAno, @NovoCodigo, EXM_COPE, EXC_LINH, EXD_QTDE, TEM_CODI, TEM_NOME
			FROM PRO_EXCD WITH(NOLOCK)
			WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador
		END
-- gere o detalhe de autorizações na nova declaração EXP-SAE
		IF @DuplicaAutorizacoes = 1
		BEGIN
-- remove o detalhe de autorizações já criados por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesAutorizacoes
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de autorizações na nova declaração EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesAutorizacoes(id_declaracaoEXP, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
			SELECT @NovoId, id_documento, numero, titular, origem, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesAutorizacoes WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id
		END		   
-- gere o detalhe de pedidos na nova declaracao EXP-SAE
		IF @DuplicaPedidos = 1
		BEGIN
-- remove o detalhe de pedidos já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM PRO_EXPA
			WHERE EXM_EANO = @NovoAno AND EXM_CODI = @NovoCodigo AND EXM_COPE = @CodDeclOperador					
-- insere o detalhe de pedidos na nova declaracao EXP-SAE
			INSERT INTO PRO_EXPA(EXM_EANO, EXM_CODI, EXM_COPE, EXP_LINH, TXM_CODI, TXM_DESC, EXP_ORIG)
			SELECT @NovoAno, @NovoCodigo, EXM_COPE, EXP_LINH, TXM_CODI, TXM_DESC, EXP_ORIG
			FROM PRO_EXPA WITH(NOLOCK)				
			WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador			
		END		
-- gere o detalhe de documentos e certificados na nova declaracao EXP-SAE
		IF @DuplicaDocumentos = 1
		BEGIN
-- remove o detalhe de documentos e certificados já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesDocumentos
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de documentos e certificados na nova declaracao EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesDocumentos(id_declaracaoEXP, tipo, id_documento, numero, dataValidade, entidadeEmissora, numeroAdicao, origem, id_utilizadorControlo, dataControlo)
			SELECT @NovoId, tipo, id_documento, numero, dataValidade, entidadeEmissora, numeroAdicao, origem, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesDocumentos WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id 
		END		
-- gere o detalhe de documentos precedentes na nova declaracao EXP-SAE
		IF @DuplicaPrecedentes = 1
		BEGIN
-- remove o detalhe de documentos precedentes já criado por algum automatismo da nova declaração EXP-SAE
			DELETE FROM tb_EXP_DeclaracoesPrecedentes
			WHERE id_declaracaoEXP = @NovoId
-- insere o detalhe de documentos precedentes na nova declaracao EXP-SAE
			INSERT INTO tb_EXP_DeclaracoesPrecedentes(id_declaracaoEXP, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
			SELECT @NovoId, id_documento, numero, origem, @IdUtilizador, @DataAtual
			FROM tb_EXP_DeclaracoesPrecedentes WITH(NOLOCK)
			WHERE id_declaracaoEXP = @Id	
		END			
-- obtem o detalhe de adições na declaracao de origem
		IF @DuplicaAdicoes = 1 
		BEGIN
			DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
				SELECT EXA_LINH, EXA_CHVE
				FROM PRO_EXAD WITH(NOLOCK)
				WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND EXM_COPE = @CodDeclOperador
			OPEN Adicoes
			FETCH NEXT FROM Adicoes INTO @NumAdicao, @IdAdicao
			WHILE @@FETCH_STATUS = 0
			BEGIN	
-- remove o ID existente
				DELETE FROM @TblID									
-- insere a adição na nova declaracao EXP-SAE			
				INSERT INTO PRO_EXAD(EXM_EANO, EXM_CODI, EXM_COPE, EXA_LINH, APA_CO33, APA_CP33, APA_DESG, PAI_CODI, PAI_NOME, EXA_MBRT, EXA_DESD, EXA_MLQD, EXA_QUSU, USU_CODI, USU_SIGL, 
					EXA_VALO, EXA_VFRE, EXA_VSEG, EXA_VEST, EXA_IRES, EXA_ANXC, EXA_ANXD, TDE_REGI, EXA_ATAR, EXA_ORIG,	EXA_ATA1, EXA_ATA2, EXA_ATA3, EXA_ATA4, EXA_ATA5, EXA_AIC1, EXA_AIC2, 
					EXA_AIC3, EXA_AIC4, EXA_AIC5, EXA_CCUS, id_desdobramento, NTR_CODI, EXA_NRUR, EXA_MPAG, CLI_CODI, CLI_NOME, CLI_MORA, CLI_LOCA, CLI_CPOS, CLI_LPOS, CLI_NIF, PAI_CODI1, 
					PAI_CODI2, RES_CODI, FOR_CODI, FOR_NOME, FOR_MORA, FOR_LOCA, FOR_CPOS, FOR_LPOS, FOR_NIF, PAI_CODI3, PAI_CODI4, EXA_AJUS, CLI_TNIF)
				OUTPUT inserted.EXA_CHVE, inserted.EXA_LINH INTO @TblID
				SELECT @NovoAno, @NovoCodigo, EXM_COPE, EXA_LINH, APA_CO33, APA_CP33, APA_DESG, PAI_CODI, PAI_NOME, EXA_MBRT, EXA_DESD, EXA_MLQD, EXA_QUSU, USU_CODI, USU_SIGL, 
					EXA_VALO, EXA_VFRE, EXA_VSEG, EXA_VEST, EXA_IRES, EXA_ANXC, EXA_ANXD, TDE_REGI, EXA_ATAR, EXA_ORIG,	EXA_ATA1, EXA_ATA2, EXA_ATA3, EXA_ATA4, EXA_ATA5, EXA_AIC1, EXA_AIC2, 
					EXA_AIC3, EXA_AIC4, EXA_AIC5, EXA_CCUS, id_desdobramento, NTR_CODI, EXA_NRUR, EXA_MPAG, CLI_CODI, CLI_NOME, CLI_MORA, CLI_LOCA, CLI_CPOS, CLI_LPOS, CLI_NIF, PAI_CODI1, 
					PAI_CODI2, RES_CODI, FOR_CODI, FOR_NOME, FOR_MORA, FOR_LOCA, FOR_CPOS, FOR_LPOS, FOR_NIF, PAI_CODI3, PAI_CODI4, EXA_AJUS, CLI_TNIF
				FROM PRO_EXAD WITH(NOLOCK)
				WHERE EXA_CHVE = @IdAdicao				
-- obtem o ID da nova adição
				SELECT @NovoIdAdicao = ID 
				FROM @TblID
-- gere o detalhe de marcas e volumes na nova adição				
				IF @DuplicaMarcasEVolumes = 1 
				BEGIN
-- remove o detalhe de marcas e volumes já criado por algum automatismo da nova adição
					DELETE FROM PRO_EXMV
					WHERE EXA_CHVE = @NovoIdAdicao
-- insere o detalhe de marcas e volumes na nova adição
					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)
					SELECT @NovoIdAdicao, EXM_MARN, TEM_CODI, TEM_NOME, EXM_NVOL, EXM_PART, EXM_TVOL, REPLACE(CONVERT(numeric(38, 10), DATEADD(MS, (ROW_NUMBER() OVER(ORDER BY EXM_CHVE) * 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT())), '.', ','), EXM_AUTO, @NovoAno, @NovoCodigo, EXM_COPE
					FROM PRO_EXMV WITH(NOLOCK) 
					WHERE EXA_CHVE = @IdAdicao				
				END
-- gere o detalhe de veículos na nova adição
				/*IF @DuplicaVeiculos = 1 
				BEGIN			
-- remove o detalhe de veículos já criado por algum automatismo da nova adição
					DELETE FROM PRO_DUBT
					WHERE DUC_EANO = @NovoAno AND DUC_PNUM = @NovoNumero AND DUA_CODI = @NumAdicao	
-- insere o detalhe de veículos na nova adição						
					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_AUTO, DBT_VLIA, DBT_MARC, DBT_MODE, DBT_CODR, DBT_IDCR, HTE_CODI, DBT_HOMO, DBT_TABE, DBT_TCO2, DBT_AUTN, DBT_DIMT)
					SELECT @NovoAno, @NovoNumero, @NumAdicao, DBT_CODI, DBT_QTDE, DBT_NVEI, TVE_CODI, DBT_QUAL, DBT_VIEC, DBT_VCO2, CAT_CODI, TCO_CODI, DBT_OUTR, 
						DBT_AUTO, DBT_VLIA, DBT_MARC, DBT_MODE, DBT_CODR, REPLACE(CONVERT(numeric(38, 10), DATEADD(MS, (DBT_CODI * 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT())), '.', ','), HTE_CODI, DBT_HOMO, DBT_TABE, DBT_TCO2, DBT_AUTN, DBT_DIMT
					FROM PRO_DUBT WITH(NOLOCK)
					WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @NumAdicao
					ORDER BY DBT_CODI
				END
-- gere o detalhe de chassis na nova adição
				IF @DuplicaChassis = 1 
				BEGIN		
-- remove o detalhe de chassis já criado por algum automatismo da nova adição
					DELETE FROM PRO_DUVE
					WHERE DUC_EANO = @NovoAno AND DUC_PNUM = @NovoNumero AND DUA_CODI = @NumAdicao	
-- insere o detalhe de chassis na nova adição							
					INSERT INTO PRO_DUVE(DUC_EANO, DUC_PNUM, DUA_CODI, DBT_CODI, DVC_CODI, DVC_MATR, DVC_CHAS, DVC_DMAT, DVC_DCHA)
					SELECT @NovoAno, @NovoNumero, @NumAdicao, DBT_CODI, DVC_CODI, DVC_MATR, DVC_CHAS, DVC_DMAT, DVC_DCHA
					FROM PRO_DUVE WITH(NOLOCK)
					WHERE DUC_EANO = @Ano AND DUC_PNUM = @Numero AND DUA_CODI = @NumAdicao
					ORDER BY DBT_CODI, DVC_CODI
				END*/
-- gere o detalhe de pedidos na nova adição
				IF @DuplicaPedidosAdicoes = 1
				BEGIN	
-- remove o detalhe de pedidos já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesPedidos
					WHERE id_adicao = @NovoIdAdicao	
-- insere o detalhe de pedidos na nova adição						
					INSERT INTO tb_EXP_DeclaracoesAdicoesPedidos(id_adicao, id_pedido, numero, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, id_pedido, numero, origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesPedidos WITH(NOLOCK)						
					WHERE id_adicao = @IdAdicao
				END
-- gere o detalhe de documentos e certificados na nova adição
				IF @DuplicaDocumentosAdicoes = 1
				BEGIN			
-- remove o detalhe de documentos e certificados já criado por algum automatismo da nova adição
					DELETE FROM PRO_EXDA
					WHERE EXA_CHVE = @NovoIdAdicao							
-- insere o detalhe de documentos e certificados na nova adição
					INSERT INTO PRO_EXDA(EXA_CHVE, DOC_CODI, DOC_NOME, EXD_NREF, EXD_DTEM, EEM_DESC, PAI_CODI, PAI_MOED, PAI_NOME, EXD_MONT, EXD_QNTD, UME_CODI, UME_NOME, EXD_AUTO, EXM_EANO, 
						EXM_CODI, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI)
					SELECT @NovoIdAdicao, DOC_CODI, DOC_NOME, EXD_NREF, EXD_DTEM, EEM_DESC, PAI_CODI, PAI_MOED, PAI_NOME, EXD_MONT, EXD_QNTD, UME_CODI, UME_NOME, EXD_AUTO, @NovoAno, 
						@NovoCodigo, EXM_COPE, EXA_LINH, EXD_TIPO, EXD_NADI
					FROM PRO_EXDA WITH(NOLOCK)
					WHERE EXA_CHVE = @IdAdicao				
				END
-- gere o detalhe de documentos precedentes na nova adição
				IF @DuplicaPrecedentesAdicoes = 1
				BEGIN		
-- remove o detalhe de documentos precedentes já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesPrecedentes
					WHERE id_adicao = @NovoIdAdicao	
-- insere o detalhe de documentos precedentes na nova adição															
					INSERT INTO tb_EXP_DeclaracoesAdicoesPrecedentes(id_adicao, id_documento, numero, numeroAdicao, id_unidadeMedidaVolumes, volumes, id_unidadeMedidaQualificador, 
						quantidade, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, id_documento, numero, numeroAdicao, id_unidadeMedidaVolumes, volumes, id_unidadeMedidaQualificador, 
						quantidade, origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesPrecedentes WITH(NOLOCK)
					WHERE id_adicao = @IdAdicao						
				END
-- gere o detalhe de contentores na nova adição
				IF @DuplicaContentoresAdicoes = 1 
				BEGIN
-- remove o detalhe de contentores já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesContentores
					WHERE id_adicao = @NovoIdAdicao	
-- insere o detalhe de contentores na nova adição
					INSERT INTO tb_EXP_DeclaracoesAdicoesContentores(id_adicao, id_contentor, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, nco.EXC_CHVE, dac.origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesContentores AS dac WITH(NOLOCK)
						INNER JOIN PRO_EXCT AS dco WITH(NOLOCK) ON dac.id_contentor = dco.EXC_CHVE
						INNER JOIN PRO_EXCT AS nco WITH(NOLOCK) ON nco.EXM_EANO = @NovoAno AND nco.EXM_CODI = @NovoCodigo AND dco.EXM_COPE = nco.EXM_COPE AND dco.EXC_LINH = nco.EXC_LINH
					WHERE dac.id_adicao = @IdAdicao					
				END
-- gere o detalhe de autorizações na nova adição
				IF @DuplicaAutorizacoesAdicoes = 1 
				BEGIN
-- remove o detalhe de autorizações já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesAutorizacoes
					WHERE id_adicao = @NovoIdAdicao	
-- insere o detalhe de autorizações na nova adição
					INSERT INTO tb_EXP_DeclaracoesAdicoesAutorizacoes(id_adicao, id_documento, numero, titular, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, id_documento, numero, titular, origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesAutorizacoes WITH(NOLOCK)
					WHERE id_adicao = @IdAdicao
				END
-- gere o detalhe de outros intervenientes na nova adição
				IF @DuplicaOutrosIntervenientesAdicoes = 1 
				BEGIN
-- remove o detalhe de outros intervenientes já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesIntervenientes
					WHERE id_adicao = @NovoIdAdicao	
-- insere o detalhe de outros intervenientes na nova adição
					INSERT INTO tb_EXP_DeclaracoesAdicoesIntervenientes(id_adicao, funcao, nif, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, funcao, nif, origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesIntervenientes WITH(NOLOCK)
					WHERE id_adicao = @IdAdicao
				END
-- gere o detalhe de imposições na nova adição
				IF @DuplicaImposicoes = 1
				BEGIN				
-- remove o detalhe de imposições já criado por algum automatismo da nova adição					
					DELETE FROM tb_EXP_DeclaracoesAdicoesImposicoes
					WHERE id_adicao = @NovoIdAdicao						
-- insere o detalhe de imposições na nova adição							
					INSERT INTO tb_EXP_DeclaracoesAdicoesImposicoes(id_adicao, id_rubricaReceita, imposicao, montante, metodoPagamento, origem, id_utilizadorControlo, dataControlo)
					SELECT @NovoIdAdicao, id_rubricaReceita, imposicao, 0, metodoPagamento, origem, @IdUtilizador, @DataAtual
					FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK)						
					WHERE id_adicao = @IdAdicao					
				END
-- insere o detalhe de taxas das imposições na nova adição
				IF @DuplicaTaxasImposicoes = 1
				BEGIN
-- remove o detalhe de taxas das imposições já criado por algum automatismo da nova adição
					DELETE FROM tb_EXP_DeclaracoesAdicoesImposicoesTaxas
					WHERE id_imposicao IN (SELECT id
											FROM tb_EXP_DeclaracoesAdicoesImposicoes WITH(NOLOCK)
											WHERE id_adicao = @NovoIdAdicao)
-- insere o detalhe de taxas das imposições na nova adição
					INSERT INTO tb_EXP_DeclaracoesAdicoesImposicoesTaxas(id_imposicao, tipoCalculo, taxaValor, id_unidadeMedida, quantidade, valor, montante, origem, id_utilizadorControlo, 
						dataControlo)
					SELECT nai.id, dait.tipoCalculo, dait.taxaValor, dait.id_unidadeMedida, dait.quantidade, dait.valor, dait.montante, dait.origem, @IdUtilizador, 
						@DataAtual
					FROM tb_EXP_DeclaracoesAdicoesImposicoesTaxas AS dait WITH(NOLOCK)
						INNER JOIN tb_EXP_DeclaracoesAdicoesImposicoes AS dai WITH(NOLOCK) ON dait.id_imposicao = dai.id
						INNER JOIN tb_EXP_DeclaracoesAdicoesImposicoes AS nai WITH(NOLOCK) ON nai.id_adicao = @NovoIdAdicao	AND dai.id_rubricaReceita = nai.id_rubricaReceita AND dai.imposicao = nai.imposicao AND dai.metodoPagamento = nai.metodoPagamento AND dai.origem = nai.origem
					WHERE dai.id_adicao = @IdAdicao
				END
				FETCH NEXT FROM Adicoes INTO @NumAdicao, @IdAdicao
			END
			CLOSE Adicoes
			DEALLOCATE Adicoes
		END
	END TRY
	BEGIN CATCH
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = 'Detalhes do Erro: ' + 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()
-- em caso de erro faz rollback da transacção iniciada						           
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION TspEXPDuplicacao
	END CATCH			
-- se sucesso faz commit da transacção iniciada
	IF @@TRANCOUNT > 0
		COMMIT TRANSACTION TspEXPDuplicacao
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_EXP_Declaracoes_Duplica TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'SP_DeclImportacao_ExportaDeclaracoesParaIMPCAUDHL') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE SP_DeclImportacao_ExportaDeclaracoesParaIMPCAUDHL
GO
CREATE PROCEDURE SP_DeclImportacao_ExportaDeclaracoesParaIMPCAUDHL @DataVooReferencia datetime, @BaseDadosIMPCAU varchar(6), @DirFicheiroErros varchar(500), @Utilizador varchar(30) WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON
	SET ARITHABORT ON
	SET DATEFORMAT DMY	
-- declaração de variáveis
	DECLARE @ListaErros varchar(MAX), @CodNaturezaErro varchar(3), @CodNaturezaSucesso varchar(3), @IdUtilizador int, @AnoDeclaracaoDUI2 int, @NumDeclaracaoDUI2 int, 
		@DocTransporteDUI2 varchar(18), @IdDeclaracaoDUI2 bigint, @NumErro int, @DataAtual datetime, @XMLDeclaracaoIMPCAU xml(XMLSC_DeclaracoesIMPCAUToGIDWin), 
		@AnoDeclaracaoIMPCAU int, @NumDeclaracaoIMPCAU int, @IdDeclaracaoIMPCAU bigint
	DECLARE @IdFicheiro int, @PathFicheiro varchar(500), @FicheiroBinario varbinary(MAX), @FicheiroBase64 varchar(MAX)
	DECLARE @SQLAExecutar nvarchar(4000), @SQLVariaveis nvarchar(1000), @Erro varchar(MAX)
	DECLARE @NomeFicheiroErro varchar(100), @PathFicheiroErro varchar(500), @i int, @Linha varchar(MAX)
	DECLARE @TmpTblArquivos TABLE(idArquivo int NOT NULL, ficheiroBase64 varchar(MAX) NOT NULL)
-- inicia variáveis
	SET @ListaErros = ''
	SET @CodNaturezaErro = 'ERR'
	SET @CodNaturezaSucesso = 'MOV'
-- obtem o ID do utilizador
	SELECT @IdUtilizador = UTI_IDTY
	FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
	WHERE UTI_UTIL = @Utilizador
-- valida o utilizador obtido
	IF @IdUtilizador IS NULL
		RAISERROR('O utilizador "%s" não é válido.', 16, 1, @Utilizador)
-- valida a natureza a atribuir à declaração DUI2 em caso de erro na exportação
	IF NOT EXISTS(SELECT 1 FROM TAB_NDES WITH(NOLOCK) WHERE NDE_CODI = @CodNaturezaErro AND NDE_PART = 0 AND NDE_VDAR = 0 AND NDE_VEXI = 0)
		RAISERROR('A natureza "%s" não é válida.', 16, 2, @CodNaturezaErro)
-- valida a natureza a atribuir à declaração DUI2 em caso de sucesso na exportação
	IF NOT EXISTS(SELECT 1 FROM TAB_NDES WITH(NOLOCK) WHERE NDE_CODI = @CodNaturezaSucesso AND NDE_PART = 0 AND NDE_VDAR = 0 AND NDE_VEXI = 0)
		RAISERROR('A natureza "%s" não é válida.', 16, 3, @CodNaturezaSucesso)
-- obtem as declarações DUI2 com status "Por Enviar", com título de depósito, não pertencentes às naturezas "ERR", "MOV" e ainda "4", "36", "42", "43", "44", "45", "ZZZ" e exista a incidência "A11"
	DECLARE DeclaracoesDUI2 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
		SELECT ddg.DUC_EANO, ddg.DUC_PNUM, ddg.DUC_CPRT, ddg.DUC_IDTY
		FROM PRO_DUCG AS ddg WITH(NOLOCK)
			INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON inc.SIN_CODI = 'A11'
		WHERE ddg.DUC_DUNO = 1 AND ddg.DUC_STAT = 0 AND ddg.DUC_NTDP IS NOT NULL AND ddg.NDE_CODI <> @CodNaturezaErro AND ddg.NDE_CODI <> @CodNaturezaSucesso
			AND ddg.NDE_CODI NOT IN ('4', '36', '42', '43', '44', '45', 'ZZZ') 			
			AND CAST(CONVERT(varchar(10), ddg.DUC_DTVO, 105) AS datetime) >= CAST(CONVERT(varchar(10), @DataVooReferencia, 105) AS datetime)
			AND EXISTS(SELECT 1 FROM PRO_DUIN WITH(NOLOCK) WHERE DUC_EANO = ddg.DUC_EANO AND DUC_PNUM = ddg.DUC_PNUM AND SIN_CODI = inc.SIN_CODI)
	OPEN DeclaracoesDUI2
	FETCH NEXT FROM DeclaracoesDUI2 INTO @AnoDeclaracaoDUI2, @NumDeclaracaoDUI2, @DocTransporteDUI2, @IdDeclaracaoDUI2
	WHILE @@FETCH_STATUS = 0
	BEGIN						
-- inicia processo de geração da declaração	IMP-CAU na base de dados IMP-CAU especificada
		BEGIN TRY	
			SET @NumErro = 0
			SET @Erro = ''
-- obtem data atual GMT
			SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem os arquivos da declaração DUI2 para os converter em base64
			DECLARE Ficheiros CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
				SELECT DUC_IDEN, DUF_LINK
				FROM PRO_DUFI WITH(NOLOCK)
				WHERE DUC_EANO = @AnoDeclaracaoDUI2 AND DUC_PNUM = @NumDeclaracaoDUI2 AND ISNULL(DUF_LINK, '') <> ''
			OPEN Ficheiros
			FETCH NEXT FROM Ficheiros INTO @IdFicheiro, @PathFicheiro
			WHILE @@FETCH_STATUS = 0
			BEGIN			
				SET @FicheiroBinario = NULL
-- carrega o ficheiro para binario
				SET @SQLAExecutar = N'SET @OUTFicheiroBinario = (SELECT * FROM OPENROWSET (BULK N''' + @PathFicheiro + ''', SINGLE_BLOB) AS t)'
				SET @SQLVariaveis = N'@OUTFicheiroBinario varbinary(MAX) OUTPUT'			
				EXECUTE sp_executesql @SQLAExecutar, @SQLVariaveis, @OUTFicheiroBinario = @FicheiroBinario OUTPUT		
-- converte ficheiro binario para base64						
				SET @FicheiroBase64 = CAST('' AS xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@FicheiroBinario")))', 'varchar(MAX)')	
-- insere ficheiro base64 na tabela tmp de arquivos da declaração DUI2
				INSERT INTO @TmpTblArquivos(idArquivo, ficheiroBase64)
				VALUES(@IdFicheiro, @FicheiroBase64)
				FETCH NEXT FROM Ficheiros INTO @IdFicheiro, @PathFicheiro
			END
			CLOSE Ficheiros
			DEALLOCATE Ficheiros	
-- constroi XML para declaração IMP-CAU a partir da declaração DUI2
			SET @XMLDeclaracaoIMPCAU = 
				(SELECT
					(SELECT 'I' AS "@acao", 
						(CONVERT(varchar(10), @DataAtual, 127) + 'Z') AS "data", 
						CAST(0 AS bit) AS "despachoCentralizado", 
						'H1' AS "anexoB", 
						NULLIF(ddg.NDE_CODI, '') AS "natureza", 
						NULLIF(RTRIM(LTRIM(ddg.DUC_CPRT)), '') AS "documentoTransporte",
						(SELECT 
							(SELECT 							
								NULLIF(RTRIM(LTRIM(ddg.DUC_ENIF)), '') AS "nif", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_ENOM)), '') AS "nome", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_EMOR)), '') AS "morada", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_ELOC)), '') AS "localidade", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_ECPO)), '') AS "codigoPostal", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_ELPO)), '') AS "localidadePostal", 
								NULLIF(ddg.PAI_ELIV, '') AS "pais"
							HAVING ISNULL(RTRIM(LTRIM(ddg.DUC_ENOM)), '') <> ''
							FOR XML PATH('exportador'), TYPE), 
							NULLIF(ddg.PAI_PA15, '') AS "paisExpedicao", 
							(SELECT 
								ISNULL(NULLIF(RTRIM(LTRIM(ddg.DUC_DNIF)), ''), '999999990') AS "nif", 
								ddg.DUC_TPDS AS "tipoNIF", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DNOM)), '') AS "nome", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DMOR)), '') AS "morada", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DLOC)), '') AS "localidade", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DCPO)), '') AS "codigoPostal", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DLPO)), '') AS "localidadePostal", 
								NULLIF(ddg.PAI_DLIV, '') AS "pais",
								NULLIF(RTRIM(LTRIM(ddg.DUC_DTEL)), '') AS "telefone", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_DEMA)), '') AS "email"
							FOR XML PATH('importador'), TYPE),
							NULLIF(ddg.PAI_PA17, '') AS "paisDestino",
							ddg.PAI_P17B AS "regiao", 
							(SELECT
								NULLIF(ddg.DEC_CO14, '') AS "codigoDeclarante", 
								(CASE ddg.DUC_TPDC WHEN 2 THEN ddg.DUC_TPDC ELSE NULL END) AS "estatuto"
							FOR XML PATH('declarante'), TYPE)
						FOR XML PATH('operadores'), TYPE),
						NULLIF(RTRIM(LTRIM(ddg.DUC_NVRF)), '') AS "vossaReferencia", 
						NULLIF(ddg.ALF_CODI, '') AS "estancia", 
						NULLIF(ddg.TDE_CODI, '') AS "tipoDeclaracao", 
						NULLIF(ddg.NTR_CO24, '') AS "naturezaTransacao", 
						NULLIF(ddg.CEN_CO20, '') AS "condicaoEntrega", 
						(SELECT
							NULLIF(RTRIM(LTRIM(ddg.DUC_DE20)), '') AS "localidadeCE", 
							ISNULL((SELECT (CASE WHEN CEN_LOCT IS NULL THEN NULL ELSE (CASE CEN_LOCD WHEN 0 THEN NULLIF(ddg.PAI_ELIV, '') ELSE NULLIF(ddg.PAI_DLIV, '') END) END) FROM TAB_CENT WITH(NOLOCK) WHERE CEN_CODI = ddg.CEN_CO20), '--') AS "paisCE" 						
						FOR XML PATH('localizacao'), TYPE), 
						(SELECT 
							(SELECT
								NULLIF(ddg.PAI_PR22, '') AS "pais", 	
								CAST(ISNULL(ddg.DUC_MT22, 0) AS decimal(18, 3)) AS "valorTotal"
							FOR XML PATH('fatura'), TYPE), 
							(SELECT
								NULLIF(ddg.PAI_FRET, '') AS "pais", 							
								CAST(ISNULL(ddg.DUC_FRET, 0) AS decimal(18, 3)) AS "valorTotal"
							FOR XML PATH('frete'), TYPE), 
							(SELECT
								NULLIF(ddg.PAI_SEGU, '') AS "pais", 							
								CAST(ISNULL(ddg.DUC_SEGU, 0) AS decimal(18, 3)) AS "valorTotal"
							FOR XML PATH('seguro'), TYPE), 
							(SELECT
								CAST(ISNULL(ddg.DUC_MLQT, 0) AS decimal(18, 6)) AS "massaLiquida", 							
								CAST(ISNULL(ddg.DUC_MBRT, 0) AS decimal(18, 6)) AS "massaBruta"
							FOR XML PATH('pesos'), TYPE)
						FOR XML PATH('totais'), TYPE), 
						(SELECT	
							NULLIF(RTRIM(LTRIM(ddg.DUC_CPRT)), '') AS "numeroNRUR", 
							(SELECT 
								NULLIF(ddg.MTR_FT21, '') AS "meioTransporte", 
								NULLIF(ddg.PAI_PA21, '') AS "pais"
							HAVING ISNULL(ddg.MTR_FT21, '') <> ''						
							FOR XML PATH('fronteira'), TYPE), 
							NULLIF(ddg.MTR_PT18, '') AS "meioTransporteChegada", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_MT18)), '') AS "identificacao", 
							ddg.DUC_CT19 AS "contentorizada"
						FOR XML PATH('transporte'), TYPE), 
						(SELECT
							(CASE ISNULL(ddg.DUC_TLOC, '') WHEN 'EA' THEN 'A' WHEN 'OL' THEN 'D' ELSE 'B' END) AS "tipoLocalizacao", 
							(CASE ISNULL(ddg.DUC_TLOC, '') WHEN 'EA' THEN 'V' WHEN 'OL' THEN 'Z' ELSE 'Y' END) AS "qualificador", 
							(CASE ISNULL(ddg.DUC_TLOC, '') WHEN 'EA' THEN NULL WHEN 'OL' THEN NULL ELSE NULLIF(ddg.LME_CO30, '') END) AS "armazemDTP", 
							(CASE ISNULL(ddg.DUC_TLOC, '') WHEN 'EA' THEN NULLIF(ddg.ALF_CODI1, '') WHEN 'OL' THEN NULL ELSE NULL END) AS "estancia", 
							(SELECT
								NULLIF(RTRIM(LTRIM(ddg.DUC_LAMO)), '') AS "morada", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_LALO)), '') AS "localidade", 
								NULLIF(RTRIM(LTRIM(ddg.DUC_LACP)), '') AS "codigoPostal"
							HAVING ISNULL(ddg.DUC_TLOC, '') = 'OL'
							FOR XML PATH('endereco'), TYPE)
						FOR XML PATH('localizacaoMercadorias'), TYPE), 
						NULLIF(ddg.ARM_CODI, '') AS "armazem", 				
						(SELECT 
							NULLIF(RTRIM(LTRIM(ddg.DUC_DELG)), '') AS "locID", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_GTWY)), '') AS "gateway", 	
							ddg.DUC_NVSR AS "serviceLevel", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_CIDE)), '') AS "portesAcc", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_POSA)), '') AS "portes", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_REF1)), '') AS "despachoAcc", 								
							CAST(ddg.DUC_VFRC AS decimal(18, 2)) AS "freteOriginal", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_MFRC)), '') AS "moedafreteOriginal", 
							CAST(ddg.DUC_VDES AS decimal(18, 3)) AS "despesas", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_PPFC)), '') AS "condEntrega", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_FUPS)), '') AS "nomeFicheiro"					
						FOR XML PATH('dadosEspecificos'), TYPE), 					
 						(SELECT 
							ddg.DUC_NPDT AS "numeroPDDT", 
							(CONVERT(varchar(10), ddg.DUC_DDTE, 127) + 'Z') AS "dataEntrada", 
							ddg.DUC_NPDD AS "numeroPDDTDEV", 
							ddg.DUC_NTDP AS "numeroTD", 
							ddg.DUC_NACT AS "numeroACTM", 
							ddg.DUC_NSEQ AS "numeroSequencia", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_PARM)), '') AS "posicaoArmazem"
						 FOR XML PATH('depositoTemporario'), TYPE), 	
						 (SELECT 
							NULLIF(RTRIM(LTRIM(ddg.DUC_MCPA)), '') AS "miniCPA", 	
							(CONVERT(varchar(10), ddg.DUC_DTVO, 127) + 'Z') AS "dataVoo", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_AERO)), '') AS "aeroportoOrigem", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_NVOO)), '') AS "numeroVoo", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_POSA)), '') AS "posicaoAviao", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_TRAC)), '') AS "tracking", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_TPCG)), '') AS "tipoCarga"
						FOR XML PATH('dadosAWB'), TYPE), 
						(SELECT 
							NULLIF(RTRIM(LTRIM(ddg.DUC_CIEX)), '') AS "numeroContaExpedidor", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_CIDE)), '') AS "numeroContaDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_D2NO)), '') AS "nomeOriginalDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_D2MO)), '') AS "moradaOriginalDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_D2LO)), '') AS "localidadeOriginalDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_D2CP)), '') AS "codigoPostalOriginalDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_D2LP)), '') AS "localidadePostalOriginalDestinatario", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_REF1)), '') AS "referenciaExterna1", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_REF2)), '') AS "referenciaExterna2", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_SHIP)), '') AS "shipID"
						FOR XML PATH('dadosEntidades'), TYPE), 
						(SELECT
							NULLIF(RTRIM(LTRIM(ddg.DUC_DTYP)), '') AS "dutyType", 
							ddg.DUC_PAYM AS "payment", 
							(CONVERT(varchar(10), ddg.DUC_DDDT, 127) + 'Z') AS "dataDocumentoTransporte", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_NREQ)), '') AS "numeroRequerimento", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_NDUR)), '') AS "numeroDURetorno", 
							NULLIF(RTRIM(LTRIM(ddg.DUC_T1RE)), '') AS "numeroT1Retorno"
						FOR XML PATH('outrosDados'), TYPE), 
						NULLIF(RTRIM(LTRIM(CAST(ddg.DUC_HIST AS varchar(MAX)))), '') AS "anotacoes", 
						(SELECT
							ddg.FUP_CODI AS "codigoFollowUp", 
							NULLIF(ddg.DUC_UNMD, '') AS "utilizadorNomeado"
						HAVING ddg.FUP_CODI IS NOT NULL
						FOR XML PATH('followUp'), TYPE), 																
						(SELECT 
							doc.DOC_DTRA AS "tipoDocumento", 
							doc.DOC_CODI AS "codigoDocumento",
							NULLIF(RTRIM(LTRIM(dad.DDO_NUME)), '') AS "numeroDocumento", 
							NULLIF(dad.PAI_CODI, '') AS "pais", 
							CAST(ISNULL(dad.DDO_MONT, 0) AS decimal(18, 2)) AS "montante", 
							NULLIF(RTRIM(LTRIM(dad.DDO_EEMI)), '') AS "entidadeEmissora", 
							NULLIF(dad.UME_CODI, '') AS "unidadeMedida", 
							CAST(dad.DDO_QTDE AS decimal(18, 2)) AS "quantidade"
						FROM PRO_DDOC AS dad WITH(NOLOCK) 
							INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dad.DOC_CODI = doc.DOC_CODI
							INNER JOIN PRO_DUAD AS dai WITH(NOLOCK) ON dad.DUC_EANO = dai.DUC_EANO AND dad.DUC_PNUM = dai.DUC_PNUM AND dad.DUA_CODI = dai.DUA_CODI 
							INNER JOIN TAB_APAU AS art WITH(NOLOCK) ON dai.APA_CO33 = art.APA_CODI
							LEFT OUTER JOIN TAB_ADOC AS ado WITH(NOLOCK) ON art.APA_CHVE = ado.APA_CHVE AND doc.DOC_CODI = ado.DOC_CODI AND ado.ADC_UIMP = 1
							LEFT OUTER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON ddg.DUC_DST8 = cdo.CLI_CODI AND doc.DOC_CODI = cdo.DOC_CODI AND cdo.CLD_UIMP = 1
							LEFT OUTER JOIN TAB_ALFD AS fdo WITH(NOLOCK) ON ddg.ALF_CODI = fdo.ALF_CODI AND doc.DOC_CODI = fdo.DOC_CODI
							LEFT OUTER JOIN TAB_TDED AS tdo WITH(NOLOCK) ON ddg.TDE_CODI = tdo.TDE_CODI AND doc.DOC_CODI = tdo.DOC_CODI
						WHERE dad.DUC_EANO = ddg.DUC_EANO AND dad.DUC_PNUM = ddg.DUC_PNUM AND dad.DUA_CODI = 1 AND dad.DDO_TIPO = 0 AND dad.DDO_AUTO = 0 AND ado.ADC_CODI IS NULL 
							AND cdo.CLD_UIMP IS NULL AND fdo.AFD_CODI IS NULL AND tdo.TDD_CODI IS NULL
						FOR XML PATH('documento'), ROOT('documentosECertificados'), TYPE), 	
						(SELECT 							
							'N337' AS "codigoDocumento",
							NULLIF(RTRIM(LTRIM(DRA_APC1)), '') AS "numeroDocumento"
						FROM PRO_DURA WITH(NOLOCK) 							
						WHERE DUC_EANO = ddg.DUC_EANO AND DUC_PNUM = ddg.DUC_PNUM AND DUA_CODI = 1 AND DRA_QUAL = 'X' AND ddg.DUC_ADI5 = 1
						FOR XML PATH('documentoPrecedente'), ROOT('documentosPrecedentes'), TYPE), 																	
						(SELECT 							
							NULLIF(dpe.TXM_CODI, '') AS "codigoPedido",
							NULLIF(LEFT(RTRIM(LTRIM(dpe.DPD_DESC)), 512), '') AS "numeroPedido"
						FROM PRO_DUPD AS dpe WITH(NOLOCK) 							
							LEFT OUTER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON ddg.TDE_CODI = tdp.TDE_CODI AND dpe.TXM_CODI = tdp.TXM_CODI
						WHERE dpe.DUC_EANO = ddg.DUC_EANO AND dpe.DUC_PNUM = ddg.DUC_PNUM AND dpe.DPD_ORIG = 0 AND tdp.TDP_CODI IS NULL
						FOR XML PATH('pedido'), ROOT('pedidos'), TYPE),								
						(SELECT 
							dad.DUA_CODI AS "numeroAdicao", 
							NULLIF(dad.APA_CP33, '') AS "codigoPautal", 							
							NULLIF(RTRIM(LTRIM(dad.DUA_DESG)), '') AS "designacao", 	
							NULLIF(dad.DUA_R37B, '') AS "regimeAdicional", 							
							NULLIF(dad.PAI_CO34, '') AS "paisOrigem",		
							NULLIF(dad.PRE_CO36, '') AS "preferencia", 
							dad.DUA_MAVA AS "metodoAvaliacao", 
							CAST(dad.DUA_ML38 AS decimal(18, 6)) AS "massaLiquida", 					
							CAST(dad.DUA_MB35 AS decimal(18, 6)) AS "massaBruta",	
							CAST(ISNULL(dad.DUA_US41, 0) AS decimal(18, 6)) AS "unidades", 																				
							CAST(dad.DUA_VA42 AS decimal(18, 3)) AS "montanteAd", 																																				
							CAST(ISNULL(dad.DUA_VFRE, 0) AS decimal(18, 3)) AS "valorFrete", 			
							CAST(ISNULL(dad.DUA_VSEG, 0) AS decimal(18, 3)) AS "valorSeguro", 				
							CAST(ISNULL(dad.DUA_TIVA, 0) AS decimal(18, 2)) AS "taxaIVA", 									
							(SELECT 							
								'N337' AS "codigoDocumento",
								NULLIF(RTRIM(LTRIM(DRA_APC1)), '') AS "numeroDocumento"
							FROM PRO_DURA WITH(NOLOCK) 							
							WHERE DUC_EANO = dad.DUC_EANO AND DUC_PNUM = dad.DUC_PNUM AND DUA_CODI = dad.DUA_CODI AND DRA_QUAL = 'X' AND ddg.DUC_ADI5 > 1
							FOR XML PATH('documentoPrecedente'), ROOT('documentosPrecedentes'), TYPE), 									
							(SELECT 
								NULLIF(UME_CODI, '') AS "unidadeMedida", 
								CAST(D31_QNTD AS int) AS "volumes", 
								NULLIF(RTRIM(LTRIM(D31_MARC)), '') AS "marcas", 									
								D31_CASP AS "parte"					
							FROM PRO_DU31 WITH(NOLOCK)
							WHERE DUC_EANO = dad.DUC_EANO AND DUC_PNUM = dad.DUC_PNUM AND DUA_CODI = dad.DUA_CODI AND dad.DUA_CODI = 1
							FOR XML PATH('marcaEVolume'), ROOT('marcasEVolumes'), TYPE),
							(SELECT 									
								NULLIF(RTRIM(LTRIM(DCO_CNUM)), '') AS "numeroContentor", 	
								NULLIF(RTRIM(LTRIM(DCO_TIPO)), '') AS "tipoContentor"		
							FROM PRO_DCON WITH(NOLOCK)
							WHERE DUC_EANO = dad.DUC_EANO AND DUC_PNUM = dad.DUC_PNUM AND DUA_CODI = dad.DUA_CODI
							FOR XML PATH('contentor'), ROOT('contentores'), TYPE)
						FROM PRO_DUAD AS dad WITH(NOLOCK) 								
						WHERE dad.DUC_EANO = ddg.DUC_EANO AND dad.DUC_PNUM = ddg.DUC_PNUM
						FOR XML PATH('adicao'), ROOT('adicoes'), TYPE), 												
						(SELECT 
							NULLIF(SIN_CODI, '') AS "codigoIncidencia", 
							(CONVERT(varchar(10), DUI_DINI, 127) + 'T' + CONVERT(varchar(8), DUI_HINI, 108) + '.000Z') AS "dataInicio", 
							(CONVERT(varchar(10), DUI_DFIM, 127) + 'T' + CONVERT(varchar(8), DUI_HFIM, 108) + '.000Z') AS "dataFim", 
							NULLIF(RTRIM(LTRIM(CAST(DUI_OBSR AS varchar(MAX)))), '') AS "observacoes", 
							(CASE DUI_REHO WHEN 0 THEN 'R' WHEN 1 THEN 'H' ELSE NULL END) AS "tipoIncidencia"
						FROM PRO_DUIN WITH(NOLOCK) 							
						WHERE DUC_EANO = ddg.DUC_EANO AND DUC_PNUM = ddg.DUC_PNUM
						FOR XML PATH('incidencia'), ROOT('incidencias'), TYPE), 										
						(SELECT 
							FUP_CODI AS "codigoFollowUp", 
							NULLIF(UTI_UTIL, '') AS "utilizador", 
							(CONVERT(varchar(23), DFW_DATA, 127) + 'Z') AS "dataHora"
						FROM PRO_DUFW WITH(NOLOCK) 							
						WHERE DUC_EANO = ddg.DUC_EANO AND DUC_PNUM = ddg.DUC_PNUM
						FOR XML PATH('followUpData'), ROOT('followUps'), TYPE), 						 						
						(SELECT 
							ISNULL(DUO_TIPO, 0) AS "tipoManifesto", 
							NULLIF(PAI_CODI, '') AS "paisManifesto",
							NULLIF(RTRIM(LTRIM(DUO_DESC)), '') AS "descricao",	
							CAST(ISNULL(DUO_VALO, 0) AS decimal(18, 3)) AS "valor", 						
							NULLIF(LEFT(DUO_MOED, 2), '') AS "paisMoeda",							
							CAST(ISNULL(DUO_TFAC, 0) AS decimal(18, 3)) AS "totalFatura",
							NULLIF(RTRIM(LTRIM(DUO_CPA2)), '') AS "numeroCPA", 
							CAST(ISNULL(DUO_PES2, 0) AS decimal(18, 3)) AS "pesoBruto"
						FROM PRO_DUOD WITH(NOLOCK) 							
						WHERE DUC_EANO = ddg.DUC_EANO AND DUC_PNUM = ddg.DUC_PNUM
						FOR XML PATH('manifesto'), ROOT('manifestos'), TYPE), 
						(SELECT 
							NULLIF(RTRIM(LTRIM(dfi.DUF_NOMF)), '') AS "nomeArquivo", 
							NULLIF(RTRIM(LTRIM(dfi.DUF_DESC)), '') AS "descricaoArquivo", 
							ISNULL(NULLIF(dfi.DUF_TMSG, ''), 'OUTRO') AS "tipoArquivo",
							dfi.DUF_ORIG AS "origemArquivo", 
							tfi.ficheiroBase64 AS "ficheiroBase64"
						FROM PRO_DUFI AS dfi WITH(NOLOCK) 							
							INNER JOIN @TmpTblArquivos AS tfi ON dfi.DUC_IDEN = tfi.idArquivo
						WHERE dfi.DUC_EANO = ddg.DUC_EANO AND dfi.DUC_PNUM = ddg.DUC_PNUM
						FOR XML PATH('arquivo'), ROOT('arquivos'), TYPE)								
					FROM PRO_DUCG AS ddg WITH(NOLOCK) 						
					WHERE ddg.DUC_IDTY = @IdDeclaracaoDUI2
					FOR XML PATH('declaracao'), TYPE)
				FOR XML PATH('declaracoesIMPToGIDWin'), ELEMENTS)
-- processa a geração da declaração IMP-CAU				
			SET @SQLAExecutar = N'EXEC @OUTNumErro = ' + @BaseDadosIMPCAU + '.dbo.sp_IMP_Declaracoes_ImportaDeXML @INXMLDeclaracaoIMPCAU, @INIdUtilizador, @OUTErro OUTPUT'
			SET @SQLVariaveis = N'@INXMLDeclaracaoIMPCAU xml, @INIdUtilizador int, @OUTNumErro int OUTPUT, @OUTErro varchar(MAX) OUTPUT'
			EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INXMLDeclaracaoIMPCAU = @XMLDeclaracaoIMPCAU, @INIdUtilizador = @IdUtilizador, @OUTNumErro = @NumErro OUTPUT, @OUTErro = @Erro OUTPUT		
-- senão houver erros na geração, efetua processamentos finais
			IF @NumErro = 0
			BEGIN
				SET @AnoDeclaracaoIMPCAU = NULL
				SET @NumDeclaracaoIMPCAU = NULL
				SET @IdDeclaracaoIMPCAU = NULL
-- obtem o id da declaração IMP-CAU gerada
				SET @SQLAExecutar = N'SELECT TOP 1 @OUTAnoDeclaracaoIMPCAU = DUC_EANO, @OUTNumDeclaracaoIMPCAU = DUC_PNUM, @OUTIdDeclaracaoIMPCAU = DUC_IDTY FROM ' + @BaseDadosIMPCAU + '.dbo.PRO_DUCG WITH(NOLOCK) WHERE DUC_EANO = YEAR(@INDataAtual) AND DUC_CPRT = @INDocTransporteDUI2 ORDER BY DUC_IDTY DESC'
				SET @SQLVariaveis = N'@INDataAtual datetime, @INDocTransporteDUI2 varchar(18), @OUTAnoDeclaracaoIMPCAU int OUTPUT, @OUTNumDeclaracaoIMPCAU int OUTPUT, @OUTIdDeclaracaoIMPCAU bigint OUTPUT'
				EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INDataAtual = @DataAtual, @INDocTransporteDUI2 = @DocTransporteDUI2, @OUTAnoDeclaracaoIMPCAU = @AnoDeclaracaoIMPCAU OUTPUT, @OUTNumDeclaracaoIMPCAU = @NumDeclaracaoIMPCAU OUTPUT, @OUTIdDeclaracaoIMPCAU = @IdDeclaracaoIMPCAU OUTPUT
-- verifica se a declaração IMP-CAU foi corretamente gerada
				IF @IdDeclaracaoIMPCAU IS NULL
					RAISERROR('Declaração IMP-CAU não foi gerada.', 16, 4)
-- atualiza o número dos documento automáticos de origem do tipo de declaração
				SET @SQLAExecutar = N'UPDATE ' + @BaseDadosIMPCAU + '.dbo.tb_IMP_DeclaracoesDocumentos SET numero = dad.DDO_NUME FROM ' + @BaseDadosIMPCAU + '.dbo.tb_IMP_DeclaracoesDocumentos AS did WITH(NOLOCK) INNER JOIN ' + @BaseDadosIMPCAU + '.dbo.TAB_DOCU AS doc WITH(NOLOCK) ON did.id_documento = doc.DOC_IDTY INNER JOIN PRO_DUCG AS ddg WITH(NOLOCK) ON ddg.DUC_EANO = @INAnoDeclaracaoDUI2 AND ddg.DUC_PNUM = @INNumDeclaracaoDUI2 INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON dad.DUC_EANO = ddg.DUC_EANO AND dad.DUC_PNUM = ddg.DUC_PNUM AND dad.DUA_CODI = 1 AND dad.DDO_TIPO = 0 AND dad.DDO_AUTO = 0 AND doc.DOC_CODI = dad.DOC_CODI INNER JOIN TAB_TDED AS tdo WITH(NOLOCK) ON ddg.TDE_CODI = tdo.TDE_CODI AND dad.DOC_CODI = tdo.DOC_CODI	WHERE did.id_declaracaoIMP = @INIdDeclaracaoIMPCAU AND did.origem = 1 AND ISNULL(did.numero, '''') <> ISNULL(dad.DDO_NUME, '''')'
				SET @SQLVariaveis = N'@INAnoDeclaracaoDUI2 int, @INNumDeclaracaoDUI2 int, @INIdDeclaracaoIMPCAU bigint'
				EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INAnoDeclaracaoDUI2 = @AnoDeclaracaoDUI2, @INNumDeclaracaoDUI2 = @NumDeclaracaoDUI2, @INIdDeclaracaoIMPCAU = @IdDeclaracaoIMPCAU
-- atualiza o número dos documento automáticos de origem da alfândega
				SET @SQLAExecutar = N'UPDATE ' + @BaseDadosIMPCAU + '.dbo.tb_IMP_DeclaracoesDocumentos SET numero = dad.DDO_NUME FROM ' + @BaseDadosIMPCAU + '.dbo.tb_IMP_DeclaracoesDocumentos AS did WITH(NOLOCK) INNER JOIN ' + @BaseDadosIMPCAU + '.dbo.TAB_DOCU AS doc WITH(NOLOCK) ON did.id_documento = doc.DOC_IDTY INNER JOIN PRO_DUCG AS ddg WITH(NOLOCK) ON ddg.DUC_EANO = @INAnoDeclaracaoDUI2 AND ddg.DUC_PNUM = @INNumDeclaracaoDUI2 INNER JOIN PRO_DDOC AS dad WITH(NOLOCK) ON dad.DUC_EANO = ddg.DUC_EANO AND dad.DUC_PNUM = ddg.DUC_PNUM AND dad.DUA_CODI = 1 AND dad.DDO_TIPO = 0 AND dad.DDO_AUTO = 0 AND doc.DOC_CODI = dad.DOC_CODI INNER JOIN TAB_ALFD AS fdo WITH(NOLOCK) ON ddg.ALF_CODI = fdo.ALF_CODI AND dad.DOC_CODI = fdo.DOC_CODI	WHERE did.id_declaracaoIMP = @INIdDeclaracaoIMPCAU AND did.origem = 6 AND ISNULL(did.numero, '''') <> ISNULL(dad.DDO_NUME, '''')'
				SET @SQLVariaveis = N'@INAnoDeclaracaoDUI2 int, @INNumDeclaracaoDUI2 int, @INIdDeclaracaoIMPCAU bigint'
				EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INAnoDeclaracaoDUI2 = @AnoDeclaracaoDUI2, @INNumDeclaracaoDUI2 = @NumDeclaracaoDUI2, @INIdDeclaracaoIMPCAU = @IdDeclaracaoIMPCAU
-- remove precedente criado pelo automatismo do regime da declaração IMP-CAU, apenas quando a mesma tem mais que 1 adição
				SET @SQLAExecutar = N'IF EXISTS(SELECT 1 FROM PRO_DUCG WITH(NOLOCK) WHERE DUC_IDTY = @INIdDeclaracaoIMPCAU AND DUC_ADI5 > 1) BEGIN DELETE FROM tb_IMP_DeclaracoesPrecedentes WHERE id_declaracaoIMP = @INIdDeclaracaoIMPCAU AND origem = 1 END'
				SET @SQLVariaveis = N'@INIdDeclaracaoIMPCAU bigint'
				EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INIdDeclaracaoIMPCAU = @IdDeclaracaoIMPCAU
-- remove o primeiro registo de follow-up criado pelo automatismo existente nos dados gerais das declarações IMP-CAU p/ evitar duplicação
				SET @SQLAExecutar = N'DELETE FROM ' + @BaseDadosIMPCAU + '.dbo.PRO_DUFW WHERE DUC_EANO = @INAnoDeclaracaoIMPCAU AND DUC_PNUM = @INNumDeclaracaoIMPCAU AND DFW_CODI = (SELECT MIN(DFW_CODI) FROM ' + @BaseDadosIMPCAU + '.dbo.PRO_DUFW WITH(NOLOCK) WHERE DUC_EANO = @INAnoDeclaracaoIMPCAU AND DUC_PNUM = @INNumDeclaracaoIMPCAU)'
				SET @SQLVariaveis = N'@INAnoDeclaracaoIMPCAU int, @INNumDeclaracaoIMPCAU int'
				EXEC sp_executesql @SQLAExecutar, @SQLVariaveis, @INAnoDeclaracaoIMPCAU = @AnoDeclaracaoIMPCAU, @INNumDeclaracaoIMPCAU = @NumDeclaracaoIMPCAU
-- Coloca a declaração DUI2 com natureza de sucesso da exportação e bloqueada
				UPDATE PRO_DUCG SET NDE_CODI = @CodNaturezaSucesso, NDE_NOME = (SELECT NDE_NOME FROM TAB_NDES WITH(NOLOCK) WHERE NDE_CODI = @CodNaturezaSucesso), DUC_BLOQ = 1, 
					DUC_UALT = @Utilizador, DUC_DTAL = @DataAtual
				WHERE DUC_IDTY = @IdDeclaracaoDUI2
			END
			ELSE
				RAISERROR('Declaração IMP-CAU não foi gerada! ERRO: "%s".', 16, 5, @Erro)				
		END TRY
		BEGIN CATCH
-- Coloca a declaração DUI2 com natureza de erro da exportação
			UPDATE PRO_DUCG SET NDE_CODI = @CodNaturezaErro, NDE_NOME = (SELECT NDE_NOME FROM TAB_NDES WITH(NOLOCK) WHERE NDE_CODI = @CodNaturezaErro), 
				DUC_UALT = @Utilizador, DUC_DTAL = @DataAtual
			WHERE DUC_IDTY = @IdDeclaracaoDUI2
-- constroi mensagem de erro detalhada						
			SET @ListaErros = ISNULL(@ListaErros, '') + 
								'**********************************************************************************************************' + CHAR(12) +
								'** ERRO NA EXPORTACAO DA DECLARACAO DUI2 *****************************************************************' + CHAR(12) + 
								'**********************************************************************************************************' + CHAR(12) + 
								'Dados da Declaracao DUI2: ' + CHAR(12) + 								
								' » Doc. Transporte: ' + ISNULL(@DocTransporteDUI2, '') + CHAR(12) +
								' » No. Declaracao: ' + CAST(@AnoDeclaracaoDUI2 AS varchar(4)) + '/' + CAST(@NumDeclaracaoDUI2 AS varchar(50)) + CHAR(12) +
								' » Id. Declaracao: ' + CAST(@IdDeclaracaoDUI2 AS varchar(50)) + CHAR(12) +								
								' » Erro: ' + ERROR_MESSAGE() + CHAR(12) + 
								' » 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)) + CHAR(12)
		END CATCH			
		FETCH NEXT FROM DeclaracoesDUI2 INTO @AnoDeclaracaoDUI2, @NumDeclaracaoDUI2, @DocTransporteDUI2, @IdDeclaracaoDUI2
	END
	CLOSE DeclaracoesDUI2
	DEALLOCATE DeclaracoesDUI2	
-- se ocorreram erros no processo de exportação das declarações DUI2 para IMP-CAU, gera ficheiro de erros
	IF ISNULL(@ListaErros, '') <> ''
	BEGIN			
		SET @NomeFicheiroErro = 'GIDWinErrorLogExportDUI2ToIMPCAU_' + REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(varchar(23), @DataAtual, 121), '-', ''), ':', ''), '.', ''), ' ', '') + '.txt'
		SET @PathFicheiroErro = @DirFicheiroErros + '/' + @NomeFicheiroErro
		SET @i = CHARINDEX(CHAR(12), @ListaErros, 0)
		WHILE @i > 0
		BEGIN
			SET @Erro = ''
			SET @Linha = SUBSTRING(@ListaErros, 1, @i - 1)
			EXEC GIDWIN.dbo.SP_Externo_EscreveLinhaFicheiro @PathFicheiroErro, @Linha, @Erro OUTPUT
			IF ISNULL(@Erro, '') <> ''
				RAISERROR('Não foi possível escrever no ficheiro "%s"! ERRO: "%s".', 16, 6, @PathFicheiroErro, @Erro)				
			SET @ListaErros = STUFF(@ListaErros, 1, @i, '')
			SET @i = CHARINDEX(CHAR(12), @ListaErros, 0)
		END			
	END	
END
GO
GRANT EXECUTE ON SP_DeclImportacao_ExportaDeclaracoesParaIMPCAUDHL TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_ConverteDAR') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_ConverteDAR
GO
CREATE PROCEDURE sp_IMP_Declaracoes_ConverteDAR @Id bigint, @IdUtilizador int, @IdDeclaracaoDAR int OUTPUT, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @XMLDeclaracaoDAR xml(XMLSC_DeclaracoesDARToGIDWin)
-- inicia processo de geração da declaração	DAR
	BEGIN TRY	
		SET @NumErro = 0
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para declaração DAR a partir da declaração IMP-CAU
		SET @XMLDeclaracaoDAR = 
			(SELECT
				(SELECT 
					'I' AS "@acao", 
					(CONVERT(varchar(10), @DataAtual, 127) + 'Z') AS "data",
					(CASE duc.DUC_TPDS WHEN 0 THEN 3 ELSE 2 END) AS "regimeIVA",  
					'C07' AS "adicionalRegime", 
					NULLIF(nat.NDE_CODI3, '') AS "natureza", 
					NULLIF(duc.DUC_CPRT, '') AS "documentoTransporte",
					(SELECT 
						NULLIF(duc.DUC_ENIF, '') AS "nif", 
						NULLIF(duc.DUC_ENOM, '') AS "nome", 
						NULLIF(duc.DUC_EMOR, '') AS "morada", 
						NULLIF(duc.DUC_ELOC, '') AS "localidade", 
						NULLIF(duc.DUC_ECPO, '') AS "codigoPostal", 
						NULLIF(duc.DUC_ELPO, '') AS "localidadePostal", 
						NULLIF(duc.PAI_ELIV, '') AS "pais"
					HAVING ISNULL(duc.DUC_ENOM, '') <> ''
					FOR XML PATH('exportador'), TYPE),
					(SELECT 
						ISNULL(NULLIF(duc.DUC_DNIF, ''), '999999990') AS "nif", 
						NULLIF(duc.DUC_DNOM, '') AS "nome", 
						NULLIF(duc.DUC_DMOR, '') AS "morada", 
						NULLIF(duc.DUC_DLOC, '') AS "localidade", 
						NULLIF(duc.DUC_DCPO, '') AS "codigoPostal", 
						NULLIF(duc.DUC_DLPO, '') AS "localidadePostal", 
						NULLIF(duc.PAI_DLIV, '') AS "pais", 
						NULLIF(duc.DUC_DTEL, '') AS "telefone", 
						NULLIF(duc.DUC_DEMA, '') AS "email"					
					FOR XML PATH('importador'), TYPE),
					(SELECT 
						NULLIF(duc.DEC_CO14, '') AS "codigoDeclarante",					
						(CASE duc.DUC_TPDC WHEN 2 THEN 1 ELSE NULL END) AS "estatuto"
					FOR XML PATH('declarante'), TYPE),
					duc.ALF_CODI AS "estancia", 
					'A' AS "tipoDeclaracao", 
					NULLIF(duc.DUC_NVRF, '') AS "vossaReferencia", 
					NULLIF(duc.CEN_CO20, '') AS "condEntrega",
					NULLIF(duc.MTR_PT18, '') AS "meioTransporte", 
					(SELECT 						
						ISNULL(NULLIF(duc.DUC_TLOC, ''), (CASE alf.ALF_TLOC WHEN 'EA' THEN 'A' WHEN 'LA' THEN 'B' ELSE NULL END)) AS "tipoLocalizacao", 
						ISNULL(NULLIF(duc.DUC_QUAL, ''), (CASE alf.ALF_TLOC WHEN 'EA' THEN 'V' WHEN 'LA' THEN 'Y' ELSE NULL END)) AS "qualificador", 
						ISNULL(NULLIF(duc.LME_CO30, ''), (CASE WHEN (alf.ALF_TLOC = 'LA') AND (ISNULL(duc.DUC_QUAL, '') = '') THEN NULLIF(alf.LME_CODI, '') ELSE NULL END)) AS "armazemDTP", 
						ISNULL(NULLIF(duc.ALF_CODI1, ''), (CASE WHEN (alf.ALF_TLOC = 'EA') AND (ISNULL(duc.DUC_QUAL, '') = '') THEN duc.ALF_CODI ELSE NULL END)) AS "estancia"			
					FOR XML PATH('localizacaoMercadorias'), TYPE),
					NULLIF(duc.PAI_PR22, '') AS "paisMoedaFatura", 
					NULLIF(duc.PAI_FRET, '') AS "paisMoedaCustosTransporte", 	
					ISNULL(nda.FUP_CODI, duc.FUP_CODI) AS "followUp", 
					NULLIF(duc.DUC_UNMD, '') AS "utilizadorNomeado", 	
					duc.DUC_NPDT AS "depositoTemporario/numeroPDDT", 
					duc.DUC_NPDD AS "depositoTemporario/numeroPDDTDEV", 
					duc.DUC_NTDP AS "depositoTemporario/numeroTD", 
					duc.DUC_NACT AS "depositoTemporario/numeroACTM", 
					duc.DUC_NSEQ AS "depositoTemporario/numeroSequencia", 
					NULLIF(duc.DUC_DELG, '') AS "dadosEspecificos/locID", 
					NULLIF(duc.DUC_GTWY, '') AS "dadosEspecificos/gateway", 
					duc.DUC_NVSR AS "dadosEspecificos/serviceLevel", 
					NULLIF(duc.DUC_CIDE, '') AS "dadosEspecificos/portesAcc", 
					NULLIF(duc.DUC_POSA, '') AS "dadosEspecificos/portes", 
					NULLIF(duc.DUC_REF1, '') AS "dadosEspecificos/despachoAcc", 
					NULLIF(duc.DUC_VFRC, 0) AS "dadosEspecificos/freteOriginal", 
					NULLIF(duc.DUC_MFRC, '') AS "dadosEspecificos/moedafreteOriginal", 
					NULLIF(duc.DUC_VDES, 0) AS "dadosEspecificos/despesas", 
					NULLIF(duc.DUC_PPFC, '') AS "dadosEspecificos/condicaoEntrega", 
					NULLIF(duc.DUC_FUPS, '') AS "dadosEspecificos/nomeFicheiro", 
					NULLIF(duc.DUC_CIEX, '') AS "dadosEntidades/numeroContaExpedidor", 
					NULLIF(duc.DUC_CIDE, '') AS "dadosEntidades/numeroContaDestinatario", 
					NULLIF(duc.DUC_D2NO, '') AS "dadosEntidades/nomeOriginalDestinatario", 
					NULLIF(duc.DUC_D2MO, '') AS "dadosEntidades/moradaOriginalDestinatario", 
					NULLIF(duc.DUC_D2LO, '') AS "dadosEntidades/localidadeOriginalDestinatario", 
					NULLIF(duc.DUC_D2CP, '') AS "dadosEntidades/codigoPostalOriginalDestinatario", 
					NULLIF(duc.DUC_D2LP, '') AS "dadosEntidades/localidadePostalOriginalDestinatario", 
					NULLIF(duc.DUC_REF1, '') AS "dadosEntidades/referenciaExterna1", 
					NULLIF(duc.DUC_REF2, '') AS "dadosEntidades/referenciaExterna2", 
					NULLIF(duc.DUC_SHIP, '') AS "dadosEntidades/shipID", 
					NULLIF(duc.DUC_MCPA, '') AS "dadosAWB/miniCPA", 
					(CONVERT(varchar(10), duc.DUC_DTVO, 127) + 'Z') AS "dadosAWB/dataVoo", 
					NULLIF(duc.DUC_AERO, '') AS "dadosAWB/aeroportoOrigem", 
					NULLIF(duc.DUC_NVOO, '') AS "dadosAWB/numeroVoo", 
					NULLIF(duc.DUC_POSA, '') AS "dadosAWB/posicaoAviao", 
					NULLIF(duc.DUC_TRAC, '') AS "dadosAWB/tracking", 
					NULLIF(duc.DUC_TPCG, '') AS "dadosAWB/tipoCarga", 
					NULLIF(duc.DUC_DTYP, '') AS "outrosDados/dutyType", 
					NULLIF(duc.DUC_PAYM, '') AS "outrosDados/payment", 																					
					(SELECT 
						ddo.tipo AS "tipoDocumento", 
						doc.DOC_CODI AS "codigoDocumento",
						ISNULL(NULLIF(ddo.numero, ''), '*****N/A*****') AS "numeroDocumento"						
					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.origem IN (0, 13) -- 0: Manual; 13: Importação Ficheiro XLSX										
					FOR XML PATH('documento'), ROOT('documentosECertificados'), TYPE), 									
					(SELECT 
						doc.DOC_CODI AS "codigoDocumento", 
						dpr.numero AS "numeroDocumento"									
					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 AND doc.DOC_CODI = 'N337' AND doc.DOC_CA40 = 1					
					FOR XML PATH('documentoPrecedente'), ROOT('documentosPrecedentes'), TYPE), 				
					(SELECT
						(SELECT 
							adi.DUA_CODI AS "numeroAdicao", 
							NULLIF(adi.APA_CP33, '') AS "codigoPautal", 
							NULLIF(adi.DUA_DESG, '') AS "designacao", 							
							NULLIF(adi.PAI_CO34, '') AS "paisOrigem",							
							CAST(adi.DUA_MB35 AS decimal(18, 6)) AS "massaBruta",														
							CAST(ISNULL(adi.DUA_US41, 0) AS decimal(18, 6)) AS "unidades",							
							(CASE adi.DUA_CODI WHEN 1 THEN CAST(duc.DUC_TVL6 AS int) ELSE 0 END) AS "volumes", 
							NULLIF(duc.PAI_PR22, '') AS "paisMoedaFatura", 
							CAST(adi.DUA_VA42 AS decimal(18, 2)) AS "montante", 
							NULLIF(duc.PAI_FRET, '') AS "paisMoedaCustosTransporte", 
							CAST(ISNULL(adi.DUA_VFRE, 0) AS decimal(18, 2)) AS "custosTransporte", 
							(SELECT TOP 1 ISNULL(D31_LOPT, '') FROM PRO_DU31 WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI) AS "codigoBarras", 
							(SELECT TOP 1 ISNULL(D31_NUME, '') FROM PRO_DU31 WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = adi.DUA_CODI) AS "numeroObjeto"
						FROM PRO_DUAD AS adi WITH(NOLOCK) 
						WHERE adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM
						FOR XML PATH('adicao'), TYPE)
					FOR XML PATH('adicoes'), TYPE),		
					(SELECT 
						SIN_CODI AS "codigoIncidencia", 
						(CONVERT(varchar(23), CAST(CONVERT(varchar(10), DUI_DINI, 105) + ' ' + CONVERT(varchar(12), DUI_HINI, 114) AS datetime), 127) + 'Z') AS "dataInicio",
						(CONVERT(varchar(23), CAST(CONVERT(varchar(10), DUI_DFIM, 105) + ' ' + CONVERT(varchar(12), DUI_HFIM, 114) AS datetime), 127) + 'Z')AS "dataFim",	
						CAST(DUI_OBSR AS varchar(500)) AS "observacoes", 
						(CASE DUI_REHO WHEN 0 THEN 'R' WHEN 1 THEN 'H' ELSE NULL END) AS "tipoIncidencia"					
					FROM PRO_DUIN WITH(NOLOCK)
					WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM					
					FOR XML PATH('incidencia'), ROOT('incidencias'), TYPE),					
					(SELECT 
						DUO_TIPO AS "tipoManifesto", 
						NULLIF(PAI_CODI, '') AS "paisManifesto",
						NULLIF(RTRIM(LTRIM(DUO_DESC)), '') AS "descricao",	
						CAST(ISNULL(DUO_VALO, 0) AS decimal(18, 3)) AS "valor", 						
						SUBSTRING(NULLIF(DUO_MOED, ''), 1, 2) AS "paisMoedaManifesto",							
						CAST(ISNULL(DUO_TFAC, 0) AS decimal(18, 3)) AS "totalFatura",
						RTRIM(LTRIM(DUO_CPA2)) AS "numeroCPA", 
						CAST(ISNULL(DUO_PES2, 0) AS decimal(18, 3)) AS "peso"							
					FROM PRO_DUOD WITH(NOLOCK)
					WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM AND ISNULL(RTRIM(LTRIM(DUO_CPA2)), '') <> ''					
					FOR XML PATH('manifesto'), ROOT('manifestos'), TYPE),					
					(SELECT 
						FUP_CODI AS "codigoFollowUp", 
						UTI_UTIL AS "utilizadorFollowUp",							
						(CONVERT(varchar(23), DFW_DATA, 127) + 'Z') AS "dataFollowUp"							
					FROM PRO_DUFW WITH(NOLOCK)
					WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM										 
					FOR XML PATH('followUpData'), ROOT('followUps'), TYPE),					
					(SELECT 
						DCN_TEXT AS "descricaoContacto", 
						DCN_UCRI AS "utilizadorContacto",							
						(CONVERT(varchar(23), DCN_DTCR, 127) + 'Z') AS "dataContacto"							
					FROM PRO_DUCN WITH(NOLOCK)
					WHERE DUC_EANO = duc.DUC_EANO AND DUC_PNUM = duc.DUC_PNUM
					FOR XML PATH('contacto'), ROOT('contactos'), TYPE)
				FROM PRO_DUCG AS duc WITH(NOLOCK) 
					INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON duc.NDE_CODI = nat.NDE_CODI	
					INNER JOIN TAB_NDES AS nda WITH(NOLOCK) ON nat.NDE_CODI3 = nda.NDE_CODI
					INNER JOIN TAB_ALFA AS alf WITH(NOLOCK) ON duc.ALF_CODI = alf.ALF_CODI
				WHERE duc.DUC_IDTY = @Id
				FOR XML PATH('declaracao'), TYPE)
			FOR XML PATH('declaracoesDARToGIDWin'), ELEMENTS)
-- processa a geração da declaração DAT
		SET @Erro = ''
		EXEC @NumErro = sp_DeclaracoesDAR_ImportaRegistosDeXML @XMLDeclaracaoDAR, @IdUtilizador, @Erro OUTPUT				
-- senão houver erros na geração, efetua processamentos finais
		IF @NumErro = 0
		BEGIN
			SET @IdDeclaracaoDAR = NULL
-- obtem o id da declaração DAR gerada
			SELECT @IdDeclaracaoDAR = id
			FROM tb_DeclaracoesDAR WITH(NOLOCK)
			WHERE ano = YEAR(@DataAtual) AND documentoTransporte = (SELECT DUC_CPRT FROM PRO_DUCG WITH(NOLOCK) WHERE DUC_IDTY = @Id)
-- verifica se a declaração DAR foi corretamente gerada
			IF @IdDeclaracaoDAR IS NULL
				RAISERROR('Declaração DAR não foi gerada.', 16, 1)
-- atualiza o número dos documento automáticos de origem da alfândega
			UPDATE tb_DeclaracoesDARDocumentos SET numero = ISNULL(did.numero, '')
			FROM tb_DeclaracoesDARDocumentos AS ddd WITH(NOLOCK) 				
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS did WITH(NOLOCK) ON did.id_declaracaoIMP = @Id AND did.origem = 6 AND ddd.id_documento = did.id_documento
			WHERE ddd.id_declaracaoDAR = @IdDeclaracaoDAR AND ddd.origem = 1 AND ddd.numero <> ISNULL(did.numero, '')
-- remove o primeiro registo de follow-up criado pelo automatismo existente nos dados gerais das DAR p/ evitar duplicação
			DELETE FROM tb_DeclaracoesDARFollowUps
			WHERE id = (SELECT MIN(id) 
						FROM tb_DeclaracoesDARFollowUps WITH(NOLOCK) 
						WHERE id_declaracaoDAR = @IdDeclaracaoDAR)
-- remove a declaração IMP-CAU se for possível; caso contrário coloca a declaração IMP-CAU no status de "Anulado"
			BEGIN TRY
				DELETE FROM PRO_DUCG 
				WHERE DUC_IDTY = @Id
			END TRY
			BEGIN CATCH
				UPDATE PRO_DUCG SET DUC_CPRT = (DUC_CPRT + '_ANULADO'), DUC_STAT = 3 --Anulado
				WHERE DUC_IDTY = @Id
			END CATCH
		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_IMP_Declaracoes_ConverteDAR TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_SDSViaAerea_Manifestos_MensagemIntegraAirManifestResponse') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirManifestResponse
GO
CREATE PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirManifestResponse @MensagemXML xml, @Utilizador varchar(30), @IdMensagem varchar(35) OUTPUT, @SucessoMensagem varchar(10) OUTPUT, 
	@ContramarcaMensagem varchar(14) OUTPUT, @AnoManifesto int OUTPUT, @NumManifesto int OUTPUT, @AWBIntegradasXML xml OUTPUT, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON
	SET DATEFORMAT DMY
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @IdUtilizador int, @ErroGeracao varchar(8000), @TotalLinhasAWBInvalidas int
	DECLARE @DataMsgXML datetime, @IdManifestoMsgXML varchar(35), @EstadoContramarcaMsgXML varchar(15), @DocsTransporteMsgXML xml, @ErrosMsgXML xml, @AlertasMsgXML xml
	DECLARE @TipoManifesto int, @DataVooManifesto datetime, @CodEstanciaManifesto varchar(8), @ErrosGerais varchar(MAX)
	DECLARE @AcaoAwbXML varchar(8), @EstadoAwbXML varchar(50), @SucessoAwbXML varchar(8), @NRLAwbXML varchar(22), @MRNAwbXML varchar(18), @NumDocumentoAwbXML varchar(24), 
		@ErrosAwbXML xml, @AlertasAwbXML xml, @NumDGAItemXML varchar(29), @ErrosItemXML xml, @AlertasItemXML xml
	DECLARE @EstadoLinhaAWB varchar(3), @IdLinhaAWB int, @NumAWBLinhaAWB varchar(30), @ErrosLinhaAWB varchar(MAX), @ErrosXLinhaAWB xml, @AlertasXLinhaAWB xml
	DECLARE @AnoProcesso int, @NumProcesso int, @ArtigoFranquia int, @ContextoIMP int, @IdDeclaracaoIMP bigint, @IdDeclaracaoDAR int
	DECLARE @NumAdicao int, @ProxNumeroDeclSumaria int, @DeclSumariaAuto int, @CodRelDeclSumaria varchar(20), @IDIntDeclSumaria varchar(20), @IDIntDeclSumaria1Adicao varchar(20)
	DECLARE @NumLinhaIncidencia int, @DataIncidencia datetime, @HoraIncidencia datetime
	DECLARE @TblTmpLinhasAWBIntegradas TABLE(MAN_ANO smallint NOT NULL, MAN_NUME int NOT NULL, MAN_TIPO tinyint NOT NULL, MAN_DVOO datetime NOT NULL, EAD_CODI varchar(8) NOT NULL, 
		MAN_NCTM varchar(14) NULL, MAN_ESTA varchar(15) NULL, MAN_SUCE varchar(10) NULL, MAN_ERRS xml NULL, MAN_ALRS xml NULL, AWB_NUME varchar(30) NULL, AWB_ACAO varchar(8) NULL, 
		AWB_SUCE varchar(8) NULL, AWB_NMRN varchar(18) NULL, AWB_IDGA varchar(29) NULL, AWB_ERRS xml NULL, AWB_ALRS xml NULL)
-- inicia transacção para integração da mensagem AirManifestResponse
	BEGIN TRANSACTION tSDSIntMsgAirManifestResponse
	BEGIN TRY	
		SET @NumErro = 0
		SET @TotalLinhasAWBInvalidas = 0	
-- obtem dados da mensagem XML	
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT 			
			@IdMensagem = f.m.value('(ns2:MessageInformation/Identification)[1]', 'varchar(35)'), 
			@DataMsgXML = f.m.value('(ns2:MessageInformation/DateAndTime)[1]', 'datetime'), 
			@IdManifestoMsgXML = f.m.value('(ns2:MessageCorrelationInformation/Identification)[1]', 'varchar(35)'), 
			@SucessoMensagem = f.m.value('(ns2:MessageCorrelationInformation/Success)[1]', 'varchar(10)'), 
			@ContramarcaMensagem = f.m.value('(ns2:CustomsProcess/CustomsReferenceNumber)[1]', 'varchar(14)'), 
			@EstadoContramarcaMsgXML = f.m.value('(ns2:CustomsProcess/CurrentCustomsProcessState)[1]', 'varchar(15)'), 
			@DocsTransporteMsgXML = f.m.query('ns2:TransportDocuments'), 
			@ErrosMsgXML = f.m.query('ns2:Errors'), 
			@AlertasMsgXML = f.m.query('ns2:Warnings')
		FROM @MensagemXML.nodes('ns2:AirManifestResponse') AS f(m)
-- extrai ano e número de manifesto 
		IF ISNULL(@IdManifestoMsgXML, '') <> ''
		BEGIN
			SET @AnoManifesto = CAST(LEFT(@IdManifestoMsgXML, 4) AS int)
			SET @NumManifesto = CAST(SUBSTRING(@IdManifestoMsgXML, 6, LEN(@IdManifestoMsgXML) - 8 - 5) AS int)	
		END
		ELSE
		BEGIN
			SELECT TOP 1 @AnoManifesto = DSC_EANO, @NumManifesto = DSC_NPRO
			FROM PRO_SDSC WITH(NOLOCK) 				
			WHERE DSC_NCMF = LEFT(@ContramarcaMensagem, 8) AND DSC_NCMV = RIGHT(@ContramarcaMensagem, 6)
			ORDER BY DSC_TIPO, DSC_IDEN DESC
		END			
-- verifica se mensagem é válida para o manifesto SDS - Via Aérea
		IF NOT EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto)
			RAISERROR('Manifesto SDS - Via Aérea com ID "%s" e Contramarca "%s" inexistente.', 16, 1, @IdManifestoMsgXML, @ContramarcaMensagem)	
		ELSE
			IF EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSC_RESP LIKE '%' + @IdMensagem + '%' AND DSC_RESP LIKE '%' + CONVERT(varchar(23), @DataMsgXML, 121) + '%')
				RAISERROR('Mensagem XML AirManifestResponse com ID "%s" já integrada no Manifesto SDS - Via Aérea com ID "%s" e Contramarca "%s".', 16, 2, @IdMensagem, @IdManifestoMsgXML, @ContramarcaMensagem)	
-- obtem os erros gerais do manifesto da mensagem XML		
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT @ErrosGerais = ISNULL(@ErrosGerais, ' #Erros Gerais: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
		FROM @ErrosMsgXML.nodes('ns2:Errors/Error') AS f(m)
-- obtem somente a lista de erros e warnings
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirTransportStatus' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT @ErrosMsgXML = @ErrosMsgXML.query('ns2:Errors/Error'), @AlertasMsgXML = @AlertasMsgXML.query('ns2:Warnings/Warning')
-- obtem dados do Manifesto SDS - Via Aérea
		SELECT @TipoManifesto = DSC_TIPO, @CodEstanciaManifesto = EAD_CODI, @DataVooManifesto = DSC_DTVO
		FROM PRO_SDSC WITH(NOLOCK) 				
		WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
-- obtem o ID do utilizador
		SELECT @IdUtilizador = UTI_IDTY
		FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
		WHERE UTI_UTIL = @Utilizador
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem os documentos de transporte da mensagem XML
		DECLARE LinhasAWB CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
			SELECT f.m.value('@action[1]', 'varchar(8)'),
				f.m.value('ns2:LocalReferenceNumber[1]', 'varchar(22)'), 
				f.m.value('ns2:MovementReferenceNumber[1]', 'varchar(18)'), 
				f.m.value('ns2:DocumentNumber[1]', 'varchar(24)'), 
				f.m.value('ns2:TransportDocumentState[1]', 'varchar(50)'), 
				f.m.value('ns2:Success[1]', 'varchar(8)'), 
				f.m.query('ns2:Errors'), 
				f.m.query('ns2:Warnings'), 
				f.m.value('(ns2:GoodsItems/ns2:GoodsItem/ns2:CustomsItemNumber)[1]', 'varchar(29)'), 
				f.m.query('(ns2:GoodsItems/ns2:GoodsItem/ns2:Errors)[1]'), 
				f.m.query('(ns2:GoodsItems/ns2:GoodsItem/ns2:Warnings)[1]')
			FROM @DocsTransporteMsgXML.nodes('ns2:TransportDocuments/ns2:TransportDocument') AS f(m)	
		OPEN LinhasAWB
		FETCH NEXT FROM LinhasAWB INTO @AcaoAwbXML, @NRLAwbXML, @MRNAwbXML, @NumDocumentoAwbXML, @EstadoAwbXML, @SucessoAwbXML, @ErrosAwbXML, @AlertasAwbXML, @NumDGAItemXML, 
			@ErrosItemXML, @AlertasItemXML
		WHILE @@FETCH_STATUS = 0
		BEGIN		
			SET @NumAWBLinhaAWB = NULL	
			SET @ErrosLinhaAWB = NULL
			SET @ErrosXLinhaAWB = NULL
			SET @AlertasXLinhaAWB = NULL
-- obtem o ID da linha AWB a partir do NRL
			SET @IdLinhaAWB = CAST(RIGHT(@NRLAwbXML, 9)	AS int)
-- obtem número AWB da linha AWB do Manifesto SDS - Via Aérea
			SELECT @NumAWBLinhaAWB = DSD_NRMH
			FROM PRO_SDSD WITH(NOLOCK) 				
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_IDNN = @IdLinhaAWB
-- verifica se mensagem é válida para o manifesto SDS - Via Aérea
			IF (@IdLinhaAWB IS NOT NULL) AND (ISNULL(@NumAWBLinhaAWB, '') = '')
				RAISERROR('Linha AWB com ID "%s" inexistente no Manifesto SDS - Via Aérea com ID "%s" e Contramarca "%s".', 16, 3, @NRLAwbXML, @IdManifestoMsgXML, @ContramarcaMensagem)
			ELSE
				IF (@IdLinhaAWB IS NULL) AND (ISNULL(@NumAWBLinhaAWB, '') = '')
					SET @TotalLinhasAWBInvalidas = @TotalLinhasAWBInvalidas + 1
-- calcula o estado da operação da linha AWB do Manifesto SDS - Via Aérea
			IF ISNULL(@EstadoAwbXML, '') = 'Provisional'
				SET	@EstadoLinhaAWB = 'PRV' --Provisório
			ELSE
				IF ISNULL(@EstadoAwbXML, '') IN ('Conditional', 'Conditioned by Rejection', 'Conditioned by lack of response')
					SET	@EstadoLinhaAWB = 'PEN' --Pendente
				ELSE
					IF ISNULL(@EstadoAwbXML, '') = 'Active'
						SET	@EstadoLinhaAWB = 'ACT' --Ativo
					ELSE
						IF ISNULL(@EstadoAwbXML, '') = 'Unfolding'
							SET	@EstadoLinhaAWB = 'EMD' --Em Desdobramento
						ELSE 
							IF ISNULL(@EstadoAwbXML, '') = 'Unfold'
								SET	@EstadoLinhaAWB = 'DES' --Desdobrado
							ELSE
								IF ISNULL(@EstadoAwbXML, '') = 'Annul'
									SET	@EstadoLinhaAWB = 'ANU' --Anulado
								ELSE
									SET	@EstadoLinhaAWB = ''
-- obtem os erros da AWB e/ou do item da linha AWB
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
			SELECT @ErrosLinhaAWB = ISNULL(@ErrosLinhaAWB, '#ERROS:') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
			FROM @ErrosAwbXML.nodes('ns2:Errors/Error') AS f(m)
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
			SELECT @ErrosLinhaAWB = ISNULL(@ErrosLinhaAWB, '#ERROS:') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
			FROM @ErrosItemXML.nodes('ns2:Errors/Error') AS f(m)
-- atualiza dados da linha AWB
			UPDATE PRO_SDSD SET 
				DSD_ESTA = (CASE 
								WHEN (DSD_ESTA IN ('FIN', 'APU')) THEN DSD_ESTA
								WHEN (@AcaoAwbXML = 'Create') AND (@SucessoAwbXML = 'No') AND (ISNULL(DSD_ESTA, '') = '') THEN DSD_ESTA 
								WHEN (@SucessoAwbXML = 'Pending') AND (@EstadoLinhaAWB = '') THEN DSD_ESTA 
								ELSE NULLIF(@EstadoLinhaAWB, '')
							END),
				DSD_DERR = @ErrosLinhaAWB,
				DSD_STAT = (CASE @AcaoAwbXML 
								WHEN 'Create' THEN (CASE @SucessoAwbXML WHEN 'Yes' THEN 2 ELSE 3 END) 
								WHEN 'Update' THEN (CASE @SucessoAwbXML WHEN 'Yes' THEN 5 WHEN 'No' THEN 6 ELSE (CASE @EstadoLinhaAWB WHEN '' THEN 6 ELSE 5 END) END) 
								ELSE (CASE @SucessoAwbXML WHEN 'Yes' THEN 8 WHEN 'No' THEN 9 ELSE (CASE @EstadoLinhaAWB WHEN '' THEN 9 ELSE 8 END) END) 
							END),
				DSD_NDGA = @MRNAwbXML, 
				DSD_NDGI = @NumDGAItemXML, 
				DSD_ASAI = (CASE 
								WHEN (@AcaoAwbXML = 'Create') AND (@SucessoAwbXML = 'Yes') THEN 1 
								ELSE DSD_ASAI 
							END), 
				DSD_NDSC = @NumDocumentoAwbXML
			WHERE DSD_IDNN = @IdLinhaAWB	
-- obtem os erros da AWB e do item da linha AWB no formato XML
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
			SELECT @ErrosXLinhaAWB = CAST(NULLIF(ISNULL(CAST(a.e.query('Error') AS varchar(MAX)), '') + ISNULL(CAST(i.e.query('Error') AS varchar(MAX)), ''), '') AS  xml)
			FROM @ErrosAwbXML.nodes('ns2:Errors') AS a(e)
				FULL OUTER JOIN @ErrosItemXML.nodes('ns2:Errors') AS i(e) ON 1 = 1
-- obtem os alertas da AWB e do item da linha AWB no formato XML
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirManifestResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
			SELECT @AlertasXLinhaAWB = CAST(NULLIF(ISNULL(CAST(a.e.query('Warning') AS varchar(MAX)), '') + ISNULL(CAST(i.e.query('Warning') AS varchar(MAX)), ''), '') AS  xml)
			FROM @AlertasAwbXML.nodes('ns2:Warnings') AS a(e)
				FULL OUTER JOIN @AlertasItemXML.nodes('ns2:Warnings') AS i(e) ON 1 = 1
-- insere dados do manifesto e linha AWB na tabela tmp
			INSERT INTO @TblTmpLinhasAWBIntegradas(MAN_ANO, MAN_NUME, MAN_TIPO, MAN_DVOO, EAD_CODI, MAN_NCTM, MAN_ESTA, MAN_SUCE, MAN_ERRS, MAN_ALRS, AWB_NUME, AWB_ACAO, AWB_SUCE, AWB_NMRN, 
				AWB_IDGA, AWB_ERRS, AWB_ALRS)
			VALUES(@AnoManifesto, @NumManifesto, @TipoManifesto, @DataVooManifesto, @CodEstanciaManifesto, @ContramarcaMensagem, @EstadoContramarcaMsgXML, @SucessoMensagem, @ErrosMsgXML, @AlertasMsgXML, @NumAWBLinhaAWB, @AcaoAwbXML, @SucessoAwbXML, @MRNAwbXML, 
				@NumDGAItemXML, @ErrosXLinhaAWB, @AlertasXLinhaAWB)
-- se manifesto SDS - Via Aérea for de importação e linha AWB tiver "N.º DGA" atribuído, processa atualizações nas respetivas declarações de importação DUI2, IMP-CAU ou DAR
			IF (@TipoManifesto = 0) AND (ISNULL(@MRNAwbXML, '') <> '')
			BEGIN
				SET @NumProcesso = NULL
				SET @AnoProcesso = NULL
				SET @ArtigoFranquia = NULL
				SET @ContextoIMP = NULL
				SET @IdDeclaracaoIMP = NULL
-- obtem dados da Declaração de Importação se tiver "Artigo Franquia" definido
				SELECT @NumProcesso = DUC_PNUM, @AnoProcesso = DUC_EANO, @ArtigoFranquia = DUC_ARTI, @ContextoIMP = DUC_DUNO, @IdDeclaracaoIMP = DUC_IDTY			
				FROM PRO_DUCG WITH(NOLOCK) 								
				WHERE DUC_DUNO IN (1, 2) AND DUC_CPRT = @NumAWBLinhaAWB AND CAST(CONVERT(varchar(10), DUC_DTVO, 105) as datetime) = CAST(CONVERT(varchar(10), @DataVooManifesto, 105) as datetime)
					AND (SELECT COUNT(*) FROM PRO_DUOD WITH(NOLOCK) WHERE DUC_EANO = PRO_DUCG.DUC_EANO AND DUC_PNUM = PRO_DUCG.DUC_PNUM) > 0
-- verifica se se trata de uma Declaração de Importação
				IF @NumProcesso IS NOT NULL
				BEGIN
-- actualiza DU Importação relacionado com linha AWB
					UPDATE PRO_DUCG SET 
						DUC_LC27 = @MRNAwbXML, 
						DUC_ASAI = (CASE WHEN DUC_ARTI IS NOT NULL THEN 1 ELSE DUC_ASAI END),
						DUC_NORD = (CASE WHEN DUC_ARTI IS NOT NULL THEN @MRNAwbXML ELSE DUC_NORD END),
						DUC_NDAT = (CASE WHEN DUC_ARTI IS NOT NULL THEN CAST(CONVERT(varchar(10), @DataAtual, 105) as datetime) ELSE DUC_NDAT END)					
					WHERE DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso
-- actualiza adições do DU Importação relacionado com linha AWB
					UPDATE PRO_DUAD SET 
						DUA_QUAL = 'X', 
						DUA_DANO = CAST(SUBSTRING(@NumDocumentoAwbXML, 10, 4) AS int), 
						DUA_DNUM = SUBSTRING(@NumDocumentoAwbXML, 14, 6), 
						DOC_CODI = (CASE @ContextoIMP WHEN 2 THEN 'N337' ELSE '785' END), 
						EAD_CODI = ('PT000' + SUBSTRING(@NumDocumentoAwbXML, 6, 3)), 
						DUA_DDAT = @DataVooManifesto, 
						MTR_CODI = '4', 
						DUA_LINH = SUBSTRING(@NumDocumentoAwbXML, 20, 10)
					WHERE DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso	
-- processa atualizações especificas em função se DUI2 ou IMP-CAU
					IF @ContextoIMP = 1
					BEGIN								
-- obtem as adições da Declaração de Importação
						DECLARE LstAdicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
							SELECT DUA_CODI									
							FROM PRO_DUAD WITH(NOLOCK) 								
							WHERE DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso
							ORDER BY DUA_CODI
						OPEN LstAdicoes
						FETCH NEXT FROM LstAdicoes INTO @NumAdicao
						WHILE @@FETCH_STATUS = 0
						BEGIN
-- para cada adição, verifica se linha "Sumária" do anexo de Declaração Sumária já existe					
							IF EXISTS(SELECT DRA_CODI FROM PRO_DURA WITH(NOLOCK) WHERE DRA_QUAL = 'X' AND DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso AND DUA_CODI = @NumAdicao)
							BEGIN
								IF @NumAdicao = 1
								BEGIN
									SELECT TOP 1 @IDIntDeclSumaria1Adicao = DRA_IDCR
									FROM PRO_DURA WITH(NOLOCK) 
									WHERE DRA_QUAL = 'X' AND DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso AND DUA_CODI = @NumAdicao
								END
-- actualiza linha "Sumária" do anexo de Declaração Sumária							
								UPDATE PRO_DURA set 
									DOC_CODI = '785', 
									DRA_APDT = @DataVooManifesto, 
									DRA_APAN = CAST(SUBSTRING(@NumDGAItemXML, 10, 4) AS int)
								WHERE DRA_QUAL = 'X' AND DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso AND DUA_CODI = @NumAdicao
							END
							ELSE
							BEGIN
								IF @NumAdicao = 1
								BEGIN
									SET @DeclSumariaAuto = 0
									SET @CodRelDeclSumaria = NULL
									SET @IDIntDeclSumaria = REPLACE(LTRIM(STR(CAST(GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT() AS numeric(38,6)), 20, 6)), '.', ',')
									SET @IDIntDeclSumaria1Adicao = @IDIntDeclSumaria
								END
								ELSE
								BEGIN
									SET @DeclSumariaAuto = 1
									SET @CodRelDeclSumaria = @IDIntDeclSumaria1Adicao
									SET @IDIntDeclSumaria = REPLACE(LTRIM(STR(CAST(GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT() AS numeric(38,6)), 20, 6)), '.', ',')							
								END
								SET @ProxNumeroDeclSumaria = (ISNULL((SELECT MAX(DRA_CODI) FROM PRO_DURA WHERE DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso AND DUA_CODI = @NumAdicao), 0) + 1)
-- insere linha "Sumária" do anexo de Declaração Sumária
								INSERT INTO PRO_DURA(DUC_EANO, DUC_PNUM, DUA_CODI, DRA_CODI, DOC_CODI, DRA_APAN, DRA_APC1, DRA_APC2, DRA_APDT, DRA_QUAL, DRA_CODR, DRA_AUTO, DRA_IDCR)
								VALUES(@AnoProcesso, @NumProcesso, @NumAdicao, @ProxNumeroDeclSumaria, '785', CAST(SUBSTRING(@NumDGAItemXML, 10, 4) AS int), 
									SUBSTRING(@NumDGAItemXML, 14, 12), 'NP', @DataVooManifesto, 'X', @CodRelDeclSumaria, @DeclSumariaAuto, @IDIntDeclSumaria)
							END							
							FETCH NEXT FROM LstAdicoes INTO @NumAdicao
						END
						CLOSE LstAdicoes
						DEALLOCATE LstAdicoes					
					END
					ELSE --Declaração Importação IMP-CAU
					BEGIN							
-- procede à inserção/atualização do documento precedente c/ código "N337"						
						IF NOT EXISTS(SELECT id 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 = @IdDeclaracaoIMP AND doc.DOC_CODI = 'N337')
						BEGIN
							INSERT INTO tb_IMP_DeclaracoesPrecedentes(id_declaracaoIMP, id_documento, numero, dataContramarca, origem, id_utilizadorControlo, dataControlo)
							SELECT @IdDeclaracaoIMP, DOC_IDTY, @MRNAwbXML, @DataVooManifesto, 3, @IdUtilizador, @DataAtual
							FROM TAB_DOCU WITH(NOLOCK)
							WHERE DOC_CODI = 'N337'
						END
						ELSE
						BEGIN
							UPDATE tb_IMP_DeclaracoesPrecedentes SET 
								numero = @MRNAwbXML, 
								dataContramarca = @DataVooManifesto, 
								id_utilizadorControlo = @IdUtilizador, 
								dataControlo = @DataAtual								
							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 = @IdDeclaracaoIMP AND doc.DOC_CODI = 'N337'
						END
					END																										
-- se declaração tiver "Artigo Franquia" definido, processa a inserção da incidência "A00"
					IF @ArtigoFranquia IS NOT NULL
					BEGIN
-- obtem dados para registo de incidência
						SET @NumLinhaIncidencia = (ISNULL((SELECT MAX(DUI_CODI) FROM PRO_DUIN WHERE DUC_EANO = @AnoProcesso AND DUC_PNUM = @NumProcesso), 0) + 1)
						SET @DataIncidencia = CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime)
						SET @HoraIncidencia = @DataAtual							
-- insere a incidência "A00"							
						INSERT INTO PRO_DUIN(DUC_EANO, DUC_PNUM, DUI_CODI, SIN_CODI, SIN_DESC, DUI_DINI, DUI_HINI, DUI_DFIM, DUI_HFIM)
						SELECT @AnoProcesso, @NumProcesso, @NumLinhaIncidencia, SIN_CODI, SIN_DESP, @DataIncidencia, @HoraIncidencia, @DataIncidencia, @HoraIncidencia
						FROM TAB_SINC WITH(NOLOCK) 
						WHERE SIN_CODI = 'A00'							
					END
				END
				ELSE
				BEGIN
					SET @IdDeclaracaoDAR = NULL					
-- verifica se se trata de uma Declaração DAR
					SELECT TOP 1 @IdDeclaracaoDAR = dar.id 
					FROM tb_DeclaracoesDAR AS dar WITH(NOLOCK) 							
					WHERE dar.documentoTransporte = @NumAWBLinhaAWB AND CAST(CONVERT(varchar(10), dar.dataVoo, 105) AS datetime) = CAST(CONVERT(varchar(10), @DataVooManifesto, 105) AS datetime)
						AND EXISTS(SELECT id FROM tb_DeclaracoesDARManifestos WITH(NOLOCK) WHERE id_declaracaoDAR = dar.id)
-- se for Declaração DAR, procede à inserção/atualização do documento precedente c/ código "N337"
					IF @IdDeclaracaoDAR IS NOT NULL
					BEGIN							
-- obtem o ID do utilizador
						SELECT @IdUtilizador = UTI_IDTY
						FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
						WHERE UTI_UTIL = @Utilizador
-- procede à inserção/atualização do documento precedente c/ código "N337"						
						IF NOT EXISTS(SELECT id FROM tb_DeclaracoesDARPrecedentes AS dpr WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY WHERE dpr.id_declaracaoDAR = @IdDeclaracaoDAR AND doc.DOC_CODI = 'N337')
						BEGIN
							INSERT INTO tb_DeclaracoesDARPrecedentes(id_declaracaoDAR, id_documento, numero, id_utilizadorControlo, dataControlo, origem, dataContramarca)
							SELECT @IdDeclaracaoDAR, DOC_IDTY, @MRNAwbXML, @IdUtilizador, @DataAtual, 2, @DataVooManifesto
							FROM TAB_DOCU WITH(NOLOCK) 
							WHERE DOC_CODI = 'N337'
						END
						ELSE
						BEGIN
							UPDATE tb_DeclaracoesDARPrecedentes SET 
								numero = @MRNAwbXML, 
								id_utilizadorControlo = @IdUtilizador, 
								dataControlo = @DataAtual, 
								dataContramarca = @DataVooManifesto
							FROM tb_DeclaracoesDARPrecedentes AS dpr WITH(NOLOCK) 									
								INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON dpr.id_documento = doc.DOC_IDTY
							WHERE dpr.id_declaracaoDAR = @IdDeclaracaoDAR AND doc.DOC_CODI = 'N337'
						END
					END
				END				
			END
			ELSE
-- se linha AWB tem "Aut. Saída" e pertence a um SDS do tipo "Exportação", insere ou edita registo de Saida AEX correspondente
				IF (@TipoManifesto = 1) AND (ISNULL(@MRNAwbXML, '') <> '') AND (EXISTS(SELECT 1 FROM PRO_SDSD WITH(NOLOCK) WHERE DSD_ASAI = 1 AND DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_NRMH = @NumAWBLinhaAWB))
					EXEC SP_SaidasAEX_InsereOuEditaViaExportacaoXMLouSDSViaAerea 0, @AnoManifesto, @NumManifesto, NULL, @NumAWBLinhaAWB, @Utilizador, @ErroGeracao OUTPUT															
			FETCH NEXT FROM LinhasAWB INTO @AcaoAwbXML, @NRLAwbXML, @MRNAwbXML, @NumDocumentoAwbXML, @EstadoAwbXML, @SucessoAwbXML, @ErrosAwbXML, @AlertasAwbXML, @NumDGAItemXML, 
				@ErrosItemXML, @AlertasItemXML
		END
		CLOSE LinhasAWB
		DEALLOCATE LinhasAWB
-- actualiza dados do manifesto SDS
		UPDATE PRO_SDSC SET 							
			DSC_NRRR = DSC_NRRR + 1, 
			DSC_UDRR = @DataAtual, 
			DSC_RESP = '-> AIR MANIFEST RESPONSE: ' + CHAR(13) + CHAR(10) 
						+ '	#Data Integração: ' + CONVERT(varchar(23), @DataAtual, 121) + CHAR(13) + CHAR(10) 
						+ '	#Utilizador Integração: ' + @Utilizador + CHAR(13) + CHAR(10) 
						+ '	#MessageIdentification: ' + @IdMensagem + CHAR(13) + CHAR(10) 
						+ '	#MessageDate: ' + CONVERT(varchar(23), @DataMsgXML, 121) + CHAR(13) + CHAR(10) 
						+ '	#Sucess: ' + ISNULL(@SucessoMensagem, '<n.d.>') + CHAR(13) + CHAR(10) 
						+ ISNULL(@ErrosGerais + CHAR(13) + CHAR(10), '') 
						+ (CASE WHEN (ISNULL(@SucessoMensagem, '<n.d.>') = 'No') AND (ISNULL(@ErrosGerais, '') = '') THEN ' #Erros Linhas: ' + CHAR(13) + CHAR(10) + '		. «Verificar erros nas linhas AWB»' + CHAR(13) + CHAR(10) ELSE '' END) 
						+ '===============================================================================================================================' + CHAR(13) + CHAR(10) 
						+ ISNULL(CAST(DSC_RESP AS varchar(max)), '')
		WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
-- atualiza status das linhas AWB para "Respondido Create/Update/Delete NOK" quando tem respetivamente o status como "Enviado Create/Update/Delete" e não houve sucesso nas linhas AWB integradas (normalmente devido à ocorrencia de erros gerais e/ou erros de schema [que vem descriminados nas linhas AWB mas sem quaisquer informação da AWB])
		IF (@TotalLinhasAWBInvalidas > 0) OR ((@TotalLinhasAWBInvalidas = 0) AND (NOT EXISTS(SELECT 1 FROM @TblTmpLinhasAWBIntegradas)))
		BEGIN
			UPDATE PRO_SDSD SET 
				DSD_STAT = (CASE DSD_STAT WHEN 1 THEN 3 WHEN 4 THEN 6 WHEN 7 THEN 9 ELSE DSD_STAT END)				
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_STAT IN (1, 4, 7)
		END
-- constroi XML com as linhas AWB integradas no MAnifesto SDS - Via Aérea
		SET @AWBIntegradasXML = 
			(SELECT 				
				MAN_ANO AS "AnoManifesto",		
				MAN_NUME AS "NumManifesto", 
				MAN_TIPO AS "TipoManifesto",
				MAN_DVOO AS "DataVooManifesto",
				EAD_CODI AS "EstanciaManifesto", 
				MAN_NCTM AS "ContramarcaManifesto", 
				MAN_ESTA AS "EstadoManifesto",
				MAN_SUCE AS "SucessoManifesto", 
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(MAN_ERRS AS varchar(MAX)), '') AS xml)) AS "ErrosManifesto",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(MAN_ALRS AS varchar(MAX)), '') AS xml)) AS "AlertasManifesto",
				AWB_NUME AS "NumeroAWB",
				AWB_ACAO AS "AcaoAWB",
				AWB_SUCE AS "SucessoAWB",
				AWB_NMRN AS "NumMRNAWB",
				AWB_IDGA AS "NumDGAAWB",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(AWB_ERRS AS varchar(MAX)), '') AS xml)) AS "ErrosAWB",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(AWB_ALRS AS varchar(MAX)), '') AS xml)) AS "AlertasAWB"
			FROM @TblTmpLinhasAWBIntegradas	
			FOR XML PATH('AWB'), ELEMENTS)
	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)) + '}'		
-- em caso de erro faz rollback da transacção iniciada						           
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION tSDSIntMsgAirManifestResponse
	END CATCH			
-- se sucesso faz commit da transacção iniciada
	IF @@TRANCOUNT > 0
		COMMIT TRANSACTION tSDSIntMsgAirManifestResponse
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_SDSViaAerea_Manifestos_MensagemIntegraAirManifestResponse TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_DeclaracoesDAR_ImportaRegistosDeXML') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_DeclaracoesDAR_ImportaRegistosDeXML
GO
CREATE PROC sp_DeclaracoesDAR_ImportaRegistosDeXML @XMLDeclaracoes xml(XMLSC_DeclaracoesDARToGIDWin), @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON
	SET DATEFORMAT DMY
-- declaração de variaveis	
	DECLARE @acao varchar(1), @data datetime, @regimeIVA int, @adicionalRegime varchar(3), @funcaoregimeIOSS varchar(3), @numeroIdentificacaoIVA varchar(17), @natureza varchar(3), 
		@documentoTransporte varchar(35), @nifExportador varchar(18), @nomeExportador varchar(70), @moradaExportador varchar(70), @localidadeExportador varchar(35), 
		@codigoPostalExportador varchar(20), @localidadePostalExportador varchar(35), @paisExportador varchar(2), @nifImportador varchar(18), @nomeImportador varchar(70), 
		@moradaImportador varchar(70), @localidadeImportador varchar(35), @codigoPostalImportador varchar(20), @localidadePostalImportador varchar(35), @paisImportador varchar(2), 
		@telefoneImportador varchar(15), @emailImportador varchar(70), @codigoDeclarante varchar(6), @estatutoDeclarante int, @estancia varchar(8), @tipoDeclaracao varchar(1), 
		@vossaReferencia varchar(50), @condEntrega varchar(3), @meioTransporte varchar(2), @tipoLocalizacaoMercadorias varchar(1), @qualificadorLocalizacaoMercadorias varchar(1), 
		@armazemDTPLocalizacaoMercadorias varchar(17), @estanciaLocalizacaoMercadorias varchar(8), @paisMoedaFatura varchar(2), @paisMoedaCustosTransporte varchar(2), @followUp int, 
		@utilizadorNomeado varchar(30), @numeroPDDT int, @numeroPDDTDEV int, @numeroTD int, @numeroACTM int, @numeroSequencia int, @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), 
		@condicaoEntrega varchar(2), @nomeFicheiro varchar(100), @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), @miniCPA varchar(20), 
		@dataVoo datetime,  @aeroportoOrigem varchar(80), @numeroVoo varchar(20), @posicaoAviao varchar(13), @tracking varchar(35), @tipoCarga varchar(5), @dutyType varchar(2), 
		@payment int, @dataDocumentoTransporte datetime, @XMLDocumentosECertificados xml, @XMLInformacoesAdicionais xml, @XMLDocumentosPrecedentes xml, @XMLAdicoes xml, 
		@XMLIncidencias xml, @XMLManifestos xml, @XMLFollowUps xml, @XMLContactos xml, @XMLSomaMassaBrutaAdicoes decimal(18, 6), @XMLSomaMontanteEURAdicoes decimal(18, 2)
	DECLARE @tipoDocumento int, @codigoDocumento varchar(5), @numeroDocumento varchar(70), @IdDetDocumento bigint
	DECLARE @codigoMencao varchar(8), @texto varchar(512)
	DECLARE @codigoIncidencia varchar(8), @dataInicio datetime, @dataFim datetime, @observacoes varchar(500), @tipoIncidencia varchar(1)
	DECLARE @tipoManifesto int, @paisManifesto varchar(2), @descricao varchar(150), @valor decimal(18, 3), @paisMoedaManifesto varchar(2), @totalFatura decimal(18, 3), 
		@numeroCPA varchar(35), @peso decimal(18, 3)
	DECLARE @codigoFollowUp int, @utilizadorFollowUp varchar(30), @dataFollowUp datetime
	DECLARE @descricaoContacto varchar(200), @utilizadorContacto varchar(30), @dataContacto datetime
	DECLARE @numeroAdicao int, @codigoPautal varchar(22), @designacao varchar(260), @adicionalRegimeB varchar(3), @paisOrigem varchar(2), @metodoPagamento varchar(1), 
		@massaBruta decimal(18, 6), @unidades decimal(18, 6), @volumes int, @montante decimal(18, 2), @custosTransporte decimal(18, 2), @codigoBarras varchar(30), 
		@numeroObjeto varchar(20), @Optativas decimal(18, 2)
	DECLARE @TblID table (ID bigint NOT NULL)
	DECLARE @NumErro int, @TaxaIVANormal decimal(8, 2), @CamposAdicionais int, @DataAtual datetime, @Ano smallint, @Numero int, @IdNatureza int, @IdAlfandega int, 
		@IdPaisExportador int, @IdFornecedor int, @ExportadorDefinido bit, @IdPaisImportador int, @IdCliente int, @TipoContaCliente varchar(3), @BeneficiarioIVACliente bit, 
		@CaucaoCliente varchar(24), @IdDeclarante int, @NomeDeclarante varchar(70), @IdPaisDeclarante int, @NIFDeclarante varchar(18), @MoradaDeclarante varchar(70), 
		@LocalidadeDeclarante varchar(35), @CodPostalDeclarante varchar(20), @LocPostalDeclarante varchar(35), @CaucaoDeclarante varchar(24), @IdLocalizacaoMercadorias int, 
		@IdAlfandegaLocalizacaoMercadorias int, @IdPaisMoedaMontante int, @IdPaisMoedaCustosTransporte int, @IdFollowUp int, @IdUtilizadorNomeado int, 
		@CambioMoedaCustosTransporte decimal(12, 6), @CambioMoedaMontante decimal(12, 6), @IdDeclaracao int, @IdDocumento int, @IdMencao int, @IdStatusIncidencia int, 
		@IdPaisManifesto int, @IdPaisMoedaManifesto int, @IdAdicao bigint, @IdArtigo int, @AdicionalIC1 varchar(4), @AdicionalIC2 varchar(4), @AdicionalIC3 varchar(4), 
		@IdPaisOrigem int, @MontanteEUR decimal(18, 2), @CustosTransporteEUR decimal(18, 2), @BaseTributacaoIVA decimal(18, 2), @TaxaIVA decimal(8, 2), @ValorIVA decimal(18, 2), 
		@TipoEntCaucao tinyint, @NumeroCaucao varchar(24), @IdManifesto bigint, @GestaoCEeVDA tinyint, @DiasFreeADT tinyint, @IdCondicaoEntrega int, @IdMeioTransporte int, 
		@TotalOptativas decimal(18, 2), @MeioTransportePorVolume bit, @IdUtilizadorXML int, @OperacaoManifesto int
	DECLARE @TotalMontante decimal(18, 2), @TotalCustosTransporte decimal(18, 2), @TotalMassaBruta decimal(18, 6), @TotalVolumesDirty int, @TotalVolumesClean int, @TotalVolumesScan int, 
		@TotalAdicoes smallint, @TotalVolumes int, @TotalIVA decimal(18, 2)
-- inicia variaveis 
	SET @NumErro = 0
	SET @Erro = ''
-- obtem a taxa IVA normal configurada
	SELECT @TaxaIVANormal = PAP_TXNR
	FROM TAB_PAPL WITH(NOLOCK)
-- obtem nos campos adicionais qual o tipo de empresa configurada
	SELECT @CamposAdicionais = PDE_CADI
	FROM TAB_PDES WITH(NOLOCK)
-- obtem o tipo de gestão CE/VDA configurada
	SELECT @GestaoCEeVDA = gestaoCEeVDA, @DiasFreeADT = diasFreeADT
	FROM tb_ConfiguracoesDAR WITH(NOLOCK)
-- carrega declaracoes DAR do XML p/ INSERT
	DECLARE DeclaracoesDAR CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR	 
		SELECT XML_DDAR.DAR_DATA.value('@acao[1]', 'varchar(1)'), 
			XML_DDAR.DAR_DATA.value('data[1]', 'datetime'), 
			XML_DDAR.DAR_DATA.value('regimeIVA[1]', 'int'), 			
			XML_DDAR.DAR_DATA.value('adicionalRegime[1]', 'varchar(3)'), 
			XML_DDAR.DAR_DATA.value('(regimeIOSS/funcao)[1]', 'varchar(3)'), 
			XML_DDAR.DAR_DATA.value('(regimeIOSS/numeroIdentificacaoIVA)[1]', 'varchar(17)'), 
			XML_DDAR.DAR_DATA.value('natureza[1]', 'varchar(3)'), 
			XML_DDAR.DAR_DATA.value('documentoTransporte[1]', 'varchar(35)'), 
			NULLIF(XML_DDAR.DAR_DATA.value('(exportador/nif)[1]', 'varchar(18)'), ''), 
			XML_DDAR.DAR_DATA.value('(exportador/nome)[1]', 'varchar(70)'), 
			XML_DDAR.DAR_DATA.value('(exportador/morada)[1]', 'varchar(70)'), 
			XML_DDAR.DAR_DATA.value('(exportador/localidade)[1]', 'varchar(35)'), 
			XML_DDAR.DAR_DATA.value('(exportador/codigoPostal)[1]', 'varchar(20)'), 
			XML_DDAR.DAR_DATA.value('(exportador/localidadePostal)[1]', 'varchar(35)'), 
			XML_DDAR.DAR_DATA.value('(exportador/pais)[1]', 'varchar(2)'), 
			XML_DDAR.DAR_DATA.value('(importador/nif)[1]', 'varchar(18)'), 
			XML_DDAR.DAR_DATA.value('(importador/nome)[1]', 'varchar(70)'), 
			XML_DDAR.DAR_DATA.value('(importador/morada)[1]', 'varchar(70)'), 
			XML_DDAR.DAR_DATA.value('(importador/localidade)[1]', 'varchar(35)'), 
			XML_DDAR.DAR_DATA.value('(importador/codigoPostal)[1]', 'varchar(20)'), 
			XML_DDAR.DAR_DATA.value('(importador/localidadePostal)[1]', 'varchar(35)'), 
			XML_DDAR.DAR_DATA.value('(importador/pais)[1]', 'varchar(2)'), 
			NULLIF(XML_DDAR.DAR_DATA.value('(importador/telefone)[1]', 'varchar(15)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(importador/email)[1]', 'varchar(70)'), ''), 
			XML_DDAR.DAR_DATA.value('(declarante/codigoDeclarante)[1]', 'varchar(6)'), 
			XML_DDAR.DAR_DATA.value('(declarante/estatuto)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('estancia[1]', 'varchar(8)'), 
			XML_DDAR.DAR_DATA.value('tipoDeclaracao[1]', 'varchar(1)'), 
			NULLIF(XML_DDAR.DAR_DATA.value('vossaReferencia[1]', 'varchar(50)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('condEntrega[1]', 'varchar(3)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('meioTransporte[1]', 'varchar(2)'), ''), 
			XML_DDAR.DAR_DATA.value('(localizacaoMercadorias/tipoLocalizacao)[1]', 'varchar(1)'), 
			XML_DDAR.DAR_DATA.value('(localizacaoMercadorias/qualificador)[1]', 'varchar(1)'), 
			XML_DDAR.DAR_DATA.value('(localizacaoMercadorias/armazemDTP)[1]', 'varchar(17)'), 
			XML_DDAR.DAR_DATA.value('(localizacaoMercadorias/estancia)[1]', 'varchar(8)'), 
			XML_DDAR.DAR_DATA.value('paisMoedaFatura[1]', 'varchar(2)'), 
			XML_DDAR.DAR_DATA.value('paisMoedaCustosTransporte[1]', 'varchar(2)'), 
			XML_DDAR.DAR_DATA.value('followUp[1]', 'int'),
			NULLIF(XML_DDAR.DAR_DATA.value('utilizadorNomeado[1]', 'varchar(30)'), ''), 
			XML_DDAR.DAR_DATA.value('(depositoTemporario/numeroPDDT)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('(depositoTemporario/numeroPDDTDEV)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('(depositoTemporario/numeroTD)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('(depositoTemporario/numeroACTM)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('(depositoTemporario/numeroSequencia)[1]', 'int'), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/locID)[1]', 'varchar(6)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/gateway)[1]', 'varchar(6)'), ''), 
			XML_DDAR.DAR_DATA.value('(dadosEspecificos/serviceLevel)[1]', 'int'), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/portesAcc)[1]', 'varchar(10)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/portes)[1]', 'varchar(13)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/despachoAcc)[1]', 'varchar(50)'), ''), 
			ISNULL(XML_DDAR.DAR_DATA.value('(dadosEspecificos/freteOriginal)[1]', 'decimal(18, 2)'), 0), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/moedafreteOriginal)[1]', 'varchar(3)'), ''), 
			ISNULL(XML_DDAR.DAR_DATA.value('(dadosEspecificos/despesas)[1]', 'decimal(18, 3)'), 0), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/condicaoEntrega)[1]', 'varchar(2)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEspecificos/nomeFicheiro)[1]', 'varchar(100)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/numeroContaExpedidor)[1]', 'varchar(10)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/numeroContaDestinatario)[1]', 'varchar(10)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/nomeOriginalDestinatario)[1]', 'varchar(70)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/moradaOriginalDestinatario)[1]', 'varchar(70)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/localidadeOriginalDestinatario)[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/codigoPostalOriginalDestinatario)[1]', 'varchar(12)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/localidadePostalOriginalDestinatario)[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/referenciaExterna1)[1]', 'varchar(50)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/referenciaExterna2)[1]', 'varchar(50)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosEntidades/shipID)[1]', 'varchar(11)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/miniCPA)[1]', 'varchar(20)'), ''), 
			XML_DDAR.DAR_DATA.value('(dadosAWB/dataVoo)[1]', 'datetime'),  
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/aeroportoOrigem)[1]', 'varchar(80)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/numeroVoo)[1]', 'varchar(20)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/posicaoAviao)[1]', 'varchar(13)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/tracking)[1]', 'varchar(35)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(dadosAWB/tipoCarga)[1]', 'varchar(5)'), ''), 
			NULLIF(XML_DDAR.DAR_DATA.value('(outrosDados/dutyType)[1]', 'varchar(2)'), ''), 
			XML_DDAR.DAR_DATA.value('(outrosDados/payment)[1]', 'int'), 
			XML_DDAR.DAR_DATA.value('(outrosDados/dataDocumentoTransporte)[1]', 'datetime'), 
			XML_DDAR.DAR_DATA.query('documentosECertificados'), 
			XML_DDAR.DAR_DATA.query('informacoesAdicionais'), 
			XML_DDAR.DAR_DATA.query('documentosPrecedentes'), 
			XML_DDAR.DAR_DATA.query('adicoes'), 
			XML_DDAR.DAR_DATA.query('incidencias'), 
			XML_DDAR.DAR_DATA.query('manifestos'),
			XML_DDAR.DAR_DATA.query('followUps'),
			XML_DDAR.DAR_DATA.query('contactos')
		FROM @XMLDeclaracoes.nodes('declaracoesDARToGIDWin/declaracao') as XML_DDAR(DAR_DATA)			
	OPEN DeclaracoesDAR
	FETCH NEXT FROM DeclaracoesDAR INTO @acao, @data, @regimeIVA, @adicionalRegime, @funcaoregimeIOSS, @numeroIdentificacaoIVA, @natureza, @documentoTransporte, @nifExportador, 
		@nomeExportador, @moradaExportador, @localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @nifImportador, @nomeImportador, 
		@moradaImportador, @localidadeImportador, @codigoPostalImportador, @localidadePostalImportador, @paisImportador, @telefoneImportador, @emailImportador, @codigoDeclarante, 
		@estatutoDeclarante, @estancia, @tipoDeclaracao, @vossaReferencia, @condEntrega, @meioTransporte, @tipoLocalizacaoMercadorias, @qualificadorLocalizacaoMercadorias, 
		@armazemDTPLocalizacaoMercadorias, @estanciaLocalizacaoMercadorias, @paisMoedaFatura, @paisMoedaCustosTransporte, @followUp, @utilizadorNomeado, @numeroPDDT, @numeroPDDTDEV, @numeroTD, 
		@numeroACTM, @numeroSequencia, @locID, @gateway, @serviceLevel, @portesAcc, @portes, @despachoAcc, @freteOriginal, @moedafreteOriginal, @despesas, @condicaoEntrega, @nomeFicheiro, 
		@numeroContaExpedidor, @numeroContaDestinatario, @nomeOriginalDestinatario, @moradaOriginalDestinatario, @localidadeOriginalDestinatario, @codigoPostalOriginalDestinatario, 
		@localidadePostalOriginalDestinatario, @referenciaExterna1, @referenciaExterna2, @shipID, @miniCPA, @dataVoo, @aeroportoOrigem, @numeroVoo, @posicaoAviao, @tracking, 
		@tipoCarga, @dutyType, @payment, @dataDocumentoTransporte, @XMLDocumentosECertificados, @XMLInformacoesAdicionais, @XMLDocumentosPrecedentes, @XMLAdicoes, @XMLIncidencias, 
		@XMLManifestos, @XMLFollowUps, @XMLContactos
	WHILE @@FETCH_STATUS = 0
	BEGIN
-- inicia transacção para inserção dados da declaração DAR
		BEGIN TRANSACTION	
		BEGIN TRY							
			SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
			SET @Ano = YEAR(@data)
			SET @IdNatureza = NULL
			SET @IdPaisExportador = NULL
			SET @IdFornecedor = NULL			
			SET @IdPaisImportador = NULL
			SET @IdCliente = NULL 
			SET @IdDeclarante = NULL
			SET @IdAlfandega = NULL
			SET @IdCondicaoEntrega = NULL
			SET @IdMeioTransporte = NULL
			SET @TotalOptativas = 0
			SET @MeioTransportePorVolume = 0
			SET @IdLocalizacaoMercadorias = NULL
			SET @IdAlfandegaLocalizacaoMercadorias = NULL
			SET @IdPaisMoedaMontante = NULL 
			SET @IdPaisMoedaCustosTransporte = NULL
			SET @OperacaoManifesto = NULL			
-- inicia totais
			SET @TotalVolumesDirty = 0
			SET @TotalVolumesClean = 0
			SET @TotalVolumesScan = 0		
			SET @TotalAdicoes = 0
			SET @TotalVolumes = 0
			SET @TotalIVA = 0
			SET @TotalMontante = 0
			SET @TotalCustosTransporte = 0
			SET @TotalMassaBruta = 0
-- verifica se dados regime IOSS são válidos
			IF (@regimeIVA = 1) AND ((ISNULL(@funcaoregimeIOSS, '') = '') OR (ISNULL(@numeroIdentificacaoIVA, '') = ''))
				RAISERROR('Dados do regime IOSS inválidos.', 16, 1)		
			ELSE
				IF (@regimeIVA = 2) AND ((ISNULL(@funcaoregimeIOSS, '') <> '') OR (ISNULL(@numeroIdentificacaoIVA, '') <> ''))
					RAISERROR('Dados do regime IOSS não podem ser especificados.', 16, 2)
-- obtem dados da natureza de despacho
			SELECT @IdNatureza = NDE_IDTY
			FROM TAB_NDES WITH(NOLOCK)
			WHERE NDE_PART = 0 AND NDE_CODI = @natureza
-- verifica se a natureza é válida
			IF @IdNatureza IS NULL
				RAISERROR('Natureza "%s" inválida.', 16, 3, @natureza)		
-- obtem dados do país do fornecedor (exportador)
			SELECT @IdPaisExportador = PAI_IDTY
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisExportador
-- obtem dados do fornecedor (exportador)
			SELECT TOP 1 @IdFornecedor = frn.FOR_IDTY, 
				@nomeExportador = ISNULL(frn.FOR_NOME, @nomeExportador), 
				@IdPaisExportador = ISNULL(pai.PAI_IDTY, @IdPaisExportador), 
				@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
-- verifica se o país do fornecedor (exportador) é válido
			IF (ISNULL(@nomeExportador, '') <> '') AND (@IdPaisExportador IS NULL)
				RAISERROR('País "%s" do exportador inválido.', 16, 4, @paisExportador)
-- obtem se exportador está definido
			IF ISNULL(@nomeExportador, '') <> ''
				SET @ExportadorDefinido = 1
			ELSE 
				SET @ExportadorDefinido = 0
-- obtem dados do país do cliente (importador)
			SELECT @IdPaisImportador = PAI_IDTY
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisImportador
-- verifica se o país do cliente (importador) é válido
			IF @IdPaisImportador IS NULL
				RAISERROR('País "%s" do importador inválido.', 16, 5, @paisImportador)	
-- obtem dados do cliente (importador)
			SELECT TOP 1 @IdCliente = cli.CLI_IDTY, 
				@nomeImportador = (CASE 
						WHEN cli.CLI_NIF = '999999990' THEN @nomeImportador 
						ELSE ISNULL(cli.CLI_NOME, @nomeImportador) 
					END), 
				@IdPaisImportador = (CASE 
						WHEN cli.CLI_NIF = '999999990' THEN @IdPaisImportador 
						ELSE ISNULL(pai.PAI_IDTY, @IdPaisImportador)
					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), 
				@TipoContaCliente = (CASE 
					WHEN cli.CLI_CODC = 1 THEN 'COD' 
					WHEN cli.CLI_CACC = 1 THEN 'ACC' 
					WHEN cli.CLI_CEXB = 1 THEN 'EXB' 
					WHEN cli.CLI_CDAS = 1 THEN 'DAS' 
					ELSE NULL 
				END), 
				@BeneficiarioIVACliente = (CASE
					WHEN  (cli.CLI_BIVA = 1) AND (cli.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)
			FROM TAB_CLIE AS cli WITH(NOLOCK) INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON cli.PAI_CODI = pai.PAI_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 @IdCliente IS NULL
			BEGIN
				SELECT TOP 1 @IdCliente = CLI_IDTY, 
					@TipoContaCliente = (CASE 
						WHEN CLI_CODC = 1 THEN 'COD' 
						WHEN CLI_CACC = 1 THEN 'ACC' 
						WHEN CLI_CEXB = 1 THEN 'EXB' 
						WHEN CLI_CDAS = 1 THEN 'DAS' 
						ELSE NULL 
					END), 
					@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)
				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 @IdCliente IS NULL
				RAISERROR('Cliente importador "%s" inválido.', 16, 6, @nifImportador)	
-- obtem dados do declarante
			SELECT @IdDeclarante = dcl.DEC_IDTY, 
				@NomeDeclarante = dcl.DEC_NOME, 
				@IdPaisDeclarante = pai.PAI_IDTY, 
				@NIFDeclarante = dcl.DEC_NIF, 
				@MoradaDeclarante = dcl.DEC_MORA, 
				@LocalidadeDeclarante = dcl.DEC_LOCA, 
				@CodPostalDeclarante = dcl.DEC_CPOS, 
				@LocPostalDeclarante = dcl.DEC_LPOS,
				@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)
			FROM TAB_DECL AS dcl WITH(NOLOCK) INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON dcl.PAI_CODI = pai.PAI_CODI
			WHERE dcl.DEC_INAC = 0 AND dcl.DEC_CODI = @codigoDeclarante
-- verifica se o declarante é válido
			IF @IdDeclarante IS NULL
				RAISERROR('Declarante "%s" inválido.', 16, 7, @codigoDeclarante)	
-- obtem dados da alfândega
			SELECT @IdAlfandega = ALF_IDTY
			FROM TAB_ALFA WITH(NOLOCK)
			WHERE SUBSTRING(ALF_CODI, 1, 2) = 'PT' AND LEN(ALF_CODI) = 8 AND ALF_CODI = @estancia
-- verifica se a alfândega é válida
			IF @IdAlfandega IS NULL
				RAISERROR('Alfândega "%s" inválida.', 16, 8, @estancia)
-- obtem dados da condição de entrega se regime IVA diferente de IOSS e gestão CE ativa
			IF (@regimeIVA <> 1) AND (@GestaoCEeVDA IN (1, 3))
			BEGIN
				SELECT @IdCondicaoEntrega = CEN_IDTY
				FROM TAB_CENT WITH(NOLOCK)
				WHERE CEN_CODI = @condEntrega
-- verifica se a condição de entrega é válida
				IF @IdCondicaoEntrega IS NULL 
					RAISERROR('Condição de Entrega "%s" inválida.', 16, 9, @condEntrega)				
			END
-- obtem a soma da massa bruta e do montante das adições p/ calculo das optativas apenas se regime IVA diferente de IOSS e gestão VDA ativa
			IF (@regimeIVA <> 1) AND (@GestaoCEeVDA IN (2, 3))
			BEGIN
				SELECT @XMLSomaMassaBrutaAdicoes = SUM(XML_ADIC.ADI_DATA.value('massaBruta[1]', 'decimal(18, 6)')), 
					@XMLSomaMontanteEURAdicoes = SUM(ROUND(XML_ADIC.ADI_DATA.value('montante[1]', 'decimal(18, 2)') / dbo.FNT_Geral_ObtemCambio(0, XML_ADIC.ADI_DATA.value('paisMoedaFatura[1]', 'varchar(2)'), @Data), 2))
				FROM @XMLAdicoes.nodes('adicoes/adicao') AS XML_ADIC(ADI_DATA)				
			END
			ELSE
			BEGIN
				SET @XMLSomaMassaBrutaAdicoes = 0
				SET @XMLSomaMontanteEURAdicoes = 0
			END
-- obtem dados do meio de transporte se regime IVA diferente de IOSS e gestão VDA ativa
			IF (@regimeIVA <> 1) AND (@GestaoCEeVDA IN (2, 3))
			BEGIN
				SELECT @IdMeioTransporte = mtr.MTR_IDTY, @MeioTransportePorVolume = (CASE ISNULL(mtr.MTR_VPVL, 0) WHEN 2 THEN 1 ELSE 0 END), 
					@TotalOptativas = (CASE @DiasFreeADT 
											WHEN 0 THEN (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 @XMLSomaMassaBrutaAdicoes BETWEEN MTO_LMNP AND MTO_LMXP 
																					AND @XMLSomaMontanteEURAdicoes BETWEEN MTO_LMNV AND MTO_LMXV), 0) 
															ELSE ISNULL(mtr.MTR_VOP1, 0) 
														END) 
											ELSE 0 
										END)					
				FROM TAB_MTRA AS mtr WITH(NOLOCK)
				WHERE mtr.MTR_CODI = @meioTransporte
-- verifica se o meio de transporte é válido
				IF @IdMeioTransporte IS NULL 
					RAISERROR('Meio de Transporte "%s" inválido.', 16, 10, @meioTransporte)				
			END
-- obtem dados da localização de mercadorias
			SELECT @IdLocalizacaoMercadorias = LME_IDTY
			FROM TAB_LMER WITH(NOLOCK)
			WHERE LME_FLUX = 1 AND LEFT(RIGHT(LME_CODI, 5), 3) = RIGHT(@estancia, 3) AND LME_CODI = @armazemDTPLocalizacaoMercadorias
-- verifica se a localização das mercadorias é válida
			IF (@qualificadorLocalizacaoMercadorias IN ('U', 'Y')) AND (@IdLocalizacaoMercadorias IS NULL)
				RAISERROR('Armazém DTP "%s" da localização das mercadorias inválida.', 16, 11, @armazemDTPLocalizacaoMercadorias)
-- obtem dados da alfândega das mercadorias
			SELECT @IdAlfandegaLocalizacaoMercadorias = ALF_IDTY
			FROM TAB_ALFA WITH(NOLOCK)
			WHERE SUBSTRING(ALF_CODI, 1, 2) = 'PT' AND LEN(ALF_CODI) = 8 AND ALF_CODI = @estanciaLocalizacaoMercadorias
-- verifica se a alfândega é válida
			IF (@qualificadorLocalizacaoMercadorias = 'V') AND (@IdAlfandegaLocalizacaoMercadorias IS NULL)
				RAISERROR('Alfândega "%s" da localização das mercadorias inválida.', 16, 12, @estanciaLocalizacaoMercadorias)
-- obtem dados do país da moeda do montante
			SELECT @IdPaisMoedaMontante = PAI_IDTY
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisMoedaFatura
-- verifica se o país da moeda do montante é válido
			IF @IdPaisMoedaMontante IS NULL
				RAISERROR('País "%s" da moeda da fatura inválido.', 16, 13, @paisMoedaFatura)
-- obtem câmbio da moeda do montante (no caso de ser DHL e atualização do portal, considera a data atual)
			IF (@acao = 'U') AND (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL')
				SET @CambioMoedaMontante = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaFatura, @DataAtual)
			ELSE
				SET @CambioMoedaMontante = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaFatura, @Data)				
-- obtem dados do país da moeda dos custos de transporte
			SELECT @IdPaisMoedaCustosTransporte = PAI_IDTY
			FROM TAB_PAIS WITH(NOLOCK)
			WHERE PAI_CODI = @paisMoedaCustosTransporte
-- verifica se o país da moeda dos custos de transporte é válido
			IF @IdPaisMoedaMontante IS NULL
				RAISERROR('País "%s" da moeda dos custos de transporte inválido.', 16, 14, @paisMoedaCustosTransporte)
-- obtem câmbio da moeda dos custos de transporte (no caso de ser DHL e atualização do portal, considera a data atual)
			IF (@acao = 'U') AND (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL')
				SET @CambioMoedaCustosTransporte = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaCustosTransporte, @DataAtual)
			ELSE
				SET @CambioMoedaCustosTransporte = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaCustosTransporte, @Data) 
-- obtem dados do follow-up
			SELECT @IdFollowUp = FUP_IDTY
			FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK)
			WHERE FUP_CODI = @followUp
-- verifica se o follow-up é válido
			IF (@followUp IS NOT NULL) AND (@IdFollowUp IS NULL)
				RAISERROR('Follow-up "%d" inválido.', 16, 15, @followUp)
-- obtem dados do utilizador nomeado
			SELECT @IdUtilizadorNomeado = UTI_IDTY
			FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
			WHERE UTI_UTIL = @utilizadorNomeado
-- verifica se o utilizador nomeado é válido
			IF (ISNULL(@utilizadorNomeado, '') <> '') AND (@IdUtilizadorNomeado IS NULL)
				RAISERROR('Utilizador nomeado "%s" inválido.', 16, 16, @utilizadorNomeado)
-- obtem a caução (garantia) apenas quando o regime IVA é "Geral" e cliente não é "Beneficiário IVA"
			IF (@regimeIVA = 3) AND (@BeneficiarioIVACliente = 0) AND ISNULL(@CaucaoCliente, '') <> ''
			BEGIN
				SET @TipoEntCaucao = 2
				SET @NumeroCaucao = @CaucaoCliente
			END
			ELSE
				IF (@regimeIVA = 3) AND (@BeneficiarioIVACliente = 0) AND ISNULL(@CaucaoDeclarante, '') <> ''
				BEGIN
					SET @TipoEntCaucao = 1
					SET @NumeroCaucao = @CaucaoDeclarante
				END
				ELSE
				BEGIN
					SET @TipoEntCaucao = NULL
					SET @NumeroCaucao = NULL
				END			
-- processa a inserção ou edição da declaração conforme a ação
			IF @Acao = 'I'
			BEGIN			
-- obtem o número para a nova declaração
				SELECT @Numero = proximoNumero
				FROM tb_ConfiguracoesDARNumeradores
				WHERE ano = @Ano
-- verifica se o número é válido
				IF @Numero = 0
					RAISERROR('Número da declaração não foi especificado.', 17, 15)			
-- insere nova declaração		
				INSERT INTO tb_DeclaracoesDAR(ano, 
					numero, 
					data, 
					numeroReferenciaLocal, 
					documentoTransporte, 
					dataVoo, 
					id_natureza, 
					regimeIVA, 
					regimeAdicional, 
					tipoDeclaracao, 
					numeroNRUR, 
					numeroVossaReferencia, 
					id_estancia, 
					id_fornecedor, 
					nomeFornecedor, 
					id_paisFornecedor, 
					moradaFornecedor, 
					localidadeFornecedor, 
					codPostalFornecedor, 
					locPostalFornecedor, 
					id_cliente, 
					nomeCliente, 
					id_paisCliente, 
					nifCliente, 
					moradaCliente, 
					localidadeCliente, 
					codPostalCliente, 
					locPostalCliente, 
					tipoContaCliente, 
					telefoneCliente, 
					emailCliente, 
					id_declarante, 
					nomeDeclarante, 
					id_paisDeclarante, 
					nifDeclarante, 
					moradaDeclarante, 
					localidadeDeclarante, 
					codPostalDeclarante, 
					locPostalDeclarante, 
					estatutoDeclarante, 
					nifRepresentante, 
					caucao, 
					funcaoRegimeIOSS, 
					numeroIdentificacaoIVA, 
					id_paisMoedaCustosTransporte, 
					cambioCustosTransporte, 
					localizacaoMercadorias, 
					qualificador, 
					id_estanciaMercadorias, 
					id_localAutorizado, 
					id_paisMoedaMontante, 
					cambioMontante, 
					payment, 
					numeroPDDT, 
					numeroPDDTDEV, 
					numeroTD, 
					numeroACTM, 
					miniCPA, 
					tipoCarga, 
					dutyType, 
					numeroContaExpedidor, 
					numeroContaDestinatario, 
					nomeOriginalDestinatario, 
					moradaOriginalDestinatario, 
					localidadeOriginalDestinatario, 
					codPostalOriginalDestinatario, 
					locPostalOriginalDestinatario, 
					aeroportoOrigem, 
					numeroVoo, 
					referenciaExterna1, 
					referenciaExterna2, 
					shipID, 
					tracking, 
					posicaoAviao, 
					nivelServico, 
					nomeFicheiroUPS, 
					condicaoEntregaUPS, 
					freteOriginal, 
					moedaFreteOriginal, 
					gatewayFEDEX, 
					locIDFEDEX, 
					portesAccFEDEX, 
					portesFEDEX, 
					despachoAccFEDEX, 
					despesasDHL, 
					dataDocumentoTransporte, 
					origem, 
					id_utilizadorControlo, 
					dataControlo,
					id_followUp,
					id_utilizadorNomeado,
					numeroSequencia,
					taxaIVAMaxima,
					beneficiarioIVACliente, 
					tipoCaucao,
					posicaoArmazem,
					id_condicaoEntrega,
					id_meioTransporte,
					totalOptativas)	
				OUTPUT inserted.id INTO @TblID
				VALUES (@Ano, 
					@Numero, 
					@data, 
					(SUBSTRING(STR(@Ano, 4), 3, 2) + 'PT' + REPLICATE('0', 9 - LEN(@NIFDeclarante)) + @NIFDeclarante + REPLICATE('0', 9 - LEN(LTRIM(STR(@Numero, 9)))) + LTRIM(STR(@Numero, 9))), 				
					@documentoTransporte, 
					@dataVoo, 
					@IdNatureza, 
					@regimeIVA, 
					@adicionalRegime, 
					@tipoDeclaracao, 
					(CASE @ExportadorDefinido WHEN 0 THEN NULL ELSE @documentoTransporte END), 
					@vossaReferencia, 
					@IdAlfandega, 
					@IdFornecedor, 
					@nomeExportador, 
					@IdPaisExportador, 
					@moradaExportador, 
					@localidadeExportador, 
					@codigoPostalExportador, 
					@localidadePostalExportador, 
					@IdCliente, 
					@nomeImportador, 
					@IdPaisImportador, 
					@nifImportador, 
					@moradaImportador, 
					@localidadeImportador, 
					@codigoPostalImportador, 
					@localidadePostalImportador, 
					@tipoContaCliente, 
					@telefoneImportador, 
					@emailImportador, 
					@IdDeclarante, 
					@NomeDeclarante, 
					@IdPaisDeclarante, 
					@NIFDeclarante, 
					@MoradaDeclarante, 
					@LocalidadeDeclarante, 
					@CodPostalDeclarante, 
					@LocPostalDeclarante, 
					@estatutoDeclarante, 
					(CASE WHEN @estatutoDeclarante IS NULL THEN NULL ELSE @NIFDeclarante END), 
					@NumeroCaucao, 
					@funcaoregimeIOSS, 
					@numeroIdentificacaoIVA, 
					@IdPaisMoedaCustosTransporte, 
					@CambioMoedaCustosTransporte, 
					@tipoLocalizacaoMercadorias, 
					@qualificadorLocalizacaoMercadorias, 
					@IdAlfandegaLocalizacaoMercadorias, 
					@IdLocalizacaoMercadorias, 
					@IdPaisMoedaMontante, 
					@CambioMoedaMontante, 
					@payment, 
					@numeroPDDT, 
					@numeroPDDTDEV, 
					@numeroTD, 
					@numeroACTM, 
					@miniCPA, 
					@tipoCarga, 
					@dutyType, 
					@numeroContaExpedidor, 
					@numeroContaDestinatario, 
					@nomeOriginalDestinatario, 
					@moradaOriginalDestinatario, 
					@localidadeOriginalDestinatario, 
					@codigoPostalOriginalDestinatario, 
					@localidadePostalOriginalDestinatario, 
					@aeroportoOrigem, 
					@numeroVoo, 
					@referenciaExterna1, 
					@referenciaExterna2, 
					@shipID, 
					@tracking, 
					@posicaoAviao, 
					@serviceLevel, 
					@nomeFicheiro, 
					@condicaoEntrega, 
					@freteOriginal, 
					@moedafreteOriginal, 
					@gateway, 
					@locID, 
					@portesAcc, 
					@portes, 
					@despachoAcc, 
					@despesas, 
					@dataDocumentoTransporte, 
					2, 
					@IdUtilizador, 
					@DataAtual, 
					@IdFollowUp,
					@IdUtilizadorNomeado,
					@numeroSequencia, 
					@TaxaIVANormal, 
					@BeneficiarioIVACliente, 
					@TipoEntCaucao,
					('C' + RIGHT(@documentoTransporte, 1)), 
					@IdCondicaoEntrega,
					@IdMeioTransporte,
					@TotalOptativas)		
-- obtem o ID da nova declaração
				SELECT @IdDeclaracao = ID 
				FROM @TblID				
-- remove ID da tabela
				DELETE FROM @TblID	
			END
			ELSE
			BEGIN
-- obtem o id da declaração (1ª porque pode haver com o mesmo documento de transporte mas c/ várias datas de voo)
				SELECT TOP 1 @IdDeclaracao = dar.id, @TotalVolumesDirty = dar.volumesDirty, @TotalVolumesClean = dar.volumesClean, @TotalVolumesScan = dar.volumesScan, 
					@IdMeioTransporte = mtr.MTR_IDTY,
					@ExportadorDefinido = (CASE ISNULL(dar.nomeFornecedor, '') WHEN '' THEN 0 ELSE 1 END),  
					@MeioTransportePorVolume = (CASE ISNULL(mtr.MTR_VPVL, 0) WHEN 2 THEN 1 ELSE 0 END), 
					@TotalOptativas = (CASE @DiasFreeADT 
											WHEN 0 THEN (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) OR (@CamposAdicionais = 2 AND @OperacaoManifesto = 0) OR (@CamposAdicionais = 3 AND ISNULL(@despachoAcc, '') <> 'PORTAL-DHL')) THEN @XMLSomaMassaBrutaAdicoes ELSE dar.totalMassaBruta END) BETWEEN MTO_LMNP AND MTO_LMXP 
																					AND (CASE WHEN ((@CamposAdicionais = 2 AND @OperacaoManifesto = 0) OR (@CamposAdicionais = 3 AND ISNULL(@despachoAcc, '') = 'PORTAL-DHL')) THEN @XMLSomaMontanteEURAdicoes ELSE dar.totalMontanteEUR END) BETWEEN MTO_LMNV AND MTO_LMXV), 0) 
															ELSE ISNULL(mtr.MTR_VOP1, 0) 
														END) 
											ELSE 0 
										END)										
				FROM tb_DeclaracoesDAR AS dar WITH(NOLOCK) 
					LEFT OUTER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON (CASE WHEN @CamposAdicionais IN (1, 4) THEN @IdMeioTransporte ELSE dar.id_meioTransporte END) = mtr.MTR_IDTY
				WHERE dar.ano = @ano AND dar.documentoTransporte = @documentoTransporte
				ORDER BY dar.id DESC
-- 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)
-- edita a declaração
				IF @CamposAdicionais = 1 --FEDEX/TNT
				BEGIN
					UPDATE tb_DeclaracoesDAR SET 
						id_natureza = @IdNatureza, 
						id_estancia = @IdAlfandega, 					
						id_localAutorizado = @IdLocalizacaoMercadorias, 
						dataVoo = @dataVoo, 
						id_meioTransporte = @IdMeioTransporte,
						totalOptativas = @TotalOptativas, 
						id_utilizadorControlo = @IdUtilizador, 
						dataControlo = @DataAtual
					WHERE id = @IdDeclaracao
				END
				ELSE				
				IF @CamposAdicionais = 2 --UPS
				BEGIN
					IF @OperacaoManifesto = 0 --Dirty
					BEGIN
						UPDATE tb_DeclaracoesDAR SET 
							nivelServico = @serviceLevel,
							nomeFicheiroUPS = @nomeFicheiro, 	
							freteOriginal = @freteOriginal, 
							moedaFreteOriginal = @moedafreteOriginal, 
							totalOptativas = @TotalOptativas, 						
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdDeclaracao
					END
					ELSE
					BEGIN
						UPDATE tb_DeclaracoesDAR SET 
							dataVoo = @dataVoo, 						
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdDeclaracao
					END
				END
				ELSE				
				IF @CamposAdicionais = 3 --DHL
				BEGIN
					IF ISNULL(@despachoAcc, '') = 'PORTAL-DHL'
					BEGIN
						UPDATE tb_DeclaracoesDAR SET 
							id_natureza = @IdNatureza, 	
							id_cliente = @IdCliente, 
							nomeCliente = @nomeImportador, 
							id_paisCliente = @IdPaisImportador, 
							nifCliente = @nifImportador, 
							moradaCliente = @moradaImportador, 
							localidadeCliente = @localidadeImportador, 
							codPostalCliente = @codigoPostalImportador, 
							locPostalCliente = @localidadePostalImportador, 
							tipoContaCliente = @tipoContaCliente, 
							telefoneCliente = @telefoneImportador, 
							emailCliente = @emailImportador,					
							id_paisMoedaMontante = @IdPaisMoedaMontante, 
							cambioMontante = @CambioMoedaMontante, 
							id_paisMoedaCustosTransporte = @IdPaisMoedaCustosTransporte, 
							cambioCustosTransporte = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaCustosTransporte, @DataAtual), 
							totalOptativas = @TotalOptativas, 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdDeclaracao
					END
					ELSE
					BEGIN
						UPDATE tb_DeclaracoesDAR SET 
							id_natureza = @IdNatureza, 						
							dataVoo = @dataVoo, 	
							regimeIVA = (CASE WHEN (regimeIVA <> 1) AND (@regimeIVA = 1) THEN @regimeIVA ELSE regimeIVA END), 
							regimeAdicional = (CASE WHEN (regimeIVA <> 1) AND (@regimeIVA = 1) THEN @adicionalRegime ELSE regimeAdicional END),
							funcaoRegimeIOSS = (CASE WHEN (regimeIVA <> 1) AND (@regimeIVA = 1) THEN @funcaoregimeIOSS ELSE funcaoRegimeIOSS END), 
							numeroIdentificacaoIVA = (CASE WHEN (regimeIVA <> 1) AND (@regimeIVA = 1) THEN @numeroIdentificacaoIVA ELSE numeroIdentificacaoIVA END), 
							telefoneCliente = @telefoneImportador, 
							emailCliente = @emailImportador, 					
							dutyType = @dutyType, 						
							numeroContaDestinatario = @numeroContaDestinatario, 						
							numeroVoo = @numeroVoo, 						
							shipID = @shipID, 						
							dataDocumentoTransporte = @dataDocumentoTransporte, 
							totalOptativas = @TotalOptativas, 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdDeclaracao
					END
				END
				ELSE
				IF @CamposAdicionais = 4 --TNT
				BEGIN
					UPDATE tb_DeclaracoesDAR SET 
						id_natureza = @IdNatureza, 						
						dataVoo = @dataVoo, 
						id_meioTransporte = @IdMeioTransporte,
						totalOptativas = @TotalOptativas, 
						id_utilizadorControlo = @IdUtilizador, 
						dataControlo = @DataAtual
					WHERE id = @IdDeclaracao
				END
			END		
-- processa a inserção dos detalhes de anexos e incidências apenas quando a ação é inserção
			IF @Acao = 'I'
			BEGIN
-- obtem os documentos e certicados do XML
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_DOCS.DOC_DATA.value('tipoDocumento[1]', 'int'), 
						XML_DOCS.DOC_DATA.value('codigoDocumento[1]', 'varchar(5)'), 
						XML_DOCS.DOC_DATA.value('numeroDocumento[1]', 'varchar(70)') 
					FROM @XMLDocumentosECertificados.nodes('documentosECertificados/documento') as XML_DOCS(DOC_DATA)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @IdDocumento = 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, 18, @codigoDocumento)				
-- insere o documento na nova declaracao
					INSERT INTO tb_DeclaracoesDARDocumentos(id_declaracaoDAR, 
						id_documento, 
						numero, 
						tipo, 
						origem, 
						id_utilizadorControlo, 
						dataControlo)
					VALUES (@IdDeclaracao, 
						@IdDocumento, 
						@numeroDocumento, 
						@tipoDocumento, 
						4, 
						@IdUtilizador, 
						@DataAtual)		
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
				END
				CLOSE Documentos
				DEALLOCATE Documentos
-- obtem as informações adicionais do XML
				DECLARE Mencoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_MENC.MEN_DATA.value('codigoMencao[1]', 'varchar(8)'), 
						NULLIF(XML_MENC.MEN_DATA.value('texto[1]', 'varchar(512)'), '')
					FROM @XMLInformacoesAdicionais.nodes('informacoesAdicionais/mencao') as XML_MENC(MEN_DATA)
				OPEN Mencoes
				FETCH NEXT FROM Mencoes INTO @codigoMencao, @texto
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @IdMencao = NULL
-- obtem dados da menção
					SELECT @IdMencao = INF_IDTY
					FROM TAB_INFC WITH(NOLOCK)
					WHERE INF_CODI = @codigoMencao
-- verifica se a menção é válida
					IF @IdMencao IS NULL
						RAISERROR('Menção "%s" inválida.', 16, 19, @codigoMencao)				
-- insere a menção na nova declaracao
					INSERT INTO tb_DeclaracoesDARMencoes(id_declaracaoDAR, 
						id_mencao, 
						texto, 
						origem, 
						id_utilizadorControlo, 
						dataControlo)
					VALUES (@IdDeclaracao, 
						@IdMencao, 
						@texto, 					
						3, 
						@IdUtilizador, 
						@DataAtual)		
					FETCH NEXT FROM Mencoes INTO @codigoMencao, @texto
				END
				CLOSE Mencoes
				DEALLOCATE Mencoes
-- obtem os documentos precedentes do XML
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_DOCS.DOC_DATA.value('codigoDocumento[1]', 'varchar(5)'), 
						XML_DOCS.DOC_DATA.value('numeroDocumento[1]', 'varchar(70)') 
					FROM @XMLDocumentosPrecedentes.nodes('documentosPrecedentes/documentoPrecedente') as XML_DOCS(DOC_DATA)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @IdDocumento = NULL
-- obtem dados do documento
					SELECT @IdDocumento = DOC_IDTY
					FROM TAB_DOCU WITH(NOLOCK)
					WHERE DOC_CA40 = 1 AND DOC_CODI IN ('N337', 'N355', 'N750') AND DOC_CODI = @codigoDocumento
-- verifica se o documento é válido
					IF @IdDocumento IS NULL
						RAISERROR('Documento precedente "%s" inválido.', 16, 20, @codigoDocumento)				
-- insere o documento na nova declaracao
					INSERT INTO tb_DeclaracoesDARPrecedentes(id_declaracaoDAR, 
						id_documento, 
						numero, 
						id_utilizadorControlo, 
						dataControlo, 
						origem)
					VALUES (@IdDeclaracao, 
						@IdDocumento, 
						@numeroDocumento, 										
						@IdUtilizador, 
						@DataAtual, 
						1)		
					FETCH NEXT FROM Documentos INTO @codigoDocumento, @numeroDocumento
				END
				CLOSE Documentos
				DEALLOCATE Documentos
-- obtem as incidências do XML
				DECLARE Incidencias CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_INCS.INC_DATA.value('codigoIncidencia[1]', 'varchar(8)'), 
						XML_INCS.INC_DATA.value('dataInicio[1]', 'datetime'), 
						XML_INCS.INC_DATA.value('dataFim[1]', 'datetime'), 
						NULLIF(XML_INCS.INC_DATA.value('observacoes[1]', 'varchar(500)'), ''), 
						NULLIF(XML_INCS.INC_DATA.value('tipoIncidencia[1]', 'varchar(1)'), '')
					FROM @XMLIncidencias.nodes('incidencias/incidencia') as XML_INCS(INC_DATA)
				OPEN Incidencias
				FETCH NEXT FROM Incidencias INTO @codigoIncidencia, @dataInicio, @dataFim, @observacoes, @tipoIncidencia
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @IdStatusIncidencia = NULL
-- obtem dados da incidência
					SELECT @IdStatusIncidencia = t.SIN_IDTY, @tipoIncidencia = ISNULL(@tipoIncidencia, t.SIN_REHO)
					FROM (SELECT SIN_CODI, SIN_IDTY, NULL AS SIN_REHO
						FROM TAB_SINC WITH(NOLOCK)
						UNION ALL
						SELECT COS_CODE, COS_IDTY, (CASE WHEN COS_RELI = 1 THEN 'R' WHEN COS_HOLD = 1 THEN 'H' ELSE NULL END)
						FROM TAB_COSM WITH(NOLOCK)
					) AS t
					WHERE t.SIN_CODI = @codigoIncidencia				
-- verifica se a incidência é válida
					IF @IdStatusIncidencia IS NULL
						RAISERROR('Status de incidência "%s" inválida.', 16, 21, @codigoIncidencia)				
-- insere a incidência na nova declaracao
					INSERT INTO tb_DeclaracoesDARIncidencias(id_declaracaoDAR, 
						id_statusIncidencia, 
						dataInicio, 
						dataFim, 
						observacoes, 
						id_utilizadorCriacao, 
						dataCriacao, 
						id_utilizadorControlo, 
						dataControlo, 
						origem, 
						releaseHold)
					VALUES (@IdDeclaracao, 
						@IdStatusIncidencia, 
						@dataInicio, 
						@dataFim,
						@observacoes, 					
						@IdUtilizador, 
						@DataAtual, 				
						@IdUtilizador, 
						@DataAtual, 
						1, 
						@tipoIncidencia)		
					FETCH NEXT FROM Incidencias INTO @codigoIncidencia, @dataInicio, @dataFim, @observacoes, @tipoIncidencia
				END
				CLOSE Incidencias
				DEALLOCATE Incidencias
-- obtem os follow-ups do XML
				DECLARE FollowUps CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_FWUP.FUP_DATA.value('codigoFollowUp[1]', 'int'), 
						XML_FWUP.FUP_DATA.value('utilizadorFollowUp[1]', 'varchar(30)'), 
						XML_FWUP.FUP_DATA.value('dataFollowUp[1]', 'datetime')						
					FROM @XMLFollowUps.nodes('followUps/followUpData') as XML_FWUP(FUP_DATA)
				OPEN FollowUps
				FETCH NEXT FROM FollowUps INTO @codigoFollowUp, @utilizadorFollowUp, @dataFollowUp
				WHILE @@FETCH_STATUS = 0
				BEGIN		
					SET @IdFollowUp = NULL
					SET @IdUtilizadorXML = NULL
-- obtem dados do follow-up
					SELECT @IdFollowUp = FUP_IDTY
					FROM GIDWIN.dbo.FAP_FWUP WITH(NOLOCK)
					WHERE FUP_CODI = @codigoFollowUp
-- verifica se o follow-up é válido
					IF @IdFollowUp IS NULL
						RAISERROR('Follow-up "%d" inválido.', 16, 99, @codigoFollowUp)	
-- obtem dados do utilizador
					SELECT @IdUtilizadorXML = UTI_IDTY
					FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
					WHERE UTI_UTIL = @utilizadorFollowUp
-- verifica se o utilizador é válido
					IF @IdUtilizadorXML IS NULL
						RAISERROR('Utilizador "%s" inválido.', 16, 99, @utilizadorFollowUp)											
-- insere o follow-up na nova declaracao
					INSERT INTO tb_DeclaracoesDARFollowUps(id_declaracaoDAR, 
						id_followUp, 
						id_utilizadorFollowUp, 
						dataFollowUp, 
						id_utilizadorControlo, 
						dataControlo)
					VALUES (@IdDeclaracao, 
						@IdFollowUp, 
						@IdUtilizadorXML, 
						@dataFollowUp,						
						@IdUtilizador, 
						@DataAtual)		
					FETCH NEXT FROM FollowUps INTO @codigoFollowUp, @utilizadorFollowUp, @dataFollowUp
				END
				CLOSE FollowUps
				DEALLOCATE FollowUps
-- obtem os contactos do XML
				DECLARE Contactos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_CONT.CNT_DATA.value('descricaoContacto[1]', 'varchar(200)'), 
						XML_CONT.CNT_DATA.value('utilizadorContacto[1]', 'varchar(30)'), 
						XML_CONT.CNT_DATA.value('dataContacto[1]', 'datetime')						
					FROM @XMLContactos.nodes('contactos/contacto') as XML_CONT(CNT_DATA)
				OPEN Contactos
				FETCH NEXT FROM Contactos INTO @descricaoContacto, @utilizadorContacto, @dataContacto 
				WHILE @@FETCH_STATUS = 0
				BEGIN				
					SET @IdUtilizadorXML = NULL
-- obtem dados do utilizador
					SELECT @IdUtilizadorXML = UTI_IDTY
					FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
					WHERE UTI_UTIL = @utilizadorContacto
-- verifica se o utilizador é válido
					IF @IdUtilizadorXML IS NULL
						RAISERROR('Utilizador "%s" inválido.', 16, 99, @utilizadorContacto)								
-- insere o contacto na nova declaracao
					INSERT INTO tb_DeclaracoesDARContactos(id_declaracaoDAR, 
						descricao, 
						id_utilizadorContacto, 
						dataContacto, 
						id_utilizadorControlo, 
						dataControlo)
					VALUES (@IdDeclaracao, 
						@descricaoContacto, 
						@IdUtilizadorXML, 
						@dataContacto,						
						@IdUtilizador, 
						@DataAtual)		
					FETCH NEXT FROM Contactos INTO @descricaoContacto, @utilizadorContacto, @dataContacto
				END
				CLOSE Contactos
				DEALLOCATE Contactos
			END
			ELSE
			BEGIN			
-- obtem os documentos e certicados do XML
				DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
					SELECT XML_DOCS.DOC_DATA.value('tipoDocumento[1]', 'int'), 
						XML_DOCS.DOC_DATA.value('codigoDocumento[1]', 'varchar(5)'), 
						XML_DOCS.DOC_DATA.value('numeroDocumento[1]', 'varchar(70)') 
					FROM @XMLDocumentosECertificados.nodes('documentosECertificados/documento') as XML_DOCS(DOC_DATA)
				OPEN Documentos
				FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
				WHILE @@FETCH_STATUS = 0
				BEGIN	
					SET @IdDetDocumento = NULL
-- obtem id do detalhe de documento
					SELECT @IdDetDocumento = ddo.id
					FROM tb_DeclaracoesDARDocumentos AS ddo WITH(NOLOCK) INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
					WHERE ddo.id_declaracaoDAR = @IdDeclaracao AND doc.DOC_CODI = @codigoDocumento AND ddo.tipo = @tipoDocumento 
-- altera o documento na declaracao se este já existir
					IF @IdDetDocumento IS NOT NULL
					BEGIN
						UPDATE tb_DeclaracoesDARDocumentos SET numero = @numeroDocumento, 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual
						WHERE id = @IdDetDocumento		
					END
					ELSE
-- insere o documento na declaração se não existir e apenas quando é DHL e atualização do portal
						IF (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL')
						BEGIN
							SET @IdDocumento = 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, 18, @codigoDocumento)				
-- insere o documento na declaracao
							INSERT INTO tb_DeclaracoesDARDocumentos(id_declaracaoDAR, 
								id_documento, 
								numero, 
								tipo, 
								origem, 
								id_utilizadorControlo, 
								dataControlo)
							VALUES (@IdDeclaracao, 
								@IdDocumento, 
								@numeroDocumento, 
								@tipoDocumento, 
								4, 
								@IdUtilizador, 
								@DataAtual)								
						END					
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
				END
				CLOSE Documentos
				DEALLOCATE Documentos
-- remove dados de manifesto quando em edição (se "Clean" [1] remove também as linhas "Scan")
				IF @OperacaoManifesto = 1 
				BEGIN
					UPDATE tb_DeclaracoesDARManifestos SET triggerOff = 1
					WHERE id_declaracaoDAR = @IdDeclaracao AND tipoManifesto >= 1
					DELETE FROM tb_DeclaracoesDARManifestos
					WHERE id_declaracaoDAR = @IdDeclaracao AND tipoManifesto >= 1
-- inicia total de volumes clean e volumes scan
					SET @TotalVolumesClean = 0
					SET @TotalVolumesScan = 0
				END
				ELSE
				BEGIN
-- remove dados de manifesto do tipo dirty ou scan
					UPDATE tb_DeclaracoesDARManifestos SET triggerOff = 1
					WHERE id_declaracaoDAR = @IdDeclaracao AND tipoManifesto = @OperacaoManifesto
					DELETE FROM tb_DeclaracoesDARManifestos
					WHERE id_declaracaoDAR = @IdDeclaracao AND tipoManifesto = @OperacaoManifesto
-- inicia total de volumes clean ou volumes dirty
					IF @OperacaoManifesto = 0
						SET @TotalVolumesDirty = 0 
					ELSE
						IF @OperacaoManifesto = 2
							SET @TotalVolumesScan = 0					
				END	
			END
-- obtem os manifestos do XML
			DECLARE Manifestos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT XML_MANI.MAN_DATA.value('tipoManifesto[1]', 'int'), 
					NULLIF(XML_MANI.MAN_DATA.value('paisManifesto[1]', 'varchar(2)'), ''), 
					NULLIF(XML_MANI.MAN_DATA.value('descricao[1]', 'varchar(150)'), ''), 
					XML_MANI.MAN_DATA.value('valor[1]', 'decimal(18, 3)'), 
					NULLIF(XML_MANI.MAN_DATA.value('paisMoedaManifesto[1]', 'varchar(2)'), ''), 
					XML_MANI.MAN_DATA.value('totalFatura[1]', 'decimal(18, 3)'), 
					NULLIF(XML_MANI.MAN_DATA.value('numeroCPA[1]', 'varchar(35)'), ''), 
					XML_MANI.MAN_DATA.value('peso[1]', 'decimal(18, 3)')					
				FROM @XMLManifestos.nodes('manifestos/manifesto') as XML_MANI(MAN_DATA)
			OPEN Manifestos
			FETCH NEXT FROM Manifestos INTO @tipoManifesto, @paisManifesto, @descricao, @valor, @paisMoedaManifesto, @totalFatura, @numeroCPA, @peso
			WHILE @@FETCH_STATUS = 0
			BEGIN				
				SET @IdManifesto = NULL
				SET @IdPaisManifesto = NULL
				SET @IdPaisMoedaManifesto = NULL
-- obtem dados do país do manifesto
				SELECT @IdPaisManifesto = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisManifesto
-- obtem dados do país da moeda do manifesto
				SELECT @IdPaisMoedaManifesto = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisMoedaManifesto								
-- insere o manifesto na nova declaracao
				INSERT INTO tb_DeclaracoesDARManifestos(id_declaracaoDAR, 
					tipoManifesto, 
					documentoTransporte, 
					massaBruta, 
					descricao, 
					id_pais, 
					valor, 
					id_paisMoeda, 
					totalFatura, 
					id_utilizadorControlo, 
					dataControlo, 
					origem,
					triggerOff)
				OUTPUT inserted.id INTO @TblID
				VALUES (@IdDeclaracao, 
					@tipoManifesto, 
					@numeroCPA, 	
					@peso,
					@descricao,
					@IdPaisManifesto, 
					@valor, 
					@IdPaisMoedaManifesto, 
					@totalFatura, 									
					@IdUtilizador, 
					@DataAtual, 
					1,
					1)	
-- obtem o ID da nova linha de manifesto
				SELECT @IdManifesto = ID 
				FROM @TblID				
-- remove ID da tabela
				DELETE FROM @TblID	
-- efetua o reset da flag na nova linha de manifesto inserida
				UPDATE tb_DeclaracoesDARManifestos SET triggerOff = 0
				WHERE id = @IdManifesto
-- incrementa totais
				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 Manifestos INTO @tipoManifesto, @paisManifesto, @descricao, @valor, @paisMoedaManifesto, @totalFatura, @numeroCPA, @peso
			END
			CLOSE Manifestos
			DEALLOCATE Manifestos
-- remove todas as adições da declaração
			IF (@acao = 'U') AND (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL') 
			AND (NOT EXISTS(SELECT 1 FROM @XMLAdicoes.nodes('adicoes/adicao') AS t(c) WHERE t.c.value('codigoPautal[1]', 'varchar(22)') = '9999999999'))
			BEGIN
				SET @acao = 'I'
				DELETE FROM tb_DeclaracoesDARAdicoes
				WHERE id_declaracaoDAR = @IdDeclaracao
			END
-- obtem as adições do XML
			DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
				SELECT XML_ADIC.ADI_DATA.value('numeroAdicao[1]', 'int'), 
					XML_ADIC.ADI_DATA.value('codigoPautal[1]', 'varchar(22)'), 
					XML_ADIC.ADI_DATA.value('designacao[1]', 'varchar(260)'), 
					NULLIF(XML_ADIC.ADI_DATA.value('adicionalRegimeB[1]', 'varchar(3)'), ''), 
					NULLIF(XML_ADIC.ADI_DATA.value('paisOrigem[1]', 'varchar(2)'), ''), 
					NULLIF(XML_ADIC.ADI_DATA.value('metodoPagamento[1]', 'varchar(1)'), ''), 
					NULLIF(XML_ADIC.ADI_DATA.value('(exportador/nif)[1]', 'varchar(18)'), ''), 
					XML_ADIC.ADI_DATA.value('(exportador/nome)[1]', 'varchar(70)'), 
					XML_ADIC.ADI_DATA.value('(exportador/morada)[1]', 'varchar(70)'), 
					XML_ADIC.ADI_DATA.value('(exportador/localidade)[1]', 'varchar(35)'), 
					XML_ADIC.ADI_DATA.value('(exportador/codigoPostal)[1]', 'varchar(20)'), 
					XML_ADIC.ADI_DATA.value('(exportador/localidadePostal)[1]', 'varchar(35)'), 
					XML_ADIC.ADI_DATA.value('(exportador/pais)[1]', 'varchar(2)'), 
					XML_ADIC.ADI_DATA.value('massaBruta[1]', 'decimal(18, 6)'), 
					XML_ADIC.ADI_DATA.value('unidades[1]', 'decimal(18, 6)'), 
					XML_ADIC.ADI_DATA.value('volumes[1]', 'int'), 
					XML_ADIC.ADI_DATA.value('paisMoedaFatura[1]', 'varchar(2)'), 
					XML_ADIC.ADI_DATA.value('montante[1]', 'decimal(18, 2)'), 
					XML_ADIC.ADI_DATA.value('paisMoedaCustosTransporte[1]', 'varchar(2)'), 
					XML_ADIC.ADI_DATA.value('custosTransporte[1]', 'decimal(18, 2)'), 
					NULLIF(XML_ADIC.ADI_DATA.value('codigoBarras[1]', 'varchar(30)'), ''), 
					NULLIF(XML_ADIC.ADI_DATA.value('numeroObjeto[1]', 'varchar(20)'), ''), 
					XML_ADIC.ADI_DATA.query('documentosECertificados')					
				FROM @XMLAdicoes.nodes('adicoes/adicao') as XML_ADIC(ADI_DATA)
			OPEN Adicoes
			FETCH NEXT FROM Adicoes INTO @numeroAdicao, @codigoPautal, @designacao, @adicionalRegimeB, @paisOrigem, @metodoPagamento, @nifExportador, @nomeExportador, 
				@moradaExportador, @localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @massaBruta, @unidades, @volumes, 
				@paisMoedaFatura, @montante, @paisMoedaCustosTransporte, @custosTransporte, @codigoBarras, @numeroObjeto, @XMLDocumentosECertificados
			WHILE @@FETCH_STATUS = 0
			BEGIN	
				SET @IdAdicao = NULL
				SET @IdArtigo = NULL
				SET @IdPaisExportador = NULL
				SET @IdFornecedor = NULL
				SET @IdPaisOrigem = NULL
				SET @IdPaisMoedaMontante = NULL
				SET @IdPaisMoedaCustosTransporte = NULL
-- obtem dados do artigo
				SELECT TOP 1 @IdArtigo = APA_IDTY,
					@unidades = (CASE 
						WHEN (@unidades > 0) AND (ISNULL(USU_CODI, '') = '') THEN 0 
						ELSE @unidades 
					END), 
					@AdicionalIC1 = NULLIF(APA_AIC1, ''), 
					@AdicionalIC2 = NULLIF(APA_AIC2, ''), 
					@AdicionalIC3 = NULLIF(APA_AIC3, ''),				  
					@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(APA_DESG, @designacao) 
					END), 
					@TaxaIVA = (CASE 
						WHEN (@regimeIVA = 1) OR (@adicionalRegime = 'C08') THEN (SELECT PAP_TXIS FROM TAB_PAPL WITH(NOLOCK)) 
						WHEN (@regimeIVA = 2) THEN (SELECT PAP_TXNR FROM TAB_PAPL WITH(NOLOCK)) 
						ELSE ISNULL(APA_TIVA, 0) 
					END)
				FROM TAB_APAU WITH(NOLOCK)
				WHERE APA_INAC = 0 AND APA_FLUX IN (0, 1) AND APA_EDAR = 0 AND APA_CPAU = @codigoPautal
-- se artigo não existir, assume como artigo "Artigo Genérico"
				IF @IdArtigo IS NULL
				BEGIN
					SELECT TOP 1 @IdArtigo = APA_IDTY, 
						@unidades = (CASE 
							WHEN (@unidades > 0) AND (ISNULL(USU_CODI, '') = '') THEN 0 
							ELSE @unidades 
						END),
						@AdicionalIC1 = NULLIF(APA_AIC1, ''), 
						@AdicionalIC2 = NULLIF(APA_AIC2, ''), 
						@AdicionalIC3 = NULLIF(APA_AIC3, ''),
						@TaxaIVA = (CASE 
							WHEN (@regimeIVA = 1) OR (@adicionalRegime = 'C08') THEN (SELECT PAP_TXIS FROM TAB_PAPL WITH(NOLOCK)) 
							WHEN (@regimeIVA = 2) THEN (SELECT PAP_TXNR FROM TAB_PAPL WITH(NOLOCK)) 
							ELSE ISNULL(APA_TIVA, 0) 
						END)
					FROM TAB_APAU WITH(NOLOCK) 
					WHERE APA_INAC = 0 AND APA_FLUX IN (0, 1) AND APA_EDAR = 0 AND APA_CPAU = '9999999999'
				END
-- verifica se o artigo é válido
				IF @IdArtigo IS NULL
					RAISERROR('Artigo "%s" inválido.', 16, 22, @codigoPautal)	
-- verifica se o adicional regime é válido
				IF (ISNULL(@adicionalRegimeB, '') <> '') AND (@adicionalRegimeB <> (CASE WHEN (@regimeIVA = 1) AND (@adicionalRegime = 'C07') THEN 'F48' WHEN (@regimeIVA = 2) AND (@adicionalRegime = 'C07') THEN 'F49' ELSE @adicionalRegimeB END))
					RAISERROR('Adicional regime B "%s" inválido.', 16, 23, @adicionalRegimeB)
				ELSE
					IF ISNULL(@adicionalRegimeB, '') = ''
						SET @adicionalRegimeB = (CASE WHEN (@regimeIVA = 1) AND (@adicionalRegime = 'C07') THEN 'F48' WHEN (@regimeIVA = 2) AND (@adicionalRegime = 'C07') THEN 'F49' ELSE NULL END)
-- verifica se o exportador está definido
				IF (@ExportadorDefinido = 1) AND ((ISNULL(@nifExportador, '') <> '') OR (ISNULL(@nomeExportador, '') <> ''))
					RAISERROR('Exportador não pode ser especificado nas adições.', 16, 24)
-- obtem dados do país do fornecedor (exportador)
				SELECT @IdPaisExportador = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisExportador
-- obtem dados do fornecedor (exportador)
				SELECT TOP 1 @IdFornecedor = frn.FOR_IDTY, 
					@nomeExportador = ISNULL(frn.FOR_NOME, @nomeExportador), 
					@IdPaisExportador = ISNULL(pai.PAI_IDTY, @IdPaisExportador), 
					@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
-- verifica se o país do fornecedor (exportador) é válido
				IF (ISNULL(@nomeExportador, '') <> '') AND (@IdPaisExportador IS NULL)
					RAISERROR('País "%s" do exportador inválido.', 16, 25, @paisExportador)
-- obtem dados do país de origem
				SELECT @IdPaisOrigem = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisOrigem	
-- obtem dados do país da moeda do montante
				SELECT @IdPaisMoedaMontante = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisMoedaFatura
-- verifica se o país da moeda do montante é válido
				IF @IdPaisMoedaMontante IS NULL
					RAISERROR('País "%s" da moeda da fatura inválido.', 16, 26, @paisMoedaFatura)	
-- obtem câmbio da moeda do montante
				SET @CambioMoedaMontante = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaFatura, @Data)				
-- obtem dados do país da moeda dos custos de transporte
				SELECT @IdPaisMoedaCustosTransporte = PAI_IDTY
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @paisMoedaCustosTransporte
-- verifica se o país da moeda dos custos de transporte é válido
				IF @IdPaisMoedaMontante IS NULL
					RAISERROR('País "%s" da moeda dos custos de transporte inválido.', 16, 27, @paisMoedaCustosTransporte)
-- obtem câmbio da moeda dos custos de transporte
				SET @CambioMoedaCustosTransporte = dbo.FNT_Geral_ObtemCambio(0, @paisMoedaCustosTransporte, @Data)				
-- calcula o valor de optativas
				IF @MeioTransportePorVolume = 1			
				BEGIN
					IF @numeroAdicao = 1
						SET @Optativas = ROUND((@volumes * @TotalOptativas), 2)
					ELSE
						SET @Optativas = 0
				END
				ELSE
					IF @XMLSomaMassaBrutaAdicoes > 0
						SET @Optativas = ROUND(((@TotalOptativas * CEILING(@XMLSomaMassaBrutaAdicoes / 100)) * @massaBruta / @XMLSomaMassaBrutaAdicoes), 2)	
					ELSE
						SET @Optativas = 0
-- calcula valores da adição
				SET @MontanteEUR = ROUND((@montante / @CambioMoedaMontante), 2)
				SET @CustosTransporteEUR = ROUND((@custosTransporte / @CambioMoedaCustosTransporte), 2)
				SET @BaseTributacaoIVA = (@MontanteEUR + @CustosTransporteEUR + @Optativas)	
				SET @ValorIVA = ROUND((@BaseTributacaoIVA * @TaxaIVA / 100), 2)	
-- processa a inserção ou edição da adição conforme a ação da declaração 
				IF @Acao = 'I'
				BEGIN
-- insere a adição na nova declaracao
					INSERT INTO tb_DeclaracoesDARAdicoes(id_declaracaoDAR, 
						numeroAdicao, 
						id_artigo, 
						codigoPautal, 
						codigoNC, 
						codigoTARIC, 
						adicionalTARIC1, 
						adicionalTARIC2, 
						adicionalTARIC3, 
						adicionalNacional1, 
						adicionalNacional2, 
						adicionalNacional3, 
						designacao, 
						numeroNRUR, 
						metodoPagamento, 
						id_paisOrigem, 
						regimeAdicional, 
						unidades, 
						massaBruta, 
						volumes, 
						id_paisMoedaMontante, 
						cambioMontante, 
						montante, 
						montanteEUR, 
						baseTributacaoIVA, 
						taxaIVA, 
						valorIVA, 
						id_paisMoedaCustosTransporte, 
						cambioCustosTransporte, 
						custosTransporte, 
						custosTransporteEUR, 
						id_fornecedor, 
						nomeFornecedor, 
						id_paisFornecedor, 
						moradaFornecedor, 
						localidadeFornecedor, 
						codPostalFornecedor, 
						locPostalFornecedor, 
						codigoBarrasCTT, 
						numeroObjetoCTT, 					
						id_utilizadorControlo, 
						dataControlo,
						origem,
						triggerOff,
						optativas)
					OUTPUT inserted.id INTO @TblID
					VALUES (@IdDeclaracao, 
						@numeroAdicao, 
						@IdArtigo, 
						SUBSTRING(@codigoPautal, 1, 6), 
						SUBSTRING(@codigoPautal, 7, 2), 
						SUBSTRING(@codigoPautal, 9, 2), 
						SUBSTRING(@codigoPautal, 11, 4), 
						SUBSTRING(@codigoPautal, 15, 4), 
						SUBSTRING(@codigoPautal, 19, 4), 
						@AdicionalIC1, 
						@AdicionalIC2, 
						@AdicionalIC3, 
						@designacao, 
						(CASE @ExportadorDefinido WHEN 1 THEN NULL ELSE @documentoTransporte END), 
						(CASE WHEN (@regimeIVA = 3) AND (@BeneficiarioIVACliente = 1) THEN 'G' WHEN (@regimeIVA = 3) AND (ISNULL(@NumeroCaucao, '') <> '') THEN 'T' WHEN (@regimeIVA = 3) AND (ISNULL(@NumeroCaucao, '') = '') THEN  ISNULL(@metodoPagamento, 'A') ELSE NULL END),  
						@IdPaisOrigem, 
						@adicionalRegimeB, 
						@unidades, 
						@massaBruta, 
						@volumes, 
						@IdPaisMoedaMontante, 
						@CambioMoedaMontante, 
						@montante, 
						@MontanteEUR, 
						@BaseTributacaoIVA, 
						@TaxaIVA, 
						@ValorIVA, 
						@IdPaisMoedaCustosTransporte, 
						@CambioMoedaCustosTransporte, 
						@custosTransporte, 
						@CustosTransporteEUR, 
						@IdFornecedor, 
						@nomeExportador, 
						@IdPaisExportador, 
						@moradaExportador, 
						@localidadeExportador, 
						@codigoPostalExportador, 
						@localidadePostalExportador, 
						@codigoBarras, 
						@numeroObjeto, 																				
						@IdUtilizador, 
						@DataAtual, 
						1,
						1,
						@Optativas)		
-- obtem o ID da nova adição
					SELECT @IdAdicao = ID 
					FROM @TblID				
-- remove ID da tabela
					DELETE FROM @TblID	
-- efetua o reset da flag na nova adição inserida
					UPDATE tb_DeclaracoesDARAdicoes SET triggerOff = 0
					WHERE id = @IdAdicao
				END
				ELSE
				BEGIN	
-- obtem o id da adição
					SELECT @IdAdicao = dad.id, @ValorIVA = dad.valorIVA, 
						@custosTransporte = (CASE  
							WHEN (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL') THEN @custosTransporte
							ELSE dad.custosTransporte 
						END), 
						@montante = (CASE  
							WHEN (@CamposAdicionais = 2) AND (@OperacaoManifesto = 0) THEN @montante
							WHEN (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL') THEN @montante
							ELSE dad.montante 
						END), 
						@massaBruta = (CASE 
							WHEN (@CamposAdicionais IN (1, 4)) AND (@OperacaoManifesto <> 2) THEN @massaBruta 
							WHEN (@CamposAdicionais = 2) AND (@OperacaoManifesto = 0) THEN @massaBruta 
							WHEN @CamposAdicionais = 3 THEN (CASE 
																WHEN (dar.totalAdicoes = 1 AND ABS(dad.massaBruta - @massaBruta) < 0.500) THEN @massaBruta 
																ELSE dad.massaBruta 
															END)
							ELSE dad.massaBruta 
						END), 
						@volumes = (CASE  
							WHEN (@CamposAdicionais = 2) AND (@OperacaoManifesto <> 0) THEN dad.volumes
							ELSE @volumes
						END),
						@XMLSomaMassaBrutaAdicoes = (CASE  
							WHEN (@CamposAdicionais IN (1, 4)) AND (@OperacaoManifesto = 2) THEN dar.totalMassaBruta 
							WHEN (@CamposAdicionais = 2) AND (@OperacaoManifesto <> 0) THEN dar.totalMassaBruta
							WHEN (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') <> 'PORTAL-DHL') AND ((dar.totalAdicoes <> 1 OR ABS(dad.massaBruta - @massaBruta) >= 0.500)) THEN dar.totalMassaBruta															
							WHEN (@CamposAdicionais = 3) AND (ISNULL(@despachoAcc, '') = 'PORTAL-DHL') THEN dar.totalMassaBruta
							ELSE @XMLSomaMassaBrutaAdicoes 
						END)
					FROM tb_DeclaracoesDARAdicoes AS dad WITH(NOLOCK) 
						INNER JOIN tb_DeclaracoesDAR AS dar WITH(NOLOCK) ON dad.id_declaracaoDAR = dar.id
					WHERE dad.id_declaracaoDAR = @IdDeclaracao AND dad.numeroAdicao = @numeroAdicao
-- edita a adição
					IF @CamposAdicionais IN (1, 4) --FEDEX/TNT | TNT
					BEGIN
						UPDATE tb_DeclaracoesDARAdicoes SET 
							massaBruta = @massaBruta, 					
							volumes = @volumes, 						
							@Optativas = optativas = (CASE @MeioTransportePorVolume 
														WHEN 1 THEN (CASE numeroAdicao WHEN 1 THEN ROUND((@volumes * @TotalOptativas), 2) ELSE 0 END)
														ELSE (CASE WHEN @XMLSomaMassaBrutaAdicoes > 0 THEN ROUND(((@TotalOptativas * CEILING(@XMLSomaMassaBrutaAdicoes / 100)) * @massaBruta / @XMLSomaMassaBrutaAdicoes), 2) ELSE 0 END)
													END), 
							@BaseTributacaoIVA = baseTributacaoIVA = ROUND((montanteEUR + custosTransporteEUR + @Optativas), 2), 
							valorIVA = ROUND((@BaseTributacaoIVA * taxaIVA / 100), 2), 
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual,
							triggerOff = 1
						WHERE id = @IdAdicao
					END
					ELSE					
					IF (@CamposAdicionais = 2) AND (@OperacaoManifesto = 0) --UPS
					BEGIN
						UPDATE tb_DeclaracoesDARAdicoes SET 
							massaBruta = @massaBruta, 
							volumes = @volumes, 	
							montante = @montante, 
							@MontanteEUR = montanteEUR = ROUND((@montante / cambioMontante), 2),	
							@Optativas = optativas = (CASE @MeioTransportePorVolume 
														WHEN 1 THEN (CASE numeroAdicao WHEN 1 THEN ROUND((@volumes * @TotalOptativas), 2) ELSE 0 END)
														ELSE (CASE WHEN @XMLSomaMassaBrutaAdicoes > 0 THEN ROUND(((@TotalOptativas * CEILING(@XMLSomaMassaBrutaAdicoes / 100)) * @massaBruta / @XMLSomaMassaBrutaAdicoes), 2) ELSE 0 END)
													END), 
							@BaseTributacaoIVA = baseTributacaoIVA = ROUND((@MontanteEUR + custosTransporteEUR + @Optativas), 2), 
							valorIVA = ROUND((@BaseTributacaoIVA * taxaIVA / 100), 2), 				
							id_utilizadorControlo = @IdUtilizador, 
							dataControlo = @DataAtual,
							triggerOff = 1
						WHERE id = @IdAdicao
					END
					ELSE
					IF @CamposAdicionais = 3 --DHL
					BEGIN
						IF ISNULL(@despachoAcc, '') = 'PORTAL-DHL'
						BEGIN
							UPDATE tb_DeclaracoesDARAdicoes SET 								
								montante = @montante, 
								@MontanteEUR = montanteEUR = ROUND((@montante / cambioMontante), 2),								
								custosTransporte = @custosTransporte,
								@CustosTransporteEUR = custosTransporteEUR = ROUND((@custosTransporte / cambioCustosTransporte), 2),	
								@Optativas = optativas = (CASE @MeioTransportePorVolume 
														WHEN 1 THEN (CASE numeroAdicao WHEN 1 THEN ROUND((@volumes * @TotalOptativas), 2) ELSE 0 END)
														ELSE (CASE WHEN @XMLSomaMassaBrutaAdicoes > 0 THEN ROUND(((@TotalOptativas * CEILING(@XMLSomaMassaBrutaAdicoes / 100)) * @massaBruta / @XMLSomaMassaBrutaAdicoes), 2) ELSE 0 END)
													END), 
								@BaseTributacaoIVA = baseTributacaoIVA = ROUND((@MontanteEUR + @CustosTransporteEUR + @Optativas), 2), 
								valorIVA = ROUND((@BaseTributacaoIVA * taxaIVA / 100), 2), 					
								id_utilizadorControlo = @IdUtilizador, 
								dataControlo = @DataAtual, 
								triggerOff = 1
							WHERE id = @IdAdicao
						END
						ELSE
						BEGIN
							UPDATE tb_DeclaracoesDARAdicoes SET 
								massaBruta = @massaBruta, 
								volumes = @volumes, 	
								@Optativas = optativas = (CASE @MeioTransportePorVolume 
															WHEN 1 THEN (CASE numeroAdicao WHEN 1 THEN ROUND((@volumes * @TotalOptativas), 2) ELSE 0 END)
															ELSE (CASE 
																	WHEN massaBruta <> @massaBruta THEN (CASE WHEN @XMLSomaMassaBrutaAdicoes > 0 THEN ROUND(((@TotalOptativas * CEILING(@XMLSomaMassaBrutaAdicoes / 100)) * @massaBruta / @XMLSomaMassaBrutaAdicoes), 2) ELSE 0 END)
																	ELSE optativas
																END)
														END), 
								@BaseTributacaoIVA = baseTributacaoIVA = ROUND((montanteEUR + custosTransporteEUR + @Optativas), 2), 
								valorIVA = ROUND((@BaseTributacaoIVA * taxaIVA / 100), 2), 					
								id_utilizadorControlo = @IdUtilizador, 
								dataControlo = @DataAtual, 
								triggerOff = 1
							WHERE id = @IdAdicao
						END
					END					
-- efetua o reset da flag na nova adição inserida
					UPDATE tb_DeclaracoesDARAdicoes SET triggerOff = 0
					WHERE id = @IdAdicao
				END
-- incrementa totais
				SET @TotalAdicoes = @TotalAdicoes + 1
				SET @TotalVolumes = @TotalVolumes + @volumes
				SET @TotalIVA = @TotalIVA + @ValorIVA
				SET @TotalMontante = @TotalMontante + @montante
				SET @TotalCustosTransporte = @TotalCustosTransporte + @custosTransporte
				SET @TotalMassaBruta = @TotalMassaBruta + @massaBruta
-- processa a inserção dos detalhes de anexos apenas quando a ação da declaração é inserção
				IF @Acao = 'I'
				BEGIN
-- obtem os documentos e certicados da adição do XML
					DECLARE Documentos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR		
						SELECT XML_DOCS.DOC_DATA.value('tipoDocumento[1]', 'int'), 
							XML_DOCS.DOC_DATA.value('codigoDocumento[1]', 'varchar(5)'), 
							XML_DOCS.DOC_DATA.value('numeroDocumento[1]', 'varchar(70)') 
						FROM @XMLDocumentosECertificados.nodes('documentosECertificados/documento') as XML_DOCS(DOC_DATA)
					OPEN Documentos
					FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
					WHILE @@FETCH_STATUS = 0
					BEGIN		
						SET @IdDocumento = 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, 28, @codigoDocumento)				
-- insere o documento na nova adição
						INSERT INTO tb_DeclaracoesDARAdicoesDocumentos(id_adicao, 
							id_documento, 
							numero, 
							tipo, 
							origem, 
							id_utilizadorControlo, 
							dataControlo)
						VALUES (@IdAdicao, 
							@IdDocumento, 
							@numeroDocumento, 
							@tipoDocumento, 
							2, 
							@IdUtilizador, 
							@DataAtual)		
						FETCH NEXT FROM Documentos INTO @tipoDocumento, @codigoDocumento, @numeroDocumento
					END
					CLOSE Documentos
					DEALLOCATE Documentos
				END
				FETCH NEXT FROM Adicoes INTO @numeroAdicao, @codigoPautal, @designacao, @adicionalRegimeB, @paisOrigem, @metodoPagamento, @nifExportador, @nomeExportador, 
					@moradaExportador, @localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @massaBruta, @unidades, @volumes, 
					@paisMoedaFatura, @montante, @paisMoedaCustosTransporte, @custosTransporte, @codigoBarras, @numeroObjeto, @XMLDocumentosECertificados
			END
			CLOSE Adicoes
			DEALLOCATE Adicoes
-- atualiza totais na declaração
			SET CONTEXT_INFO 0x44495341424C4544 --coloca variavel global de sessão com o valor "DISABLED" p/ trigger de UPDATE não ser processado
			UPDATE tb_DeclaracoesDAR SET 
				totalAdicoes = @TotalAdicoes, 
				totalVolumes = @TotalVolumes, 
				totalIVA = @TotalIVA, 
				totalMontante = @TotalMontante,
				totalMontanteEUR = ROUND((@TotalMontante / cambioMontante), 2),
				totalCustosTransporte = @TotalCustosTransporte,
				totalMassaBruta = @TotalMassaBruta,
				volumesDirty = @TotalVolumesDirty,
				volumesClean = @TotalVolumesClean,
				volumesScan = @TotalVolumesScan
			WHERE id = @IdDeclaracao
			SET CONTEXT_INFO 0x0 --reset à variavel global de sessão
		END TRY
		BEGIN CATCH							
-- constroi mensagem de erro detalhada
			SET @NumErro = 1 
			SET @Erro = @Erro + 'Doc. Transporte N.º: ' + @documentoTransporte 
				+ CHAR(13) + 'Detalhes do Erro: ' 
				+ 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	
		END CATCH	
-- se sucesso faz commit da transacção iniciada
		IF @@TRANCOUNT > 0
			COMMIT TRANSACTION			
		FETCH NEXT FROM DeclaracoesDAR INTO @acao, @data, @regimeIVA, @adicionalRegime, @funcaoregimeIOSS, @numeroIdentificacaoIVA, @natureza, @documentoTransporte, @nifExportador, 
			@nomeExportador, @moradaExportador, @localidadeExportador, @codigoPostalExportador, @localidadePostalExportador, @paisExportador, @nifImportador, @nomeImportador, 
			@moradaImportador, @localidadeImportador, @codigoPostalImportador, @localidadePostalImportador, @paisImportador, @telefoneImportador, @emailImportador, @codigoDeclarante, 
			@estatutoDeclarante, @estancia, @tipoDeclaracao, @vossaReferencia, @condEntrega, @meioTransporte, @tipoLocalizacaoMercadorias, @qualificadorLocalizacaoMercadorias, 
			@armazemDTPLocalizacaoMercadorias, @estanciaLocalizacaoMercadorias, @paisMoedaFatura, @paisMoedaCustosTransporte, @followUp, @utilizadorNomeado, @numeroPDDT, @numeroPDDTDEV, @numeroTD, 
			@numeroACTM, @numeroSequencia, @locID, @gateway, @serviceLevel, @portesAcc, @portes, @despachoAcc, @freteOriginal, @moedafreteOriginal, @despesas, @condicaoEntrega, @nomeFicheiro, 
			@numeroContaExpedidor, @numeroContaDestinatario, @nomeOriginalDestinatario, @moradaOriginalDestinatario, @localidadeOriginalDestinatario, @codigoPostalOriginalDestinatario, 
			@localidadePostalOriginalDestinatario, @referenciaExterna1, @referenciaExterna2, @shipID, @miniCPA, @dataVoo, @aeroportoOrigem, @numeroVoo, @posicaoAviao, @tracking, 
			@tipoCarga, @dutyType, @payment, @dataDocumentoTransporte, @XMLDocumentosECertificados, @XMLInformacoesAdicionais, @XMLDocumentosPrecedentes, @XMLAdicoes, @XMLIncidencias, 
			@XMLManifestos, @XMLFollowUps, @XMLContactos
	END
	CLOSE DeclaracoesDAR
	DEALLOCATE DeclaracoesDAR
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_DeclaracoesDAR_ImportaRegistosDeXML TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_AdicoesInsere') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_AdicoesInsere
GO
CREATE PROCEDURE sp_IMP_Declaracoes_AdicoesInsere @AnoDeclaracao int, @NumDeclaracao int, @NumAdicao int, @CodArtigo varchar(22), @PesoLiquido numeric(38, 6), 
	@PesoBruto numeric(38, 6), @Montante numeric(38, 6), @Unidades numeric(38, 6), @CodPreferencia varchar(3), @CodPaisOrigem varchar(2), @Designacao varchar(150), 
	@Desdobramento1 varchar(3), @MetodoAvaliacao int, @Frete numeric(38, 6), @Seguro numeric(38, 6), @TaxaIVA numeric(38, 6), @IdAdicao int OUTPUT, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN	
	SET NOCOUNT ON;
	SET ARITHABORT ON;
	SET DATEFORMAT DMY;
-- declaração de variáveis
	DECLARE @TblID table (ID int NOT NULL)
	DECLARE @NumErro int, @DataAtual datetime, @ValorFormatado varchar(40)
	DECLARE @1CasaTipoDeclaracao varchar(5), @CodCliente varchar(18), @CodDeclarante varchar(6), @MontanteTotal numeric(38, 6), @CambioMontante numeric(38, 6), @FreteTotal numeric(38, 6), 
		@CambioFrete numeric(38, 6), @SeguroTotal numeric(38, 6), @CambioSeguro numeric(38, 6), @VerbaTransitarioTotal numeric(38, 6), @MassaBrutaTotal numeric(38, 6), 
		@ValorAduaneiroTotal numeric(38, 6), @TotalAdicoes int, @TotalVolumes numeric(38, 6), @FormulaCondEntrega varchar(70), @TaxaFDA numeric(38, 6), @CodMeioTransporteChegada varchar(2), 
		@TotalOptativas numeric(38, 6), @AnexoB varchar(2), @Regime varchar(4), @BeneficiarioIVA bit, @GarantiaGlobal bit, @NumeroNRG varchar(24), @AnoNRG varchar(4), @TipoNRG varchar(1), 
		@EntidadeNRG int, @CodAlfandegaNRG varchar(8), @CodigoAcessoNRG varchar(4), @OutrasReferenciasNRG varchar(35), @NIFResponsavel varchar(17), @DesdobramentoTipoDeclaracao varchar(3), 
		@AdicionalIVA varchar(3)
	DECLARE @SomaMontantesAdicoes numeric(38, 6), @SomaFretesAdicoes numeric(38, 6), @SomaSegurosAdicoes numeric(38, 6), @SomaVerbasTransitarioAdicoes numeric(38, 6)
	DECLARE @IdDesdobramento int, @Desdobramento2 varchar(3)
	DECLARE @CodUnidMedida varchar(3), @TipoTributacao int, @CodUnidSuplementar varchar(10), @CodigoPautal varchar(22), @ArtigoTxComposta bit, @CodigoATAR varchar(10), @CodigoIC1 varchar(4), 
		@CodigoIC2 varchar(4), @CodigoIC3 varchar(4), @CodigoIC4 varchar(4), @CodigoIC5 varchar(4), @CodigoCCUS varchar(9), @TipoMercadoria varchar(3)
	DECLARE @NomeUnidMedida varchar(35)
	DECLARE @NomePaisOrigem varchar(35)
	DECLARE @NomeUnidSuplementar varchar(10)
	DECLARE @NomePreferencia varchar(70), @CodRubricaDireitos int, @TaxaPreferencia numeric(38, 6), @NomeRubricaDireitos varchar(35), @ImposicaoDireitos varchar(3)
	DECLARE @CodRubricaIVA int, @NomeRubricaIVA varchar(35), @ImposicaoIVA varchar(3)
	DECLARE @NumeroNRGDireitos varchar(24), @AnoNRGDireitos varchar(4), @TipoNRGDireitos varchar(1), @EntidadeNRGDireitos int, @CodAlfandegaNRGDireitos varchar(8), 
		@CodigoAcessoNRGDireitos varchar(4), @OutrasReferenciasNRGDireitos varchar(35), @NIFResponsavelDireitos varchar(17),  @NumeroNRGIVA varchar(24), @AnoNRGIVA varchar(4), 
		@TipoNRGIVA varchar(1), @EntidadeNRGIVA int, @CodAlfandegaNRGIVA varchar(8), @CodigoAcessoNRGIVA varchar(4), @OutrasReferenciasNRGIVA varchar(35), @NIFResponsavelIVA varchar(17)
	DECLARE @VerbaTransitario numeric(38, 6), @Optativas numeric(38, 6), @ValorEUR numeric(38, 6), @Ajustamento numeric(38, 6), @ValorEstatistico numeric(38, 6), @ValorAduaneiro numeric(38, 6), 
		@BaseTributacaoDireitos numeric(38, 6), @TaxaValorDireitos numeric(38, 6), @MontanteDireitos numeric(38, 6), @BaseTributacaoIVA numeric(38, 6), @MontanteIVA numeric(38, 6), 
		@QtdDireitos numeric(38, 6)
-- inicia processo de inserção da adição
	BEGIN TRY	
		SET @NumErro = 0
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- valida artigo
		IF NOT EXISTS(SELECT 1 FROM TAB_APAU WITH(NOLOCK) WHERE APA_CODI = @CodArtigo AND APA_INAC = 0 AND APA_FLUX IN (0, 1) AND APA_EDAR = 0 AND LEN(APA_CPAU) >= 10)
			RAISERROR('Código do artigo "%s" inexistente ou não está devidamente configurado.', 16, 1, @CodArtigo)
-- valida preferência
		IF (ISNULL(@CodPreferencia, '') <> '') AND (NOT EXISTS(SELECT 1 FROM TAB_PREF WITH(NOLOCK) WHERE PRE_CODI = @CodPreferencia))
			RAISERROR('Código da preferência "%s" inexistente.', 16, 2, @CodPreferencia)
-- valida país de origem
		IF (ISNULL(@CodPaisOrigem, '') <> '') AND (NOT EXISTS(SELECT 1 FROM TAB_PAIS WITH(NOLOCK) WHERE PAI_CODI = @CodPaisOrigem))
			RAISERROR('Código do país de origem "%s" inexistente.', 16, 3, @CodPaisOrigem)
-- valida peso bruto
		IF ISNULL(@PesoBruto, 0) <= 0
		BEGIN
			SET @ValorFormatado = LTRIM(STR(@PesoBruto, 38, 6))
			RAISERROR('Peso bruto "%s" inválido.', 16, 4, @ValorFormatado)
		END
-- valida montante
		IF ISNULL(@Montante, 0) <= 0
		BEGIN
			SET @ValorFormatado = LTRIM(STR(@Montante, 38, 3))
			RAISERROR('Montante "%s" inválido.', 16, 5, @ValorFormatado)
		END
-- obtem dados da declaração		
		SELECT @1CasaTipoDeclaracao = duc.TDE_1CAS, @CodCliente = duc.DUC_DST8, @CodDeclarante = duc.DEC_CO14, @MontanteTotal = ISNULL(duc.DUC_MT22, 0), @CambioMontante = ISNULL(duc.DUC_TX23, 0), 
			@FreteTotal = ISNULL(duc.DUC_FRET, 0), @CambioFrete = ISNULL(duc.DUC_TXFR, 0), @SeguroTotal = ISNULL(duc.DUC_SEGU, 0), @CambioSeguro = ISNULL(duc.DUC_TxSE, 0), 
			@VerbaTransitarioTotal = ISNULL(duc.DUC_VTRN, 0), @MassaBrutaTotal = ISNULL(duc.DUC_MBRT, 0), @ValorAduaneiroTotal = ISNULL(duc.DUC_VATT, 0), @TotalAdicoes = duc.DUC_ADI5, 
			@TotalVolumes = ISNULL(duc.DUC_TVL6, 0), @FormulaCondEntrega = ISNULL(duc.DUC_FR20, ''), @TaxaFDA = ISNULL(duc.DUC_TFDA, 0), @CodMeioTransporteChegada = duc.MTR_PT18, 
			@TotalOptativas = ISNULL(duc.DUC_OP18, 0), @AnexoB = duc.DUC_ANXB, @Regime = duc.DUC_REGI, @BeneficiarioIVA = duc.DUC_BIVA, @GarantiaGlobal = duc.DUC_CGLB, @NumeroNRG = duc.DUC_CAUC, 
			@AnoNRG = duc.DUC_CANO, @TipoNRG = duc.DUC_CTIP, @EntidadeNRG = duc.DUC_CENT, @CodAlfandegaNRG = duc.ALF_CODI2, @CodigoAcessoNRG = duc.DUC_CCAC, @OutrasReferenciasNRG = duc.DUC_CORF, 
			@NIFResponsavel = duc.DUC_CNIR, 
			@DesdobramentoTipoDeclaracao = tde.TDE_DESD, 
			@CodPaisOrigem = (CASE duc.DUC_ANXB 
								WHEN 'I2' THEN NULL 
								WHEN 'H6' THEN ISNULL(@CodPaisOrigem, duc.PAI_ELIV)
								ELSE ISNULL(@CodPaisOrigem, duc.PAI_PA15) 
							END), 
			@CodPreferencia = (CASE 
								WHEN duc.DUC_ANXB IN ('H2', 'H5', 'H6') THEN (SELECT PRE_CODI FROM TAB_PREF WITH(NOLOCK) WHERE PRE_CODI = '000')
								ELSE ISNULL(@CodPreferencia, tde.PRE_CODI) 
							END), 
			@AdicionalIVA = (CASE 
								WHEN (LEFT(duc.DUC_REGI, 2) <> '42') AND (duc.DUC_BIVA = 0) THEN cli.CLI_AIVA
								ELSE NULL
							END)
		FROM PRO_DUCG AS duc WITH(NOLOCK) 			
			INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON duc.TDE_CODI = tde.TDE_CODI			
			INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON duc.DUC_DST8 = cli.CLI_CODI
		WHERE duc.DUC_EANO = @AnoDeclaracao AND duc.DUC_PNUM = @NumDeclaracao 
-- valida peso líquido
		IF (@AnexoB NOT IN ('H2', 'H3', 'I2')) AND (ISNULL(@PesoLiquido, 0) <= 0)
		BEGIN
			SET @ValorFormatado = LTRIM(STR(@PesoLiquido, 38, 6))
			RAISERROR('Peso líquido "%s" inválido.', 16, 6, @ValorFormatado)
		END
-- obtem dados das adições já existentes		
		SELECT @SomaMontantesAdicoes = ISNULL(SUM(DUA_VA42), 0), @SomaFretesAdicoes = ISNULL(SUM(ISNULL(DUA_VFRE, 0)), 0), @SomaSegurosAdicoes = ISNULL(SUM(ISNULL(DUA_VSEG, 0)), 0), 
			@SomaVerbasTransitarioAdicoes = ISNULL(SUM(ISNULL(DUA_VTRA, 0)), 0)
		FROM PRO_DUAD WITH(NOLOCK)
		WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao 
-- valida se montante é válido na declaração
		IF (@MontanteTotal - @SomaMontantesAdicoes - @Montante) < 0
		BEGIN
			SET @ValorFormatado = LTRIM(STR(@Montante, 38, 3))
			RAISERROR('Montante "%s" inválido porque é superior ao montante total disponível', 16, 7, @ValorFormatado)
		END
-- obtem dados do desdobramento de regime		
		SELECT @IdDesdobramento = id, @Desdobramento1 = desdobramento1, @Desdobramento2 = desdobramento2
		FROM tb_TBL_Desdobramentos WITH(NOLOCK) 
		WHERE tipoDeclaracao = @1CasaTipoDeclaracao AND regime = @Regime AND desdobramento1 = ISNULL(NULLIF(@Desdobramento1, ''), @DesdobramentoTipoDeclaracao)
-- valida se regime adicional é válido
		IF (LEFT(@Regime, 2) = '53') AND (@IdDesdobramento IS NULL)
			RAISERROR('O regime "%s" obriga ao preenchimento do regime adicional.', 16, 8, @Regime)
-- obtem dados do artigo		
		SELECT @CodigoPautal = apa.APA_CPAU, @TipoTributacao = apa.APA_TRIB, @CodUnidSuplementar = apa.USU_CODI, @CodigoATAR = apa.APA_ATAR, 
			@Designacao = ISNULL(NULLIF(@Designacao, ''), apa.APA_DESG), 
			@CodigoIC1 = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_AIC1 
							ELSE NULL 
						END),
			@CodigoIC2 = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_AIC2 
							ELSE NULL 
						END), 
			@CodigoIC3 = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_AIC3 
							ELSE NULL 
						END),
			@CodigoIC4 = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_AIC4 
							ELSE NULL 
						END),
			@CodigoIC5 = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_AIC5 
							ELSE NULL 
						END),
			@CodigoCCUS = (CASE 
							WHEN @AnexoB NOT IN ('H6', 'I2') THEN apa.APA_CCUS
							ELSE NULL 
						END),
			@TipoMercadoria = (CASE 
							WHEN @AnexoB NOT IN ('HI', 'H2', 'H3', 'H4', 'H5', 'I1') THEN apa.APA_TMER
							ELSE NULL 
						END),
			@CodUnidMedida = (CASE 
									WHEN ISNULL(apa.APA_TRIB, 0) IN (0, 1) THEN apa.UME_CODI 
									ELSE NULL 
								END),
			@TaxaIVA = (CASE 						
						WHEN (LEFT(ISNULL(@Regime, ''), 2) IN ('42', '51', '53', '71')) OR (ISNULL(@Desdobramento1, '') = '4II') OR (ISNULL(@Desdobramento1, '') = 'C01') OR (ISNULL(@Desdobramento1, '') = 'F48') OR (ISNUMERIC(@Desdobramento1) = 1 AND CAST(@Desdobramento1 AS int) >= 401 AND CAST(@Desdobramento1 AS int) <= 459) THEN 0 
						ELSE ISNULL(@TaxaIVA, ISNULL(apa.APA_TIVA, 0))
					END), 
			@ArtigoTxComposta = (CASE apa.APA_TRIB 
									WHEN 0 THEN ~(apa.APA_TXCO) 
									WHEN 1 THEN 1 
									ELSE 0 
								END)			
		FROM TAB_APAU AS apa WITH(NOLOCK)
		WHERE APA_CODI = @CodArtigo
-- valida unidades
		IF (@AnexoB IN ('H6', 'I2')) AND (ISNULL(@Unidades, 0) > 0)
		BEGIN
			SET @ValorFormatado = LTRIM(STR(@Unidades, 38, 6))
			RAISERROR('Unidades "%s" inválida.', 16, 9, @ValorFormatado)
		END
		ELSE
			IF (@AnexoB NOT IN ('H6', 'I2')) AND (ISNULL(@CodUnidSuplementar, '') <> '') AND (ISNULL(@Unidades, 0) <= 0)
			BEGIN
				SET @ValorFormatado = LTRIM(STR(@Unidades, 38, 6))
				RAISERROR('Unidades "%s" inválida.', 16, 10, @ValorFormatado)
			END
-- obtem dados da unidade de medida		
		SELECT @NomeUnidMedida = UME_NOME
		FROM TAB_UMED WITH(NOLOCK)
		WHERE UME_CODI = @CodUnidMedida
-- obtem dados do país de origem		
		SELECT @NomePaisOrigem = PAI_NOME
		FROM TAB_PAIS WITH(NOLOCK)
		WHERE PAI_CODI = @CodPaisOrigem
-- obtem dados da unidade suplementar
		SELECT @NomeUnidSuplementar = USU_SIGL
		FROM TAB_USUP WITH(NOLOCK)
		WHERE USU_CODI = @CodUnidSuplementar
-- obtem dados da preferência		
		SELECT @NomePreferencia = pre.PRE_NOME, @TaxaPreferencia = pre.PRE_TAXA, @CodRubricaDireitos = rre.RRE_CODI, @NomeRubricaDireitos = rre.RRE_NOME, @ImposicaoDireitos = rre.RRE_IMPO
		FROM TAB_PREF AS pre WITH(NOLOCK)
			INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON pre.RRE_CODI = rre.RRE_CODI
		WHERE pre.PRE_CODI = @CodPreferencia
-- obtem dados do IVA		
		SELECT @CodRubricaIVA = rre.RRE_CODI, @NomeRubricaIVA = rre.RRE_NOME, @ImposicaoIVA = rre.RRE_IMPO
		FROM (SELECT PAP_TXIS, RRE_CDIS 
				FROM TAB_PAPL WITH(NOLOCK) 
				UNION 
				SELECT PAP_TXRD, RRE_CDRD 
				FROM TAB_PAPL WITH(NOLOCK) 
				UNION 
				SELECT PAP_TXIN, RRE_CDIN 
				FROM TAB_PAPL WITH(NOLOCK) 
				UNION 
				SELECT PAP_TXNR, RRE_CDNR 
				FROM TAB_PAPL WITH(NOLOCK)) AS t 
			INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON t.RRE_CDIS = rre.RRE_CODI
		WHERE t.PAP_TXIS = @TaxaIVA
-- calcula a garantia de direitos e IVA		
		IF (@GarantiaGlobal = 0) AND (@AnexoB NOT IN ('H2', 'I1', 'I2'))
		BEGIN			
			SELECT @EntidadeNRG = 1, @NIFResponsavel = CLI_CNIF, 
				@NumeroNRG = (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), 
				@AnoNRG = (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), 
				@TipoNRG = (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), 
				@CodAlfandegaNRG = (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), 
				@CodigoAcessoNRG = (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), 
				@OutrasReferenciasNRG = (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)				
			FROM TAB_CLIE WITH(NOLOCK)
			WHERE CLI_CODI = @CodCliente
			IF ISNULL(@NumeroNRG, '') = ''
			BEGIN
				SELECT @EntidadeNRG = 0, 
					@NumeroNRG = (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), 
					@AnoNRG = (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), 
					@TipoNRG = (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), 
					@CodAlfandegaNRG = (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), 
					@CodigoAcessoNRG = (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), 
					@OutrasReferenciasNRG = (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), 
					@NIFResponsavel = NULL
				FROM TAB_DECL WITH(NOLOCK)
				WHERE DEC_CODI = @CodDeclarante
			END				
		END
		SET @NumeroNRGDireitos = @NumeroNRG
		SET @AnoNRGDireitos = @AnoNRG
		SET @TipoNRGDireitos = @TipoNRG
		SET @EntidadeNRGDireitos = @EntidadeNRG
		SET @CodAlfandegaNRGDireitos = @CodAlfandegaNRG
		SET @CodigoAcessoNRGDireitos = @CodigoAcessoNRG
		SET @OutrasReferenciasNRGDireitos = @OutrasReferenciasNRG
		SET @NIFResponsavelDireitos = @NIFResponsavel
		IF @BeneficiarioIVA = 0
		BEGIN
			SET @NumeroNRGIVA = @NumeroNRG
			SET @AnoNRGIVA = @AnoNRG
			SET @TipoNRGIVA = @TipoNRG
			SET @EntidadeNRGIVA = @EntidadeNRG
			SET @CodAlfandegaNRGIVA = @CodAlfandegaNRG
			SET @CodigoAcessoNRGIVA = @CodigoAcessoNRG
			SET @OutrasReferenciasNRGIVA = @OutrasReferenciasNRG
			SET @NIFResponsavelIVA = @NIFResponsavel
		END
		ELSE
		BEGIN
			SET @NumeroNRGIVA = NULL
			SET @AnoNRGIVA = NULL
			SET @TipoNRGIVA = NULL
			SET @EntidadeNRGIVA = NULL
			SET @CodAlfandegaNRGIVA = NULL
			SET @CodigoAcessoNRGIVA = NULL
			SET @OutrasReferenciasNRGIVA = NULL
			SET @NIFResponsavelIVA = NULL
		END
-- calcula os valores da adição		
		IF @NumAdicao IS NULL
			SET @NumAdicao = @TotalAdicoes + 1
		IF (@AnexoB IN ('H2', 'H3', 'I2')) AND (@PesoLiquido > 0)
			SET @PesoLiquido = 0
		IF (@AnexoB IN ('H6', 'I2')) AND (ISNULL(@Unidades, 0) > 0)
			SET @Unidades = 0	
		IF @AnexoB IN ('H1', 'H3', 'H4', 'H5')
			SET @MetodoAvaliacao = ISNULL(@MetodoAvaliacao, 1)
		ELSE
			SET @MetodoAvaliacao = NULL
		SET @Frete = ISNULL(@Frete, ROUND((CASE (@MontanteTotal - @SomaMontantesAdicoes - @Montante) 
											WHEN 0 THEN (@FreteTotal - @SomaFretesAdicoes) 
											ELSE (@PesoBruto * @FreteTotal / @MassaBrutaTotal) 
										END), 3))
		SET @Seguro = ISNULL(@Seguro, ROUND((CASE (@MontanteTotal - @SomaMontantesAdicoes - @Montante) 
												WHEN 0 THEN (@SeguroTotal - @SomaSegurosAdicoes) 
												ELSE (@Montante * @SeguroTotal / @MontanteTotal) 
											END), 3))
		SET @VerbaTransitario = ROUND((CASE (@MontanteTotal - @SomaMontantesAdicoes - @Montante) 
										WHEN 0 THEN (@VerbaTransitarioTotal - @SomaVerbasTransitarioAdicoes) 
										ELSE (@PesoBruto * @VerbaTransitarioTotal / @MassaBrutaTotal) 
									END), 3)		
		SET @ValorEUR = ROUND(@Montante / @CambioMontante, 2)
		SET @Ajustamento = dbo.fn_IMP_CalculaAjustamento(@FormulaCondEntrega, @TaxaFDA, @CambioFrete, @CambioSeguro, @Frete, @Seguro, 0, 0, 0)
		SET @ValorEstatistico = dbo.fn_IMP_CalculaValorEstatistico(@ValorEUR, @Ajustamento)
		SET @ValorAduaneiro = @ValorEstatistico
		SET @Optativas = dbo.fn_IMP_CalculaValorOptativas(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodMeioTransporteChegada, @TotalAdicoes, @TotalVolumes, @TotalOptativas, @MassaBrutaTotal, @ValorAduaneiroTotal, @PesoBruto, @ValorAduaneiro)
		SET @BaseTributacaoDireitos = dbo.fn_IMP_CalculaBaseTributacaoDireitos(0, 0, @TipoTributacao, @PesoLiquido, @Unidades, @ValorEstatistico, @CodUnidMedida) 		                              
		SET @TaxaValorDireitos = dbo.fn_IMP_CalculaTaxaValorDireitos(@DataAtual, @CodArtigo, @CodPaisOrigem, @TaxaPreferencia, @Unidades, @Regime, @Desdobramento1) 
		SET @MontanteDireitos = dbo.fn_IMP_CalculaMontanteDireitos(0, 0, ~(@ArtigoTxComposta), @TaxaValorDireitos, @BaseTributacaoDireitos)
		SET @BaseTributacaoIVA = dbo.fn_IMP_CalculaBaseTributacaoIVA(@FormulaCondEntrega, @TaxaFDA, @CambioFrete, @Frete, @Ajustamento, @ValorEstatistico, @VerbaTransitario, @Optativas, @MontanteDireitos, 0, 0, 0)
		SET @MontanteIVA = ROUND(@BaseTributacaoIVA * @TaxaIVA / 100, 2)
		SET @QtdDireitos = dbo.fn_IMP_CalculaBaseTributacaoDireitos(0, 0, @TipoTributacao, @PesoLiquido, @Unidades, 0, @CodUnidMedida)
-- insere a adição
		INSERT INTO PRO_DUAD(DUC_EANO, DUC_PNUM, DUA_CODI, APA_CO33, UME_CODI, DUA_TIVA, DUA_TRIB, PAI_CO34, DUA_MB35, PRE_CO36, RRE_PREF, DUA_RG37, DUA_R37B, DUA_ML38, DUA_US41, USU_CO41, 
			DUA_VA42, DUA_VFRE, DUA_VSEG, DUA_VTRA, DUA_ROYA, DUA_VROY, DUA_VDIR, DUA_VOPT, DUA_DESG, DUA_VEST, DUA_AJUS, DUA_DANO, DUA_VATO, DUA_BTRI, DUA_TXCO, DUA_TXVL, DUA_MTRI, DUA_IVAV, 
			DUA_BTIV, RRE_CODI, DUA_MPAG, DUA_VSEL, DUA_VIVA, DUA_VAEU, APA_CP33, PAI_NOME, PRE_NOME, USU_NOME, RRE_NOME, UME_NOTR, DUA_MTPR, DUA_QUAL, DUA_IMPO, DUA_ATAR, DUA_AIVA, DUA_CS50, 
			DUA_R37C, DUA_2TAR, DUA_3TAR, DUA_MAVA, RRE_NOME1, DUA_IMPI, DUA_1TAR, DUA_4TAR, DUA_5TAR, id_desdobramento, APA_CCUS, DUA_TMER, DUA_QTDD, DUA_CAUC, DUA_CANO, DUA_CTIP, DUA_CENT, 
			DUA_CAUD, DUA_CAND, DUA_CTID, DUA_CEND, ALF_CODI, DUA_CCAD, DUA_CORD, DUA_CNRD, DUA_CAUI, DUA_CANI, DUA_CTII, DUA_CENI, ALF_CODI1, DUA_CCAI, DUA_CORI, DUA_CNRI)
		OUTPUT inserted.DUA_IDEN INTO @TblID
		VALUES(@AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodArtigo, @CodUnidMedida, @TaxaIVA, @TipoTributacao, @CodPaisOrigem, @PesoBruto, @CodPreferencia, @CodRubricaDireitos, @Regime, @Desdobramento1, @PesoLiquido, @Unidades, @CodUnidSuplementar, 
			@Montante, @Frete, @Seguro, @VerbaTransitario, 0, 0, 0, @Optativas, @Designacao, @ValorEstatistico, @Ajustamento, @AnoDeclaracao, @ValorAduaneiro, @BaseTributacaoDireitos, @ArtigoTxComposta, @TaxaValorDireitos, @MontanteDireitos, 0, 
			@BaseTributacaoIVA, @CodRubricaIVA, '0', 0, @MontanteIVA, @ValorEUR, @CodigoPautal, @NomePaisOrigem, @NomePreferencia, @NomeUnidSuplementar, @NomeRubricaIVA, @NomeUnidMedida, 0, 'X', @ImposicaoDireitos, @CodigoATAR, @AdicionalIVA, 0, 
			@Desdobramento2, @CodigoIC2, @CodigoIC3, @MetodoAvaliacao, @NomeRubricaDireitos, @ImposicaoIVA, @CodigoIC1, @CodigoIC4, @CodigoIC5, @IdDesdobramento, @CodigoCCUS, @TipoMercadoria, @QtdDireitos, @NumeroNRGDireitos, @AnoNRGDireitos, @TipoNRGDireitos, @EntidadeNRGDireitos, 
			@NumeroNRGDireitos, @AnoNRGDireitos, @TipoNRGDireitos, @EntidadeNRGDireitos, @CodAlfandegaNRGDireitos, @CodigoAcessoNRGDireitos, @OutrasReferenciasNRGDireitos, @NIFResponsavelDireitos, @NumeroNRGIVA, @AnoNRGIVA, @TipoNRGIVA, @EntidadeNRGIVA, @CodAlfandegaNRGIVA, @CodigoAcessoNRGIVA, @OutrasReferenciasNRGIVA, @NIFResponsavelIVA)
-- obtem o ID da nova adição
		SELECT @IdAdicao = ID
		FROM @TblID
	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_IMP_Declaracoes_AdicoesInsere TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_SDSViaAerea_Manifestos_MensagemIntegraAirWarehouseKeepersReportResponse') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirWarehouseKeepersReportResponse
GO
CREATE PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirWarehouseKeepersReportResponse @MensagemXML xml, @Utilizador varchar(30), @IdMensagem varchar(35) OUTPUT, 
	@SucessoMensagem varchar(10) OUTPUT, @ContramarcaMensagem varchar(14) OUTPUT, @AnoManifesto int OUTPUT, @NumManifesto int OUTPUT, @AWBIntegradasXML xml OUTPUT, 
	@Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON
	SET DATEFORMAT DMY
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @TotalLinhasAWBInvalidas int
	DECLARE @DataMsgXML datetime, @IdManifestoMsgXML varchar(35), @DadosDescargaMsgXML xml, @SucessoFimOpXML varchar(8), @ErrosFimOpXML xml, @AlertasFimOpXML xml, 
		@JustificacaoFimOpXML varchar(512), @ErrosMsgXML xml, @AlertasMsgXML xml
	DECLARE @TipoManifesto int, @DataVooManifesto datetime, @CodEstanciaManifesto varchar(8), @IdDepositarioManifesto varchar(20), @ErrosGerais varchar(MAX), @AlertasGerais varchar(MAX), 
		@ErrosFimOp varchar(MAX), @AlertasFimOp varchar(MAX)
	DECLARE @AcaoAwbXML varchar(8), @SucessoAwbXML varchar(8), @NRLAwbXML varchar(22), @ErrosAwbXML xml, @AlertasAwbXML xml, @JustificacaoAwbXML varchar(512)		
	DECLARE @IdLinhaAWB int, @NumAWBLinhaAWB varchar(30), @ErrosLinhaAWB varchar(MAX), @AlertasLinhaAWB varchar(MAX)
	DECLARE @TblTmpLinhasAWBIntegradas TABLE(MAN_ANO smallint NOT NULL, MAN_NUME int NOT NULL, MAN_TIPO tinyint NOT NULL, MAN_DVOO datetime NOT NULL, EAD_CODI varchar(8) NOT NULL, 
		MAN_NCTM varchar(14) NULL, MAN_SUCE varchar(10) NULL, MAN_ERRS xml NULL, MAN_ALRS xml NULL, AWB_NUME varchar(30) NULL, AWB_ACAO varchar(8) NULL, AWB_SUCE varchar(8) NULL, 
		AWB_ERRS xml NULL, AWB_ALRS xml NULL)
-- inicia transacção para integração da mensagem AirWarehouseKeepersReportResponse
	BEGIN TRANSACTION tSDSIntMsgAirWarehouseResponse
	BEGIN TRY	
		SET @NumErro = 0
		SET @TotalLinhasAWBInvalidas = 0	
-- obtem dados da mensagem XML	
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT 			
			@IdMensagem = f.m.value('(ns2:MessageInformation/Identification)[1]', 'varchar(35)'), 
			@DataMsgXML = f.m.value('(ns2:MessageInformation/DateAndTime)[1]', 'datetime'), 
			@IdManifestoMsgXML = f.m.value('(ns2:MessageCorrelationInformation/Identification)[1]', 'varchar(35)'), 
			@SucessoMensagem = f.m.value('(ns2:MessageCorrelationInformation/Success)[1]', 'varchar(10)'), 
			@ContramarcaMensagem = f.m.value('ns2:CustomsReferenceNumber[1]', 'varchar(14)'), 			
			@DadosDescargaMsgXML = f.m.query('ns2:UnloadReportResponse'), 
			@SucessoFimOpXML = f.m.value('(ns2:UnloadEndOfOperationsResponse/ns2:Success)[1]', 'varchar(10)'), 
			@AlertasFimOpXML = f.m.query('(ns2:UnloadEndOfOperationsResponse/ns2:Warnings)'), 
			@ErrosFimOpXML = f.m.query('(ns2:UnloadEndOfOperationsResponse/ns2:Errors)'), 			
			@JustificacaoFimOpXML = f.m.value('(ns2:UnloadEndOfOperationsResponse/ns2:Justification)[1]', 'varchar(512)'), 
			@AlertasMsgXML = f.m.query('ns2:Warnings'), 
			@ErrosMsgXML = f.m.query('ns2:Errors')		
		FROM @MensagemXML.nodes('ns2:AirWarehouseKeepersReportResponse') AS f(m)
-- extrai ano e número do Relatório de Descarga 
		IF ISNULL(@IdManifestoMsgXML, '') <> ''
		BEGIN
			SET @AnoManifesto = CAST(LEFT(@IdManifestoMsgXML, 4) AS int)
			SET @NumManifesto = CAST(SUBSTRING(@IdManifestoMsgXML, 6, LEN(@IdManifestoMsgXML) - 8 - 5) AS int)	
		END
		ELSE
		BEGIN
			SELECT TOP 1 @AnoManifesto = DSC_EANO, @NumManifesto = DSC_NPRO
			FROM PRO_SDSC WITH(NOLOCK) 				
			WHERE DSC_NCMF = LEFT(@ContramarcaMensagem, 8) AND DSC_NCMV = RIGHT(@ContramarcaMensagem, 6)
			ORDER BY DSC_TIPO, DSC_IDEN DESC
		END			
-- verifica se mensagem é válida para o Relatório de Descarga SDS - Via Aérea
		IF NOT EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto)
			RAISERROR('Relatório de Descarga SDS - Via Aérea com ID "%s" e Contramarca "%s" inexistente.', 16, 1, @IdManifestoMsgXML, @ContramarcaMensagem)	
		ELSE
			IF EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSC_RPRD LIKE '%' + @IdMensagem + '%' AND DSC_RPRD LIKE '%' + CONVERT(varchar(23), @DataMsgXML, 121) + '%')
				RAISERROR('Mensagem XML AirWarehouseKeepersReportResponse com ID "%s" já integrada no Relatório de Descarga SDS - Via Aérea com ID "%s" e Contramarca "%s".', 16, 2, @IdMensagem, @IdManifestoMsgXML, @ContramarcaMensagem)	
-- obtem os erros gerais do Relatório de Descarga da mensagem XML		
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @ErrosGerais = ISNULL(@ErrosGerais, ' #Erros Gerais: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
		FROM @ErrosMsgXML.nodes('ns2:Errors/Error') AS f(m)
-- obtem os alertas gerais do Relatório de Descarga da mensagem XML		
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @AlertasGerais = ISNULL(@AlertasGerais, ' #Alertas Gerais: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('WarningDescription[1]', 'varchar(250)')
		FROM @AlertasMsgXML.nodes('ns2:Warnings/Warning') AS f(m)
-- obtem somente a lista de erros e warnings gerais
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @ErrosMsgXML = @ErrosMsgXML.query('ns2:Errors/Error'), @AlertasMsgXML = @AlertasMsgXML.query('ns2:Warnings/Warning')
-- obtem os erros do fim de operação
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @ErrosFimOp = ISNULL(@ErrosFimOp, ' #Erros Fim Operação: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
		FROM @ErrosFimOpXML.nodes('ns2:Errors/Error') AS f(m)		
-- obtem os alertas do fim de operação
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @AlertasFimOp = ISNULL(@AlertasFimOp, ' #Alertas Fim Operação: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('WarningDescription[1]', 'varchar(250)')
		FROM @AlertasFimOpXML.nodes('ns2:Warnings/Warning') AS f(m)
-- obtem somente a lista de erros e warnings de fim de operação
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
		SELECT @ErrosFimOpXML = @ErrosFimOpXML.query('ns2:Errors/Error'), @AlertasFimOpXML = @AlertasFimOpXML.query('ns2:Warnings/Warning')
-- obtem dados do Relatório de Descarga SDS - Via Aérea
		SELECT @TipoManifesto = DSC_TIPO, @CodEstanciaManifesto = EAD_CODI, @DataVooManifesto = DSC_DTVO, @IdDepositarioManifesto = DSC_IDDP
		FROM PRO_SDSC WITH(NOLOCK) 				
		WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem os documentos de transporte da mensagem XML
		DECLARE LinhasAWB CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
			SELECT f.m.value('ns2:Action[1]', 'varchar(8)'),
				f.m.value('ns2:Success[1]', 'varchar(8)'), 
				f.m.value('ns2:LocalReferenceNumber[1]', 'varchar(22)'), 								
				f.m.query('ns2:Warnings'), 
				f.m.query('ns2:Errors'), 
				f.m.value('ns2:Justification[1]', 'varchar(512)')
			FROM @DadosDescargaMsgXML.nodes('ns2:UnloadReportResponse') AS f(m)	
		OPEN LinhasAWB
		FETCH NEXT FROM LinhasAWB INTO @AcaoAwbXML, @SucessoAwbXML, @NRLAwbXML, @AlertasAwbXML, @ErrosAwbXML, @JustificacaoAwbXML
		WHILE @@FETCH_STATUS = 0
		BEGIN		
			SET @NumAWBLinhaAWB = NULL	
			SET @ErrosLinhaAWB = NULL		
			SET @AlertasLinhaAWB = NULL	
-- obtem o ID da linha AWB a partir do NRL
			SET @IdLinhaAWB = CAST(RIGHT(@NRLAwbXML, 9)	AS int)
-- obtem número AWB da linha AWB do Relatório de Descarga SDS - Via Aérea
			SELECT @NumAWBLinhaAWB = DSD_NRMH
			FROM PRO_SDSD WITH(NOLOCK) 				
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_IDNN = @IdLinhaAWB
-- verifica se mensagem é válida para o Relatório de Descarga SDS - Via Aérea
			IF (@IdLinhaAWB IS NOT NULL) AND (ISNULL(@NumAWBLinhaAWB, '') = '')
				RAISERROR('Linha AWB com ID "%s" inexistente no Relatórios de Descarga SDS - Via Aérea com ID "%s" e Contramarca "%s".', 16, 3, @NRLAwbXML, @IdManifestoMsgXML, @ContramarcaMensagem)
			ELSE
				IF (@IdLinhaAWB IS NULL) AND (ISNULL(@NumAWBLinhaAWB, '') = '')
					SET @TotalLinhasAWBInvalidas = @TotalLinhasAWBInvalidas + 1
-- obtem os erros da linha AWB
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
			SELECT @ErrosLinhaAWB = ISNULL(@ErrosLinhaAWB, '#ERROS:') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
			FROM @ErrosAwbXML.nodes('ns2:Errors/Error') AS f(m)		
-- obtem os alertas da linha AWB
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
			SELECT @AlertasLinhaAWB = ISNULL(@AlertasLinhaAWB, '#ALERTAS:') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('WarningDescription[1]', 'varchar(250)')
			FROM @AlertasAwbXML.nodes('ns2:Warnings/Warning') AS f(m)							
-- atualiza dados da linha AWB
			UPDATE PRO_SDSD SET 
				DSD_SIRD = (CASE @AcaoAwbXML WHEN 'Update' THEN 2 ELSE 1 END),
				DSD_DIRD = @DataAtual, 
				DSD_RIRD = (CASE @SucessoAwbXML WHEN 'No' THEN 2 WHEN 'Pending' THEN 3 ELSE 1 END), 
				DSD_EIRD = NULLIF(ISNULL(@ErrosLinhaAWB + CHAR(13) + CHAR(10), '') + ISNULL(@AlertasLinhaAWB + CHAR(13) + CHAR(10), '') + ISNULL('#JUSTIFICACAO: ' + NULLIF(@JustificacaoAwbXML, ''), ''), '')					
			WHERE DSD_IDNN = @IdLinhaAWB					
-- obtem somente a lista de erros e warnings
			;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirWarehouseKeepersReportResponse' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirWarehouseKeepersTypes')
			SELECT @ErrosAwbXML = @ErrosAwbXML.query('ns2:Errors/Error'), @AlertasAwbXML = @AlertasAwbXML.query('ns2:Warnings/Warning')
-- insere dados do Relatório de Descarga e linha AWB na tabela tmp
			INSERT INTO @TblTmpLinhasAWBIntegradas(MAN_ANO, MAN_NUME, MAN_TIPO, MAN_DVOO, EAD_CODI, MAN_NCTM, MAN_SUCE, MAN_ERRS, MAN_ALRS, AWB_NUME, AWB_ACAO, AWB_SUCE, AWB_ERRS, AWB_ALRS)
			VALUES(@AnoManifesto, @NumManifesto, @TipoManifesto, @DataVooManifesto, @CodEstanciaManifesto, @ContramarcaMensagem, @SucessoMensagem, @ErrosMsgXML, @AlertasMsgXML, @NumAWBLinhaAWB, @AcaoAwbXML, @SucessoAwbXML, @ErrosAwbXML, @AlertasAwbXML)
			FETCH NEXT FROM LinhasAWB INTO  @AcaoAwbXML, @SucessoAwbXML, @NRLAwbXML, @AlertasAwbXML, @ErrosAwbXML, @JustificacaoAwbXML
		END
		CLOSE LinhasAWB
		DEALLOCATE LinhasAWB
-- actualiza dados do Relatório de Descarga SDS
		UPDATE PRO_SDSC SET 
			DSC_STRD = 3, 	
			DSC_UERF = (CASE ISNULL(@SucessoFimOpXML, '') WHEN 'No' THEN NULL ELSE DSC_UERF END), 
			DSC_DERF = (CASE ISNULL(@SucessoFimOpXML, '') WHEN 'No' THEN NULL ELSE DSC_DERF END), 
			DSC_NRRD = DSC_NRRD + 1, 
			DSC_URRD = @Utilizador, 
			DSC_DRRD = @DataAtual, 
			DSC_RPRD = '-> AIR WAREHOUSEKEEPERS REPORT RESPONSE: ' + CHAR(13) + CHAR(10) 
						+ '	#Data Integração: ' + CONVERT(varchar(23), @DataAtual, 121) + CHAR(13) + CHAR(10) 
						+ '	#Utilizador Integração: ' + @Utilizador + CHAR(13) + CHAR(10) 
						+ '	#MessageIdentification: ' + @IdMensagem + CHAR(13) + CHAR(10) 
						+ '	#MessageDate: ' + CONVERT(varchar(23), @DataMsgXML, 121) + CHAR(13) + CHAR(10) 
						+ '	#Sucess: ' + ISNULL(@SucessoMensagem, '<n.d.>') + CHAR(13) + CHAR(10) 
						+ ISNULL(@ErrosGerais + CHAR(13) + CHAR(10), '') 
						+ ISNULL(@AlertasGerais + CHAR(13) + CHAR(10), '') 
						+ (CASE WHEN (ISNULL(@SucessoMensagem, '<n.d.>') = 'No') AND (ISNULL(@ErrosGerais, '') = '') AND (ISNULL(@ErrosFimOp, '') = '') THEN ' #Erros Linhas: ' + CHAR(13) + CHAR(10) + '		. «Verificar erros nas linhas AWB»' + CHAR(13) + CHAR(10) ELSE '' END) 
						+ ISNULL(' #Sucess Fim Operação: ' + NULLIF(@SucessoFimOpXML, '') + CHAR(13) + CHAR(10), '')
						+ ISNULL(' #Justification Fim Operação: ' + NULLIF(@JustificacaoFimOpXML, '') + CHAR(13) + CHAR(10), '') 
						+ ISNULL(@ErrosFimOp + CHAR(13) + CHAR(10), '') 
						+ ISNULL(@AlertasFimOp + CHAR(13) + CHAR(10), '') 						
						+ '===============================================================================================================================' + CHAR(13) + CHAR(10) 
						+ ISNULL(CAST(DSC_RPRD AS varchar(max)), '')						
		WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
-- processo atualizações de fim de operação
		IF ISNULL(@SucessoFimOpXML, '') = 'Yes'
		BEGIN
-- atualiza status das linhas AWB para "Respondido Finalize" e atribui estado "FIN" (Finalizado) quando tem respetivamente o status como "Enviado Create/Update/Delete" e a integração diferente de "Não respondido" com resultado de integração atribuído
			UPDATE PRO_SDSD SET 
				DSD_SIRD = 3,
				DSD_ESTA = (CASE DSD_RIRD WHEN 1 THEN 'FIN' ELSE DSD_ESTA END)
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_EADC <> 'C' AND DSD_TIPO <> 'TR' AND DSD_DEPO = @IdDepositarioManifesto AND DSD_ENVI = 1 
				AND DSD_STRD > 0 AND DSD_SIRD > 0 AND DSD_RIRD IS NOT NULL
		END
		ELSE
-- atualiza status das linhas AWB para "Respondido Create/Update" quando tem respetivamente o status como "Enviado Create/Update/Delete" e não houve sucesso nas linhas AWB integradas (normalmente devido à ocorrencia de erros gerais e/ou erros de schema [que vem descriminados nas linhas AWB mas sem quaisquer informação da AWB])
			IF (ISNULL(@SucessoFimOpXML, '') = '') AND ((@TotalLinhasAWBInvalidas > 0) OR ((@TotalLinhasAWBInvalidas = 0) AND (NOT EXISTS(SELECT 1 FROM @TblTmpLinhasAWBIntegradas))))
			BEGIN
				UPDATE PRO_SDSD SET 
					DSD_SIRD = (CASE DSD_STRD WHEN 1 THEN 1 ELSE 2 END), 					
					DSD_RIRD = 2					
				WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSD_EADC <> 'C' AND DSD_TIPO <> 'TR' AND DSD_DEPO = @IdDepositarioManifesto AND DSD_ENVI = 1 
					AND DSD_STRD > 0 AND DSD_SIRD = 0 AND DSD_RIRD IS NULL
			END
-- insere dados do Relatório de Descarga e fim de operação na tabela tmp
		IF (ISNULL(@SucessoFimOpXML, '') <> '') OR ((@TotalLinhasAWBInvalidas = 0) AND (NOT EXISTS(SELECT 1 FROM @TblTmpLinhasAWBIntegradas)))
		BEGIN
			INSERT INTO @TblTmpLinhasAWBIntegradas(MAN_ANO, MAN_NUME, MAN_TIPO, MAN_DVOO, EAD_CODI, MAN_NCTM, MAN_SUCE, MAN_ERRS, MAN_ALRS, AWB_NUME, AWB_ACAO, AWB_SUCE, AWB_ERRS, AWB_ALRS)
			VALUES(@AnoManifesto, @NumManifesto, @TipoManifesto, @DataVooManifesto, @CodEstanciaManifesto, @ContramarcaMensagem, @SucessoMensagem, @ErrosMsgXML, @AlertasMsgXML, NULL, (CASE WHEN ISNULL(@SucessoFimOpXML, '') <> '' THEN 'Finalize' ELSE NULL END), @SucessoFimOpXML, @ErrosFimOpXML, @AlertasFimOpXML)
		END
-- constroi XML com as linhas AWB integradas no Relatório de Descarga SDS - Via Aérea
		SET @AWBIntegradasXML = 
			(SELECT 				
				MAN_ANO AS "AnoManifesto",		
				MAN_NUME AS "NumManifesto", 
				MAN_TIPO AS "TipoManifesto",
				MAN_DVOO AS "DataVooManifesto",
				EAD_CODI AS "EstanciaManifesto", 
				MAN_NCTM AS "ContramarcaManifesto", 				
				MAN_SUCE AS "SucessoManifesto", 
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(MAN_ERRS AS varchar(MAX)), '') AS xml)) AS "ErrosManifesto",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(MAN_ALRS AS varchar(MAX)), '') AS xml)) AS "AlertasManifesto",
				AWB_NUME AS "NumeroAWB",
				AWB_ACAO AS "AcaoAWB",
				AWB_SUCE AS "SucessoAWB",				
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(AWB_ERRS AS varchar(MAX)), '') AS xml)) AS "ErrosAWB",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(AWB_ALRS AS varchar(MAX)), '') AS xml)) AS "AlertasAWB"
			FROM @TblTmpLinhasAWBIntegradas	
			FOR XML PATH('AWB'), ELEMENTS)
	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)) + '}'		
-- em caso de erro faz rollback da transacção iniciada						           
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION tSDSIntMsgAirWarehouseResponse
	END CATCH			
-- se sucesso faz commit da transacção iniciada
	IF @@TRANCOUNT > 0
		COMMIT TRANSACTION tSDSIntMsgAirWarehouseResponse
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_SDSViaAerea_Manifestos_MensagemIntegraAirWarehouseKeepersReportResponse TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'SP_ExportacaoXML_AdicoesGeraDeLinhasOGMA') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE SP_ExportacaoXML_AdicoesGeraDeLinhasOGMA
GO
CREATE PROCEDURE SP_ExportacaoXML_AdicoesGeraDeLinhasOGMA @Ano int, @Codigo int, @CodDeclarante varchar(6), @ParteResto bit, @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), @DocumentoXML xml(XMLSC_DeclaracoesExpToGIDWin)
	DECLARE @TblTmpLinhas TABLE(
		LIN_IDEN int NOT NULL IDENTITY(1, 1), 
		APA_CODI varchar(22) NOT NULL,
		APA_DESG varchar(150) NOT NULL, 
		PAI_CODI varchar(2) NULL,
		LIN_MBRT decimal(28, 6) NOT NULL,
		LIN_MLIQ decimal(28, 6) NOT NULL,
		LIN_REGI varchar(4) NOT NULL,
		LIN_QUNI decimal(28, 6) NOT NULL,
		LIN_MONT decimal(28, 6) NOT NULL,
		UME_CODI varchar(2) NOT NULL,
		LIN_VOLS decimal(28, 6) NOT NULL)
	DECLARE @TblTmpPrecedentes TABLE(
		PRE_IDEN int NOT NULL IDENTITY(1, 1),	
		LIN_IDEN int NOT NULL, 
		PRE_NDOC varchar(20) NOT NULL,
		PRE_DDOC datetime NOT NULL)
	DECLARE @TblTmpRegimes TABLE(
		REG_IDEN int NOT NULL IDENTITY(1, 1),	
		LIN_IDEN int NOT NULL,
		REG_NPRE varchar(20) NOT NULL,
		REG_ADIC int NOT NULL,  
		REG_PPAU varchar(22) NOT NULL,
		REG_QTDE decimal(28, 6) NOT NULL)
	DECLARE @IdLinha bigint, @TotalPrecedentes int, @NumPrecedentesIguais int, @CodArtigo varchar(22), @DesignacaoArtigo varchar(150), @CodPaisOrigem varchar(2), 
		@MassaBrt decimal(28, 6), @MassaLiq decimal(28, 6), @Regime varchar(4), @QtdUnidades decimal(28, 6), @Montante decimal(28, 6), @CodUnidMedida varchar(2), 
		@Volumes decimal(28, 6), @NumeroDocPrecedente varchar(20), @DataDocPrecedente datetime, @AdicaoPrecedente int, @CodPautalPrecedente varchar(22), 
		@QtdPrecedente decimal(28, 6), @NumAdicao int, @TotalAdicoes int, @IdRegimePrec int
-- inicia processo para geração de adições a partir de linhas OGMA
	BEGIN TRY	
		SET @NumErro = 0
		SET @TotalAdicoes = 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 as linhas OGMA da declaração já associadas a artigo pautal para globalização
		DECLARE Linhas CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT apa.APA_CODI, apa.APA_DESG, pai.PAI_CODI, lin.massaBruta, lin.massaLiquida, lin.observacoes, lin.unidades, lin.montante, ume.UME_CODI, lin.volumes, 
				lin.numeroOrdem, lin.dataOrdem, lin.numeroAdPrec, lin.codigoPautalPrec, lin.quantidade
			FROM PRO_EXML AS exm WITH(NOLOCK)
				INNER JOIN tb_TBL_LinhasOGMA AS lin WITH(NOLOCK) ON exm.EXM_IDTY = lin.id_declaracaoEXP
				INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON lin.id_artigo = apa.APA_IDTY
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON lin.id_paisOrigem = pai.PAI_IDTY
				INNER JOIN TAB_UMED AS ume WITH(NOLOCK) ON lin.id_unidadeMedida = ume.UME_IDTY
			WHERE exm.EXM_EANO = @Ano AND exm.EXM_CODI = @Codigo AND exm.DEC_CODI = @CodDeclarante AND lin.id_artigo IS NOT NULL
			ORDER BY apa.APA_CODI, pai.PAI_CODI, lin.observacoes, ume.UME_CODI
		OPEN Linhas
		FETCH NEXT FROM Linhas INTO @CodArtigo, @DesignacaoArtigo, @CodPaisOrigem, @MassaBrt, @MassaLiq, @Regime, @QtdUnidades, @Montante, @CodUnidMedida, @Volumes, 
			@NumeroDocPrecedente, @DataDocPrecedente, @AdicaoPrecedente, @CodPautalPrecedente, @QtdPrecedente
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			SET @IdLinha = NULL
			SET @TotalPrecedentes = 0
			SET @NumPrecedentesIguais = 0
			SET @IdRegimePrec = NULL
-- obtem dados referente ao artigo/pais origem/regime/unidade medida para globalização
			SELECT @IdLinha = MAX(lin.LIN_IDEN), @TotalPrecedentes = COUNT(*), @NumPrecedentesIguais = COUNT((CASE WHEN (pre.PRE_NDOC = @NumeroDocPrecedente) AND (pre.PRE_DDOC = @DataDocPrecedente) THEN 1 ELSE NULL END))
			FROM @TblTmpLinhas AS lin
				LEFT OUTER JOIN @TblTmpPrecedentes AS pre ON lin.LIN_IDEN = pre.LIN_IDEN
			WHERE APA_CODI = @CodArtigo AND PAI_CODI = @CodPaisOrigem AND LIN_REGI = @Regime AND UME_CODI = @CodUnidMedida
			GROUP BY lin.LIN_IDEN		
-- se artigo/pais origem/regime/unidade medida ainda não existe ou já existe mas já tem 99 precedentes associados, insere nova linha
			IF (@IdLinha IS NULL) OR ((@TotalPrecedentes = 99) AND (@NumPrecedentesIguais = 0))
			BEGIN		
				INSERT INTO @TblTmpLinhas(APA_CODI, APA_DESG, PAI_CODI, LIN_MBRT, LIN_MLIQ, LIN_REGI, LIN_QUNI, LIN_MONT, UME_CODI, LIN_VOLS)		
				VALUES(@CodArtigo, @DesignacaoArtigo, @CodPaisOrigem, @MassaBrt, @MassaLiq, @Regime, @QtdUnidades, @Montante, @CodUnidMedida, @Volumes)	
				SET @IdLinha = SCOPE_IDENTITY()
			END
			ELSE
			BEGIN
				UPDATE @TblTmpLinhas SET 
					LIN_MBRT = LIN_MBRT + @MassaBrt, 
					LIN_MLIQ = LIN_MLIQ + @MassaLiq, 
					LIN_QUNI = LIN_QUNI + @QtdUnidades, 
					LIN_MONT = LIN_MONT + @Montante, 
					LIN_VOLS = LIN_VOLS + @Volumes
				WHERE LIN_IDEN = @IdLinha
			END	
-- insere precedente se este ainda não existe na linha
			IF NOT EXISTS(SELECT PRE_IDEN FROM @TblTmpPrecedentes WHERE LIN_IDEN = @IdLinha AND PRE_NDOC = @NumeroDocPrecedente AND PRE_DDOC = @DataDocPrecedente)
			BEGIN
				INSERT @TblTmpPrecedentes(LIN_IDEN, PRE_NDOC, PRE_DDOC)
				VALUES(@IdLinha, @NumeroDocPrecedente, @DataDocPrecedente)
			END
-- obtem dados do regime precedente na linha
			SELECT @IdRegimePrec = REG_IDEN 
			FROM @TblTmpRegimes 
			WHERE LIN_IDEN = @IdLinha AND REG_NPRE = @NumeroDocPrecedente AND REG_ADIC = @AdicaoPrecedente AND REG_PPAU = @CodPautalPrecedente
-- insere regime se este ainda não existe na linha
			IF @IdRegimePrec IS NULL
			BEGIN
				INSERT @TblTmpRegimes(LIN_IDEN, REG_NPRE, REG_ADIC, REG_PPAU, REG_QTDE)
				VALUES(@IdLinha, @NumeroDocPrecedente, @AdicaoPrecedente, @CodPautalPrecedente, @QtdPrecedente)
			END
			ELSE
			BEGIN
				UPDATE @TblTmpRegimes SET 
					REG_QTDE = REG_QTDE + @QtdPrecedente
				WHERE REG_IDEN = @IdRegimePrec
			END
			FETCH NEXT FROM Linhas INTO @CodArtigo, @DesignacaoArtigo, @CodPaisOrigem, @MassaBrt, @MassaLiq, @Regime, @QtdUnidades, @Montante, @CodUnidMedida, @Volumes, 
				@NumeroDocPrecedente, @DataDocPrecedente, @AdicaoPrecedente, @CodPautalPrecedente, @QtdPrecedente
		END
		CLOSE Linhas
		DEALLOCATE Linhas
-- obtem o total de adições apuradas
		SELECT @TotalAdicoes = COUNT(*)
		FROM @TblTmpLinhas
-- constroi XML para edição da declaração Exportação/XML com adições sendo as linhas OGMA
		SELECT @DocumentoXML = 
			(SELECT
				(SELECT 'U' AS "@Acao", 
					exm.EXM_TPRO AS "TipoProcedimento",
					exm.NDE_CODI AS "CodNatureza", 
					exm.DEC_CODI AS "CodOperador", 
					(CONVERT(varchar(10), exm.EXM_DATA, 127) + 'Z') AS "Data",					
					exm.EAD_CODA AS "CodEstanciaA", 
					exm.TDE_COD1 AS "CodTipoDeclaracao", 									
					(SELECT 					
						NULLIF(exm.CLI_NOM2, '') AS "Nome",
						NULLIF(exm.CLI_MOR2, '') AS "Morada"
					FOR XML PATH('Expedidor'), TYPE),					
					(SELECT 						
						NULLIF(exm.FOR_NOM8, '') AS "Nome",
						NULLIF(exm.FOR_MOR8, '') AS "Morada"
					FOR XML PATH('Destinatario'), TYPE), 						
					exm.EAD_CO29 AS "CodEstanciaTAC", 					
					exm.PAI_CO22 AS "CodPais", 
					CAST(exm.EXM_TFRT as numeric(28, 6)) AS "TotalFrete", 
					CAST(exm.EXM_TSEG as numeric(28, 6)) AS "TotalSeguro", 		
					(SELECT 
						(SELECT 
							'EXM_CODI' AS "CodigoCampoExtra", 
							exm.EXM_CODI AS "ValorCampoExtra"
						FOR XML PATH('CampoExtra'), TYPE)
					FOR XML PATH('CamposExtra'), TYPE), 											
					(SELECT 
						adi.LIN_NUME AS "NumeroAdicao", 
						adi.APA_CODI AS "CodArtigo", 
						adi.APA_DESG AS "DesignacaoArtigo", 
						adi.PAI_CODI AS "CodPaisOrigem", 
						CAST(adi.LIN_MBRT AS numeric(28, 6)) AS "MassaBruta", 
						CAST(adi.LIN_MLIQ AS numeric(28, 6)) AS "MassaLiquida",						
						adi.LIN_REGI AS "Regime", 							
						CAST(adi.LIN_QUNI AS numeric(28, 6)) AS "QtdUnidades", 
						CAST(adi.LIN_MONT AS numeric(28, 6)) AS "ValorAdicao", 
						CAST(0 AS numeric(28, 6)) AS "ValorFrete", 
						CAST(0 AS numeric(28, 6)) AS "ValorSeguro", 							
						(SELECT 									
							'Z' AS "Tipo", 
							doc.DOC_CODI AS "CodDocumento", 						
							pre.PRE_NDOC AS "RefDocumento", 						
							'PT' AS "CodPais", 
							(CONVERT(varchar(10), pre.PRE_DDOC, 127) + 'Z') AS "DataDocumento"
						FROM @TblTmpPrecedentes AS pre
							INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'IM' AND doc.DOC_EXPT = 1
						WHERE pre.LIN_IDEN = adi.LIN_IDEN
						FOR XML PATH('DocPrecedente'), ROOT('DocsPrecedentes'), TYPE), 														
						(SELECT 
							rpr.REG_NPRE AS "NumeroDocPrecedente", 
							rpr.REG_ADIC AS "AdicaoDocPrecedente", 
							rpr.REG_PPAU AS "CodArtigoPautal", 
							CAST(rpr.REG_QTDE AS numeric(28, 6)) AS "Quantidade", 
							ume.UME_CODI AS "CodUnidMedida"
						FROM @TblTmpRegimes AS rpr 
							INNER JOIN TAB_UMED AS ume WITH(NOLOCK) ON ume.UME_CODI = 'NAR' AND ume.UME_EXPT = 1
						WHERE rpr.LIN_IDEN = adi.LIN_IDEN
						FOR XML PATH('RegimeEconomico'), ROOT('RegimesEconomicos'), TYPE), 														
						(SELECT 
							doc.DOC_CODI AS "CodDocumento",
							NULLIF(t.CLD_NDOC, '') AS "NumeroReferencia", 
							(CONVERT(varchar(10), t.CLD_DDOC, 127) + 'Z') AS "DataEmissao"
						FROM TAB_DOCU AS doc WITH(NOLOCK) 
							INNER JOIN (SELECT DOC_CODI, CLD_NDOC, CLD_DDOC
										FROM TAB_CLDO WITH(NOLOCK) 
										WHERE CLD_UEXP = 1 AND CLI_CODI = exm.CLI_COD2 AND adi.LIN_NUME = 1
										UNION ALL
										SELECT DOC_CODI, NULLIF(exm.EXM_REF1, ''), NULL
										FROM TAB_DOCU WITH(NOLOCK) 
										WHERE DOC_EXPT = 1 AND DOC_CODI = 'N325' AND adi.LIN_NUME = 1
										UNION ALL
										SELECT DOC_CODI, NULLIF(exm.EXM_CPRT, ''), NULL
										FROM TAB_DOCU WITH(NOLOCK) 
										WHERE DOC_EXPT = 1 AND DOC_CODI = 'N740' AND adi.LIN_NUME = 1
										UNION ALL
										SELECT doc.DOC_CODI, (CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END), (CASE doc.DOC_TDDT WHEN 1 THEN exm.EXM_DATA ELSE NULL END)
										FROM TAB_APAU AS apa WITH(NOLOCK) 
											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
										WHERE ado.ADC_UEXP = 1 AND apa.APA_CODI = adi.APA_CODI
										UNION ALL
										SELECT DOC_CODI, 'Conforme lista anexa', @DataAtual
										FROM TAB_DOCU WITH(NOLOCK) 
										WHERE DOC_EXPT = 1 AND DOC_CODI = 'N960'
										UNION ALL
										SELECT doc.DOC_CODI, (CASE doc.DOC_TDNU WHEN 1 THEN 'S/N' WHEN 2 THEN 'N/A' WHEN 3 THEN 'DEC' ELSE NULL END), (CASE doc.DOC_TDDT WHEN 1 THEN exm.EXM_DATA ELSE NULL END)
										FROM TAB_APAU AS apa WITH(NOLOCK) 													
											INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'Y901'
										WHERE apa.APA_DPUT = 1 AND apa.APA_CODI = adi.APA_CODI
									) AS t ON doc.DOC_CODI = t.DOC_CODI
						WHERE doc.DOC_EXPT = 1
						FOR XML PATH('Documento'), ROOT('Documentos'), TYPE), 							
						(SELECT 
							men.INF_CODI AS "CodMencao"
						FROM TAB_INFC AS men WITH(NOLOCK)
							INNER JOIN (SELECT INF_CODI
										FROM TAB_INFC WITH(NOLOCK)
										WHERE INF_EXPT = 1 AND INF_CODI = 'CCE' AND adi.LIN_NUME = 1 AND ISNULL(exm.EXM_Q30C, 0) > 0
										UNION ALL
										SELECT INF_CODI
										FROM TAB_INFC WITH(NOLOCK)
										WHERE INF_EXPT = 1 AND INF_CODI = 'CC' AND adi.LIN_NUME = 1 AND ISNULL(exm.EXM_Q30C, 0) = 0 AND ISNULL(exm.EXM_MR30, '') <> ''
										UNION ALL
										SELECT INF_CODI
										FROM TAB_INFC WITH(NOLOCK)
										WHERE INF_EXPT = 1 AND INF_CODI = '30400' AND adi.LIN_NUME = 1 AND ISNULL(exm.EAD_CO29, '') <> 'PT' AND exm.EAD_CODA <> ISNULL(exm.EAD_CO29, '') AND ISNULL(exm.EAD_C29A, '') = ''
										UNION ALL
										SELECT INF_CODI
										FROM TAB_INFC WITH(NOLOCK)
										WHERE INF_EXPT = 1 AND INF_CODI = 'PROC' AND adi.LIN_NUME = 1 AND ISNULL(exm.EXM_TP14, 0) = 2
										UNION ALL
										SELECT INF_CODI
										FROM TAB_INFC WITH(NOLOCK)
										WHERE INF_EXPT = 1 AND INF_CODI = 'EORI' AND adi.LIN_NUME = 1
										UNION ALL
										SELECT men.INF_CODI
										FROM TAB_APAU AS apa WITH(NOLOCK) 
											INNER JOIN TAB_AMEN AS ame WITH(NOLOCK) ON apa.APA_CHVE = ame.APA_CHVE
											INNER JOIN TAB_INFC AS men WITH(NOLOCK) ON ame.INF_CODI = men.INF_CODI
										WHERE ame.AME_UEXP = 1 AND apa.APA_CODI = adi.APA_CODI
							) AS t ON men.INF_CODI = t.INF_CODI
						WHERE men.INF_EXPT = 1
						FOR XML PATH('MencaoEspecial'), ROOT('MencoesEspeciais'), TYPE), 																																																											
						(SELECT 									
							tem.TEM_CODI AS "CodNaturezaVols", 
							CAST(adi.LIN_VOLS AS numeric(28, 6)) AS "NumeroVols", 						
							(CASE WHEN (@ParteResto = 1) AND (adi.LIN_NUME <> @TotalAdicoes) THEN 1 ELSE 0 END) AS "P", 						
							(CASE WHEN (@ParteResto = 1) AND (adi.LIN_NUME = @TotalAdicoes) THEN 1 ELSE 0 END) AS "R"									
						FROM TAB_TEMB AS tem WITH(NOLOCK)
						WHERE tem.TEM_CODI = adi.UME_CODI AND tem.TEM_EXPT = 1	
						FOR XML PATH('MarcaEVolume'), ROOT('MarcasEVolumes'), TYPE)							
					FROM (SELECT ROW_NUMBER() OVER(ORDER BY LIN_IDEN) AS LIN_NUME, LIN_IDEN, APA_CODI, APA_DESG, PAI_CODI, LIN_MBRT, LIN_MLIQ, LIN_REGI, LIN_QUNI, LIN_MONT, LIN_VOLS, UME_CODI
						FROM @TblTmpLinhas) AS adi
					FOR XML PATH('Adicao'), ROOT('Adicoes'), TYPE)					
				FROM PRO_EXML AS exm WITH(NOLOCK) 
				WHERE EXM_EANO = @Ano AND EXM_CODI = @Codigo AND DEC_CODI = @CodDeclarante									
				FOR XML PATH('Declaracao'), TYPE)
			FOR XML PATH('DeclaracoesExpToGIDWin'), ELEMENTS)
-- processa a atualização da declaração para inserir as adições apuradas
		EXEC @NumErro = SP_ExportacaoXML_GeraDeclaracoesDeXML @DocumentoXML, @CodUtilizador, @Erro OUTPUT
		IF @NumErro > 0
			RAISERROR ('Erro na inserção de adições na declaração: %s', 16, 1, @Erro)		
-- inicia o número da adição em todas as linhas OGMA
		UPDATE tb_TBL_LinhasOGMA SET numeroAdicao = NULL
		FROM tb_TBL_LinhasOGMA AS lin WITH(NOLOCK)
			INNER JOIN PRO_EXML AS exm WITH(NOLOCK) ON lin.id_declaracaoEXP = exm.EXM_IDTY
		WHERE exm.EXM_EANO = @Ano AND exm.EXM_CODI = @Codigo AND exm.DEC_CODI = @CodDeclarante AND lin.numeroAdicao IS NOT NULL
-- atribui a todas as linhas OGMA o respetivo número de adição
		DECLARE Adicoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT exa.EXA_LINH, lin.id
			FROM PRO_EXML AS exm WITH(NOLOCK)
				INNER JOIN PRO_EXAD AS exa WITH(NOLOCK) ON exm.EXM_EANO = exa.EXM_EANO AND exm.EXM_CODI = exa.EXM_CODI AND exm.DEC_CODI = exa.EXM_COPE
				INNER JOIN PRO_EXDS AS adp WITH(NOLOCK) ON exa.EXA_CHVE = adp.EXA_CHVE
				INNER JOIN PRO_EXMV AS amv WITH(NOLOCK) ON exa.EXA_CHVE = amv.EXA_CHVE
				INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON exa.APA_CO33 = apa.APA_CODI
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON exa.PAI_CODI = pai.PAI_CODI
				INNER JOIN TAB_UMED AS ume WITH(NOLOCK) ON amv.TEM_CODI = ume.UME_CODI
				INNER JOIN tb_TBL_LinhasOGMA AS lin WITH(NOLOCK) ON exm.EXM_IDTY = lin.id_declaracaoEXP AND apa.APA_IDTY = lin.id_artigo AND pai.PAI_IDTY = lin.id_paisOrigem AND exa.TDE_REGI = lin.observacoes AND ume.UME_IDTY = lin.id_unidadeMedida AND adp.EXD_DESC = lin.numeroOrdem				
			WHERE exm.EXM_EANO = @Ano AND exm.EXM_CODI = @Codigo AND exm.DEC_CODI = @CodDeclarante			
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @NumAdicao, @IdLinha
		WHILE @@FETCH_STATUS = 0
		BEGIN			
			UPDATE tb_TBL_LinhasOGMA SET numeroAdicao = @NumAdicao
			WHERE id = @IdLinha
			FETCH NEXT FROM Adicoes INTO @NumAdicao, @IdLinha
		END
		CLOSE Adicoes
		DEALLOCATE Adicoes					
	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_ExportacaoXML_AdicoesGeraDeLinhasOGMA TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirTransportInformation') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirTransportInformation
GO
CREATE PROCEDURE sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirTransportInformation @AnoManifesto int, @NumManifesto int, @AcaoMensagem varchar(10), @FicheiroXML xml OUTPUT WITH ENCRYPTION AS
BEGIN 
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @DataAtual datetime, @CfgAbrevEmpresa varchar(3), @NomeBDParaSDSExportacao varchar(8), @SQLSelect varchar(MAX)
	DECLARE @TblDadosSDSExportacao TABLE(DSC_TIPO int NOT NULL, DSC_IDRP varchar(20) NOT NULL, DSC_IDTP varchar(20) NOT NULL, DSC_NRAP varchar(40) NOT NULL, 
		EAD_CODI varchar(8) NOT NULL, DSC_NCMF varchar(8) NOT NULL, DSC_NCMV varchar(6) NOT NULL, DSC_NVOO varchar(35) NULL, DSC_IDEN int NOT NULL, DSC_DPRV datetime NULL, 
		DSC_PPRV numeric(38, 6) NOT NULL, DSC_VPRV int NOT NULL, DSC_DEFT datetime NULL, DSC_IDCM varchar(20) NOT NULL, PAE_CLIS varchar(8) NULL, PAI_CLIS varchar(2) NULL, 
		PAE_COPO varchar(8) NULL, PAI_COPO varchar(2) NULL)	
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem o nome da tipologia de empresa definida nos Campos Adicionais dos Parâmetros de Despachos
	SELECT TOP 1 @CfgAbrevEmpresa = (CASE PDE_CADI WHEN 1 THEN 'FED' WHEN 2 THEN 'UPS' WHEN 3 THEN 'DHL' ELSE NULL END)
	FROM TAB_PDES WITH(NOLOCK)
-- obtem o nome da BD de Manifestos SDS de Exportação dos Parâmetros SDS - Via Aérea
	SELECT TOP 1 @NomeBDParaSDSExportacao = ISNULL((CASE PSD_BDEX WHEN 1 THEN (NULLIF(PSD_NBDE, '') + '..') ELSE NULL END), '')
	FROM TAB_PSDS WITH(NOLOCK)
-- constroi o SELECT para obtenção dos dados do Manifesto SDS de Exportação, quer seja na própria BD ou em BD diferente
	SET @SQLSelect = 'SELECT sde.DSC_TIPO, sde.DSC_IDRP, sde.DSC_IDTP, sde.DSC_NRAP, sde.EAD_CODI, sde.DSC_NCMF, sde.DSC_NCMV, sde.DSC_NVOO, sde.DSC_IDEN, sde.DSC_DPRV, sde.DSC_PPRV, sde.DSC_VPRV, sde.DSC_DEFT, 
			sde.DSC_IDCM, ele.PAE_CODI, ele.PAI_CODI, epe.PAE_CODI, epe.PAI_CODI
		FROM PRO_SDSC AS sds WITH(NOLOCK) 				
			INNER JOIN ' + @NomeBDParaSDSExportacao + 'TAB_PSDS AS psd WITH(NOLOCK) ON 1 = 1			
			INNER JOIN ' + @NomeBDParaSDSExportacao + 'PRO_SDSC AS sde WITH(NOLOCK) ON sde.DSC_TIPO = 1 AND sds.DSC_IDCM = sde.DSC_IDCM	
			LEFT OUTER JOIN ' + @NomeBDParaSDSExportacao + 'TAB_PAER AS ele WITH(NOLOCK) ON psd.PAE_CODI = ele.PAE_CODI
			LEFT OUTER JOIN ' + @NomeBDParaSDSExportacao + 'TAB_PAER AS epe WITH(NOLOCK) ON psd.PAE_CODI1 = epe.PAE_CODI
		WHERE sds.DSC_EANO = ' + LTRIM(STR(@AnoManifesto, 4)) + ' AND sds.DSC_NPRO = ' + LTRIM(STR(@NumManifesto, 20))
-- insere os dados do Manifesto SDS de Exportação da própria BD ou da BD diferente na tabela tmp
	INSERT INTO @TblDadosSDSExportacao(DSC_TIPO, DSC_IDRP, DSC_IDTP, DSC_NRAP, EAD_CODI, DSC_NCMF, DSC_NCMV, DSC_NVOO, DSC_IDEN, DSC_DPRV, DSC_PPRV, DSC_VPRV, DSC_DEFT, 
		DSC_IDCM, PAE_CLIS, PAI_CLIS, PAE_COPO, PAI_COPO)
	EXEC (@SQLSelect)	
-- constroi XML para ficheiro XML da mensagem AirTransportInformation
	;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirTransportInformation' AS ns, 'http://simtem.at.gov.pt/WS/AirTypes' AS t)
	SELECT @FicheiroXML = 						
		(SELECT
			(SELECT
				(CAST(sds.DSC_EANO AS varchar(4)) + 'M' + CAST(sds.DSC_NPRO AS varchar(20)) + sds.EAD_CODI) AS "t:Identification", 				
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @DataAtual), 120) AS "t:DateAndTime",
				NULLIF(sds.DSC_IDTR, '') AS "t:Sender", 
				NULLIF(sds.DSC_IDRP, '') AS "t:PersonLodging"
			FOR XML PATH('ns:MessageInformation'), TYPE),
			(SELECT
				sds.DSC_IDCM AS "ns:LocalReferenceNumber", 
				(SELECT 			
					sds.EAD_CODI AS "t:ReferenceNumber"
				FOR XML PATH('ns:SupervisingCustomsOffice'), TYPE), 
				(CASE WHEN @AcaoMensagem IN ('Update', 'Annul') THEN (sds.DSC_NCMF + sds.DSC_NCMV) ELSE NULL END) AS "ns:CustomsReferenceNumber",
				@AcaoMensagem AS "ns:Action", 
				(CASE @AcaoMensagem WHEN 'Update' THEN 'Alteracao Elementos. ' WHEN 'Annul' THEN 'Voo Cancelado. ' ELSE NULL END) AS "ns:Justification"				
			FOR XML PATH('ns:CustomsProcess'), TYPE),	
			(SELECT			
				'ANA' AS "ns:AirportAuthorityCode", 
				(CASE sds.EAD_CODI WHEN 'PT000020' THEN 'PTOPO' ELSE 'PTLIS' END) AS "ns:AirportCode",
				(@CfgAbrevEmpresa + sds.DSC_IDCM) AS "ns:AirportAuthorityReferenceNumber"
			FOR XML PATH('ns:AirportAuthorityProcess'), TYPE),	
			(SELECT
				'AirTransport' AS "ns:TransportType", 
				'41' AS "ns:TypeOfIdentification", 
				ISNULL(NULLIF(sds.DSC_NVOO, ''), sde.DSC_NVOO) AS "ns:TransportIdentification"
			FOR XML PATH('ns:Transport'), TYPE),	
			(SELECT
				(SELECT
					t.FlightNumber AS "ns:FlightNumber"
				FROM (SELECT sds.DSC_IDEN AS ManifestType, sds.DSC_NVOO AS FlightNumber
					UNION ALL					
					SELECT sde.DSC_IDEN AS ManifestType, sde.DSC_NVOO AS FlightNumber) AS t
				WHERE t.ManifestType IS NOT NULL AND ISNULL(FlightNumber, '') <> ''
				FOR XML PATH(''), TYPE),
				(SELECT
					t.FlightNumberType AS "ns:FlightNumberType"
				FROM (SELECT sds.DSC_IDEN AS ManifestType, 'MainArrivalFlightNumber' AS FlightNumberType
					UNION ALL					
					SELECT sde.DSC_IDEN AS ManifestType, 'MainDepartureFlightNumber' AS FlightNumberType) AS t
				WHERE t.ManifestType IS NOT NULL
				FOR XML PATH(''), TYPE),				
				'CargoMailScheduled' AS "ns:FlightType", 
				(SELECT
					t.TraficDistributionType AS "ns:TraficDistribution"
				FROM (SELECT sds.DSC_IDEN AS ManifestType, 'Arrival' AS TraficDistributionType
					UNION ALL					
					SELECT sde.DSC_IDEN AS ManifestType, 'Departure' AS TraficDistributionType) AS t
				WHERE t.ManifestType IS NOT NULL
				FOR XML PATH(''), TYPE),				
				'InSchengen' AS "ns:FlightClassification", 
				'ComercialScale' AS "ns:OperationType", 
				'Cargo' AS "ns:AirPlaneType", 
				'CargoMailSchedule' AS "ns:Nature"
			FOR XML PATH('ns:Flight'), TYPE),
			(SELECT
				(SELECT
					'C525' AS "ns:Type", 
					sds.DSC_NRAP AS "ns:ReferenceNumber"
				HAVING ISNULL(sds.DSC_NRAP, '') <> ''
				FOR XML PATH('ns:AuthorisationAtEntry'), TYPE),		
				(SELECT
					'C525' AS "ns:Type", 
					sde.DSC_NRAP AS "ns:ReferenceNumber"
				HAVING ISNULL(sde.DSC_NRAP, '') <> ''
				FOR XML PATH('ns:AuthorisationAtExit'), TYPE)
			FOR XML PATH('ns:Authorisations'), TYPE),
			(SELECT
				(CASE WHEN sds.DSC_IDEN IS NULL THEN NULL ELSE (CASE sds.EAD_CODI WHEN 'PT000020' THEN (ISNULL(epi.PAI_CODI, '') + epi.PAE_CODI) ELSE (ISNULL(eli.PAI_CODI, '') + eli.PAE_CODI) END) END) AS "ns:OriginAirportCode", 
				(CASE WHEN sde.DSC_IDEN IS NULL THEN NULL ELSE (CASE sde.EAD_CODI WHEN 'PT000020' THEN (ISNULL(sde.PAI_COPO, '') + sde.PAE_COPO) ELSE (ISNULL(sde.PAI_CLIS, '') + sde.PAE_CLIS) END) END) AS "ns:DestinyAirportCode" 
			FOR XML PATH('ns:Route'), TYPE), 
			(SELECT
				(CASE sds.EAD_CODI WHEN 'PT000020' THEN psd.LME_CODI1 ELSE psd.LME_CODI END) AS "ns:EstimatedPlaceOfArrival", 
				(CASE WHEN sds.DSC_DEFT IS NOT NULL THEN (CASE sds.EAD_CODI WHEN 'PT000020' THEN psd.LME_CODI1 ELSE psd.LME_CODI END) ELSE NULL END) AS "ns:ConfirmedPlaceOfArrival", 
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), sds.DSC_DPRV), 120) AS "ns:EstimatedDateAndTimeOfArrival",
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), sds.DSC_DEFT), 120) AS "ns:ConfirmedDateAndTimeOfArrival", 
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), sds.DSC_DEFT), 120) AS "ns:ActualDateAndTimeOfArrival"						
			HAVING sds.DSC_IDEN IS NOT NULL
			FOR XML PATH('ns:Arrival'), TYPE),
			(SELECT
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), sde.DSC_DPRV), 120) AS "ns:EstimatedDateAndTimeOfDeparture", 
				CONVERT(varchar(19), DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), sde.DSC_DEFT), 120) AS "ns:ActualDateAndTimeOfDeparture"
			HAVING sde.DSC_IDEN IS NOT NULL
			FOR XML PATH('ns:Departure'), TYPE), 
			(SELECT
				(SELECT
					t.TraficDistributionType AS "ns:ManifestType"
				FROM (SELECT sds.DSC_IDEN AS ManifestType, 'Unload' AS TraficDistributionType
					UNION ALL					
					SELECT sde.DSC_IDEN AS ManifestType, 'Load' AS TraficDistributionType) AS t
				WHERE t.ManifestType IS NOT NULL
				FOR XML PATH(''), TYPE),				
				'Combined' AS "ns:CargoType", 
				(CASE WHEN sde.DSC_IDEN IS NULL THEN NULL ELSE (CASE sde.EAD_CODI WHEN 'PT000020' THEN psd.LME_CODI1 ELSE psd.LME_CODI END) END) AS "ns:LoadPlace", 
				(CASE WHEN sds.DSC_IDEN IS NULL THEN NULL ELSE (CASE sds.EAD_CODI WHEN 'PT000020' THEN psd.LME_CODI1 ELSE psd.LME_CODI END) END) AS "ns:UnloadPlace", 
				ISNULL(sde.DSC_PPRV, 0.000000) AS "ns:LoadTotalGrossMass", 
				ISNULL(sde.DSC_VPRV, 0) AS "ns:LoadTotalNumberOfPackages", 
				ISNULL(sds.DSC_PPRV, 0.000000) AS "ns:UnloadTotalGrossMass", 
				ISNULL(sds.DSC_VPRV, 0) AS "ns:UnloadTotalNumberOfPackages", 
				0 AS "ns:UnloadTotalNumberOfMailBags", 				
				0 AS "ns:TranshipmentTotalNumberOfMailBags", 				
				0.000000 AS "ns:TransitTotalGrossMass", 
				0 AS "ns:TransitTotalNumberOfPackages"
			FOR XML PATH('ns:Manifests'), TYPE),
			(SELECT
				(SELECT
					t.RoleName AS "ns:Role", 
					'EORI' AS "ns:IdentificationType", 					
					t.RoleIdentificationNr AS "ns:IdentificationNumber"
				FROM (SELECT 'EntryAirCompany' AS RoleName, sds.DSC_IDTP AS RoleIdentificationNr
					UNION ALL					
					SELECT 'ExitAirCompany' AS RoleName, sde.DSC_IDTP AS RoleIdentificationNr
					UNION ALL
					SELECT 'EntryDeclarant' AS RoleName, sds.DSC_IDRP AS RoleIdentificationNr
					UNION ALL					
					SELECT 'ExitDeclarant' AS RoleName, sde.DSC_IDRP AS RoleIdentificationNr) AS t				
				WHERE ISNULL(t.RoleIdentificationNr, '') <> ''
				FOR XML PATH('ns:Operator'), TYPE)
			FOR XML PATH('ns:Operators'), TYPE), 
			(SELECT 
				(SELECT
					ISNULL(NULLIF(psd.PSD_EEED, ''), ISNULL(sds.DSC_IDTP, sde.DSC_IDTP)) AS "ns:CargoAgentName", 
					ISNULL(sds.DSC_IDTP, sde.DSC_IDTP) AS "ns:CargoAgentIdentification", 
					ISNULL(sde.DSC_PPRV, 0.000000) AS "ns:LoadGrossMass", 
					ISNULL(sde.DSC_VPRV, 0) AS "ns:LoadNumberOfPackages", 
					ISNULL(sds.DSC_PPRV, 0.000000) AS "ns:UnloadGrossMass", 
					ISNULL(sds.DSC_VPRV, 0) AS "ns:UnloadNumberOfPackages", 
					0.000000 AS "ns:TransitGrossMass", 
					0 AS "ns:TransitNumberOfPackages"
				FOR XML PATH('ns:CargoAgent'), TYPE)
			FOR XML PATH('ns:CargoAgents'), TYPE)
		FROM PRO_SDSC AS sds WITH(NOLOCK) 				
			LEFT OUTER JOIN TAB_PSDS AS psd WITH(NOLOCK) ON 1 = 1			
			LEFT OUTER JOIN TAB_PAER AS eli WITH(NOLOCK) ON psd.PAE_CODI = eli.PAE_CODI
			LEFT OUTER JOIN TAB_PAER AS epi WITH(NOLOCK) ON psd.PAE_CODI1 = epi.PAE_CODI
			LEFT OUTER JOIN @TblDadosSDSExportacao AS sde ON sde.DSC_TIPO = 1 AND sds.DSC_IDCM = sde.DSC_IDCM			
		WHERE sds.DSC_EANO = @AnoManifesto AND sds.DSC_NPRO = @NumManifesto
		FOR XML PATH('ns:AirTransportInformation'), ELEMENTS)
END
GO
GRANT EXECUTE ON sp_SDSViaAerea_Manifestos_MensagemGeraXMLAirTransportInformation 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) 
		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_SDSViaAerea_Manifestos_MensagemIntegraAirTransportStatus') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirTransportStatus
GO
CREATE PROCEDURE sp_SDSViaAerea_Manifestos_MensagemIntegraAirTransportStatus @MensagemXML xml, @Utilizador varchar(30), @IdMensagem varchar(35) OUTPUT, @SucessoMensagem varchar(10) OUTPUT, 
	@ContramarcaMensagem varchar(14) OUTPUT, @AnoManifesto int OUTPUT, @NumManifesto int OUTPUT, @AWBIntegradasXML xml OUTPUT, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON
	SET DATEFORMAT DMY
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime
	DECLARE @DataMsgXML datetime, @IdManifestoMsgXML varchar(35), @EstadoContramarcaMsgXML varchar(15), @ErrosMsgXML xml, @AlertasMsgXML xml
	DECLARE @EstadoManifesto varchar(3), @ErrosManifesto varchar(MAX)		
-- inicia transacção para integração da mensagem AirManifestResponse
	BEGIN TRANSACTION tSDSIntMsgAirTransportStatus
	BEGIN TRY	
		SET @NumErro = 0	
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- obtem dados da mensagem XML	
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirTransportStatus' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT 			
			@IdMensagem = f.m.value('(ns2:MessageInformation/Identification)[1]', 'varchar(35)'), 
			@DataMsgXML = f.m.value('(ns2:MessageInformation/DateAndTime)[1]', 'datetime'), 
			@IdManifestoMsgXML = f.m.value('(ns2:MessageCorrelationInformation/Identification)[1]', 'varchar(35)'), 
			@SucessoMensagem = f.m.value('(ns2:MessageCorrelationInformation/Success)[1]', 'varchar(10)'), 
			@ContramarcaMensagem = f.m.value('(ns2:CustomsProcess/CustomsReferenceNumber)[1]', 'varchar(14)'), 
			@EstadoContramarcaMsgXML = f.m.value('(ns2:CustomsProcess/CurrentCustomsProcessState)[1]', 'varchar(15)'), 			
			@ErrosMsgXML = f.m.query('ns2:Errors'), 
			@AlertasMsgXML = f.m.query('ns2:Warnings')
		FROM @MensagemXML.nodes('ns2:AirTransportStatus') AS f(m)		
-- extrai ano e número de manifesto 
		IF ISNULL(@IdManifestoMsgXML, '') <> ''
		BEGIN
			SET @AnoManifesto = CAST(LEFT(@IdManifestoMsgXML, 4) AS int)
			SET @NumManifesto = CAST(SUBSTRING(@IdManifestoMsgXML, 6, LEN(@IdManifestoMsgXML) - 8 - 5) AS int)
		END
		ELSE
		BEGIN
			SELECT TOP 1 @AnoManifesto = DSC_EANO, @NumManifesto = DSC_NPRO
			FROM PRO_SDSC WITH(NOLOCK) 				
			WHERE DSC_NCMF = LEFT(@ContramarcaMensagem, 8) AND DSC_NCMV = RIGHT(@ContramarcaMensagem, 6)
			ORDER BY DSC_TIPO, DSC_IDEN DESC
		END
-- verifica se mensagem é válida para o manifesto SDS - Via Aérea
		IF NOT EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto)
			RAISERROR('Manifesto SDS - Via Aérea com ID "%s" e Contramarca "%s" inexistente.', 16, 1, @IdManifestoMsgXML, @ContramarcaMensagem)	
		ELSE
			IF EXISTS(SELECT 1 FROM PRO_SDSC WITH(NOLOCK) WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto AND DSC_RESP LIKE '%' + @IdMensagem + '%' AND DSC_RESP LIKE '%' + CONVERT(varchar(23), @DataMsgXML, 121) + '%')
				RAISERROR('Mensagem XML AirTransportStatus com ID "%s" já integrada no Manifesto SDS - Via Aérea com ID "%s" e Contramarca "%s".', 16, 2, @IdMensagem, @IdManifestoMsgXML, @ContramarcaMensagem)
-- calcula o estado da operação da contramarca do Manifesto SDS - Via Aérea
		IF ISNULL(@EstadoContramarcaMsgXML, '') IN ('PreActive', 'Provisional')
			SET	@EstadoManifesto = 'PRV' --Provisório
		ELSE
			IF ISNULL(@EstadoContramarcaMsgXML, '') IN ('Closed', 'Ultimate')
				SET	@EstadoManifesto = 'FIN' --Finalizado
			ELSE
				IF ISNULL(@EstadoContramarcaMsgXML, '') = 'Active'
					SET	@EstadoManifesto = 'ACT' --Ativo
				ELSE
					IF ISNULL(@EstadoContramarcaMsgXML, '') = 'Annul'
						SET	@EstadoManifesto = 'ANU' --Anulado
					ELSE
						SET	@EstadoManifesto = ''	
-- obtem os erros gerais do manifesto da mensagem XML		
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirTransportStatus' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT @ErrosManifesto = ISNULL(@ErrosManifesto, ' #Erros Gerais: ') + CHAR(13) + CHAR(10) + '		. ' + f.m.value('ErrorDescription[1]', 'varchar(250)')
		FROM @ErrosMsgXML.nodes('ns2:Errors/Error') AS f(m)
-- obtem somente a lista de erros e warnings
		;WITH XMLNAMESPACES ('http://simtem.at.gov.pt/WS/AirTransportStatus' AS ns2, DEFAULT 'http://simtem.at.gov.pt/WS/AirTypes')
		SELECT @ErrosMsgXML = @ErrosMsgXML.query('ns2:Errors/Error'), @AlertasMsgXML = @AlertasMsgXML.query('ns2:Warnings/Warning')
-- actualiza dados do manifesto SDS
		UPDATE PRO_SDSC SET 			
			DSC_NCMF = (CASE WHEN (ISNULL(@ContramarcaMensagem, '') <> '') AND (DSC_NCMF <> LEFT(@ContramarcaMensagem, 8)) THEN LEFT(@ContramarcaMensagem, 8) ELSE DSC_NCMF END), 
			DSC_NCMV = (CASE WHEN (ISNULL(@ContramarcaMensagem, '') <> '') AND (DSC_NCMV <> RIGHT(@ContramarcaMensagem, 6)) THEN RIGHT(@ContramarcaMensagem, 6) ELSE DSC_NCMV END),
			DSC_STCM = (CASE ISNULL(@SucessoMensagem, '') 
							WHEN 'No' THEN (CASE WHEN DSC_STCM IN (1, 10) THEN 0 ELSE (CASE WHEN DSC_DUCR IS NULL THEN 1 ELSE 2 END) END) 
							WHEN 'Yes' THEN (DSC_STCM / (CASE WHEN DSC_STCM >= 10 THEN 10 ELSE 1 END)) 
							ELSE DSC_STCM 
						END), 
			DSC_UCCR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (1, 10)) THEN @Utilizador ELSE DSC_UCCR END), 
			DSC_DCCR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (1, 10)) THEN @DataAtual ELSE DSC_DCCR END),
			DSC_UUCR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (2, 20)) THEN @Utilizador ELSE DSC_UUCR END), 
			DSC_DUCR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (2, 20)) THEN @DataAtual ELSE DSC_DUCR END),
			DSC_UACR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (3, 30)) THEN @Utilizador ELSE DSC_UACR END), 
			DSC_DACR = (CASE WHEN (ISNULL(@SucessoMensagem, '') = 'Yes') AND (DSC_STCM IN (3, 30)) THEN @DataAtual ELSE DSC_DACR END),		
			DSC_ESTA = @EstadoManifesto, 
			DSC_RESP = '-> AIR TRANSPORT STATUS: ' + CHAR(13) + CHAR(10) 
						+ '	#Data Integração: ' + CONVERT(varchar(23), @DataAtual, 121) + CHAR(13) + CHAR(10) 
						+ '	#Utilizador Integração: ' + @Utilizador + CHAR(13) + CHAR(10) 
						+ '	#MessageIdentification: ' + @IdMensagem + CHAR(13) + CHAR(10) 
						+ '	#MessageDate: ' + CONVERT(varchar(23), @DataMsgXML, 121) + CHAR(13) + CHAR(10) 
						+ '	#Sucess: ' + ISNULL(@SucessoMensagem, '<n.d.>') + CHAR(13) + CHAR(10) 
						+ ISNULL(@ErrosManifesto + CHAR(13) + CHAR(10), '') 						
						+ '===============================================================================================================================' + CHAR(13) + CHAR(10) 
						+ ISNULL(CAST(DSC_RESP AS varchar(MAX)), '')
		WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto		
-- constroi XML com as linhas AWB integradas no MAnifesto SDS - Via Aérea
		SET @AWBIntegradasXML = 
			(SELECT 				
				DSC_EANO AS "AnoManifesto",		
				DSC_NPRO AS "NumManifesto", 
				DSC_TIPO AS "TipoManifesto",
				DSC_DTVO AS "DataVooManifesto",
				EAD_CODI AS "EstanciaManifesto", 
				@ContramarcaMensagem AS "ContramarcaManifesto", 
				@EstadoContramarcaMsgXML AS "EstadoManifesto",
				@SucessoMensagem AS "SucessoManifesto", 
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(@ErrosMsgXML AS varchar(MAX)), '') AS xml)) AS "ErrosManifesto",
				CONVERT(varbinary(MAX), CAST(NULLIF(CAST(@AlertasMsgXML AS varchar(MAX)), '') AS xml)) AS "AlertasManifesto"
			FROM PRO_SDSC WITH(NOLOCK) 				
			WHERE DSC_EANO = @AnoManifesto AND DSC_NPRO = @NumManifesto
			FOR XML PATH('AWB'), ELEMENTS)
	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)) + '}'		
-- em caso de erro faz rollback da transacção iniciada						           
		IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION tSDSIntMsgAirTransportStatus
	END CATCH			
-- se sucesso faz commit da transacção iniciada
	IF @@TRANCOUNT > 0
		COMMIT TRANSACTION tSDSIntMsgAirTransportStatus
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_SDSViaAerea_Manifestos_MensagemIntegraAirTransportStatus TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'SP_SDSViaAerea_GeraManifestoExp') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE SP_SDSViaAerea_GeraManifestoExp
GO
CREATE PROCEDURE SP_SDSViaAerea_GeraManifestoExp @AnoSDSOrigem int, @NumeroSDSOrigem int, @DataVoo datetime, @NumContramarcaVar varchar(6), @Utilizador varchar(30), 
	@FechoContentores bit, @CodEstancia varchar(8), @EnvioCMOficial bit, @IDEntidadeDesconsolidacao int, @CodPaisDestino varchar(2), @EstCarga varchar(3), 
	@AWBMasterT1 varchar(30), @AWBMasterX varchar(30), @NumECSDSS varchar(30), @DataECSDSS datetime, @LstAWBScanXML xml, @NomeBDOrigem varchar(6) = NULL WITH ENCRYPTION AS
BEGIN
	SET DATEFORMAT DMY
-- declaração de variáveis
	DECLARE @DataAtual datetime, @NumeroSDS int, @AnoSDS int, @InsereManifesto bit, @NumLinhaAWB int, @NumeroAWB varchar(30), @CodDocumento varchar(5), @NomeDocumento varchar(70), 
		@LocalEmissaoDocumento varchar(30), @DataEmissaoDocumento datetime, @EntidadeEmissaoDocumento varchar(60), @CodPais varchar(2), @NomePais varchar(35), 
		@TipoManifesto varchar(2), @CodAeroportoDest varchar(8), @NomeAeroportoDest varchar(35), @CodAeroportoEsc varchar(8), @NomeAeroportoEsc varchar(35), 
		@CodAeroportoOrig varchar(8), @NomeAeroportoOrig varchar(35), @TemCTU bit, @MencaoEXP bit, @EstatutoCarga varchar(3), @IdOriginalShipper varchar(50), 
		@NomeOriginalShipper varchar(75), @IdShipper varchar(50), @NomeShipper varchar(75), @IdDestinatario varchar(50), @NomeDestinatario varchar(75), 
		@IdNotificado varchar(50), @IdConsignatario varchar(50), @DescMercadorias varchar(150), @MarcasNumeros varchar(25), @CodTipoEmb varchar(2), @NomeTipoEmb varchar(35), 
		@PesoBrt numeric(38, 6), @Vols int, @TipoCarga varchar(3), @CodLocMercadorias varchar(17), @NomeLocMercadorias varchar(70), @CodAeroportoEmb varchar(8), 
		@NomeAeroportoEmb varchar(35), @Poseima bit, @TipoOrigem int, @IDAdicaoXML int, @Valor numeric(38, 6), @NumOrdemDAU varchar(22), @DataEntrada datetime, @NumTD int, 
		@Depositario varchar(50), @IDLinhaAWB int, @ApenasDeposito bit, @NomeEntidadeDesconsolidar varchar(70), @NIFEntidadeDesconsolidar varchar(20), 
		@PesoBrtInicial numeric(38, 6), @VolsInicial int, @MoradaOriginalShipper varchar(100), @MoradaDestinatario varchar(100), @NovoNumLinhaAWB int, 
		@IDStrInternoOrigem varchar(20), @IDStrInternoDestino varchar(20), @IDStrRelacaoOrigem varchar(20), @IDStrRelacaoDestino varchar(20), @CargaPerigosa bit, 
		@IntegraXML bit, @CodAlfandega varchar(8), @NomeAlfandega varchar(35), @NumeroVoo varchar(35), @CodPaisVoo varchar(2), @CodPostalOriginalShipper varchar(17), 
		@LocalidadeOriginalShipper varchar(35), @NumDocPrecedente varchar(70), @CodArtigo varchar(22), @CodPautalArtigo varchar(22), @IntegracaoEXPCAUAtiva bit, 
		@DataHoraPrevista datetime, @CodPedido varchar(5), @NomePedido varchar(150), @TextoPedido varchar(512), @NomeBDOrigemCompleto varchar(8), @SQLSelect varchar(MAX)
	DECLARE @TblLinhasAWBSDSOrigem TABLE(DSD_NRMH varchar(30) NOT NULL, DOC_CODI varchar(5) NOT NULL, DOC_NOME varchar(70) NULL, DSD_LOED varchar(30) NOT NULL, 
		DSD_DTED datetime NOT NULL, DSD_EEED varchar(60) NOT NULL, PAI_CODI varchar(2) NOT NULL, PAI_NOME varchar(35) NULL, PAE_CODI varchar(8) NOT NULL, 
		PAE_NOME varchar(35) NULL, PAE_CODI1 varchar(8) NOT NULL, PAE_NOME1 varchar(35) NULL, PAE_CODI2 varchar(8) NOT NULL, PAE_NOME2 varchar(35) NULL, 
		DSD_TCTU bit NOT NULL, DSD_TMEX bit NOT NULL, DSD_EADC varchar(3) NOT NULL, DSD_IDOS varchar(50) NULL, DSD_NOOS varchar(75) NULL, DSD_IDNS varchar(50) NULL, 
		DSD_NONS varchar(75) NOT NULL, DSD_IDED varchar(50) NULL, DSD_NOMD varchar(75) NULL, DSD_IDEN varchar(50) NULL, DSD_IDEC varchar(50) NOT NULL, 
		DSD_DMER varchar(150) NOT NULL, DSD_MRNR varchar(25) NOT NULL, TEM_CODI varchar(2) NOT NULL, TEM_NOME varchar(35) NOT NULL, DSD_PESO numeric(38, 6) NOT NULL, 
		DSD_VOLS int NOT NULL, DSD_TCAR varchar(3) NOT NULL, LME_CODI varchar(17) NULL, PAE_CODI3 varchar(8) NOT NULL, PAE_NOME3 varchar(35) NULL, 
		DSD_VALO numeric(38, 6) NOT NULL, DSD_DTEN datetime NULL, PDD_IDDE varchar(20) NULL,  DSD_IDNN int NOT NULL, DSD_PDEP bit NOT NULL, DSD_PES2 numeric(38, 6) NOT NULL, 
		DSD_VOL2 int NOT NULL, DSD_MOOS varchar(100) NULL, DSD_MORD varchar(100) NULL, DSD_CPER bit NOT NULL, EAD_CODI varchar(8) NOT NULL, EAD_NOME varchar(35) NOT NULL, 
		DSD_CPOS varchar(17) NULL, DSD_LOOS varchar(35) NULL, DSD_NDPR varchar(70) NULL, APA_CODI varchar(22) NULL, DSD_CPAU varchar(22) NULL, TXM_CODI varchar(5) NULL, 
		TXM_DESC varchar(150) NULL, DSD_PTXT varchar(512) NULL)
-- inicia variaveis
	SET @AnoSDS = YEAR(@DataVoo)
	SET @IntegraXML = (CASE WHEN @IDEntidadeDesconsolidacao IS NULL THEN 1 ELSE 0 END)
	SET @NomeBDOrigemCompleto = ISNULL((NULLIF(@NomeBDOrigem, '') + '..'), '')
-- se operação não for de "Fecho de Contentores" nem "Envio CM Oficial", insere novo manifesto
	IF (@FechoContentores = 0) AND (@EnvioCMOficial = 0)
	BEGIN
		IF @IDEntidadeDesconsolidacao IS NULL
			SET @InsereManifesto = 1
		ELSE
			IF EXISTS(SELECT DSC_NPRO FROM PRO_SDSC WHERE DSC_TIPO = 1 AND DSC_IXML = @IntegraXML AND DSC_EANO = @AnoSDS AND EAD_CODI = @CodEstancia AND CAST(CONVERT(varchar(10), DSC_DTVO, 105) AS datetime) = CAST(CONVERT(varchar(10), @DataVoo, 105) AS datetime) AND DSC_NCMV = @NumContramarcaVar)
				SET @InsereManifesto = 0
			ELSE
				SET @InsereManifesto = 1
	END
	ELSE
-- se operação for de "Envio CM Oficial", procede à copia dos Dados AWB
		IF (@FechoContentores = 0) AND (@EnvioCMOficial = 1)
			SET @InsereManifesto = 0
		ELSE
-- se operação for de "Fecho de Contentores" verifica se manifesto de exportação p/ a data de voo já existe
			IF (@FechoContentores = 1) AND (@EnvioCMOficial = 0)
			BEGIN
				IF EXISTS(SELECT DSC_NPRO FROM PRO_SDSC WHERE DSC_TIPO = 1 and DSC_IXML = @IntegraXML and DSC_EANO = @AnoSDS and EAD_CODI = @CodEstancia and CAST(CONVERT(varchar(10), DSC_DTVO, 105) as datetime) = CAST(CONVERT(varchar(10), @DataVoo, 105) as datetime))
					SET @InsereManifesto = 0
				ELSE
					SET @InsereManifesto = 1
			END		
			ELSE
				RETURN
-- procede à inserção de manifesto de exportação se for caso disso
	IF @InsereManifesto = 1
	BEGIN		
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()					
-- obtem dados do Parâmetros de Despachos
		SELECT TOP 1 @IntegracaoEXPCAUAtiva = PDE_ECAU
		FROM TAB_PDES WITH(NOLOCK) 
-- obtem dados dos Parâmetros de SDS - Via Aérea
		SELECT TOP 1 @NumeroSDS = PSD_PRNR, 
			@NumeroVoo = ISNULL((CASE @CodEstancia WHEN 'PT000020' THEN NULLIF(PSD_NVEP, '') ELSE NULLIF(PSD_NVEL, '') END), ''), 			
			@CodPaisVoo = ISNULL((CASE @CodEstancia WHEN 'PT000020' THEN NULLIF(PAI_CODI1, '') ELSE NULLIF(PAI_CODI, '') END), 'QU'), 
			@DataHoraPrevista = CAST(CONVERT(varchar(10), @DataVoo, 105) + ' ' + ISNULL(CONVERT(varchar(12), (CASE @CodEstancia WHEN 'PT000020' THEN PSD_HPEP ELSE PSD_HPEL END), 114), '00:00:00:000') AS datetime)			
		FROM TAB_PSDS
-- constroi o SELECT para obtenção dos dados do Manifesto SDS de Importação ou Exportação, quer seja na própria BD ou em BD diferente
		SET @SQLSelect = 'SELECT ' + LTRIM(STR(@AnoSDS, 4)) + ', ' + LTRIM(STR(@NumeroSDS, 20)) + ', 1, ISNULL(psd.PDD_IDRP, dsc.DSC_IDRP), ISNULL(psd.PDD_IDTP , dsc.DSC_IDTP), ISNULL(psd.PDD_IDTS, dsc.DSC_IDTR), ISNULL(psd.PDD_NRAP, dsc.DSC_NRAP), ISNULL(psd.PDD_AEMI, dsc.DSC_AEMI), dsc.EAD_CODI, dsc.EAD_NOME, ISNULL(psd.PDD_NVPR, dsc.DSC_NVPR), CAST(''' + CONVERT(varchar(10), @DataVoo, 105) + ''' AS datetime), ISNULL(psd.EAD_CODI, dsc.EAD_CODI1), ISNULL(ead.EAD_NOME, dsc.EAD_NOME1), 
				(RIGHT(dsc.EAD_CODI, 3) + ''4'' + ''' + LTRIM(STR(@AnoSDS, 4)) + '''), ''' + @NumContramarcaVar + ''', ''' + @Utilizador + ''', CAST(''' + CONVERT(varchar(10), @DataAtual, 105) + ' ' + CONVERT(varchar(12), @DataAtual, 114) + ''' AS datetime), ''' + @Utilizador + ''', CAST(''' + CONVERT(varchar(10), @DataAtual, 105) + ' ' + CONVERT(varchar(12), @DataAtual, 114) + ''' AS datetime), ' + STR(@IntegraXML, 1) + ', 
				ISNULL((CASE dsc.EAD_CODI WHEN ''PT000020'' THEN psd.PDD_IDDP ELSE psd.PDD_IDDL END), dsc.DSC_IDDP), 
				ISNULL(NULLIF(''' + @NumeroVoo + ''', ''''), dsc.DSC_NVOO), pvo.PAI_CODI, pvo.PAI_NOME,
				(CASE ' + STR(@IntegracaoEXPCAUAtiva, 1) + ' WHEN 1 THEN CAST(''' + CONVERT(varchar(10), @DataHoraPrevista, 105) + ' ' + CONVERT(varchar(12), @DataHoraPrevista, 114) + ''' AS datetime) ELSE NULL END), 
				(CASE ' + STR(@IntegracaoEXPCAUAtiva, 1) + ' WHEN 1 THEN dsc.DSC_PPRV ELSE 0 END), 
				(CASE ' + STR(@IntegracaoEXPCAUAtiva, 1) + ' WHEN 1 THEN dsc.DSC_VPRV ELSE 0 END), 
				(CASE WHEN (dsc.DSC_TIPO = 1) OR (psd.PDD_IDEN IS NOT NULL) THEN ''' + REPLACE(CONVERT(numeric(38, 10), @DataAtual), '.', '') + ''' ELSE dsc.DSC_IDCM END)
			FROM ' + @NomeBDOrigemCompleto + 'PRO_SDSC AS dsc WITH(NOLOCK) 			
				LEFT OUTER JOIN ' + @NomeBDOrigemCompleto + 'TAB_PSDD AS psd WITH(NOLOCK) ON psd.PDD_IDEN = ' + ISNULL(LTRIM(STR(@IDEntidadeDesconsolidacao, 20)), '-1') + '
				LEFT OUTER JOIN ' + @NomeBDOrigemCompleto + 'TAB_EADU AS ead WITH(NOLOCK) ON psd.EAD_CODI = ead.EAD_CODI
				LEFT OUTER JOIN TAB_PAIS AS pvo WITH(NOLOCK) ON ''' + @CodPaisVoo + ''' = pvo.PAI_CODI	
			WHERE dsc.DSC_EANO = ' + LTRIM(STR(@AnoSDSOrigem, 4)) + ' AND dsc.DSC_NPRO = ' + LTRIM(STR(@NumeroSDSOrigem, 20))	
-- insere novo Manifesto de Exportação SDS - Via Aérea com base nos dados de outro manifesto
		INSERT INTO PRO_SDSC(DSC_EANO, DSC_NPRO, DSC_TIPO, DSC_IDRP, DSC_IDTP, DSC_IDTR, DSC_NRAP, DSC_AEMI, EAD_CODI, EAD_NOME, DSC_NVPR, DSC_DTVO, EAD_CODI1, EAD_NOME1, 
			DSC_NCMF, DSC_NCMV, DSC_UCRI, DSC_DCRI, DSC_UALT, DSC_DALT, DSC_IXML, DSC_IDDP, DSC_NVOO, PAI_CODI, PAI_NOME, DSC_DPRV, DSC_PPRV, DSC_VPRV, DSC_IDCM)
		EXEC (@SQLSelect)
-- incrementa Nº. Proximo manifesto no Parâmetros de SDS - Via Aérea
		UPDATE TAB_PSDS SET PSD_PRNR = PSD_PRNR + 1
-- inicia contador das linhas AWB
		SET @NovoNumLinhaAWB = 1		
	END
	ELSE
	BEGIN
		IF @IDEntidadeDesconsolidacao IS NULL
		BEGIN
			SELECT TOP 1 @NumeroSDS = DSC_NPRO, @NovoNumLinhaAWB = (ISNULL((SELECT MAX(DSD_NUME) FROM PRO_SDSD WHERE DSC_EANO = PRO_SDSC.DSC_EANO and DSC_NPRO = PRO_SDSC.DSC_NPRO), 0) + 1)
			FROM PRO_SDSC WITH(NOLOCK)
			WHERE DSC_TIPO = 1 and DSC_IXML = @IntegraXML and DSC_ACTI = @FechoContentores and DSC_EANO = @AnoSDS and EAD_CODI = @CodEstancia 
				and CAST(CONVERT(varchar(10), DSC_DTVO, 105) as datetime) = CAST(CONVERT(varchar(10), @DataVoo, 105) as datetime)
		END
		ELSE
		BEGIN
			SELECT TOP 1 @NumeroSDS = DSC_NPRO, @NovoNumLinhaAWB = (ISNULL((SELECT MAX(DSD_NUME) FROM PRO_SDSD WHERE DSC_EANO = PRO_SDSC.DSC_EANO and DSC_NPRO = PRO_SDSC.DSC_NPRO), 0) + 1)
			FROM PRO_SDSC WITH(NOLOCK)
			WHERE DSC_TIPO = 1 and DSC_IXML = @IntegraXML and DSC_EANO = @AnoSDS and EAD_CODI = @CodEstancia 
				and CAST(CONVERT(varchar(10), DSC_DTVO, 105) as datetime) = CAST(CONVERT(varchar(10), @DataVoo, 105) as datetime) and DSC_NCMV = @NumContramarcaVar			
		END
	END
-- se operação de "Fecho de Contentores" ou  "Envio CM Oficial", processa outras atualizações
	IF (@NumeroSDS IS NOT NULL) and ((@FechoContentores = 1) or (@EnvioCMOficial = 1))
	BEGIN
-- cria tabela temporária de relação de IDs INTERNOS STR entre as linhas AWB de origem e de destino 
		CREATE TABLE #tmpRELACAOLINHASAWB(IDSTRLINHAORIG varchar(20) COLLATE Latin1_General_CI_AI NOT NULL, IDSTRLINHADEST varchar(20) COLLATE Latin1_General_CI_AI NOT NULL)	
-- obtem as linhas AWB c/ "Env." não selecionado se operação de "Fecho de Contentores", e todas se operação de "Envio CM Oficial" e que ainda não existam no manifesto de destino e com o campo "Poseima" não selecionado
		DECLARE LinhasAWB CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT d.DSD_NUME, d.DSD_NRMH, d.DOC_CODI, d.DOC_NOME, d.DSD_LOED, d.DSD_DTED, d.DSD_EEED, d.PAI_CODI, d.PAI_NOME, d.DSD_TIPO, d.PAE_CODI, d.PAE_NOME, d.PAE_CODI1, d.PAE_NOME1, 
				d.PAE_CODI2, d.PAE_NOME2, d.DSD_TCTU, d.DSD_TMEX, d.DSD_EADC, d.DSD_IDOS, d.DSD_NOOS, d.DSD_IDNS, d.DSD_NONS, d.DSD_IDED, d.DSD_NOMD, d.DSD_IDEN, d.DSD_IDEC, d.DSD_DMER, 
				d.DSD_MRNR, d.TEM_CODI, d.TEM_NOME, d.DSD_PESO, d.DSD_VOLS, d.DSD_TCAR, d.LME_CODI, d.LME_NOME, d.PAE_CODI3, d.PAE_NOME3, d.DSD_CAPO, d.DSD_ORIG, d.EXA_CHVE, d.DSD_VALO, 
				d.DSD_NDAU, d.DSD_DTEN, d.DSD_TDEP, d.DSD_DEPO, d.DSD_IDNN, d.DSD_PDEP, d.DSD_NEAD, d.DSD_CEAD, d.DSD_PES2, d.DSD_VOL2, d.DSD_MOOS, d.DSD_MORD, d.DSD_IDCR, d.DSD_CODR, d.DSD_CPOS, 
				d.DSD_LOOS, d.DSD_NDPR, d.APA_CODI, d.DSD_CPAU, d.TXM_CODI, d.TXM_DESC, d.DSD_PTXT
			FROM PRO_SDSD AS d WITH(NOLOCK)
			WHERE d.DSD_ENVI = (CASE WHEN (@FechoContentores = 1) AND (@LstAWBScanXML IS NULL) THEN 0 ELSE d.DSD_ENVI END) AND d.DSD_CAPO = 0 AND d.DSC_EANO = @AnoSDSOrigem 
				AND d.DSC_NPRO = @NumeroSDSOrigem AND (NOT EXISTS(SELECT DSD_NUME FROM PRO_SDSD WITH(NOLOCK) WHERE DSC_EANO = @AnoSDS and DSC_NPRO = @NumeroSDS and DSD_NRMH = d.DSD_NRMH))	
				AND ((@LstAWBScanXML IS NULL) OR ((@LstAWBScanXML IS NOT NULL) AND (d.DSD_NRMH IN (SELECT XML_MSGR.MSG_DATA.value('.[1]', 'varchar(30)') FROM @LstAWBScanXML.nodes('DadosAWB/AWB') as XML_MSGR(MSG_DATA)))))
		OPEN LinhasAWB
		FETCH NEXT FROM LinhasAWB INTO @NumLinhaAWB, @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 
			@TipoManifesto, @CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, 
			@IdOriginalShipper, @NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, 
			@NomeTipoEmb, @PesoBrt, @Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, @Poseima, @TipoOrigem, @IDAdicaoXML, @Valor, @NumOrdemDAU, 
			@DataEntrada, @NumTD, @Depositario, @IDLinhaAWB, @ApenasDeposito, @NomeEntidadeDesconsolidar, @NIFEntidadeDesconsolidar, @PesoBrtInicial, @VolsInicial, @MoradaOriginalShipper, 
			@MoradaDestinatario, @IDStrInternoOrigem, @IDStrRelacaoOrigem, @CodPostalOriginalShipper, @LocalidadeOriginalShipper, @NumDocPrecedente, @CodArtigo, @CodPautalArtigo, @CodPedido, 
			@NomePedido, @TextoPedido
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- se operação de "Envio CM Oficial" obtem ID de origem p/ relação
			IF @EnvioCMOficial = 1
			BEGIN				
				SELECT @IDStrRelacaoDestino = IDSTRLINHADEST
				FROM #tmpRELACAOLINHASAWB
				WHERE IDSTRLINHAORIG = @IDStrRelacaoOrigem
			END
			ELSE
				SET @IDStrRelacaoDestino = NULL
-- calcula ID string interno para nova linha AWB
			SET @IDStrInternoDestino = REPLACE(CONVERT(numeric(38, 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()), '.', ',')
-- insere linha AWB no manifesto de destino		
			INSERT INTO PRO_SDSD(DSC_EANO, DSC_NPRO, DSD_NUME, DSD_NRMH, DOC_CODI, DOC_NOME, DSD_LOED, DSD_DTED, DSD_EEED, PAI_CODI, PAI_NOME, DSD_TIPO, PAE_CODI, PAE_NOME, PAE_CODI1, PAE_NOME1, 
				PAE_CODI2, PAE_NOME2, DSD_TCTU, DSD_TMEX, DSD_EADC, DSD_IDOS, DSD_NOOS, DSD_IDNS, DSD_NONS, DSD_IDED, DSD_NOMD, DSD_IDEN, DSD_IDEC, DSD_DMER, DSD_MRNR, TEM_CODI, TEM_NOME, 
				DSD_PESO, DSD_VOLS, DSD_TCAR, LME_CODI, LME_NOME, PAE_CODI3, PAE_NOME3, DSD_CAPO, DSD_DNOW, DSD_ORIG, EXA_CHVE, DSD_VALO, DSD_NDAU, DSD_DTEN, DSD_TDEP, DSD_DEPO, DSD_PDEP, 
				DSD_IDCR, DSD_CODR, DSD_NEAD, DSD_CEAD, DSD_PES2, DSD_VOL2, DSD_MOOS, DSD_MORD, DSD_ENVI, DSD_IDFC, DSD_CPOS, DSD_LOOS, DSD_NDPR, APA_CODI, DSD_CPAU, TXM_CODI, TXM_DESC, DSD_PTXT)
			VALUES(@AnoSDS, @NumeroSDS, @NovoNumLinhaAWB, @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 
				@TipoManifesto, @CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, @IdOriginalShipper, 
				@NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, @NomeTipoEmb, @PesoBrt, 
				@Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, @Poseima, GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT(), @TipoOrigem, @IDAdicaoXML, @Valor, 
				@NumOrdemDAU, @DataEntrada, @NumTD, @Depositario, @ApenasDeposito, @IDStrInternoDestino, @IDStrRelacaoDestino, @NomeEntidadeDesconsolidar, @NIFEntidadeDesconsolidar, @PesoBrtInicial, 
				@VolsInicial, @MoradaOriginalShipper, @MoradaDestinatario, (CASE WHEN (@FechoContentores = 1) AND (@IDLinhaAWB IS NOT NULL) THEN 1 ELSE @EnvioCMOficial END), 
				(CASE @FechoContentores WHEN 1 THEN @IDLinhaAWB ELSE NULL END), @CodPostalOriginalShipper, @LocalidadeOriginalShipper, @NumDocPrecedente, @CodArtigo, @CodPautalArtigo, @CodPedido, 
				@NomePedido, @TextoPedido)
-- se operação de "Envio CM Oficial", procede à inserção da relação na tabela temporária
			IF @EnvioCMOficial = 1
			BEGIN
				INSERT INTO #tmpRELACAOLINHASAWB(IDSTRLINHAORIG, IDSTRLINHADEST)
				VALUES(@IDStrInternoOrigem, @IDStrInternoDestino)
			END				
-- insere detalhe de documentos na linha AWB no manifesto de destino		
			INSERT INTO PRO_SSDD(DSC_EANO, DSC_NPRO, DSD_NUME, SDD_NUME, DOC_CODI, DOC_NOME, SDD_NDOC, SDD_DDOC, EAD_CODI, EAD_NOME, SDD_SDOC, SDD_ORIG)
			SELECT @AnoSDS, @NumeroSDS, @NovoNumLinhaAWB, SDD_NUME, DOC_CODI, DOC_NOME, SDD_NDOC, SDD_DDOC, EAD_CODI, EAD_NOME, SDD_SDOC, SDD_ORIG
			FROM PRO_SSDD WITH(NOLOCK)
			WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem and DSD_NUME = @NumLinhaAWB
-- se operação de "Fecho de Contentores", remove ligação à adição de Exportação/XML na linha AWB de origem, caso exista
			IF @FechoContentores = 1
			BEGIN
				UPDATE PRO_SDSD SET EXA_CHVE = NULL
				WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem and DSD_NUME = @NumLinhaAWB and EXA_CHVE IS NOT NULL
			END
			ELSE
-- se operação de "Envio CM Oficial", remove detalhe de documentos e linha AWB
				IF @EnvioCMOficial = 1
				BEGIN
					DELETE FROM PRO_SSDD
					WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem and DSD_NUME = @NumLinhaAWB
					DELETE FROM PRO_SDSD
					WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem and DSD_NUME = @NumLinhaAWB
				END
-- incrementa contador das linhas AWB
			SET @NovoNumLinhaAWB = @NovoNumLinhaAWB + 1		
-- espera 50 milisegundos para não obter IDs string interno igual à linha AWB anterior			
			WAITFOR DELAY '00:00:00.050'	
			FETCH NEXT FROM LinhasAWB INTO @NumLinhaAWB, @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 
				@TipoManifesto, @CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, 
				@IdOriginalShipper, @NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, 
				@NomeTipoEmb, @PesoBrt, @Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, @Poseima, @TipoOrigem, @IDAdicaoXML, @Valor, @NumOrdemDAU, 
				@DataEntrada, @NumTD, @Depositario, @IDLinhaAWB, @ApenasDeposito, @NomeEntidadeDesconsolidar, @NIFEntidadeDesconsolidar, @PesoBrtInicial, @VolsInicial, @MoradaOriginalShipper, 
				@MoradaDestinatario, @IDStrInternoOrigem, @IDStrRelacaoOrigem, @CodPostalOriginalShipper, @LocalidadeOriginalShipper, @NumDocPrecedente, @CodArtigo, @CodPautalArtigo, @CodPedido, 
				@NomePedido, @TextoPedido
		END
		CLOSE LinhasAWB
		DEALLOCATE LinhasAWB
-- se operação de "Envio CM Oficial", desativa o Manifesto de Exportação SDS - Via Aérea de origem (= Fecho de Contentores ativo)
		IF (@FechoContentores = 1) AND (@LstAWBScanXML IS NULL)
		BEGIN
			UPDATE PRO_SDSC SET DSC_ACTI = 0, DSC_UINA = @Utilizador, DSC_DINA = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
			WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem
		END
		ELSE
-- se operação de "Envio CM Oficial", remove o próprio Manifesto de Exportação SDS - Via Aérea de origem	
			IF @EnvioCMOficial = 1
			BEGIN
				DELETE FROM PRO_SDSC 
				WHERE DSC_EANO = @AnoSDSOrigem and DSC_NPRO = @NumeroSDSOrigem
			END
-- remove tabela temporária
		DROP TABLE #tmpRELACAOLINHASAWB			
	END
	ELSE
-- se operação de "Desconsolidar Manifesto", processa outras atualizações
		IF (@NumeroSDS IS NOT NULL) and (@IDEntidadeDesconsolidacao IS NOT NULL)
		BEGIN	
-- cria tabela temporária p/ paises a filtrar
			CREATE TABLE #tmpPAISES(CODPAIS varchar(2) COLLATE Latin1_General_CI_AI NOT NULL)
			IF @CodPaisDestino = '0'
			BEGIN
				INSERT INTO #tmpPAISES(CODPAIS)
				SELECT PAI_CODI
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI IN ('AO', 'CV', 'ST')
			END
			ELSE
			BEGIN
				INSERT INTO #tmpPAISES(CODPAIS)
				SELECT PAI_CODI
				FROM TAB_PAIS WITH(NOLOCK)
				WHERE PAI_CODI = @CodPaisDestino
			END
-- cria tabela temporária p/ estatutos de carga a filtrar
			CREATE TABLE #tmpESTCARGA(CODIGO varchar(3) COLLATE Latin1_General_CI_AI NOT NULL)
			IF @EstCarga = '0'
			BEGIN
				INSERT INTO #tmpESTCARGA(CODIGO)
				VALUES('T1')
				INSERT INTO #tmpESTCARGA(CODIGO)
				VALUES('X')
			END
			ELSE
			BEGIN
				INSERT INTO #tmpESTCARGA(CODIGO)
				VALUES(@EstCarga)
			END	
-- constroi o SELECT para obtenção dos dados AWB do Manifesto SDS de Importação, quer seja na própria BD ou em BD diferente
			SET @SQLSelect = 'SELECT d.DSD_NRMH, d.DOC_CODI, d.DOC_NOME, d.DSD_LOED, d.DSD_DTED, d.DSD_EEED, d.PAI_CODI, d.PAI_NOME, d.PAE_CODI, d.PAE_NOME, d.PAE_CODI1, d.PAE_NOME1, 
					d.PAE_CODI2, d.PAE_NOME2, d.DSD_TCTU, d.DSD_TMEX, d.DSD_EADC, d.DSD_IDOS, d.DSD_NOOS, d.DSD_IDNS, d.DSD_NONS, d.DSD_IDED, d.DSD_NOMD, d.DSD_IDEN, d.DSD_IDEC, d.DSD_DMER, d.DSD_MRNR, 
					d.TEM_CODI, d.TEM_NOME, d.DSD_PESO, d.DSD_VOLS, d.DSD_TCAR, (CASE c.EAD_CODI WHEN ''PT000020'' THEN psd.LME_CODI1 ELSE psd.LME_CODI END), d.PAE_CODI3, d.PAE_NOME3, d.DSD_VALO, d.DSD_DTEN, (CASE c.EAD_CODI WHEN ''PT000020'' THEN psd.PDD_IDDP ELSE psd.PDD_IDDL END), d.DSD_IDNN, d.DSD_PDEP, d.DSD_PES2, 
					d.DSD_VOL2, d.DSD_MOOS, d.DSD_MORD, d.DSD_CPER, c.EAD_CODI, c.EAD_NOME, d.DSD_CPOS, d.DSD_LOOS, d.DSD_NDPR, d.APA_CODI, d.DSD_CPAU, d.TXM_CODI, d.TXM_DESC, d.DSD_PTXT
				FROM ' + @NomeBDOrigemCompleto + 'PRO_SDSD AS d WITH(NOLOCK)
					INNER JOIN ' + @NomeBDOrigemCompleto + 'PRO_SDSC AS c WITH(NOLOCK) ON d.DSC_EANO = c.DSC_EANO and d.DSC_NPRO = c.DSC_NPRO					 
					INNER JOIN ' + @NomeBDOrigemCompleto + 'TAB_PSDD AS psd WITH(NOLOCK) ON psd.PDD_IDEN = ' + ISNULL(LTRIM(STR(@IDEntidadeDesconsolidacao, 20)), '-1') + '					
				WHERE d.DSD_ENVI = 1 AND d.DSD_ANUL = 0 AND ISNULL(d.DSD_NDGI, '''') <> '''' 
					AND d.DSC_EANO = ' + LTRIM(STR(@AnoSDSOrigem, 4)) + ' AND d.DSC_NPRO = ' + LTRIM(STR(@NumeroSDSOrigem, 20))							
-- insere os dados AWB do Manifesto SDS de Importação da própria BD ou da BD diferente na tabela tmp
			INSERT INTO @TblLinhasAWBSDSOrigem(DSD_NRMH, DOC_CODI, DOC_NOME, DSD_LOED, DSD_DTED, DSD_EEED, PAI_CODI, PAI_NOME, PAE_CODI, PAE_NOME, PAE_CODI1, PAE_NOME1, 
				PAE_CODI2, PAE_NOME2, DSD_TCTU, DSD_TMEX, DSD_EADC, DSD_IDOS, DSD_NOOS, DSD_IDNS, DSD_NONS, DSD_IDED, DSD_NOMD, DSD_IDEN, DSD_IDEC, DSD_DMER, DSD_MRNR, 
				TEM_CODI, TEM_NOME, DSD_PESO, DSD_VOLS, DSD_TCAR, LME_CODI, PAE_CODI3, PAE_NOME3, DSD_VALO, DSD_DTEN, PDD_IDDE, DSD_IDNN, DSD_PDEP, DSD_PES2, DSD_VOL2, 
				DSD_MOOS, DSD_MORD, DSD_CPER, EAD_CODI, EAD_NOME, DSD_CPOS, DSD_LOOS, DSD_NDPR, APA_CODI, DSD_CPAU, TXM_CODI, TXM_DESC, DSD_PTXT)
			EXEC (@SQLSelect)								
-- obtem as linhas AWB c/ "Env." selecionado, não "Anuladas", c/ "Nº. NDGI" preenchido e cujo "País" do "Aeroporto Destino" e "Estatuto de Carga" sejam iguais aos especificados 
			DECLARE LinhasAWB CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
				SELECT awb.DSD_NRMH, awb.DOC_CODI, awb.DOC_NOME, awb.DSD_LOED, awb.DSD_DTED, awb.DSD_EEED, awb.PAI_CODI, awb.PAI_NOME, awb.PAE_CODI, awb.PAE_NOME, 
					awb.PAE_CODI1, awb.PAE_NOME1, awb.PAE_CODI2, awb.PAE_NOME2, awb.DSD_TCTU, awb.DSD_TMEX, awb.DSD_EADC, awb.DSD_IDOS, awb.DSD_NOOS, awb.DSD_IDNS, 
					awb.DSD_NONS, awb.DSD_IDED, awb.DSD_NOMD, awb.DSD_IDEN, awb.DSD_IDEC, awb.DSD_DMER, awb.DSD_MRNR, awb.TEM_CODI, awb.TEM_NOME, awb.DSD_PESO, awb.DSD_VOLS, 
					awb.DSD_TCAR, awb.LME_CODI, lme.LME_NOME, awb.PAE_CODI3, awb.PAE_NOME3, awb.DSD_VALO, awb.DSD_DTEN, awb.PDD_IDDE, awb.DSD_IDNN, awb.DSD_PDEP, awb.DSD_PES2, 
					awb.DSD_VOL2, awb.DSD_MOOS, awb.DSD_MORD, awb.DSD_CPER, awb.EAD_CODI, awb.EAD_NOME, awb.DSD_CPOS, awb.DSD_LOOS, awb.DSD_NDPR, awb.APA_CODI, awb.DSD_CPAU, 
					awb.TXM_CODI, awb.TXM_DESC, awb.DSD_PTXT
				FROM @TblLinhasAWBSDSOrigem AS awb
					INNER JOIN TAB_PAER AS pd WITH(NOLOCK) ON awb.PAE_CODI = pd.PAE_CODI
					LEFT OUTER JOIN TAB_LMER AS lme WITH(NOLOCK) ON awb.LME_CODI = lme.LME_CODI
				WHERE pd.PAI_CODI IN (SELECT CODPAIS FROM #tmpPAISES) AND awb.DSD_EADC IN (SELECT CODIGO FROM #tmpESTCARGA)				
			OPEN LinhasAWB
			FETCH NEXT FROM LinhasAWB INTO @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 
				@CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, @IdOriginalShipper, 
				@NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, @NomeTipoEmb, 
				@PesoBrt, @Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, @Valor, @DataEntrada, @Depositario, @IDLinhaAWB, @ApenasDeposito, 
				@PesoBrtInicial, @VolsInicial, @MoradaOriginalShipper, @MoradaDestinatario, @CargaPerigosa, @CodAlfandega, @NomeAlfandega, @CodPostalOriginalShipper, @LocalidadeOriginalShipper, 
				@NumDocPrecedente, @CodArtigo, @CodPautalArtigo, @CodPedido, @NomePedido, @TextoPedido
			WHILE @@FETCH_STATUS = 0
			BEGIN	
-- calcula ID string interno para nova linha AWB
				SET @IDStrInternoDestino = REPLACE(CONVERT(numeric(38, 10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()), '.', ',')
-- insere linha AWB no manifesto de destino		
				INSERT INTO PRO_SDSD(DSC_EANO, DSC_NPRO, DSD_NUME, DSD_NRMH, DOC_CODI, DOC_NOME, DSD_LOED, DSD_DTED, DSD_EEED, PAI_CODI, PAI_NOME, DSD_TIPO, PAE_CODI, PAE_NOME, PAE_CODI1, 
					PAE_NOME1, PAE_CODI2, PAE_NOME2, DSD_TCTU, DSD_TMEX, DSD_EADC, DSD_IDOS, DSD_NOOS, DSD_IDNS, DSD_NONS, DSD_IDED, DSD_NOMD, DSD_IDEN, DSD_IDEC, DSD_DMER, DSD_MRNR, TEM_CODI, 
					TEM_NOME, DSD_PESO, DSD_VOLS, DSD_TCAR, LME_CODI, LME_NOME, PAE_CODI3, PAE_NOME3, DSD_DNOW, DSD_VALO, DSD_DTEN, DSD_DEPO, DSD_PDEP, DSD_IDCR, DSD_PES2, DSD_VOL2, DSD_MOOS, 
					DSD_MORD, DSD_CPER, DSD_IDOR, DSD_MAWB, DSD_CPOS, DSD_LOOS, DSD_NDPR, APA_CODI, DSD_CPAU, TXM_CODI, TXM_DESC, DSD_PTXT)
				VALUES(@AnoSDS, @NumeroSDS, @NovoNumLinhaAWB, @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 'C', 
					@CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, @IdOriginalShipper, 
					@NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, @NomeTipoEmb, @PesoBrt, 
					@Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT(), @Valor, @DataEntrada, @Depositario, 
					@ApenasDeposito, @IDStrInternoDestino, @PesoBrtInicial, @VolsInicial, @MoradaOriginalShipper, @MoradaDestinatario, @CargaPerigosa, @IDLinhaAWB, 
					(CASE @EstatutoCarga WHEN 'T1' THEN @AWBMasterT1 ELSE @AWBMasterX END), @CodPostalOriginalShipper, @LocalidadeOriginalShipper, @NumDocPrecedente, @CodArtigo, @CodPautalArtigo, 
					@CodPedido, @NomePedido, @TextoPedido)		
-- insere detalhe de documento "4D01" na linha AWB no manifesto de destino apenas quando a linha é "T1"
				IF @EstatutoCarga = 'T1' 
				BEGIN
					INSERT INTO PRO_SSDD(DSC_EANO, DSC_NPRO, DSD_NUME, SDD_NUME, DOC_CODI, DOC_NOME, SDD_NDOC, SDD_DDOC, EAD_CODI, EAD_NOME, SDD_SDOC)		
					SELECT @AnoSDS, @NumeroSDS, @NovoNumLinhaAWB, 1, DOC_CODI, DOC_NOME, @NumECSDSS, @DataECSDSS, @CodAlfandega, @NomeAlfandega, 'T'
					FROM TAB_DOCU WITH(NOLOCK)
					WHERE DOC_CODI = '4D01'
				END					
-- incrementa contador das linhas AWB
				SET @NovoNumLinhaAWB = @NovoNumLinhaAWB + 1		
-- espera 50 milisegundos para não obter IDs string interno igual à linha AWB anterior			
				WAITFOR DELAY '00:00:00.050'	
				FETCH NEXT FROM LinhasAWB INTO @NumeroAWB, @CodDocumento, @NomeDocumento, @LocalEmissaoDocumento, @DataEmissaoDocumento, @EntidadeEmissaoDocumento, @CodPais, @NomePais, 
					@CodAeroportoDest, @NomeAeroportoDest, @CodAeroportoEsc, @NomeAeroportoEsc, @CodAeroportoOrig, @NomeAeroportoOrig, @TemCTU, @MencaoEXP, @EstatutoCarga, @IdOriginalShipper, 
					@NomeOriginalShipper, @IdShipper, @NomeShipper, @IdDestinatario, @NomeDestinatario, @IdNotificado, @IdConsignatario, @DescMercadorias, @MarcasNumeros, @CodTipoEmb, @NomeTipoEmb, 
					@PesoBrt, @Vols, @TipoCarga, @CodLocMercadorias, @NomeLocMercadorias, @CodAeroportoEmb, @NomeAeroportoEmb, @Valor, @DataEntrada, @Depositario, @IDLinhaAWB, @ApenasDeposito, 
					@PesoBrtInicial, @VolsInicial, @MoradaOriginalShipper, @MoradaDestinatario, @CargaPerigosa, @CodAlfandega, @NomeAlfandega, @CodPostalOriginalShipper, @LocalidadeOriginalShipper, 
					@NumDocPrecedente, @CodArtigo, @CodPautalArtigo, @CodPedido, @NomePedido, @TextoPedido
			END
			CLOSE LinhasAWB
			DEALLOCATE LinhasAWB	
-- remove tabelas temporárias
			DROP TABLE #tmpPAISES
			DROP TABLE #tmpESTCARGA
		END		
END
GO
GRANT EXECUTE ON SP_SDSViaAerea_GeraManifestoExp TO public AS dbo
GO
IF EXISTS(SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'sp_IMP_Declaracoes_ImportaFicheiroUPS') AND type IN (N'P', N'PC')) 
	DROP PROCEDURE sp_IMP_Declaracoes_ImportaFicheiroUPS
GO
CREATE PROCEDURE sp_IMP_Declaracoes_ImportaFicheiroUPS @FicheiroXML xml, @TipoManifesto int, @DataVoo datetime, @IdUtilizador int, @Erro varchar(MAX) OUTPUT WITH ENCRYPTION AS 
BEGIN
	SET NOCOUNT ON	
	SET ARITHABORT ON		
-- declaração de variáveis
	DECLARE @NumErro int, @DataAtual datetime, @XMLDeclaracao xml(XMLSC_DeclaracoesIMPCAUToGIDWin)
-- inicia variaveis
	SET @NumErro = 0
-- inicia processo de importação da declaração IMP-CAU
	BEGIN TRY	
-- obtem data atual GMT
		SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- constroi XML para declaração IMP-CAU a partir do ficheiro XML no formato UPS
		SET @XMLDeclaracao = 
			(SELECT	
				(SELECT (CASE 						
						WHEN @TipoManifesto = 0 THEN (CASE 
														WHEN EXISTS(SELECT 1 FROM PRO_DUCG WITH(NOLOCK) WHERE DUC_CPRT = NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AND CAST(CONVERT(varchar(10), DUC_DTVO, 127) AS datetime) = ISNULL(@DataVoo, CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 13, 6))) AS datetime))) THEN 'U' 
														ELSE 'I' 
													END) 
						WHEN EXISTS(SELECT 1 FROM PRO_DUCG AS duc WITH(NOLOCK) INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON duc.DUC_EANO = adi.DUC_EANO AND duc.DUC_PNUM = adi.DUC_PNUM AND adi.DUA_CODI = 1 WHERE duc.DUC_EANO = YEAR(@DataAtual) AND duc.DUC_CPRT = NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AND ISNULL(adi.DUA_DNUM, '') = '') THEN 'U'
						ELSE 'I'
					END) AS "@acao", 
					(CONVERT(varchar(10), @DataAtual, 127) + 'Z') AS "data", 
					CAST(0 AS bit) AS "despachoCentralizado", 
					'H1' AS "anexoB", 
					(CASE 
						WHEN EXISTS(SELECT 1 FROM TAB_CLIE WITH(NOLOCK) WHERE CLI_DPRO = 1 AND CLI_NIF = NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b701000/linha)[1]', 'varchar(MAX)'), 107, 9))), '')) AND SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 319, 3))), '/', ''), 1, 2) <> 'FD' THEN '90' 
						ELSE '25' 
					END) AS "natureza", 
					NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AS "documentoTransporte", 
					(SELECT 
						(SELECT 							
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 69, 35))), '') AS "nome", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 104, 35))), '') AS "morada", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 174, 35))), '') AS "localidade", 
							ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 231, 9))), ''), '0') AS "codigoPostal", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 174, 35))), '') AS "localidadePostal", 
							(CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))) 
								WHEN 'GB' THEN (CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 231, 2))) 
													WHEN 'BT' THEN 'XI' 
													ELSE 'XU' 
												END) 
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '') 
							END) AS "pais"
						HAVING ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 69, 35))), '') <> ''
						FOR XML PATH('exportador'), TYPE), 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '') AS "paisExpedicao", 
						(SELECT 
							ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b701000/linha)[1]', 'varchar(MAX)'), 107, 9))), ''), '999999990') AS "nif", 
							1 AS "tipoNIF", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 69, 35))), '') AS "nome", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 129, 35))), '') AS "morada", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 199, 35))), '') AS "localidade", 
							ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 256, 9))), ''), '0') AS "codigoPostal", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 199, 35))), '') AS "localidadePostal", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 265, 2))), '') AS "pais", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 268, 14))), '') AS "telefone" 							
						FOR XML PATH('importador'), TYPE),
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 265, 2))), '') AS "paisDestino",						
						(SELECT
							'0137I4' AS "codigoDeclarante"
						FOR XML PATH('declarante'), TYPE)
					FOR XML PATH('operadores'), TYPE), 
					'PT000020' AS "estancia", 
					'IMD' AS "tipoDeclaracao", 
					'11' AS "naturezaTransacao", 
					'FCA' AS "condicaoEntrega", 
					(SELECT
						ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 174, 35))), ''), '*****N/A*****') AS "localidadeCE", 
						(CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))) 
							WHEN 'GB' THEN (CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 231, 2))) 
												WHEN 'BT' THEN 'XI' 
												ELSE 'XU' 
											END) 
							ELSE ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), ''), '--')
						END) AS "paisCE"
					FOR XML PATH('localizacao'), TYPE), 					
					(SELECT 
						(SELECT
							ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 176, 2))), ''), 'EU') AS "pais", 	
							CAST(ISNULL(NULLIF((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00), 0), 0.01) AS decimal(18, 3)) AS "valorTotal"
						FOR XML PATH('fatura'), TYPE), 
						(SELECT
							'EU' AS "pais", 							
							0 AS "valorTotal"
						FOR XML PATH('frete'), TYPE), 
						(SELECT
							'EU' AS "pais", 							
							0 AS "valorTotal"
						FOR XML PATH('seguro'), TYPE), 
						(SELECT							
							CAST(ROUND(((CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 82, 3))) 
											WHEN 'LBS' THEN ROUND((CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) * 0.4536), 3) 
											ELSE (CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) / 10) 
										END) * 0.95), 3) AS decimal(18, 6)) AS "massaLiquida", 								 			
							CAST((CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 82, 3))) 
									WHEN 'LBS' THEN ROUND((CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) * 0.4536), 3) 
									ELSE (CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) / 10) 
								END) AS decimal(18, 6)) AS "massaBruta"
						FOR XML PATH('pesos'), TYPE)
					FOR XML PATH('totais'), TYPE), 
					(SELECT
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AS "numeroNRUR", 
						(SELECT 
							(CASE 
								WHEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 1, 2))), '') IN ('GB', 'XU', 'XI') AND RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 353, 8))) <> 'SRR6646' THEN '30' 
								ELSE '40' 
							END) AS "meioTransporte",
							(CASE 
								WHEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 1, 2))), '') IN ('GB', 'XU', 'XI') AND RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 353, 8))) <> 'SRR6646' THEN 'PT' 
								ELSE 'DK' 
							END) AS "pais"						
						FOR XML PATH('fronteira'), TYPE), 
						(CASE 
							WHEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 1, 2))), '') IN ('GB', 'XU', 'XI') AND RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 353, 8))) <> 'SRR6646' THEN '30' 
							ELSE '40' 
						END) AS "meioTransporteChegada", 
						(CASE 
							WHEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 1, 2))), '') IN ('GB', 'XU', 'XI') AND RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 353, 8))) <> 'SRR6646' THEN 'CAMIAO' 
							ELSE 'OY-SRO' 
						END) AS "identificacao", 
						0 AS "contentorizada"
					FOR XML PATH('transporte'), TYPE), 
					(SELECT
						'B' AS "tipoLocalizacao", 
						'Y' AS "qualificador", 
						'DTP00000117020PT' AS "armazemDTP"
					FOR XML PATH('localizacaoMercadorias'), TYPE), 
					(SELECT 						
						CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 137, 2))) AS int) AS "serviceLevel", 
						(CASE @TipoManifesto 
							WHEN 1 THEN NULL 
							ELSE CAST(((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 207, 9))), ''), 0) AS decimal(18, 2)) / 100) - (CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 119, 13))), ''), 0) AS decimal(18, 2)) / 100)) AS decimal(18, 2)) 							     
						END) AS "freteOriginal", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 216, 3))), '') AS "moedafreteOriginal", 
						NULLIF(SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 319, 3))), '/', ''), 1, 2), '') AS "condEntrega", 	
						NULLIF(t.c.value('nomeFicheiro[1]', 'varchar(100)'), '') AS "nomeFicheiro"					
					FOR XML PATH('dadosEspecificos'), TYPE), 
					(SELECT 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 34, 11))), '') AS "miniCPA", 
						(CONVERT(varchar(10), ISNULL(@DataVoo, CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 13, 6))) AS datetime)), 127) + 'Z') AS "dataVoo", 
						NULLIF(ISNULL((SELECT PAE_CODI FROM TAB_IATA WITH(NOLOCK) WHERE IAT_CODI = RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 3, 4)))), RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 3, 4)))), '') AS "aeroportoOrigem", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 353, 8))), '') AS "numeroVoo", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 256, 9))), '') AS "posicaoAviao", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 35))), '') AS "tracking", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 260, 5))), '') AS "tipoCarga"
					FOR XML PATH('dadosAWB'), TYPE), 
					(SELECT 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 59, 10))), '') AS "numeroContaExpedidor", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 59, 10))), '') AS "numeroContaDestinatario", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 69, 35))), '') AS "nomeOriginalDestinatario", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 129, 35))), '') AS "moradaOriginalDestinatario", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 199, 35))), '') AS "localidadeOriginalDestinatario", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 256, 9))), '') AS "codigoPostalOriginalDestinatario", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 199, 35))), '') AS "localidadePostalOriginalDestinatario", 						
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 296, 12))), '') AS "referenciaExterna2", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 51, 11))), '') AS "shipID"
					FOR XML PATH('dadosEntidades'), TYPE), 
					(SELECT
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 133, 2))), '') AS "dutyType", 						
						(CONVERT(varchar(10), CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 192, 9))) AS datetime), 127) + 'Z') AS "dataDocumentoTransporte", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 220, 1))), '') AS "numeroRequerimento", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 129, 20))), '') AS "numeroDURetorno", 
						NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b400000/linha)[1]', 'varchar(MAX)'), 199, 30))), '') AS "numeroT1Retorno"
					FOR XML PATH('outrosDados'), TYPE), 
					(SELECT
						(CASE 
							WHEN EXISTS(SELECT 1 FROM TAB_CLIE WITH(NOLOCK) WHERE CLI_DPRO = 1 AND CLI_NIF = NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b701000/linha)[1]', 'varchar(MAX)'), 107, 9))), '')) AND SUBSTRING(REPLACE(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 319, 3))), '/', ''), 1, 2) <> 'FD' THEN 3 
							ELSE 0 
						END) AS "codigoFollowUp"					
					FOR XML PATH('followUp'), TYPE), 									
					(SELECT
						(SELECT 
							1 AS "numeroAdicao", 
							'9999999999' AS "codigoPautal", 							
							ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 58, 104))), ''), 'NÃO CLASSIFICADO') AS "designacao", 								
							(CASE ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 86, 2))), '') 
								WHEN '' THEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '')
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 86, 2))), '') 
							END) AS "paisOrigem",		
							1 AS "metodoAvaliacao", 
							CAST(ROUND(((CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 82, 3))) 
											WHEN 'LBS' THEN ROUND((CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) * 0.4536), 3) 
											ELSE (CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) / 10) 
										END) * 0.95), 3) AS decimal(18, 6)) AS "massaLiquida", 
							CAST((CASE RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 82, 3))) 
									WHEN 'LBS' THEN ROUND((CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) * 0.4536), 3) 
									ELSE (CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))) AS decimal(18, 6)) / 10) 
								END) AS decimal(18, 6)) AS "massaBruta",							
							CAST(ISNULL(NULLIF((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00), 0), 0.01) AS decimal(18, 3)) AS "montanteAd", 
							(SELECT TOP 1
								(SELECT 
									'CT' AS "unidadeMedida", 
									CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 100, 3))) AS int) AS "volumes", 
									'ADD' AS "marcas", 									
									CAST(0 AS bit) AS "parte"																		
								FOR XML PATH('marcaEVolume'), TYPE)																
							FOR XML PATH('marcasEVolumes'), TYPE)											
						FOR XML PATH('adicao'), TYPE)
					FOR XML PATH('adicoes'), TYPE), 
					(SELECT 
						(SELECT 
							@TipoManifesto AS "tipoManifesto", 
							(CASE ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
								WHEN '' THEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '')
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
							END) AS "paisManifesto", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 58, 104))), '') AS "descricao", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 162, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "valor", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 172, 2))), '') AS "paisMoeda", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "totalFatura", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AS "numeroCPA", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))), ''), 0) AS decimal(18, 3)) / 10.00) AS decimal(18, 3)) AS "pesoBruto"							
						FOR XML PATH('manifesto'), TYPE), 
						(SELECT 
							@TipoManifesto AS "tipoManifesto", 
							(CASE ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
								WHEN '' THEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '')
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
							END) AS "paisManifesto", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 58, 104))), '') AS "descricao", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 162, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "valor", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 172, 2))), '') AS "paisMoeda", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "totalFatura", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(m.c.value('linha[1]', 'varchar(MAX)'), 167, 35))), '') AS "numeroCPA", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(m.c.value('linha[1]', 'varchar(MAX)'), 66, 3))), ''), 0) AS decimal(18, 3)) / 10.00) AS decimal(18, 3)) AS "pesoBruto"
						FROM t.c.nodes('b600xxx') AS m(c)							
						FOR XML PATH('manifesto'), TYPE), 
						(SELECT 
							2 AS "tipoManifesto", 
							(CASE ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
								WHEN '' THEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '')
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
							END) AS "paisManifesto", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 58, 104))), '') AS "descricao", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 162, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "valor", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 172, 2))), '') AS "paisMoeda", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "totalFatura", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') AS "numeroCPA", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 77, 5))), ''), 0) AS decimal(18, 3)) / 10.00) AS decimal(18, 3)) AS "pesoBruto"							
						HAVING @TipoManifesto = 1
						FOR XML PATH('manifesto'), TYPE), 
						(SELECT 
							2 AS "tipoManifesto", 
							(CASE ISNULL(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
								WHEN '' THEN NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b300000/linha)[1]', 'varchar(MAX)'), 240, 2))), '')
								ELSE NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 195, 2))), '') 
							END) AS "paisManifesto", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 58, 104))), '') AS "descricao", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 162, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "valor", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b500000/linha)[1]', 'varchar(MAX)'), 172, 2))), '') AS "paisMoeda", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b200000/linha)[1]', 'varchar(MAX)'), 166, 10))), ''), 0) AS decimal(18, 3)) / 100.00) AS decimal(18, 3)) AS "totalFatura", 
							NULLIF(RTRIM(LTRIM(SUBSTRING(m.c.value('linha[1]', 'varchar(MAX)'), 167, 35))), '') AS "numeroCPA", 
							CAST((CAST(ISNULL(NULLIF(RTRIM(LTRIM(SUBSTRING(m.c.value('linha[1]', 'varchar(MAX)'), 66, 3))), ''), 0) AS decimal(18, 3)) / 10.00) AS decimal(18, 3)) AS "pesoBruto"
						FROM t.c.nodes('b600xxx') AS m(c)	
						WHERE @TipoManifesto = 1						
						FOR XML PATH('manifesto'), TYPE)		
					FOR XML PATH('manifestos'), TYPE)
				FROM @FicheiroXML.nodes('declaracaoUPS') AS t(c)
				WHERE NOT EXISTS(SELECT 1 
								FROM PRO_DUCG WITH(NOLOCK) 
								WHERE DUC_CPRT = NULLIF(RTRIM(LTRIM(SUBSTRING(t.c.value('(b202000/linha)[1]', 'varchar(MAX)'), 51, 18))), '') 
									AND CAST(CONVERT(varchar(10), DUC_DTVO, 127) AS datetime) = ISNULL(@DataVoo, CAST(RTRIM(LTRIM(SUBSTRING(t.c.value('(b100000/linha)[1]', 'varchar(MAX)'), 13, 6))) AS datetime)) 
									AND NDE_CODI <> '25' AND @TipoManifesto = 0)
				FOR XML PATH('declaracao'), TYPE)		
			FOR XML PATH('declaracoesIMPToGIDWin'), ELEMENTS)
-- processa a geração da(s) declaração(ões) IMP-CAU
		EXEC @NumErro = sp_IMP_Declaracoes_ImportaDeXML @XMLDeclaracao, @IdUtilizador, @Erro OUTPUT								
	END TRY
	BEGIN CATCH
-- constroi mensagem de erro detalhada
		SET @NumErro = 1 
		SET @Erro = ISNULL(@Erro, '') +
					'Detalhes do Erro: ' + 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()
	END CATCH			
-- devolve resultado (0: Sucesso; 1: Erro)
	RETURN @NumErro	
END
GO
GRANT EXECUTE ON sp_IMP_Declaracoes_ImportaFicheiroUPS TO public AS dbo
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 "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, 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 "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, 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 "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, 3, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 0, @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 "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, 4, @AnoDeclaracao, @CodDeclaracao, @CodOperadorDeclaracao, @NumAdicao, 0, @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
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAU_PRO_DUCG_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAU_PRO_DUCG_IMPCAU  
GO
CREATE TRIGGER TAU_PRO_DUCG_IMPCAU ON PRO_DUCG WITH ENCRYPTION FOR UPDATE AS 
BEGIN	
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaracao de variaveis 
	DECLARE @DataAtual datetime, @IdRegisto bigint, @IdPais int, @SQLAExecutar varchar(MAX), @ProcesssaCalculos varchar(20)
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @IdDeclaracao bigint, @IdUtilizador int, @VerbaTransitario decimal(18, 2)
	DECLARE @CodStatusIncidencia varchar(8), @NumIncidencia int, @NomeStatusIncidencia varchar(60)
	DECLARE @IdDocumento int, @NumeroDocumento varchar(70), @DataValidadeDocumento datetime, @NumDocumento int, @CodDocumento varchar(5), @NomeDocumento varchar(150)
	DECLARE @NumAdicao int, @IdAdicao int, @ValorEUR numeric(38, 6), @Ajustamento numeric(38, 6), @ValorEstatistico numeric(38, 6), @ValorAduaneiro numeric(38, 6), 
		@BaseTributacaoDireitos numeric(38, 6), @TaxaValorDireitos numeric(38, 6), @MontanteDireitos numeric(38, 6), @Optativas numeric(38, 6), @BaseTributacaoIVA numeric(38, 6), 
		@TaxaIVA numeric(38, 6)		
	DECLARE @IdPedido int, @NumeroPedido varchar(512)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- se coluna de declarante alterada, processa remoções do detalhe de outros intervenientes das declarações IMP-CAU alteradas
	IF UPDATE(DEC_CO14)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON ins.DEC_CO14 = dcl.DEC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ((dcl.DEC_FXOE NOT IN (0, 1)) OR (ISNULL(dcl.DEC_NAOE, '') = ''))
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nos outros intervenientes o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesIntervenientes SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove os outros intervenientes da declaração
			DELETE FROM tb_IMP_DeclaracoesIntervenientes
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END		
-- se coluna de estado de operação alterada, processa a gestão de incidências fixas "AS" e "ND" no detalhe de incidências das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ESTO)
	BEGIN
-- insere status de incidência "A00" no detalhe de incidências da declaração IMP-CAU 				
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, inc.SIN_CODI, inc.SIN_DESP
			FROM inserted AS ins 
				INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON inc.SIN_CODI	= 'A00'
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ESTO = 'AS'			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia, @NomeStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN			
-- obtem o próximo numero de registo de incidência
			SELECT @NumIncidencia = ISNULL(MAX(DUI_CODI), 0) + 1
			FROM PRO_DUIN
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
-- insere a incidência no detalhe de incidências da declaração IMP-CAU 
			INSERT INTO PRO_DUIN(DUC_EANO, DUC_PNUM, DUI_CODI, SIN_CODI, SIN_DESC, DUI_DINI, DUI_HINI, DUI_DFIM, DUI_HFIM)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumIncidencia, @CodStatusIncidencia, @NomeStatusIncidencia, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), 
				CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime))			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia, @NomeStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- insere status de incidência "ND" no detalhe de incidências da declaração IMP-CAU
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, inc.SIN_CODI, inc.SIN_DESP
			FROM inserted AS ins 
				INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON ins.DUC_ESTO = inc.SIN_CODI					
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ESTO = 'ND'			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia, @NomeStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN						
-- obtem o próximo numero de registo de incidência
			SELECT @NumIncidencia = ISNULL(MAX(DUI_CODI), 0) + 1
			FROM PRO_DUIN
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
-- insere a incidência no detalhe de incidências da declaração IMP-CAU 
			INSERT INTO PRO_DUIN(DUC_EANO, DUC_PNUM, DUI_CODI, SIN_CODI, SIN_DESC, DUI_DINI, DUI_HINI, DUI_DFIM, DUI_HFIM)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumIncidencia, @CodStatusIncidencia, @NomeStatusIncidencia, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), 
				CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime))			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia, @NomeStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- se coluna de verba transitário alterada, processa a gestão do documento "3E01" de origem automatica da estancia de sujeição no detalhe de documentos das declarações IMP-CAU alteradas
	IF UPDATE(DUC_VTRN)
	BEGIN
-- edita o documento "3E01" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ISNULL(ins.DUC_VTRN, 0), uti.UTI_IDTY, ddo.id, 
				(CASE WHEN ISNULL(ins.DUC_VTRN, 0) > 0 THEN pai.PAI_IDTY ELSE NULL END)
			FROM inserted AS ins 				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = '3E01'
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 6	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL		
				INNER JOIN TAB_PAPL AS pap WITH(NOLOCK) ON 1 = 1
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON pap.PAI_CODI = pai.PAI_CODI				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @VerbaTransitario, @IdUtilizador, @IdRegisto, @IdPais
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesDocumentos SET 
				id_paisMoeda = @IdPais, 
				montante = @VerbaTransitario, 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id = @IdRegisto			
			FETCH NEXT FROM Declaracoes INTO @VerbaTransitario, @IdUtilizador, @IdRegisto, @IdPais
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se coluna de título de depósito alterada, processa a gestão do documento fixo "9Z07" no detalhe de documentos das declarações IMP-CAU alteradas
	IF UPDATE(DUC_NTDP)
	BEGIN		
-- insere o documento fixo "9Z07" como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, CAST(ins.DUC_NTDP as varchar(20)), CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), ddo.id
			FROM inserted AS ins 					
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI	= '9Z07'
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 11
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_NTDP IS NOT NULL AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN			
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, 11, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 
					dataValidade = @DataValidadeDocumento,					
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento fixo "9Z07" existente no detalhe de documentos da declaração mas já não satisfaz a condição do título depósito
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 11			
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL						
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ins.DUC_NTDP IS NULL OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes									
	END
-- se coluna de anexo B alterada, processa remoções dos detalhes de referências fiscais, acréscimos/deduções e detalhes do aperfeiçoamento das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB)
	BEGIN
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter referências fiscais
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB NOT IN ('H1', 'H6', 'I1')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nas referências fiscais o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesReferenciasFiscais SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove as referências fiscais da declaração
			DELETE FROM tb_IMP_DeclaracoesReferenciasFiscais
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter acréscimos/deduções
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB IN ('H2', 'H3', 'H4', 'H6')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nos acréscimos/deduções o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesAcrescimosDeducoes SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove os acréscimos/deduções da declaração
			DELETE FROM tb_IMP_DeclaracoesAcrescimosDeducoes
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter proprietários das mercadorias de aperfeiçoamento
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB IN ('H1', 'H2', 'H4', 'H5', 'H6', 'I1', 'I2')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nos proprietários das mercadorias o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesProprietarios SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove os proprietários das mercadorias da declaração
			DELETE FROM tb_IMP_DeclaracoesProprietarios
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter estâncias de apuramento ou locais de transformação de aperfeiçoamento
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB IN ('H1', 'H2', 'H5', 'H6', 'I1', 'I2')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nas estâncias de apuramento o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesEstancias SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove as estâncias de apuramento da declaração
			DELETE FROM tb_IMP_DeclaracoesEstancias
			WHERE id_declaracaoIMP = @IdDeclaracao
-- atualiza nos locais de transformação o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesLocaisTransformacao SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove os locais de transformação da declaração
			DELETE FROM tb_IMP_DeclaracoesLocaisTransformacao
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter produtos transformados ou condições económicas de aperfeiçoamento
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ins.DUC_UALT = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB IN ('H1', 'H2', 'H3', 'H5', 'H6', 'I1', 'I2')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nos produtos transformados o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesProdutosTransformados SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove os produtos transformados da declaração
			DELETE FROM tb_IMP_DeclaracoesProdutosTransformados
			WHERE id_declaracaoIMP = @IdDeclaracao
-- atualiza nas condições económicas o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesCondicoesEconomicas SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_declaracaoIMP = @IdDeclaracao
-- remove as condições económicas da declaração
			DELETE FROM tb_IMP_DeclaracoesCondicoesEconomicas
			WHERE id_declaracaoIMP = @IdDeclaracao
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se colunas de contentores e n.º contentor alteradas, processa remoções dos detalhes de contentores das adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_CT19) OR UPDATE(DUC_CONT)
	BEGIN
-- obtem as declarações IMP-CAU que não satisfaçam as condições p/ ter contentores nas adições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM
			FROM inserted AS ins 				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ins.DUC_CT19 = 0 OR ISNULL(ins.DUC_CONT, '') <> '')
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- remove os contentores de todas as adições da declaração
			DELETE FROM PRO_DCON
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- se colunas de anexo B, tipo declaração, exportador, vendedor, comprador, natureza de transação, numero NRUR, despacho centralizado, beneficiario de IVA, regime, direitos DDP, frete, seguro, verba transitário, verbas automáticas, garantia global, NRG, NIF Responsável, Fórmula, Taxa FDA, Câmbio Montante, Câmbio Frete, Câmbio Seguro, Meio Transporte Chegada, Total Adições, Total Volumes e Total Optativas alteradas, processa atualizações nos campos das adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB) OR UPDATE(TDE_CODI) OR UPDATE(DUC_ENOM) OR UPDATE(FOR_NOME) OR UPDATE(CLI_NOME1) OR UPDATE(NTR_CO24) OR UPDATE(DUC_REF7) OR UPDATE(DUC_DCEN) 
	OR UPDATE(DUC_BIVA) OR UPDATE(DUC_REGI) OR UPDATE(DUC_DIRT) OR UPDATE(DUC_FRET) OR UPDATE(DUC_SEGU) OR UPDATE(DUC_VTRN) OR UPDATE(DUC_VBAT) OR UPDATE(DUC_CGLB) 
	OR UPDATE(DUC_CAUC) OR UPDATE(DUC_CNIR) OR UPDATE(DUC_FR20) OR UPDATE(DUC_TFDA) OR UPDATE(DUC_TX23) OR UPDATE(DUC_TXFR) OR UPDATE(DUC_TXSE) OR UPDATE(MTR_PT18) 
	OR UPDATE(DUC_ADI5) OR UPDATE(DUC_TVL6) OR UPDATE(DUC_OP18)
	BEGIN
		DECLARE @LimpaVendedor tinyint, @LimpaComprador tinyint, @LimpaContingente tinyint, @LimpaMassaLiquida tinyint, @AtualizaPreferencia tinyint, @AtualizaMetodoAvaliacao tinyint, 
			@LimpaPaisPreferencial tinyint, @AtualizaAdicionaisNacionais tinyint, @AtualizaTipoMercadoria tinyint, @LimpaExportador tinyint, @LimpaNaturezaTransacao tinyint, 
			@LimpaPaisDestino tinyint, @LimpaRegiao tinyint, @AtualizaPaisOrigem tinyint, @LimpaNumeroNRUR tinyint, @AtualizaAdicionalIVA tinyint, @AtualizaRegime tinyint,
			@LimpaIndicadorAvaliacao tinyint, @LimpaDireitos tinyint, @AtualizaFrete tinyint, @AtualizaSeguro tinyint, @AtualizaVerbaTransitario tinyint, @AtualizaNRG tinyint, 
			@AtualizaNIFResponsavel tinyint, @AtualizaAjustamento tinyint, @AtualizaValorEUR tinyint, @AtualizaValorOptativas tinyint
		DECLARE @SQLJoinTBL_Desdobramentos varchar(1000), @SQLJoinTAB_PREF varchar(1000), @SQLJoinTAB_CLIE varchar(1000), @SQLJoinTAB_APAU varchar(1000)
-- obtem as adições das declarações IMP-CAU que satisfaçam as condições associadas ao anexo B ou exportador
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUA_IDEN, 
				(CASE 
					WHEN ((ins.DUC_ANXB <> 'H1' AND del.DUC_ANXB IN ('H1', '##')) OR (ISNULL(ins.FOR_NOME, '') <> '' AND ISNULL(del.FOR_NOME, '') = '')) AND ISNULL(adi.FOR_NOME1, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ((ins.DUC_ANXB <> 'H1' AND del.DUC_ANXB IN ('H1', '##')) OR (ISNULL(ins.CLI_NOME1, '') <> '' AND ISNULL(del.CLI_NOME1, '') = '')) AND ISNULL(adi.CLI_NOME, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB NOT IN ('H1', 'I1') AND del.DUC_ANXB IN ('H1', 'I1', '##') AND ISNULL(adi.DUA_CO39, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H2', 'H3', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'H3', 'I2') AND adi.DUA_ML38 <> 0 THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H2', 'H5', 'H6') AND del.DUC_ANXB NOT IN ('H2', 'H5', 'H6') AND ISNULL(adi.PRE_CO36, '') <> '000' THEN 1 
					WHEN ins.DUC_ANXB NOT IN ('H2', 'H5', 'H6') AND ins.DUC_ASAI = 0 AND ins.TDE_CODI <> del.TDE_CODI AND ISNULL(tde.PRE_CODI, '') <> '' AND ISNULL(tde.PRE_CODI, '') <> ISNULL(adi.PRE_CO36, '') THEN 2
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'H6', 'I1', 'I2') AND adi.DUA_MAVA IS NOT NULL THEN 1 
					WHEN ins.DUC_ANXB NOT IN ('H2', 'H6', 'I1', 'I2') AND del.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2', '##') AND adi.DUA_R37B NOT IN ('E01', 'E02') AND adi.DUA_MAVA IS NULL THEN 2
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H5', 'H6', 'I2') AND del.DUC_ANXB NOT IN ('H5', 'H6', 'I2') AND ISNULL(adi.PAI_CODI5, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H6', 'I2') AND del.DUC_ANXB NOT IN ('H6', 'I2') AND ((ISNULL(adi.DUA_1TAR, '') <> '') OR (ISNULL(adi.DUA_2TAR, '') <> '') OR (ISNULL(adi.DUA_3TAR, '') <> '') OR (ISNULL(adi.DUA_4TAR, '') <> '') OR (ISNULL(adi.DUA_5TAR, '') <> '') OR (ISNULL(adi.APA_CCUS, '') <> '') OR (ISNULL(adi.DUA_US41, 0) <> 0)) THEN 1 
					WHEN ins.DUC_ANXB NOT IN ('H6', 'I2') AND del.DUC_ANXB IN ('H6', 'I2') AND ISNULL(adi.DUA_1TAR, '') = '' AND ISNULL(adi.DUA_2TAR, '') = '' AND ISNULL(adi.DUA_3TAR, '') = '' AND ISNULL(adi.DUA_4TAR, '') = '' AND ISNULL(adi.DUA_5TAR, '') = '' AND ISNULL(adi.APA_CCUS, '') = '' THEN 2
					WHEN ins.DUC_ANXB NOT IN ('H6', 'I2') AND del.DUC_ANXB = '##' AND ISNULL(adi.DUA_4TAR, '') = '' AND ISNULL(adi.DUA_5TAR, '') = '' AND ISNULL(adi.APA_CCUS, '') = '' THEN 3
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB NOT IN ('H6', 'I2') AND del.DUC_ANXB IN ('H6', 'I2', '##') AND ISNULL(adi.DUA_TMER, '') <> '' THEN 1 
					WHEN ins.DUC_ANXB IN ('H6', 'I2') AND del.DUC_ANXB NOT IN ('H6', 'I2') AND ISNULL(adi.DUA_TMER, '') = '' THEN 2
					ELSE 0 
				END), 
				(CASE 
					WHEN ((ins.DUC_ANXB IN ('H6', 'I2') AND del.DUC_ANXB NOT IN ('H6', 'I2')) OR (ISNULL(ins.DUC_ENOM, '') <> '' AND ISNULL(del.DUC_ENOM, '') = '')) AND ((ISNULL(adi.FOR_NOME, '') <> '') OR (ISNULL(adi.PAI_CODI1, '') <> '')) THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ((ins.DUC_ANXB IN ('H2', 'H6', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'H6', 'I1', 'I2')) OR (ISNULL(ins.NTR_CO24, '') <> '' AND ISNULL(del.NTR_CO24, '') = '')) AND ISNULL(adi.NTR_CODI, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H6', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H6', 'I1', 'I2') AND ISNULL(adi.PAI_CODI2, '') <> '' THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ((ins.DUC_ANXB IN ('H6', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H6', 'I1', 'I2')) OR (ins.DUC_DCEN = 0 AND del.DUC_DCEN = 1)) AND adi.RES_CODI IS NOT NULL THEN 1 
					ELSE 0 
				END), 
				(CASE 
					WHEN ins.DUC_ANXB = 'I2' AND del.DUC_ANXB <> 'I2' AND ISNULL(adi.PAI_CO34, '') <> '' THEN 1 
					WHEN ins.DUC_ANXB <> 'I2' AND del.DUC_ANXB = 'I2' AND ISNULL(adi.PAI_CO34, '') = '' THEN 2
					ELSE 0 
				END), 
				(CASE 
					WHEN ((ins.DUC_ANXB = 'I2' AND del.DUC_ANXB <> 'I2') OR (ISNULL(ins.DUC_REF7, '') <> '' AND ISNULL(del.DUC_REF7, '') = '')) AND ISNULL(adi.DUA_NRUR, '') <> '' THEN 1 
					ELSE 0 
				END),
				(CASE 
					WHEN ((LEFT(ISNULL(ins.DUC_REGI, ''), 2) = '42' AND LEFT(ISNULL(del.DUC_REGI, ''), 2) <> '42') OR (ins.DUC_BIVA = 1 AND del.DUC_BIVA = 0)) AND adi.DUA_AIVA IS NOT NULL THEN 1
					WHEN LEFT(ISNULL(ins.DUC_REGI, ''), 2) <> '42' AND ins.DUC_BIVA = 0 AND ((LEFT(ISNULL(ins.DUC_REGI, ''), 2) <> LEFT(ISNULL(del.DUC_REGI, ''), 2)) OR (ins.DUC_BIVA <> del.DUC_BIVA)) AND adi.DUA_AIVA IS NULL THEN 2
					ELSE 0
				END), 
				(CASE 
					WHEN ISNULL(ins.DUC_REGI, '') <> ISNULL(del.DUC_REGI, '') AND ISNULL(ins.DUC_REGI, '') <> ISNULL(adi.DUA_RG37, '') THEN 1
					ELSE 0
				END), 
				(CASE 
					WHEN ins.DUC_ANXB IN ('H2', 'H3', 'H6', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'H3', 'H6', 'I2') AND ISNULL(adi.DUA_IAVA, '') <> '' THEN 1 					
					ELSE 0 
				END), 
				(CASE
					WHEN ISNULL(ins.DUC_DIRT, 0) = 0 AND ISNULL(del.DUC_DIRT, 0) <> 0 AND ISNULL(adi.DUA_VDIR, 0) <> 0 THEN 1
					ELSE 0
				END),
				(CASE
					WHEN ISNULL(ins.DUC_FRET, 0) = 0 AND ISNULL(del.DUC_FRET, 0) <> 0 AND ISNULL(adi.DUA_VFRE, 0) <> 0 THEN 1
					WHEN ISNULL(ins.DUC_FRET, 0) > 0 AND ins.DUC_VBAT = 1 AND ((del.DUC_VBAT = 0) OR (ISNULL(ins.DUC_FRET, 0) <> ISNULL(del.DUC_FRET, 0))) THEN 2
					ELSE 0
				END),
				(CASE
					WHEN ISNULL(ins.DUC_SEGU, 0) = 0 AND ISNULL(del.DUC_SEGU, 0) <> 0 AND ISNULL(adi.DUA_VSEG, 0) <> 0 THEN 1
					WHEN ISNULL(ins.DUC_SEGU, 0) > 0 AND ins.DUC_VBAT = 1 AND ((del.DUC_VBAT = 0) OR (ISNULL(ins.DUC_SEGU, 0) <> ISNULL(del.DUC_SEGU, 0))) THEN 2
					ELSE 0
				END), 
				(CASE
					WHEN ISNULL(ins.DUC_VTRN, 0) = 0 AND ISNULL(del.DUC_VTRN, 0) <> 0 AND ISNULL(adi.DUA_VTRA, 0) <> 0 THEN 1
					WHEN ISNULL(ins.DUC_VTRN, 0) > 0 AND ins.DUC_VBAT = 1 AND ((del.DUC_VBAT = 0) OR (ISNULL(ins.DUC_VTRN, 0) <> ISNULL(del.DUC_VTRN, 0))) THEN 2					
					ELSE 0
				END), 
				(CASE					
					WHEN (ins.DUC_ANXB IN ('H2', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'I1', 'I2')) OR (ins.DUC_CGLB = 1 AND (ins.DUC_CGLB <> del.DUC_CGLB OR ISNULL(ins.DUC_CAUC, '') <> ISNULL(del.DUC_CAUC, ''))) THEN 1
					WHEN ins.DUC_ANXB NOT IN ('H2', 'I1', 'I2') AND ins.DUC_BIVA <> del.DUC_BIVA THEN 2
					ELSE 0
				END),
				(CASE					
					WHEN (ins.DUC_ANXB IN ('H2', 'I1', 'I2') AND del.DUC_ANXB NOT IN ('H2', 'I1', 'I2')) OR (ins.DUC_CGLB = 1 AND (ins.DUC_CGLB <> del.DUC_CGLB OR ISNULL(ins.DUC_CNIR, '') <> ISNULL(del.DUC_CNIR, ''))) THEN 1
					WHEN ins.DUC_ANXB NOT IN ('H2', 'I1', 'I2') AND ins.DUC_BIVA <> del.DUC_BIVA THEN 2
					ELSE 0
				END), 
				(CASE 
					WHEN (ISNULL(ins.DUC_FR20, '') <> ISNULL(del.DUC_FR20, '')) OR (ISNULL(ins.DUC_TFDA, 0) <> ISNULL(del.DUC_TFDA, 0)) OR (ISNULL(ins.DUC_TXFR, 0) <> ISNULL(del.DUC_TXFR, 0)) OR (ISNULL(ins.DUC_TXSE, 0) <> ISNULL(del.DUC_TXSE, 0)) THEN 1
					ELSE 0
				END), 
				(CASE 
					WHEN ISNULL(ins.DUC_TX23, 0) <> ISNULL(del.DUC_TX23, 0) THEN 1
					ELSE 0
				END), 
				(CASE WHEN (ISNULL(ins.MTR_PT18, '') <> ISNULL(del.MTR_PT18, '')) OR (ISNULL(ins.DUC_OP18, 0) <> ISNULL(del.DUC_OP18, 0)) OR (((ins.DUC_ADI5 <> del.DUC_ADI5) OR (ISNULL(ins.DUC_TVL6, 0) <> ISNULL(del.DUC_TVL6, 0))) AND (mtr.MTR_VPVL = 2)) THEN 1
					ELSE 0
				END)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON ins.TDE_CODI = tde.TDE_CODI
				INNER JOIN TAB_MTRA AS mtr WITH(NOLOCK) ON ins.MTR_PT18 = mtr.MTR_CODI
				INNER JOIN PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM										
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdAdicao, @LimpaVendedor, @LimpaComprador, @LimpaContingente, @LimpaMassaLiquida, @AtualizaPreferencia, @AtualizaMetodoAvaliacao, @LimpaPaisPreferencial, 
			@AtualizaAdicionaisNacionais, @AtualizaTipoMercadoria, @LimpaExportador, @LimpaNaturezaTransacao, @LimpaPaisDestino, @LimpaRegiao, @AtualizaPaisOrigem, @LimpaNumeroNRUR, 
			@AtualizaAdicionalIVA, @AtualizaRegime, @LimpaIndicadorAvaliacao, @LimpaDireitos, @AtualizaFrete, @AtualizaSeguro, @AtualizaVerbaTransitario, @AtualizaNRG, @AtualizaNIFResponsavel,
			@AtualizaAjustamento, @AtualizaValorEUR, @AtualizaValorOptativas
		WHILE @@FETCH_STATUS = 0
		BEGIN			
			SET @ProcesssaCalculos = REPLICATE('0', 20)
			SET @SQLAExecutar = '' 
			SET @SQLJoinTBL_Desdobramentos = ''
			SET @SQLJoinTAB_PREF = ''
			SET @SQLJoinTAB_CLIE = ''
-- atualiza nas adições os campos de Vendedor quando o anexo B não é "H1" ou vendedor preenchido
			IF @LimpaVendedor = 1			
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'FOR_CODI1 = NULL, FOR_NOME1 = NULL, FOR_MORA1 = NULL, FOR_LOCA1 = NULL, FOR_CPOS1 = NULL, FOR_LPOS1 = NULL, PAI_CODI3 = NULL, FOR_NIF1 = NULL'
			END		
-- atualiza nas adições os campos de Comprador quando o anexo B não é "H1" ou comprador preenchido
			IF @LimpaComprador = 1		
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'CLI_CODI = NULL, CLI_NOME = NULL, CLI_MORA = NULL,	CLI_LOCA = NULL, CLI_CPOS = NULL, CLI_LPOS = NULL, PAI_CODI4 = NULL, CLI_NIF = NULL'
			END	
-- atualiza nas adições o campo de Contingente quando o anexo B não é "H1" ou "I1" 
			IF @LimpaContingente = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_CO39 = NULL'
			END
-- atualiza nas adições o campo de Massa Líquida quando o anexo B é "H2", "H3" ou "I2"
			IF @LimpaMassaLiquida = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_ML38 = 0'				
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI		
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 10, 1, '1') -- DUA_QTDD
			END
-- atualiza nas adições o campo de Preferência quando o anexo B é "H2", "H5" ou "H6"
			IF @AtualizaPreferencia = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'PRE_CO36 = ISNULL(pr0.PRE_CODI, prd.PRE_CODI), PRE_NOME = ISNULL(pr0.PRE_NOME, prd.PRE_NOME), RRE_PREF = rrp.RRE_CODI, RRE_NOME1 = rrp.RRE_NOME, DUA_IMPO = rrp.RRE_IMPO'	
				SET @SQLJoinTAB_PREF = 'LEFT OUTER JOIN TAB_PREF AS pr0 WITH(NOLOCK) ON pr0.PRE_CODI = ''000'' '
				SET @SQLJoinTAB_PREF = @SQLJoinTAB_PREF + 'LEFT OUTER JOIN TAB_PREF AS prd WITH(NOLOCK) ON tde.PRE_CODI = prd.PRE_CODI '
				SET @SQLJoinTAB_PREF = @SQLJoinTAB_PREF + 'LEFT OUTER JOIN TAB_RREC AS rrp WITH(NOLOCK) ON ISNULL(pr0.RRE_CODI, prd.RRE_CODI) = rrp.RRE_CODI'
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL
			END
			ELSE
-- atualiza nas adições o campo de Preferência quando o tipo de declaração alterou
				IF @AtualizaPreferencia = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'PRE_CO36 = prd.PRE_CODI, PRE_NOME = prd.PRE_NOME, RRE_PREF = rrp.RRE_CODI, RRE_NOME1 = rrp.RRE_NOME, DUA_IMPO = rrp.RRE_IMPO'	
					SET @SQLJoinTAB_PREF = 'LEFT OUTER JOIN TAB_PREF AS prd WITH(NOLOCK) ON tde.PRE_CODI = prd.PRE_CODI '
					SET @SQLJoinTAB_PREF = @SQLJoinTAB_PREF + 'LEFT OUTER JOIN TAB_RREC AS rrp WITH(NOLOCK) ON prd.RRE_CODI = rrp.RRE_CODI'
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL
				END
-- atualiza nas adições o campo do Método de Avaliação quando o anexo B é "H2", "H6", "I1" ou "I2"
			IF @AtualizaMetodoAvaliacao = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_MAVA = NULL'								
			END
			ELSE
-- atualiza nas adições o campo de Método de Avaliação quando o anexo B não é "H2", "H6", "I1" ou "I2" 
				IF @AtualizaMetodoAvaliacao = 2
				BEGIN
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_MAVA = (CASE DUA_CODI WHEN 1 THEN 1 ELSE (SELECT DUA_MAVA FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI = 1) END)'					
				END
-- atualiza nas adições o campo de País de Origem Preferencial quando o anexo B é "H5", "H6" ou "I2" 
			IF @LimpaPaisPreferencial = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'PAI_CODI5 = NULL'
			END
-- atualiza nas adições os campos de adicional nacional, codigo CUS e unidades quando o anexo B é "H6" ou "I2"
			IF @AtualizaAdicionaisNacionais = 1
			BEGIN		
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '		
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_1TAR = NULL, DUA_2TAR = NULL, DUA_3TAR = NULL, DUA_4TAR = NULL, DUA_5TAR = NULL, APA_CCUS = NULL, DUA_US41 = 0'
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI		
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL	
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 10, 1, '1') -- DUA_QTDD							
			END
			ELSE
-- atualiza nas adições os campos de adicional nacional e codigo CUS quando o anexo B não é "H6" ou "I2"
				IF @AtualizaAdicionaisNacionais = 2
				BEGIN
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_1TAR = apa.APA_AIC1, DUA_2TAR = apa.APA_AIC2, DUA_3TAR = apa.APA_AIC3, DUA_4TAR = apa.APA_AIC4, DUA_5TAR = apa.APA_AIC5, APA_CCUS = apa.APA_CCUS'
					SET @SQLJoinTAB_APAU = 'INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON adi.APA_CO33 = apa.APA_CODI'
				END
				ELSE
-- atualiza nas adições os campos de adicional nacional e codigo CUS quando o anexo B não é "H6" ou "I2" mas está em conversão de DUI2
					IF @AtualizaAdicionaisNacionais = 3
					BEGIN
						IF @SQLAExecutar <> ''
							SET @SQLAExecutar = @SQLAExecutar + ', '
						SET @SQLAExecutar = @SQLAExecutar + 'DUA_4TAR = apa.APA_AIC4, DUA_5TAR = apa.APA_AIC5, APA_CCUS = apa.APA_CCUS'
						SET @SQLJoinTAB_APAU = 'INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON adi.APA_CO33 = apa.APA_CODI'
					END
-- atualiza nas adições o campo de Tipo de Mercadoria quando o anexo B não é "H6" ou "I2" 
			IF @AtualizaTipoMercadoria = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_TMER = NULL'
			END
			ELSE
-- atualiza nas adições o campo de Tipo de Mercadoria quando o anexo B é "H6" ou "I2" 
				IF @AtualizaTipoMercadoria = 2
				BEGIN
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_TMER = apa.APA_TMER'
					SET @SQLJoinTAB_APAU = 'INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON adi.APA_CO33 = apa.APA_CODI'
				END
-- atualiza nas adições os campos de Exportador e País de Expedição quando o anexo B é "H6" ou "I2" ou exportador preenchido
			IF @LimpaExportador = 1		
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'FOR_CODI = NULL, FOR_NOME = NULL, FOR_MORA = NULL,	FOR_LOCA = NULL, FOR_CPOS = NULL, FOR_LPOS = NULL, PAI_CODI = NULL, FOR_NIF = NULL, PAI_CODI1 = NULL'
			END
-- atualiza nas adições o campo de Natureza de Transação quando o anexo B é "H2", "H6", "I1" ou "I2" ou natureza de transação preenchida
			IF @LimpaNaturezaTransacao = 1			
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'NTR_CODI = NULL'
			END
-- atualiza nas adições o campo de País de Destino quando o anexo B é "H6", "I1" ou "I2" 
			IF @LimpaPaisDestino = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'PAI_CODI2 = NULL'
			END
-- atualiza nas adições o campo de Região quando o anexo B é "H6", "I1" ou "I2" ou despacho não é centralizado
			IF @LimpaRegiao = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'RES_CODI = NULL'
			END
-- atualiza nas adições o campo de País Origem quando o anexo B é "I2"
			IF @AtualizaPaisOrigem = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'PAI_CO34 = NULL, PAI_NOME = NULL'						
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL
			END
			ELSE
-- atualiza nas adições o campo de País Origem quando o anexo B não é "I2" 
				IF @AtualizaPaisOrigem = 2
				BEGIN
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'PAI_CO34 = duc.PAI_PA15, PAI_NOME = duc.PAI_NO15'
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL
				END
-- atualiza nas adições o campo de Número NRUR quando o anexo B é "I2" ou número NRUR preenchido
			IF @LimpaNumeroNRUR = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_NRUR = NULL'
			END
-- atualiza nas adições o campo de adicional IVA quando o regime é "42" ou é beneficiário IVA
			IF @AtualizaAdicionalIVA = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_AIVA = NULL'
			END
			ELSE
-- atualiza nas adições o campo de adicional IVA quando o regime não é "42" e não é beneficiário IVA
				IF @AtualizaAdicionalIVA = 2
				BEGIN
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_AIVA = cli.CLI_AIVA'
					SET @SQLJoinTAB_CLIE = 'INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON duc.DUC_DST8 = cli.CLI_CODI'
				END			
-- atualiza nas adições o campo de regime quando o regime é diferente do regime da adição
			IF @AtualizaRegime = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_RG37 = duc.DUC_REGI, id_desdobramento = ddb.id, DUA_R37B = ddb.desdobramento1, DUA_R37C = ddb.desdobramento2'	
				SET @SQLJoinTBL_Desdobramentos = 'LEFT OUTER JOIN tb_TBL_Desdobramentos AS ddb WITH(NOLOCK) ON duc.TDE_1CAS = ddb.tipoDeclaracao AND duc.DUC_REGI = ddb.regime AND tde.TDE_DESD = ddb.desdobramento1 AND ISNULL(ddb.desdobramento2, '''') = '''' AND ISNULL(ddb.desdobramento3, '''') = '''' AND ISNULL(ddb.desdobramento4, '''') = '''' AND ISNULL(ddb.desdobramento5, '''') = '''''
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 8, 1, '1') -- DUA_TIVA
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 6, 1, '1') -- DUA_TXVL
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 9, 1, '1') -- DUA_MAVA
			END
-- atualiza nas adições o campo de Indicador Avaliação quando o anexo B é "H2", "H3", "H6" ou "I2" 
			IF @LimpaIndicadorAvaliacao = 1
			BEGIN
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_IAVA = NULL'
			END
-- atualiza nas adições o campo de Direitos quando não há direitos DDP
			IF @LimpaDireitos = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_VDIR = 0'				
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
			END
-- atualiza nas adições o campo de Frete quando não há valor de frete
			IF @AtualizaFrete = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_VFRE = 0'				
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
			END
			ELSE
				IF @AtualizaFrete = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_VFRE = ROUND((CASE WHEN (duc.DUC_ADI5 > 1) AND (adi.DUA_CODI = duc.DUC_ADI5) THEN (duc.DUC_FRET - (SELECT SUM(DUA_VFRE) FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI <> adi.DUA_CODI)) ELSE (adi.DUA_MB35 * duc.DUC_FRET / duc.DUC_MBRT) END), 3)'				
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
				END
-- atualiza nas adições o campo de Seguro quando não há valor de seguro
			IF @AtualizaSeguro = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_VSEG = 0'				
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
			END
			ELSE
				IF @AtualizaSeguro = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_VSEG = ROUND((CASE WHEN (duc.DUC_ADI5 > 1) AND (adi.DUA_CODI = duc.DUC_ADI5) THEN (duc.DUC_SEGU - (SELECT SUM(DUA_VSEG) FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI <> adi.DUA_CODI)) ELSE (adi.DUA_VA42 * duc.DUC_SEGU / duc.DUC_MT22) END), 3)'				
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
				END
-- atualiza nas adições o campo de Verba Transitário quando não há valor de verba transitário
			IF @AtualizaVerbaTransitario = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_VTRA = 0'				
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 20, 1, '1')
			END
			ELSE
				IF @AtualizaVerbaTransitario = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_VTRA = ROUND((CASE WHEN (duc.DUC_ADI5 > 1) AND (adi.DUA_CODI = duc.DUC_ADI5) THEN (duc.DUC_VTRN - (SELECT SUM(DUA_VTRA) FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = adi.DUC_EANO AND DUC_PNUM = adi.DUC_PNUM AND DUA_CODI <> adi.DUA_CODI)) ELSE (adi.DUA_MB35 * duc.DUC_VTRN / duc.DUC_MBRT) END), 2)'				
					SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 20, 1, '1')
				END
-- atualiza nas adições o campo de NRG quando não há NRG definido
			IF @AtualizaNRG = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_CAUC = duc.DUC_CAUC, DUA_CANO = duc.DUC_CANO, DUA_CTIP = duc.DUC_CTIP, DUA_CENT = duc.DUC_CENT, '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_CAUD = duc.DUC_CAUC, DUA_CAND = duc.DUC_CANO, DUA_CTID = duc.DUC_CTIP, DUA_CEND = duc.DUC_CENT, ALF_CODI = duc.ALF_CODI2, DUA_CCAD = duc.DUC_CCAC, DUA_CORD = duc.DUC_CORF, '
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_CAUI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CAUC ELSE NULL END), DUA_CANI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CANO ELSE NULL END), DUA_CTII = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CTIP ELSE NULL END), DUA_CENI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CENT ELSE NULL END), ALF_CODI1 = (CASE duc.DUC_BIVA WHEN 0 THEN duc.ALF_CODI2 ELSE NULL END), DUA_CCAI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CCAC ELSE NULL END), DUA_CORI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CORF ELSE NULL END)'
			END
			ELSE
				IF @AtualizaNRG = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '						
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_CAUI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CAUC ELSE NULL END), DUA_CANI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CANO ELSE NULL END), DUA_CTII = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CTIP ELSE NULL END), DUA_CENI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CENT ELSE NULL END), ALF_CODI1 = (CASE duc.DUC_BIVA WHEN 0 THEN duc.ALF_CODI2 ELSE NULL END), DUA_CCAI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CCAC ELSE NULL END), DUA_CORI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CORF ELSE NULL END)'
				END
-- atualiza nas adições o campo de NIF Responsável Garantia quando não há NIF reponsável garantia definido
			IF @AtualizaNIFResponsavel = 1
			BEGIN				
				IF @SQLAExecutar <> ''
					SET @SQLAExecutar = @SQLAExecutar + ', '					
				SET @SQLAExecutar = @SQLAExecutar + 'DUA_CNRD = duc.DUC_CNIR, DUA_CNRI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CNIR ELSE NULL END)'
			END
			ELSE
				IF @AtualizaNIFResponsavel = 2
				BEGIN				
					IF @SQLAExecutar <> ''
						SET @SQLAExecutar = @SQLAExecutar + ', '						
					SET @SQLAExecutar = @SQLAExecutar + 'DUA_CNRI = (CASE duc.DUC_BIVA WHEN 0 THEN duc.DUC_CNIR ELSE NULL END)'
				END
-- atualiza nas adições o campo de ajustamento quando a formula ou a taxa FDA foram alteradas
			IF @AtualizaAjustamento = 1
			BEGIN
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 1, 1, '1') -- DUA_AJUS
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
			END
-- atualiza nas adições o campo de valor EUR quando a taxa de câmbio foi alterada
			IF @AtualizaValorEUR = 1
			BEGIN
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 2, 1, '1') -- DUA_VAEU
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 3, 1, '1') -- DUA_VEST
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 4, 1, '1') -- DUA_VATO
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 5, 1, '1') -- DUA_BTRI
			END
-- atualiza nas adições o campo de valor optativas quando o meio de transporte, total adições, total volumes, total massa bruta, valor aduaneiro total ou total optativas alterados
			IF @AtualizaValorOptativas = 1
				SET @ProcesssaCalculos = STUFF(@ProcesssaCalculos, 7, 1, '1') -- DUA_VOPT
-- processa a atualização dos campos na adição
			IF @SQLAExecutar <> ''
			BEGIN
				SET @SQLAExecutar = 'UPDATE PRO_DUAD SET ' + @SQLAExecutar + ' '
				SET @SQLAExecutar = @SQLAExecutar + 'FROM PRO_DUAD AS adi WITH(NOLOCK) '
				SET @SQLAExecutar = @SQLAExecutar + 'INNER JOIN PRO_DUCG AS duc WITH(NOLOCK) ON adi.DUC_EANO = duc.DUC_EANO AND adi.DUC_PNUM = duc.DUC_PNUM '
				SET @SQLAExecutar = @SQLAExecutar + 'INNER JOIN TAB_TDEC AS tde WITH(NOLOCK) ON duc.TDE_CODI = tde.TDE_CODI '
				IF @SQLJoinTBL_Desdobramentos <> ''
					SET @SQLAExecutar = @SQLAExecutar + @SQLJoinTBL_Desdobramentos + ' '				
				IF @SQLJoinTAB_PREF <> ''
					SET @SQLAExecutar = @SQLAExecutar + @SQLJoinTAB_PREF + ' '
				IF @SQLJoinTAB_CLIE <> ''
					SET @SQLAExecutar = @SQLAExecutar + @SQLJoinTAB_CLIE + ' '
				IF @SQLJoinTAB_APAU <> ''
					SET @SQLAExecutar = @SQLAExecutar + @SQLJoinTAB_APAU + ' '								
				SET @SQLAExecutar = @SQLAExecutar + 'WHERE adi.DUA_IDEN = ' + CAST(@IdAdicao AS varchar(10))
				EXEC (@SQLAExecutar)
			END
-- atualiza a atualização dos campos de valores da tributação de direitos e IVA na adição
			IF @ProcesssaCalculos <> REPLICATE('0', 20)
			BEGIN				
				UPDATE PRO_DUAD SET 										
					@Ajustamento = DUA_AJUS = (CASE 
												WHEN SUBSTRING(@ProcesssaCalculos, 1, 1) = '1' THEN dbo.fn_IMP_CalculaAjustamento(ISNULL(duc.DUC_FR20, ''), ISNULL(duc.DUC_TFDA, 0), ISNULL(duc.DUC_TXFR, 0), ISNULL(duc.DUC_TxSE, 0), adi.DUA_VFRE, adi.DUA_VSEG, adi.DUA_VDIR, adi.DUA_ACRE, adi.DUA_DEDU)
												ELSE adi.DUA_AJUS
											END),
					@ValorEUR = DUA_VAEU = (CASE 
												WHEN SUBSTRING(@ProcesssaCalculos, 2, 1) = '1' THEN ROUND(adi.DUA_VA42 / ISNULL(duc.DUC_TX23, 0), 2)
												ELSE adi.DUA_VAEU
											END), 
					@ValorEstatistico = DUA_VEST = (CASE 
														WHEN SUBSTRING(@ProcesssaCalculos, 3, 1) = '1' THEN dbo.fn_IMP_CalculaValorEstatistico(@ValorEUR, @Ajustamento)
														ELSE adi.DUA_VEST
													END),
					@ValorAduaneiro = DUA_VATO = (CASE 
													WHEN SUBSTRING(@ProcesssaCalculos, 4, 1) = '1' THEN @ValorEstatistico
													ELSE adi.DUA_VATO
												END),
					@BaseTributacaoDireitos = DUA_BTRI = (CASE 
															WHEN SUBSTRING(@ProcesssaCalculos, 5, 1) = '1' THEN dbo.fn_IMP_CalculaBaseTributacaoDireitos(adi.DUA_BMAN, adi.DUA_BTRI, adi.DUA_TRIB, adi.DUA_ML38, adi.DUA_US41, @ValorEstatistico, adi.UME_CODI) 
															ELSE adi.DUA_BTRI 
														END), 
					@TaxaValorDireitos = DUA_TXVL = (CASE 
														WHEN SUBSTRING(@ProcesssaCalculos, 6, 1) = '1' THEN dbo.fn_IMP_CalculaTaxaValorDireitos(@DataAtual, adi.APA_CO33, adi.PAI_CO34, pre.PRE_TAXA, adi.DUA_US41, adi.DUA_RG37, adi.DUA_R37B) 
														ELSE adi.DUA_TXVL 
													END), 					
					@MontanteDireitos = DUA_MTRI = dbo.fn_IMP_CalculaMontanteDireitos(adi.DUA_BMAN, adi.DUA_MTRI, (CASE adi.DUA_TXCO WHEN 1 THEN 0 ELSE 1 END), @TaxaValorDireitos, @BaseTributacaoDireitos),
					@Optativas = DUA_VOPT = (CASE 
												WHEN SUBSTRING(@ProcesssaCalculos, 7, 1) = '1' THEN dbo.fn_IMP_CalculaValorOptativas(adi.DUC_EANO, adi.DUC_PNUM, adi.DUA_CODI, duc.MTR_PT18, duc.DUC_ADI5, ISNULL(duc.DUC_TVL6, 0), ISNULL(duc.DUC_OP18, 0), ISNULL(duc.DUC_MBRT, 0), ISNULL(duc.DUC_VATT, 0), adi.DUA_MB35, @ValorAduaneiro)
												ELSE adi.DUA_VOPT
											END), 
					@BaseTributacaoIVA = DUA_BTIV = dbo.fn_IMP_CalculaBaseTributacaoIVA(ISNULL(duc.DUC_FR20, ''), ISNULL(duc.DUC_TFDA, 0), ISNULL(duc.DUC_TXFR, 0), adi.DUA_VFRE, @Ajustamento, @ValorEstatistico, adi.DUA_VTRA, @Optativas, @MontanteDireitos, adi.DUA_IVAV, adi.DUA_ABTI, adi.DUA_MIVI), 
					@TaxaIVA = DUA_TIVA = (CASE 
											WHEN SUBSTRING(@ProcesssaCalculos, 8, 1) = '1' THEN (CASE 
																				WHEN (LEFT(ISNULL(adi.DUA_RG37, ''), 2) IN ('42', '51', '53', '71')) OR (ISNULL(adi.DUA_R37B, '') = '4II') OR (ISNULL(adi.DUA_R37B, '') = 'C01') OR (ISNULL(adi.DUA_R37B, '') = 'F48') OR (ISNUMERIC(adi.DUA_R37B) = 1 AND CAST(adi.DUA_R37B AS int) >= 401 AND CAST(adi.DUA_R37B AS int) <= 459) THEN 0 
																				ELSE ISNULL(apa.APA_TIVA, 0) 
																			END)
											ELSE adi.DUA_TIVA
										END), 
					DUA_VIVA = ROUND(@BaseTributacaoIVA * @TaxaIVA / 100, 2), 
					DUA_MAVA = (CASE 
									WHEN SUBSTRING(@ProcesssaCalculos, 9, 1) = '1' THEN (CASE 
																		WHEN adi.DUA_R37B IN ('E01', 'E02') THEN NULL 
																		ELSE adi.DUA_MAVA 
																	END) 				
									ELSE adi.DUA_MAVA 
								END), 
					DUA_QTDD = (CASE 
									WHEN SUBSTRING(@ProcesssaCalculos, 10, 1) = '1' THEN dbo.fn_IMP_CalculaBaseTributacaoDireitos(0, 0, adi.DUA_TRIB, adi.DUA_ML38, adi.DUA_US41, 0, adi.UME_CODI) 
									ELSE adi.DUA_QTDD 
								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
					INNER JOIN TAB_PREF AS pre WITH(NOLOCK) ON adi.PRE_CO36 = pre.PRE_CODI
					INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON adi.APA_CO33 = apa.APA_CODI
				WHERE adi.DUA_IDEN = @IdAdicao																	
-- processa atualização extra na adição para os campos da rúbrica de receita do IVA, apenas no caso de ter havido alteração da Taxa IVA																						
				IF SUBSTRING(@ProcesssaCalculos, 8, 1) = '1'
				BEGIN
					UPDATE PRO_DUAD SET 
						RRE_CODI = rre.RRE_CODI,
						RRE_NOME = rre.RRE_NOME,
						DUA_IMPI = rre.RRE_IMPO
					FROM PRO_DUAD AS adi WITH(NOLOCK) 
						INNER JOIN (SELECT PAP_TXIS, RRE_CDIS FROM TAB_PAPL WITH(NOLOCK) UNION SELECT PAP_TXRD, RRE_CDRD FROM TAB_PAPL WITH(NOLOCK) UNION SELECT PAP_TXIN, RRE_CDIN FROM TAB_PAPL WITH(NOLOCK) UNION SELECT PAP_TXNR, RRE_CDNR FROM TAB_PAPL WITH(NOLOCK)) AS t ON adi.DUA_TIVA = t.PAP_TXIS
						INNER JOIN TAB_RREC AS rre WITH(NOLOCK) ON t.RRE_CDIS = rre.RRE_CODI
					WHERE adi.DUA_IDEN = @IdAdicao
				END
			END
			FETCH NEXT FROM Declaracoes INTO @IdAdicao, @LimpaVendedor, @LimpaComprador, @LimpaContingente, @LimpaMassaLiquida, @AtualizaPreferencia, @AtualizaMetodoAvaliacao, @LimpaPaisPreferencial, 
				@AtualizaAdicionaisNacionais, @AtualizaTipoMercadoria, @LimpaExportador, @LimpaNaturezaTransacao, @LimpaPaisDestino, @LimpaRegiao, @AtualizaPaisOrigem, @LimpaNumeroNRUR, 
				@AtualizaAdicionalIVA, @AtualizaRegime, @LimpaIndicadorAvaliacao, @LimpaDireitos, @AtualizaFrete, @AtualizaSeguro, @AtualizaVerbaTransitario, @AtualizaNRG, @AtualizaNIFResponsavel, 
				@AtualizaAjustamento, @AtualizaValorEUR, @AtualizaValorOptativas
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se coluna do anexo B alterada, processa remoções dos sub-detalhes de referências fiscais de todas as adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB)
	BEGIN
-- obtem as adições IMP-CAU que não satisfaçam as condições p/ ter referências fiscais
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUA_IDEN, uti.UTI_IDTY
			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										
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB NOT IN ('H1', 'H6', 'I1') 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdAdicao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nas referências fiscais o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesAdicoesReferenciasFiscais SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_adicao = @IdAdicao
-- remove as referências fiscais da adição
			DELETE FROM tb_IMP_DeclaracoesAdicoesReferenciasFiscais
			WHERE id_adicao = @IdAdicao
			FETCH NEXT FROM Declaracoes INTO @IdAdicao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se coluna do anexo B alterada, processa remoções dos sub-detalhes de entrepostos de todas as adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB)
	BEGIN
-- obtem as adições IMP-CAU que não satisfaçam as condições p/ ter entrepostos
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUA_IDEN, uti.UTI_IDTY
			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										
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB NOT IN ('H1', 'H2', 'H3', 'H4') 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdAdicao, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nos entrepostos o utilizador e data de controlo antes de remover
			UPDATE tb_IMP_DeclaracoesAdicoesEntrepostos SET 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id_adicao = @IdAdicao
-- remove os entrepostos da adição
			DELETE FROM tb_IMP_DeclaracoesAdicoesEntrepostos
			WHERE id_adicao = @IdAdicao
			FETCH NEXT FROM Declaracoes INTO @IdAdicao, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se coluna do anexo B alterada, processa remoções dos sub-detalhes de veículos de todas as adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB)
	BEGIN
-- obtem as adições IMP-CAU que não satisfaçam as condições p/ ter veículos
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT adi.DUC_EANO, adi.DUC_PNUM, adi.DUA_CODI
			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				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB = 'H6' 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- remove os veículos da adição
			DELETE FROM PRO_DUBT
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DUA_CODI = @NumAdicao
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se coluna do anexo B alterada, processa alterações dos sub-detalhes de marcas e volumes de todas as adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_ANXB)
	BEGIN
-- obtem as marcas e volumes das adições IMP-CAU que não satisfaçam as condições p/ ter os campos de tipo de volumes e marcas preenchidos
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT mvl.D31_IDEN
			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				
				INNER JOIN PRO_DU31 AS mvl WITH(NOLOCK) ON adi.DUC_EANO = mvl.DUC_EANO AND adi.DUC_PNUM = mvl.DUC_PNUM AND adi.DUA_CODI = mvl.DUA_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB = 'H6' 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza nas marcas e volumes os campos de marcas e tipo de volumes
			UPDATE PRO_DU31 SET 
				D31_MARC = NULL,
				UME_CODI = NULL,
				UME_NOME = NULL,
				D31_TTVL = 0				
			WHERE D31_IDEN = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- se coluna do cliente importador alterada, processa remoções dos sub-detalhes de documentos "C601" ou pedidos "G1RED" de todas as adições das declarações IMP-CAU alteradas
	IF UPDATE(DUC_DST8)
	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, adi.DUA_CODI, doc.DOC_CODI, doc.DOC_NOME, cau.CAU_NDOC, dad.DDO_IDEN
			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		
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = 'C601'
				INNER JOIN TAB_CLAU AS cau WITH(NOLOCK) ON ins.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.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 = 12
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ISNULL(adi.DUA_RG37, '') IN ('0151', '0153') AND doc.DOC_DESP = 1 AND doc.DOC_TRAN = 0 AND LEN(doc.DOC_CODI) <= 4
		OPEN Adicoes
		FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
-- obtem o próximo numero de registo de documentos da adição IMP-CAU
				SELECT @NumDocumento = 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, @NumDocumento, @CodDocumento, @NomeDocumento, @NumeroDocumento, 12, 0)			
			END
			ELSE
			BEGIN
				UPDATE PRO_DDOC SET DDO_NUME = @NumeroDocumento
				WHERE DDO_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Adicoes INTO @AnoDeclaracao, @NumDeclaracao, @NumAdicao, @CodDocumento, @NomeDocumento, @NumeroDocumento, @IdRegisto
		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 PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM		
				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 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 ins.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ISNULL(adi.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 adi.DUA_IDEN, uti.UTI_IDTY, tdp.TXM_IDTY, NULLIF(SUBSTRING(tdp.TXM_TEXT, 1, 512), '')
			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		
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.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 ins.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
				LEFT OUTER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.DUA_IDEN = dap.id_adicao AND dap.origem = 22
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ISNULL(adi.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 PRO_DUAD AS adi WITH(NOLOCK) ON ins.DUC_EANO = adi.DUC_EANO AND ins.DUC_PNUM = adi.DUC_PNUM	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL	
				INNER JOIN tb_IMP_DeclaracoesAdicoesPedidos AS dap WITH(NOLOCK) ON adi.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 ins.DUC_DST8 = cau.CLI_CODI AND doc.DOC_CODI = cau.DOC_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ISNULL(adi.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	
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAIU_PRO_DUCG_IMPCAU') AND type = 'TR')
	DROP TRIGGER TAIU_PRO_DUCG_IMPCAU  
GO
CREATE TRIGGER TAIU_PRO_DUCG_IMPCAU ON PRO_DUCG WITH ENCRYPTION FOR INSERT, UPDATE AS 
BEGIN	
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaracao de variaveis 
	DECLARE @DataAtual datetime, @IdRegisto bigint, @IdPais int
	DECLARE @AnoDeclaracao int, @NumDeclaracao int, @IdDeclaracao bigint, @CodNatureza varchar(3), @CodCliente varchar(18), @NumDocTransporte varchar(18), @Utilizador varchar(30), 
		@IdUtilizador int, @VerbaTransitario decimal(18, 2), @SomaFreteESeguroTotal decimal(18, 2), @ValorLiqRecapitulativa numeric(18, 2), @CodTipoDocConta varchar(4), @NumMascaras int, 
		@TipoMascara int, @CodMascara int, @Observacoes varchar(5000), @ValorHonorarios decimal(18, 2), @ValorDireitosDDP decimal(18, 2), @NIFImportador varchar(18), @CodPaisImportador varchar(2)
	DECLARE @CodStatusIncidencia varchar(8), @NumIncidencia int, @NomeStatusIncidencia varchar(60), @ReleaseHold int
	DECLARE @CodPedidoEletronico varchar(5), @TextoPedidoEletronico varchar(3000), @NumPedido int
	DECLARE @IdDocumento int, @NumeroDocumento varchar(70), @DataValidadeDocumento datetime, @TipoDocumento tinyint	
	DECLARE @TipoAcrescimoDeducao tinyint, @CodAcrescimoDeducao varchar(2)
	DECLARE @Funcao	varchar(3)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- se coluna da natureza alterada, processa a gestão da incidência no detalhe de incidências das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(NDE_CODI)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, nde.SIN_CODI
			FROM inserted AS ins 				
				INNER JOIN TAB_NDES AS nde WITH(NOLOCK) ON ins.NDE_CODI = nde.NDE_CODI				
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ISNULL(nde.SIN_CODI, '') <> ''
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN
			SET @NomeStatusIncidencia = NULL
-- obtem o nome do status de incidência ou cosmo code
			SELECT @NomeStatusIncidencia = SIN_DESP, @ReleaseHold = NULL
			FROM TAB_SINC WITH(NOLOCK)
			WHERE SIN_CODI = @CodStatusIncidencia
			IF ISNULL(@NomeStatusIncidencia, '') = ''
			BEGIN
				SELECT @NomeStatusIncidencia = COS_POST, @ReleaseHold = (CASE WHEN (COS_RELI = 1) THEN 0 WHEN (COS_HOLD = 1) THEN 1 ELSE NULL END)
				FROM TAB_COSM WITH(NOLOCK)
				WHERE COS_CODE = @CodStatusIncidencia
			END
-- obtem o próximo numero de registo de incidência
			SELECT @NumIncidencia = ISNULL(MAX(DUI_CODI), 0) + 1
			FROM PRO_DUIN
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
-- insere a incidência no detalhe de incidências da declaração 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_REHO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumIncidencia, @CodStatusIncidencia, @NomeStatusIncidencia, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), 
				CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), 
				@ReleaseHold)
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END		
-- se coluna do importador alterada, processa a gestão do cosmo code no detalhe de incidências das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_DST8)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, (CASE RIGHT(ins.ALF_CODI, 3) WHEN '015' THEN cli.COS_CDLS WHEN '020' THEN cli.COS_CDPO ELSE NULL END)
			FROM inserted AS ins 				
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = cli.CLI_CODI					
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ISNULL((CASE RIGHT(ins.ALF_CODI, 3) WHEN '015' THEN cli.COS_CDLS WHEN '020' THEN cli.COS_CDPO ELSE NULL END), '') <> ''
				AND NOT EXISTS(SELECT DUI_CODI FROM PRO_DUIN WITH(NOLOCK) WHERE DUC_EANO = ins.DUC_EANO AND DUC_PNUM = ins.DUC_PNUM AND SIN_CODI = (CASE RIGHT(ins.ALF_CODI, 3) WHEN '015' THEN cli.COS_CDLS WHEN '020' THEN cli.COS_CDPO ELSE NULL END))
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN
			SET @NomeStatusIncidencia = NULL
-- obtem o nome do cosmo code
			SELECT @NomeStatusIncidencia = COS_POST, @ReleaseHold = (CASE WHEN (COS_RELI = 1) THEN 0 WHEN (COS_HOLD = 1) THEN 1 ELSE NULL END)
			FROM TAB_COSM WITH(NOLOCK)
			WHERE COS_CODE = @CodStatusIncidencia			
-- obtem o próximo numero de registo de incidência
			SELECT @NumIncidencia = ISNULL(MAX(DUI_CODI), 0) + 1
			FROM PRO_DUIN
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
-- insere a incidência no detalhe de incidências da declaração 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_REHO)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumIncidencia, @CodStatusIncidencia, @NomeStatusIncidencia, CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), 
				CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime), CAST(CONVERT(varchar(8), @DataAtual, 108) AS datetime), 
				@ReleaseHold)
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END		
-- se coluna do importador alterada, processa a gestão do documento OEA no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_DST8)
	BEGIN
-- insere/edita o documento OEA como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, NULLIF(cli.CLI_NAOE, ''), cli.CLI_DTOE, ddo.id
			FROM inserted AS ins 	
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = cli.CLI_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cli.DOC_CDOE = doc.DOC_CODI	
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 2					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND cli.CLI_FXOE IN (0, 1) AND ISNULL(cli.CLI_NAOE, '') <> '' AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, 2, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 
					dataValidade = @DataValidadeDocumento, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento OEA existente no detalhe de documentos da declaração mas já não existente na configuração do cliente
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 2					
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = 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.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (cli.CLI_FXOE NOT IN (0, 1) OR ISNULL(cli.CLI_NAOE, '') = '' OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se coluna do importador alterada, processa a gestão de documentos no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_DST8)
	BEGIN		
-- insere os documentos como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_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)), cdo.CLD_DDOC
			FROM inserted AS ins 
				INNER JOIN TAB_CLDO AS cdo WITH(NOLOCK) ON ins.DUC_DST8 = cdo.CLI_CODI				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON cdo.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 3
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND cdo.CLD_UIMP = 1 AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @IdRegisto, @NumeroDocumento, @DataValidadeDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
		    IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, 3, @IdUtilizador, @DataAtual)				
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesDocumentos SET					
					numero = @NumeroDocumento, 
					dataValidade = @DataValidadeDocumento, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @IdRegisto, @NumeroDocumento, @DataValidadeDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- remove os documentos existentes no detalhe de documentos da declaração mas já não existentes na configuração do cliente
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND 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.DUC_DST8 = cdo.CLI_CODI AND doc.DOC_CODI = cdo.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (cdo.CLD_UIMP = 0 OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se colunas do declarante ou tipo declarante alteradas, processa a gestão do documento OEA no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DEC_CO14) OR UPDATE(DUC_TPDC)
	BEGIN
-- insere/edita o documento OEA como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, NULLIF(dcl.DEC_NAOE, ''), dcl.DEC_DTOE, 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.DUC_TPDC WHEN 2 THEN dcl.DOC_CDOE ELSE dcl.DOC_CODI2 END) = doc.DOC_CODI	
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 4					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND dcl.DEC_FXOE IN (0, 1) AND ISNULL(dcl.DEC_NAOE, '') <> '' AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, 4, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 
					dataValidade = @DataValidadeDocumento, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento OEA existente no detalhe de documentos da declaração mas já não existente na configuração do 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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND 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.DUC_TPDC 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.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (dcl.DEC_FXOE NOT IN (0, 1) OR ISNULL(dcl.DEC_NAOE, '') = '' OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se colunas do declarante ou tipo declaração adicional alteradas, processa a gestão do documento RSI no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DEC_CO14) OR UPDATE(TDE_2CAS)
	BEGIN
-- insere/edita o documento RSI como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, NULLIF(dcl.DEC_ARSI, ''), dcl.DEC_DRSI, 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 dcl.DOC_CODI1 = doc.DOC_CODI	
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 5
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.TDE_2CAS IN ('C', 'Y', 'Z') AND ISNULL(dcl.DEC_ARSI, '') <> '' AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, 5, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesDocumentos SET
					id_documento = @IdDocumento, 
					numero = @NumeroDocumento, 
					dataValidade = @DataValidadeDocumento, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento RSI existente no detalhe de documentos da declaração mas já não existente na configuração do 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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 5					
				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 dcl.DOC_CODI1 = doc.DOC_CODI	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ins.TDE_2CAS NOT IN ('C', 'Y', 'Z') OR ISNULL(dcl.DEC_ARSI, '') = '' OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se colunas do estatuto, cédula ou importador alteradas, processa a gestão do pedido fixo "G1PRO" no detalhe de pedidos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_TPDC) OR UPDATE(DEC_CENI) OR UPDATE(DUC_DST8)
	BEGIN		
-- obtem o pedido "G1PRO" associado ao estatuto das declarações IMP-CAU inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, ped.TXM_CODI, NULLIF(cli.CLI_NDHA, ''), dpd.DPD_IDEN
			FROM inserted AS ins 				
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = cli.CLI_CODI
				INNER JOIN TAB_TXML AS ped WITH(NOLOCK) ON ped.TXM_CODI = 'G1PRO'		
				LEFT OUTER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND ped.TXM_CODI = dpd.TXM_CODI AND dpd.DPD_ORIG = 2		
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (CASE WHEN ins.DUC_TPDC IS NULL THEN LEFT(RIGHT(ins.DEC_CENI, 2), 1) ELSE 'I' END) = 'I'			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere/atualiza o pedido "G1PRO" no detalhe de pedidos da declaração IMP-CAU
			IF @IdRegisto IS NULL
			BEGIN
				SELECT @NumPedido = ISNULL(MAX(DPD_CODI), 0) + 1 FROM PRO_DUPD WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
				INSERT INTO PRO_DUPD(DUC_EANO, DUC_PNUM, DPD_CODI, TXM_CODI, DPD_DESC, DPD_ORIG)
				VALUES(@AnoDeclaracao, @NumDeclaracao, @NumPedido, @CodPedidoEletronico, @TextoPedidoEletronico, 2)
			END
			ELSE
			BEGIN
				UPDATE PRO_DUPD SET
					TXM_CODI = @CodPedidoEletronico, 
					DPD_DESC = @TextoPedidoEletronico
				WHERE DPD_IDEN = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
-- obtem o pedido "G1PRO" existente no detalhe de pedidos da declaração IMP-CAU 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.DUC_EANO, ins.DUC_PNUM, dpd.DPD_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND dpd.DPD_ORIG = 2
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpd.TXM_CODI = ped.TXM_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ((CASE WHEN ins.DUC_TPDC IS NULL THEN LEFT(RIGHT(ins.DEC_CENI, 2), 1) ELSE 'I' END) <> 'I' OR ped.TXM_CODI IS NULL)			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove pedido					
			DELETE FROM PRO_DUPD
			WHERE DPD_IDEN = @IdRegisto
-- atualiza numero de pedidos posteriores
			UPDATE PRO_DUPD SET DPD_CODI = DPD_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DPD_IDEN > @IdRegisto 			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes												
	END
-- se coluna de estância de sujeição alterada, processa a gestão de documentos no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(ALF_CODI)
	BEGIN		
-- insere os documentos como "Suporte"/"Transporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, doc.DOC_DTRA, uti.UTI_IDTY, 				 
				(CASE 
					WHEN (doc.DOC_CODI ='N740' AND LEFT(ins.MTR_PT18, 1) = '4') OR (doc.DOC_CODI ='N750' AND LEFT(ins.MTR_PT18, 1) = '5') 
						OR (doc.DOC_CODI ='N705' AND LEFT(ins.MTR_PT18, 1) IN ('1', '2')) OR (doc.DOC_CODI ='N704' AND LEFT(ins.MTR_PT18, 1) IN ('1', '2'))
						OR (doc.DOC_CODI ='N704' AND LEFT(ins.MTR_PT18, 1) = '3' AND LEFT(ins.MTR_FT21, 1) = '1') 
						OR (doc.DOC_CODI ='N821' AND LEFT(ins.MTR_PT18, 1) = '3' AND LEFT(ins.MTR_FT21, 1) = '3') THEN NULLIF(ins.DUC_CPRT, '')
					WHEN doc.DOC_CODI = '3E01' AND ISNULL(ins.DUC_VTRN, 0) > 0 THEN 'S/N'
					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), 
				(CASE 
					WHEN (doc.DOC_CODI ='N740' AND LEFT(ins.MTR_PT18, 1) = '4') OR (doc.DOC_CODI ='N704' AND LEFT(ins.MTR_PT18, 1) IN ('1', '2'))
						OR (doc.DOC_CODI ='N704' AND LEFT(ins.MTR_PT18, 1) = '3' AND LEFT(ins.MTR_FT21, 1) = '1') 
						OR (doc.DOC_CODI ='N821' AND LEFT(ins.MTR_PT18, 1) = '3' AND LEFT(ins.MTR_FT21, 1) = '3') THEN ins.DUC_DDDT
					WHEN (doc.DOC_CODI ='N750' AND LEFT(ins.MTR_PT18, 1) = '5') OR (doc.DOC_CODI ='N705' AND LEFT(ins.MTR_PT18, 1) IN ('1', '2')) THEN ins.DUC_DATA 
					WHEN (doc.DOC_CODI = '3E01' AND ISNULL(ins.DUC_VTRN, 0) > 0) THEN CAST(CONVERT(varchar(10), @DataAtual, 105) AS datetime)					
					ELSE NULL 
				END),
				(CASE WHEN (doc.DOC_CODI = '3E01' AND ISNULL(ins.DUC_VTRN, 0) > 0) THEN ISNULL(ins.DUC_VTRN, 0) ELSE 0 END), 
				(CASE WHEN (doc.DOC_CODI = '3E01' AND ISNULL(ins.DUC_VTRN, 0) > 0) THEN pai.PAI_IDTY ELSE NULL END)
			FROM inserted AS ins 				
				INNER JOIN TAB_ALFD AS ado WITH(NOLOCK) ON ins.ALF_CODI = ado.ALF_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ado.DOC_CODI = doc.DOC_CODI
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 6	
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL		
				INNER JOIN TAB_PAPL AS pap WITH(NOLOCK) ON 1 = 1
				INNER JOIN TAB_PAIS AS pai WITH(NOLOCK) ON pap.PAI_CODI = pai.PAI_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND doc.DOC_DESP = 1 AND LEN(doc.DOC_CODI) <= 4 AND ddo.id IS NULL 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @VerbaTransitario, @IdPais
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, dataValidade, id_paisMoeda, montante, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @TipoDocumento, @IdDocumento, @NumeroDocumento, @DataValidadeDocumento, @IdPais, @VerbaTransitario, 6, @IdUtilizador, @DataAtual)		
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @TipoDocumento, @IdUtilizador, @NumeroDocumento, @DataValidadeDocumento, @VerbaTransitario, @IdPais
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- remove os documentos existentes no detalhe de documentos da declaração mas já não existentes na configuração da alfândega
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 6			
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY	
				LEFT OUTER JOIN TAB_ALFD AS ado WITH(NOLOCK) ON ins.ALF_CODI = ado.ALF_CODI AND doc.DOC_CODI = ado.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (doc.DOC_DESP = 0 OR LEN(doc.DOC_CODI) > 4 OR ado.DOC_CODI IS NULL)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
	END
-- se coluna tipo declaração adicional alterada, processa a gestão do pedido fixo "G1DSA" no detalhe de pedidos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(TDE_2CAS)
	BEGIN
-- obtem o pedido "G1DSA" associado ao estatuto das declarações IMP-CAU inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, 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 = 'G1DSA'		
				LEFT OUTER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND ped.TXM_CODI = dpd.TXM_CODI AND dpd.DPD_ORIG = 3	
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ISNULL(ins.TDE_2CAS, '') = 'B' AND dpd.DPD_CODI IS NULL		
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere o pedido "G1DSA" no detalhe de pedidos da declaração IMP-CAU			
			SELECT @NumPedido = ISNULL(MAX(DPD_CODI), 0) + 1 FROM PRO_DUPD WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
			INSERT INTO PRO_DUPD(DUC_EANO, DUC_PNUM, DPD_CODI, TXM_CODI, DPD_DESC, DPD_ORIG)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumPedido, @CodPedidoEletronico, @TextoPedidoEletronico, 3)	
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
-- obtem o pedido "G1DSA" existente no detalhe de pedidos da declaração IMP-CAU cuja origem é do tipo declaração adicional mas que já não satisfaz a condição
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, dpd.DPD_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND dpd.DPD_ORIG = 3
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpd.TXM_CODI = ped.TXM_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ISNULL(ins.TDE_2CAS, '') <> 'B' OR ped.TXM_CODI IS NULL)			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove pedido					
			DELETE FROM PRO_DUPD
			WHERE DPD_IDEN = @IdRegisto
-- atualiza numero de pedidos posteriores
			UPDATE PRO_DUPD SET DPD_CODI = DPD_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DPD_IDEN > @IdRegisto 			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- se coluna do tipo de declaração alterada, processa a gestão de pedidos no detalhe de pedidos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(TDE_CODI)
	BEGIN
-- insere os pedidos no detalhe de pedidos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, tdp.TXM_CODI, SUBSTRING(tdp.TDP_TEXT, 1, 512)
			FROM inserted AS ins 				
				INNER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON ins.TDE_CODI = tdp.TDE_CODI		
				LEFT OUTER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND tdp.TXM_CODI = dpd.TXM_CODI AND dpd.DPD_ORIG = 1		
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ASAI = 0 AND dpd.DPD_CODI IS NULL
			ORDER BY tdp.TDP_CODI
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem o próximo numero de registo de pedido
			SELECT @NumPedido = ISNULL(MAX(DPD_CODI), 0) + 1
			FROM PRO_DUPD
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
-- insere o pedido no detalhe de pedidos da declaração IMP-CAU 
			INSERT INTO PRO_DUPD(DUC_EANO, DUC_PNUM, DPD_CODI, TXM_CODI, DPD_DESC, DPD_ORIG)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumPedido, @CodPedidoEletronico, @TextoPedidoEletronico, 1)
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove os pedidos existentes no detalhe de pedidos da declaração mas já não existentes na configuração do tipo de declaração
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, dpd.DPD_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND dpd.DPD_ORIG = 1	
				LEFT OUTER JOIN TAB_TDEP AS tdp WITH(NOLOCK) ON ins.TDE_CODI = tdp.TDE_CODI AND dpd.TXM_CODI = tdp.TXM_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ASAI = 0 AND tdp.TXM_CODI IS NULL
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove pedido					
			DELETE FROM PRO_DUPD
			WHERE DPD_IDEN = @IdRegisto
-- atualiza numero de pedidos posteriores
			UPDATE PRO_DUPD SET DPD_CODI = DPD_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DPD_IDEN > @IdRegisto 			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes					
	END		
-- se coluna do tipo de declaração alterada, processa a gestão de documentos no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(TDE_CODI)
	BEGIN
-- insere os documentos como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY, 
				(CASE 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_TDED AS tdd WITH(NOLOCK) ON ins.TDE_CODI = tdd.TDE_CODI				
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON tdd.DOC_CODI = doc.DOC_CODI		
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND doc.DOC_IDTY = ddo.id_documento AND ddo.origem = 1
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ASAI = 0 AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND ddo.id IS NULL 
			ORDER BY tdd.TDD_CODI
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN
			INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, numero, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, 0, @IdDocumento, @NumeroDocumento, 1, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador, @NumeroDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove os documentos existentes no detalhe de documentos da declaração mas já não existentes na configuração 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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 1				
				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_CODI = tdd.TDE_CODI AND doc.DOC_CODI = tdd.DOC_CODI
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ASAI = 0 AND (doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END		
-- se colunas do anexo B ou exportador alteradas, processa a gestão do documento fixo "3E18" no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_ANXB) OR UPDATE(DUC_EXP2)
	BEGIN
-- insere o documento fixo "3E18" como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 	
				INNER JOIN TAB_FORN AS frn WITH(NOLOCK) ON ins.DUC_EXP2 = frn.FOR_CODI
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI	= '3E18'
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 8					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.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 ddo.id IS NULL	
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
			INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, 0, @IdDocumento, 8, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento fixo "3E18" existente no detalhe de documentos da declaração mas já não existente na configuração do anexo B
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 8					
				LEFT OUTER JOIN TAB_FORN AS frn WITH(NOLOCK) ON ins.DUC_EXP2 = frn.FOR_CODI
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ins.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_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se colunas do anexo B ou tipo NIF importador alteradas, processa a gestão do documento fixo "3E19" no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_ANXB) OR UPDATE(DUC_TPDS)
	BEGIN
-- insere o documento fixo "3E19" como "Suporte" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 					
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI	= '3E19'
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 9
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB <> 'H2' AND ins.DUC_TPDS = 5 AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND ddo.id IS NULL	
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
			INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, 0, @IdDocumento, 9, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento fixo "3E19" existente no detalhe de documentos da declaração mas já não existente na configuração do anexo B
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 9									
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ins.DUC_ANXB = 'H2' OR ISNULL(ins.DUC_TPDS, -1) <> 5 OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se coluna do regime alterada, processa a gestão do documento fixo "Y044" no detalhe de documentos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_REGI)
	BEGIN
-- insere o documento fixo "Y044" como "Referência Adicional" no detalhe de documentos da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 					
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI	= 'Y044'
				LEFT OUTER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 12
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND LEFT(ins.DUC_REGI, 2) IN ('42', '63') AND doc.DOC_DESP = 1 AND doc.DOC_DTRA = 0 AND LEN(doc.DOC_CODI) <= 4 AND ddo.id IS NULL	
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
			INSERT INTO tb_IMP_DeclaracoesDocumentos(id_declaracaoIMP, tipo, id_documento, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, 2, @IdDocumento, 12, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o documento fixo "Y044" existente no detalhe de documentos da declaração mas já não existente na configuração do regime
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesDocumentos AS ddo WITH(NOLOCK) ON ins.DUC_IDTY = ddo.id_declaracaoIMP AND origem = 12 								
				LEFT OUTER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (LEFT(ins.DUC_REGI, 2) NOT IN ('42', '63') OR doc.DOC_DESP = 0 OR doc.DOC_DTRA = 1 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	
			UPDATE tb_IMP_DeclaracoesDocumentos SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesDocumentos		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se coluna do regime alterada, processa a gestão do documento fixo "N960"/"N337" no detalhe de precedentes das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_REGI)
	BEGIN
-- insere o documento fixo "N960"/"N337" no detalhe de precedentes da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, doc.DOC_IDTY, uti.UTI_IDTY
			FROM inserted AS ins 									
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = (CASE WHEN (ins.DUC_REGI = '4071') THEN 'N960' WHEN ((LEFT(ins.DUC_REGI, 2) = '40' AND ins.DUC_REGI <> '4071') OR (LEFT(ins.DUC_REGI, 2) = '61')) THEN 'N337' ELSE NULL END) OR doc.DOC_CODI = (CASE WHEN LEFT(ins.DUC_REGI, 2) = '61' THEN 'N960' ELSE NULL END)
				LEFT OUTER JOIN tb_IMP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) ON ins.DUC_IDTY = dpr.id_declaracaoIMP AND doc.DOC_IDTY = dpr.id_documento AND origem = 1				
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND LEFT(ins.DUC_REGI, 2) IN ('40', '61') AND doc.DOC_CA40 = 1 AND dpr.id IS NULL	
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdDocumento, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN
			INSERT INTO tb_IMP_DeclaracoesPrecedentes(id_declaracaoIMP, 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
-- remove o documento fixo "N960"/"N337" existente no detalhe de precedentes da declaração mas já não existente na configuração do regime
		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.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesPrecedentes AS dpr WITH(NOLOCK) ON ins.DUC_IDTY = dpr.id_declaracaoIMP AND 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.DUC_REGI = '4071') THEN 'N960' WHEN ((LEFT(ins.DUC_REGI, 2) = '40' AND ins.DUC_REGI <> '4071') OR (LEFT(ins.DUC_REGI, 2) = '61')) THEN 'N337' ELSE NULL END) OR doc.DOC_CODI = (CASE WHEN LEFT(ins.DUC_REGI, 2) = '61' THEN 'N960' ELSE NULL END)
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (LEFT(ins.DUC_REGI, 2) NOT IN ('40', '61') OR doc.DOC_CA40 = 0 OR doc.DOC_IDTY IS NULL) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesPrecedentes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesPrecedentes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se coluna do regime alterada, processa a gestão do pedido fixo "I1PGI" no detalhe de pedidos das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_REGI)
	BEGIN
-- obtem o pedido "I1PGI" associado ao regime "42" das declarações IMP-CAU inseridas/alteradas
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, 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 = 'I1PGI'		
				LEFT OUTER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND ped.TXM_CODI = dpd.TXM_CODI AND dpd.DPD_ORIG = 4
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND LEFT(ins.DUC_REGI, 2) = '42' AND dpd.DPD_CODI IS NULL		
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- insere o pedido "I1PGI" no detalhe de pedidos da declaração IMP-CAU			
			SELECT @NumPedido = ISNULL(MAX(DPD_CODI), 0) + 1 FROM PRO_DUPD WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao							
			INSERT INTO PRO_DUPD(DUC_EANO, DUC_PNUM, DPD_CODI, TXM_CODI, DPD_DESC, DPD_ORIG)
			VALUES(@AnoDeclaracao, @NumDeclaracao, @NumPedido, @CodPedidoEletronico, @TextoPedidoEletronico, 4)	
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @CodPedidoEletronico, @TextoPedidoEletronico
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
-- obtem o pedido "I1PGI" existente no detalhe de pedidos da declaração IMP-CAU cuja origem é do regime "42" mas que já não satisfaz a condição
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_EANO, ins.DUC_PNUM, dpd.DPD_IDEN
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN PRO_DUPD AS dpd WITH(NOLOCK) ON ins.DUC_EANO = dpd.DUC_EANO AND ins.DUC_PNUM = dpd.DUC_PNUM AND dpd.DPD_ORIG = 4
				LEFT OUTER JOIN TAB_TXML AS ped WITH(NOLOCK) ON dpd.TXM_CODI = ped.TXM_CODI
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (LEFT(ins.DUC_REGI, 2) <> '42' OR ped.TXM_CODI IS NULL)			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN	
-- remove pedido					
			DELETE FROM PRO_DUPD
			WHERE DPD_IDEN = @IdRegisto
-- atualiza numero de pedidos posteriores
			UPDATE PRO_DUPD SET DPD_CODI = DPD_CODI - 1    
			WHERE DUC_EANO = @AnoDeclaracao AND DUC_PNUM = @NumDeclaracao AND DPD_IDEN > @IdRegisto 			
			FETCH NEXT FROM Declaracoes INTO @AnoDeclaracao, @NumDeclaracao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- se coluna do regime alterada, processa a gestão das referências fiscais associadas no detalhe de referências fiscais das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_REGI) OR UPDATE(DUC_DNIF) OR UPDATE(PAI_DLIV) OR UPDATE(DUC_TPDS)
	BEGIN
-- insere a referência fiscal "FR1"/"FR2" no detalhe de referências fiscais da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, ins.DUC_DNIF, ins.PAI_DLIV, uti.UTI_IDTY, t.funcao, drf.id
			FROM inserted AS ins 			
				INNER JOIN (SELECT 'FR1' AS funcao UNION SELECT 'FR2' AS funcao) AS t ON 1 = 1										
				LEFT OUTER JOIN tb_IMP_DeclaracoesReferenciasFiscais AS drf WITH(NOLOCK) ON ins.DUC_IDTY = drf.id_declaracaoIMP AND drf.funcao = t.funcao AND origem = 2				
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ((ISNULL(ins.DUC_REGI, '') = '4200' AND t.funcao IN ('FR1', 'FR2')) 
				OR (ISNULL(ins.DUC_TPDS, -1) IN (3, 4, 6) AND t.funcao = 'FR1')) --NP, BI, NE
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @NIFImportador, @CodPaisImportador, @IdUtilizador, @Funcao, @IdRegisto
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF @IdRegisto IS NULL
			BEGIN
				INSERT INTO tb_IMP_DeclaracoesReferenciasFiscais(id_declaracaoIMP, funcao, nif, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @Funcao, LEFT((@CodPaisImportador + @NIFImportador), 17), 2, @IdUtilizador, @DataAtual)			
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesReferenciasFiscais SET
					nif = LEFT((@CodPaisImportador + @NIFImportador), 17), 					
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @NIFImportador, @CodPaisImportador, @IdUtilizador, @Funcao, @IdRegisto
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove a referência fiscal "FR1"/"FR2" existente no detalhe de referências fiscais da declaração mas já não existente na configuração do regime
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT drf.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesReferenciasFiscais AS drf WITH(NOLOCK) ON ins.DUC_IDTY = drf.id_declaracaoIMP AND origem = 2												
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND (ISNULL(ins.DUC_REGI, '') <> '4200' OR drf.funcao NOT IN ('FR1', 'FR2')) 
				AND (ISNULL(ins.DUC_TPDS, -1) NOT IN (3, 4, 6) OR drf.funcao <> 'FR1') --NP, BI, NE
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesReferenciasFiscais SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesReferenciasFiscais		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes	
	END
-- se colunas do frete total, câmbio do frete, seguro total, câmbio seguro ou formula da cond. entrega alteradas, processa a gestão do código "AK"/"BA" no detalhe de acréscimos/deduções das declarações IMP-CAU inseridas/alteradas
	IF UPDATE(DUC_FRET) OR UPDATE(DUC_TXFR) OR UPDATE(DUC_SEGU) OR UPDATE(DUC_TXSE) OR UPDATE(DUC_FR20) OR UPDATE(DUC_ANXB)
	BEGIN
-- insere/edita o código "AK"/"BA" no detalhe de acréscimos/deduções da declaração IMP-CAU 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_IDTY, uti.UTI_IDTY, dad.id, 
				(ROUND(ISNULL(ins.DUC_FRET, 0) / ISNULL(ins.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUC_SEGU, 0) / ISNULL(ins.DUC_TXSE, 0), 2)), 
				(CASE WHEN ISNULL(NULLIF(CHARINDEX('+', ISNULL(ins.DUC_FR20, '')), 0), 999999) > ISNULL(NULLIF(CHARINDEX('-', ISNULL(ins.DUC_FR20, '')), 0), 999999) THEN 1 ELSE 0 END)
			FROM inserted AS ins 					
				LEFT OUTER JOIN tb_IMP_DeclaracoesAcrescimosDeducoes AS dad WITH(NOLOCK) ON ins.DUC_IDTY = dad.id_declaracaoIMP AND origem = 1					
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB NOT IN ('H2', 'H3', 'H4', 'H6') AND ISNULL(ins.DUC_FR20, '') <> '' 
				AND (ROUND(ISNULL(ins.DUC_FRET, 0) / ISNULL(ins.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUC_SEGU, 0) / ISNULL(ins.DUC_TXSE, 0), 2)) > 0
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdRegisto, @SomaFreteESeguroTotal, @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_DeclaracoesAcrescimosDeducoes(id_declaracaoIMP, tipo, codigo, montante, origem, id_utilizadorControlo, dataControlo)
				VALUES(@IdDeclaracao, @TipoAcrescimoDeducao, @CodAcrescimoDeducao, @SomaFreteESeguroTotal, 1, @IdUtilizador, @DataAtual)
			END
			ELSE
			BEGIN
				UPDATE tb_IMP_DeclaracoesAcrescimosDeducoes SET
					tipo = @TipoAcrescimoDeducao, 
					codigo = @CodAcrescimoDeducao, 
					montante = @SomaFreteESeguroTotal, 
					id_utilizadorControlo = @IdUtilizador, 
					dataControlo = @DataAtual
				WHERE id = @IdRegisto
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdRegisto, @SomaFreteESeguroTotal, @TipoAcrescimoDeducao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- remove o código "AK"/"BA" existente no detalhe de acréscimos/deduções da declaração mas já não satisfazem a condição do valor do frete + seguro
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT dad.id, uti.UTI_IDTY
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN tb_IMP_DeclaracoesAcrescimosDeducoes AS dad WITH(NOLOCK) ON ins.DUC_IDTY = dad.id_declaracaoIMP AND origem = 1				
				INNER JOIN GIDWIN.dbo.FAP_UTIL AS uti WITH(NOLOCK) ON ISNULL(ins.DUC_UALT, ins.DUC_UCRI) = uti.UTI_UTIL			
			WHERE ins.DUC_DUNO = 2 AND ins.DUC_SERV = 0 AND ins.DUC_ANXB NOT IN ('H2', 'H3', 'H4', 'H6') AND (ISNULL(ins.DUC_FR20, '') = '' 
				OR (ROUND(ISNULL(ins.DUC_FRET, 0) / ISNULL(ins.DUC_TXFR, 0), 2) + ROUND(ISNULL(ins.DUC_SEGU, 0) / ISNULL(ins.DUC_TXSE, 0), 2)) = 0) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_IMP_DeclaracoesAcrescimosDeducoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdRegisto
			DELETE FROM tb_IMP_DeclaracoesAcrescimosDeducoes		
			WHERE id = @IdRegisto
			FETCH NEXT FROM Declaracoes INTO @IdRegisto, @IdUtilizador
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- se colunas várias alteradas, processa a gestão do documento de contas das declarações IMP-CAU inseridas/alteradas
	IF (UPDATE(DUC_EANO) OR UPDATE(DUC_PNUM) OR UPDATE(DUC_DATA) OR UPDATE(DUC_CPRT) OR UPDATE(DUC_NORD) OR UPDATE(DUC_NDAT) OR UPDATE(NDE_CODI) OR UPDATE(DUC_EXP2) OR UPDATE(DUC_ENOM) 
		OR UPDATE(DUC_DST8) OR UPDATE(DUC_TPDS) OR UPDATE(MTR_PT18) OR UPDATE(DUC_MT18) OR UPDATE(DUC_COBR) OR UPDATE(DUC_VATT) OR UPDATE(DEC_CO14) OR UPDATE(ALF_CODI) OR UPDATE(DUC_TVL6) 
		OR UPDATE(DUC_ADI5) OR UPDATE(DUC_MBRT) OR UPDATE(DUC_MLQT) OR UPDATE(TDO_DOCU) OR UPDATE(DUC_TX23) OR UPDATE(DUC_VEUR) OR UPDATE(DUC_VDES) OR UPDATE(DUC_VDIR) OR UPDATE(DUC_VLRC) 
		OR UPDATE(DUC_REGL) OR UPDATE(DUC_DTRL) OR UPDATE(DUC_TSHI) OR UPDATE(TDO_DOCU1) OR UPDATE(NDE_CODI1) OR UPDATE(DUC_BIVA) OR UPDATE(DUC_PDVU) OR UPDATE(DUC_MASC) OR UPDATE(DUC_TMSF)
		OR UPDATE(DUC_DGEN)) 
		AND (NOT EXISTS(SELECT FTA_IDEN FROM TAB_PFTA WITH(NOLOCK) WHERE FTA_ACTI = 1))
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.DUC_PNUM, ins.DUC_EANO, ins.NDE_CODI, ISNULL(cli.CLI_CCOR, ins.DUC_DST8), ins.DUC_CPRT, ISNULL(ins.DUC_UALT, ins.DUC_UCRI), ISNULL(ins.DUC_VLRC, 0), ins.DUC_MASC, 
				ins.DUC_TMSF, 
				(CASE WHEN (pde.PDE_IDCV = 1) AND (ISNULL(nat.NDE_TLCV, -1) = 0) THEN ins.TDO_DOCU ELSE pde.PDE_TDOC END), 
				(CASE WHEN ISNULL(CAST(nat.NDE_FORM AS varchar(MAX)), '') <> '' THEN dbo.fn_Geral_ObtemHonorariosImportacao(ISNULL(ins.DUC_VATT, 0)) ELSE 0 END)
			FROM inserted AS ins 
				LEFT OUTER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON ins.NDE_CODI = nat.NDE_CODI
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = cli.CLI_CODI				
				INNER JOIN TAB_PDES AS pde WITH(NOLOCK) ON ISNULL(pde.PDE_TDOC, '') <> ''
			WHERE (ins.DUC_DUNO = 2 OR ins.DUC_SERV = 1) AND ins.DUC_TSHI < 2 AND nat.NDE_CRCO = 1 AND ISNULL(nat.NDE_TLCV, -1) <> 1 AND cli.CLI_DUCT = 1 AND pde.PDE_LFCT = 0 
				AND del.DUC_IDTY IS NULL 				 										
			UNION
			SELECT ins.DUC_PNUM, ins.DUC_EANO, ins.NDE_CODI, ISNULL(cli.CLI_CCOR, ins.DUC_DST8), ins.DUC_CPRT, ISNULL(ins.DUC_UALT, ins.DUC_UCRI), ISNULL(ins.DUC_VLRC, 0), ins.DUC_MASC, 
				ins.DUC_TMSF, 
				(CASE WHEN (pde.PDE_IDCV = 1) AND (ISNULL(nat.NDE_TLCV, -1) = 0) THEN ins.TDO_DOCU ELSE pde.PDE_TDOC END), 
				(CASE WHEN ISNULL(CAST(nat.NDE_FORM AS varchar(MAX)), '') <> '' THEN dbo.fn_Geral_ObtemHonorariosImportacao(ISNULL(ins.DUC_VATT, 0)) ELSE 0 END)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY
				INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON ins.NDE_CODI = nat.NDE_CODI
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.DUC_DST8 = cli.CLI_CODI
				INNER JOIN TAB_PDES AS pde WITH(NOLOCK) ON ISNULL(pde.PDE_TDOC, '') <> ''				
				INNER JOIN FAC_CDOC AS cnt WITH(NOLOCK) ON ins.DUC_EANO = cnt.CDO_PANO AND ins.DUC_PNUM = cnt.CDO_NPRO AND cnt.CDO_IMEX = 0
			WHERE (ins.DUC_DUNO = 2 OR ins.DUC_SERV = 1) AND ins.DUC_TSHI < 2 AND cnt.CDO_STAT = 0 
				AND ((pde.PDE_BCNR = 0) OR (pde.PDE_BCNR = 2 AND ins.DUC_ASAI = 0)) 
				AND ((pde.PDE_LFCT = 0 AND nat.NDE_CRCO = 1 AND ISNULL(nat.NDE_TLCV, -1) <> 1 AND cli.CLI_DUCT = 1) OR (pde.PDE_LFCT = 1 AND pde.PDE_IDCV = 0))
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @NumDeclaracao, @AnoDeclaracao, @CodNatureza, @CodCliente, @NumDocTransporte, @Utilizador, @ValorLiqRecapitulativa, @CodMascara, @TipoMascara, 
			@CodTipoDocConta, @ValorHonorarios
		WHILE @@FETCH_STATUS = 0
		BEGIN				
-- obtem as observações para a Conta
			EXEC SP_ObtemObservacoesParaConta @CodMascara, @AnoDeclaracao, @NumDeclaracao, @CodCliente, @CodNatureza, '', @Observacoes OUTPUT			
-- processa a geração do documento de Conta
			EXEC SP_geraContas @NumDeclaracao, @AnoDeclaracao, @CodTipoDocConta, @CodNatureza, @Utilizador, @TipoMascara, @CodMascara, @ValorHonorarios, @Observacoes, @ValorLiqRecapitulativa, @NumDocTransporte, 0, NULL, 0			
			FETCH NEXT FROM Declaracoes INTO @NumDeclaracao, @AnoDeclaracao, @CodNatureza, @CodCliente, @NumDocTransporte, @Utilizador, @ValorLiqRecapitulativa, @CodMascara, @TipoMascara, 
				@CodTipoDocConta, @ValorHonorarios
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'tr_DeclaracoesDAR_Atualizacoes_U') AND type = 'TR')
	DROP TRIGGER tr_DeclaracoesDAR_Atualizacoes_U  
GO
CREATE TRIGGER tr_DeclaracoesDAR_Atualizacoes_U ON tb_DeclaracoesDAR WITH ENCRYPTION AFTER UPDATE AS 
BEGIN
	SET NOCOUNT ON;
-- declaração de variáveis
	DECLARE @DataAtual datetime, @IdDeclaracao int, @IdPaisMoedaCustosTransporte int, @CambioCustosTransporte decimal(12, 6), @IdPaisMoedaMontante int, @CambioMontante decimal(12, 6), 
		@IdUtilizador int, @IdAdicao bigint, @TxIVAIsenta decimal(8, 2), @TxIVANormal decimal(8, 2), @TxIVAArtigo decimal(8, 2), @RegimeAdicional varchar(3), @IdStatusIncidencia int, 
		@IdTabela bigint, @NumeroTD int, @IdDocumento int, @MetodoPagamento varchar(1)	
	DECLARE	@IdTipoDoc int, @TipoCliente varchar(3), @Resultado int, @IdDocConta int, @Erro varchar(MAX)
	DECLARE @Ano smallint, @Numero int, @Data datetime, @RegimeIVA tinyint, @NumeroNRM varchar(25), @DataNRM datetime, @CodEstancia varchar(8), @CodCliente varchar(18), 
		@CodDeclarante varchar(6), @Caucao varchar(35), @TotalIVA decimal(18, 2), @NumeroRL varchar(20), @DataRL datetime, @BeneficiarioIVA bit, @DescricaoDeclaracao varchar(15), 
		@AnoCaucao varchar(4), @NumCaucao varchar(24), @TipoCaucao varchar(1), @TipoEntCaucao tinyint, @CodEntCaucao varchar(18)
	DECLARE @MontanteEUR decimal(18, 2), @CustosTransporteEUR decimal(18, 2), @BaseTributacaoIVA decimal(18, 2)
-- obtem data atual GMT
	SET @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
-- nas alterações dos países da moeda ou custos de transporte ou respetivos câmbios, atualiza os países das moedas de montante e custos de transporte e respetivos câmbios nas adições 
	IF UPDATE(id_paisMoedaMontante) OR UPDATE(cambioMontante) OR UPDATE(id_paisMoedaCustosTransporte) OR UPDATE(cambioCustosTransporte)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_paisMoedaMontante, ins.cambioMontante, ins.id_paisMoedaCustosTransporte, ins.cambioCustosTransporte, ins.id_utilizadorControlo, adi.id
			FROM inserted AS ins 
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdPaisMoedaMontante, @CambioMontante, @IdPaisMoedaCustosTransporte, @CambioCustosTransporte, @IdUtilizador, @IdAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				id_paisMoedaMontante = @IdPaisMoedaMontante, 
				cambioMontante = @CambioMontante, 
				@MontanteEUR = montanteEUR = ROUND((montante / @CambioMontante), 2), 
				id_paisMoedaCustosTransporte = @IdPaisMoedaCustosTransporte, 
				cambioCustosTransporte = @CambioCustosTransporte,   
				@CustosTransporteEUR = custosTransporteEUR = ROUND((custosTransporte / @CambioCustosTransporte), 2), 
				@BaseTributacaoIVA = baseTributacaoIVA = ROUND((@MontanteEUR + @CustosTransporteEUR + optativas), 2), 
				valorIVA = ROUND((@BaseTributacaoIVA * taxaIVA / 100), 2), 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id = @IdAdicao
			FETCH NEXT FROM Declaracoes INTO @IdPaisMoedaMontante, @CambioMontante, @IdPaisMoedaCustosTransporte, @CambioCustosTransporte, @IdUtilizador, @IdAdicao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes			
	END
--  nas alterações do regime IVA ou adicional regime, atualiza a taxa de IVA nas adições
	IF UPDATE(regimeIVA) OR UPDATE(regimeAdicional)
	BEGIN
-- obtem as taxas IVA configuradas na aplicação
		SELECT @TxIVAIsenta = PAP_TXIS, @TxIVANormal = PAP_TXNR 
		FROM TAB_PAPL WITH(NOLOCK)
-- atualiza a taxa IVA nas adições para a "Isenta", quando o regime IVA alterou para "IOSS" ou o regime adicional alterou para "C08"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
			WHERE (ins.regimeIVA = 1 OR ins.regimeAdicional = 'C08') AND (ins.regimeIVA <> del.regimeIVA OR ins.regimeAdicional <> del.regimeAdicional) AND adi.taxaIVA <> @TxIVAIsenta
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				taxaIVA = @TxIVAIsenta, 
				valorIVA = ROUND((baseTributacaoIVA * @TxIVAIsenta / 100), 2), 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual			
			WHERE id = @IdAdicao 	
			FETCH NEXT FROM Declaracoes INTO  @IdUtilizador, @IdAdicao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- atualiza a taxa IVA nas adições para a "Normal", quando o regime IVA alterou para "Especial" e o regime adicional não é "C08"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
			WHERE ins.regimeIVA = 2 AND ins.regimeAdicional <> 'C08' AND (ins.regimeIVA <> del.regimeIVA OR ins.regimeAdicional <> del.regimeAdicional) AND adi.taxaIVA <> @TxIVANormal
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				taxaIVA = @TxIVANormal, 
				valorIVA = ROUND((baseTributacaoIVA * @TxIVANormal / 100), 2), 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual			
			WHERE id = @IdAdicao 
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- atualiza a taxa IVA nas adições para a taxa IVA definida no artigo, quando o regime IVA alterou para "Geral" e o regime adicional não é "C08"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id, ISNULL(apa.APA_TIVA, 0)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
				INNER JOIN TAB_APAU AS apa WITH(NOLOCK) ON adi.id_artigo = apa.APA_IDTY
			WHERE ins.regimeIVA = 3 AND ins.regimeAdicional <> 'C08' AND (ins.regimeIVA <> del.regimeIVA OR ins.regimeAdicional <> del.regimeAdicional) AND adi.taxaIVA <> ISNULL(apa.APA_TIVA, 0)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @TxIVAArtigo
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				taxaIVA = @TxIVAArtigo, 
				valorIVA = ROUND((baseTributacaoIVA * @TxIVAArtigo / 100), 2), 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id = @IdAdicao 
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @TxIVAArtigo
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- atualiza o adicional regime nas adições para "F48" quando o regime IVA alterou para "IOSS" e o regime adicional alterou para "C07"; para "F49" quando o regime IVA alterou para "Especial" e o regime adicional alterou para "C07"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id, 
				(CASE ins.regimeIVA 
					WHEN 1 THEN 'F48' 
					WHEN 2 THEN 'F49' 
					ELSE adi.regimeAdicional 
				END)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
			WHERE ins.regimeIVA IN (1, 2) AND ins.regimeAdicional = 'C07' AND (ins.regimeIVA <> del.regimeIVA OR ins.regimeAdicional <> del.regimeAdicional) 
				AND ISNULL(adi.regimeAdicional, '') <> (CASE ins.regimeIVA 
															WHEN 1 THEN 'F48' 
															WHEN 2 THEN 'F49' 
															ELSE adi.regimeAdicional 
														END)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @RegimeAdicional
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				regimeAdicional = @RegimeAdicional,
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual		
			WHERE id = @IdAdicao 
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @RegimeAdicional
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- atualiza o adicional regime nas adições para "NULL" quando o regime adicional alterou para "C08"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
			WHERE ins.regimeAdicional = 'C08' AND ins.regimeAdicional <> del.regimeAdicional AND ISNULL(adi.regimeAdicional, '') <> ''
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				regimeAdicional = NULL, 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual				
			WHERE id = @IdAdicao 
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes						
	END
-- insere status de incidência em função do estado de operação
	IF UPDATE(estadoOperacao)
	BEGIN
-- insere status de incidência "SC" quando o estado de operação é "SC - Sem Controlo" e não tem caução/garantia definida
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ins.id_utilizadorControlo, inc.SIN_IDTY
			FROM inserted AS ins 
				INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON ins.estadoOperacao = inc.SIN_CODI					
			WHERE ins.estadoOperacao = 'SC' AND ISNULL(ins.caucao, '') = ''
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			INSERT INTO tb_DeclaracoesDARIncidencias(id_declaracaoDAR, id_statusIncidencia, dataInicio, dataFim, id_utilizadorCriacao, dataCriacao, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @IdStatusIncidencia, @DataAtual, @DataAtual, @IdUtilizador, @DataAtual, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes						
-- insere status de incidência "A00" quando o estado de operação é "AS - Autorização de Saída"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ins.id_utilizadorControlo, inc.SIN_IDTY
			FROM inserted AS ins 
				INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON inc.SIN_CODI = 'A00'
			WHERE ins.estadoOperacao = 'AS'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN			
			INSERT INTO tb_DeclaracoesDARIncidencias(id_declaracaoDAR, id_statusIncidencia, dataInicio, dataFim, id_utilizadorCriacao, dataCriacao, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @IdStatusIncidencia, @DataAtual, @DataAtual, @IdUtilizador, @DataAtual, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
-- insere status de incidência "ND" quando o estado de operação é "ND - Notificação da Dívida"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ins.id_utilizadorControlo, inc.SIN_IDTY
			FROM inserted AS ins 
				INNER JOIN TAB_SINC AS inc WITH(NOLOCK) ON ins.estadoOperacao = inc.SIN_CODI
			WHERE ins.estadoOperacao = 'ND'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		WHILE @@FETCH_STATUS = 0
		BEGIN						
			INSERT INTO tb_DeclaracoesDARIncidencias(id_declaracaoDAR, id_statusIncidencia, dataInicio, dataFim, id_utilizadorCriacao, dataCriacao, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @IdStatusIncidencia, @DataAtual, @DataAtual, @IdUtilizador, @DataAtual, @IdUtilizador, @DataAtual)
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdUtilizador, @IdStatusIncidencia
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes		
	END
-- gere documento "9Z07" e menção "RBVDP" em função do título de depósito
	IF UPDATE(numeroTD)
	BEGIN
-- atualiza documento "9Z07" quando a declaração recebe título de depósito e este já existe
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.numeroTD, ins.id_utilizadorControlo, ddo.id
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id 
				INNER JOIN tb_DeclaracoesDARDocumentos AS ddo WITH(NOLOCK) ON ins.id = ddo.id_declaracaoDAR 
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON ddo.id_documento = doc.DOC_IDTY				
		WHERE del.numeroTD IS NULL AND ins.numeroTD IS NOT NULL AND doc.DOC_CODI = '9Z07'			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @NumeroTD, @IdUtilizador, @IdTabela
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARDocumentos SET 
				numero = CAST(@NumeroTD AS varchar(20)), 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id = @IdTabela
			FETCH NEXT FROM Declaracoes INTO @NumeroTD, @IdUtilizador, @IdTabela
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
-- insere documento "9Z07" quando a declaração recebe título de depósito e este ainda não existir
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ins.numeroTD, ins.id_utilizadorControlo, doc.DOC_IDTY
			FROM inserted AS ins INNER JOIN deleted AS del ON ins.id = del.id 
				INNER JOIN TAB_DOCU AS doc WITH(NOLOCK) ON doc.DOC_CODI = '9Z07'
			WHERE del.numeroTD IS NULL AND ins.numeroTD IS NOT NULL AND NOT EXISTS(SELECT id FROM tb_DeclaracoesDARDocumentos WITH(NOLOCK) WHERE id_declaracaoDAR = ins.id AND id_documento = doc.DOC_IDTY)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @NumeroTD, @IdUtilizador, @IdDocumento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			INSERT INTO tb_DeclaracoesDARDocumentos(id_declaracaoDAR, id_documento, numero, tipo, origem, id_utilizadorControlo, dataControlo)
			VALUES(@IdDeclaracao, @IdDocumento, CAST(@NumeroTD AS varchar(20)), 0, 5, @IdUtilizador, @DataAtual)			
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @NumeroTD, @IdUtilizador, @IdDocumento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
-- processa a remoção da menção "RBVDP"	quando a declaração recebe título de depósito	
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, dme.id
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARMencoes AS dme WITH(NOLOCK) ON ins.id = dme.id_declaracaoDAR AND dme.origem = 1
				INNER JOIN TAB_INFC AS men WITH(NOLOCK) ON dme.id_mencao = men.INF_IDTY				
			WHERE ins.numeroTD IS NOT NULL AND del.numeroTD IS NULL AND men.INF_CODI = 'RBVDP'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdTabela
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARMencoes SET id_utilizadorControlo = @IdUtilizador, dataControlo = @DataAtual			
			WHERE id = @IdTabela
			DELETE FROM tb_DeclaracoesDARMencoes		
			WHERE id = @IdTabela
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdTabela
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes			
	END
-- processa geração do documento de conta ao abrigo da "Faturação Automática Ativa"
	IF (UPDATE(autorizacaoSaida)) AND (EXISTS(SELECT FTA_IDEN FROM TAB_PFTA WITH(NOLOCK) WHERE FTA_ACTI = 1))
    BEGIN   		
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ISNULL(ins.id_tipoDocumentoConta, tdo.TDO_IDTY), ins.id_utilizadorControlo, 
				(CASE 
					WHEN pde.PDE_IDCV = 0 THEN NULL 
					WHEN ins.dutyType IN ('A5', 'A6') THEN 'ACC' 
					WHEN ins.dutyType = 'CA' THEN 'COD' 
					WHEN ins.dutyType IN ('D5', 'D6') THEN 'EXB' 
					ELSE NULL 
				END)
			FROM inserted AS ins 
				INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON ins.id_natureza = nat.NDE_IDTY
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.id_cliente = cli.CLI_IDTY
				INNER JOIN TAB_PDES AS pde WITH(NOLOCK) ON ISNULL(pde.PDE_TDOC, '') <> ''
				INNER JOIN TAB_TDOC AS tdo WITH(NOLOCK) ON pde.PDE_TDOC = tdo.TDO_DOCU	
				INNER JOIN TAB_PFTA as pft WITH(NOLOCK) ON pft.FTA_ACTI = 1				
			WHERE ins.autorizacaoSaida = 1 AND ins.tipoShipment < 2 AND ins.id_conta IS NULL AND nat.NDE_CRCO = 1 AND ISNULL(nat.NDE_TLCV, 0) <> 1 AND cli.CLI_DUCT = 1
				AND NOT EXISTS(SELECT DVE_IDTY FROM FAC_DVEN WITH(NOLOCK) WHERE DVE_IDAR = ins.id)
				AND (CASE pft.FTA_DUVR 
						WHEN 1 THEN (CASE 
										WHEN ISNULL(ins.numeroVossaReferencia, '') <> '' THEN 1 
										ELSE 0 
									END) 
						WHEN 2 THEN (CASE 
										WHEN ISNULL(ins.numeroVossaReferencia, '') = '' THEN 1 
										ELSE 0 
									END) 
						ELSE 1 END) = 1
				AND (CASE pft.FTA_DDRI 
						WHEN 0 THEN (CASE 
										WHEN ins.regimeIVA = 1 THEN 0 
										ELSE 1 
									END) 						
						ELSE 1 END) = 1
				AND (CASE pft.FTA_DDBI 
						WHEN 0 THEN (CASE 
										WHEN (ins.totalIVA <= 5) AND (cli.CLI_BIVA = 1) THEN 0 
										ELSE 1 
									END) 						
						ELSE 1 END) = 1		
				AND (CASE 
						WHEN (ISNULL(nat.NDE_TLCV, -1) = 0) AND (ins.id_tipoDocumentoConta IS NULL) THEN 0 
						ELSE 1 
					END) = 1			
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdTipoDoc, @IdUtilizador, @TipoCliente
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			EXEC @Resultado = sp_DeclaracoesDAR_GeraDocumentoConta @IdDeclaracao, @IdTipoDoc, @TipoCliente, @IdUtilizador, 1, @IdDocConta OUTPUT, @Erro OUTPUT
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @IdTipoDoc, @IdUtilizador, @TipoCliente
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes 
    END
--  nas alterações da garantia/caução ou beneficiário IVA, atualiza o metodo de pagamento nas adições
	IF UPDATE(caucao) OR UPDATE(beneficiarioIVACliente)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id_utilizadorControlo, adi.id,
				(CASE 																	
					WHEN (ins.regimeIVA = 3) AND (ins.beneficiarioIVACliente = 1) THEN 'G' 
					WHEN (ins.regimeIVA = 3) AND (ISNULL(ins.caucao, '') <> '') THEN 'T' 
					WHEN (ins.regimeIVA = 3) AND (ISNULL(ins.caucao, '') = '') THEN  'A' 																	
					ELSE NULL 
				END)
			FROM inserted AS ins 
				INNER JOIN deleted AS del ON ins.id = del.id
				INNER JOIN tb_DeclaracoesDARAdicoes AS adi WITH(NOLOCK) ON ins.id = adi.id_declaracaoDAR
			WHERE ISNULL(ins.caucao, '') <> ISNULL(del.caucao, '') OR ins.beneficiarioIVACliente <> del.beneficiarioIVACliente
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @MetodoPagamento
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE tb_DeclaracoesDARAdicoes SET 
				metodoPagamento = @MetodoPagamento, 
				id_utilizadorControlo = @IdUtilizador, 
				dataControlo = @DataAtual
			WHERE id = @IdAdicao
			FETCH NEXT FROM Declaracoes INTO @IdUtilizador, @IdAdicao, @MetodoPagamento
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes								
	END
-- obtem as declarações para efetuar o respetivo lançamento na caução
	IF UPDATE(data) OR UPDATE(regimeIVA) OR UPDATE(regimeAdicional) OR UPDATE(id_natureza) OR UPDATE(numeroNRM) OR UPDATE(dataNRM) OR UPDATE(id_estancia) OR UPDATE(id_cliente) 
	OR UPDATE(id_declarante) OR UPDATE(caucao) OR UPDATE(totalIVA) OR UPDATE(numeroRegistoLiquidacao) OR UPDATE(dataRegistoLiquidacao) OR UPDATE(beneficiarioIVACliente) 
	OR UPDATE(tipoCaucao)
	BEGIN		
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ins.id, ins.ano, ins.numero, ins.data, ins.regimeIVA, ins.numeroNRM, ins.dataNRM, alf.ALF_CODI, cli.CLI_CODI, dcl.DEC_CODI, ins.caucao, ins.totalIVA, 
				ins.numeroRegistoLiquidacao, ins.dataRegistoLiquidacao, ins.beneficiarioIVACliente, ins.tipoCaucao, 
				(nat.NDE_CODI + '.' + REPLICATE('0', 6 - LEN(CAST(ins.numero AS varchar(10)))) + CAST(ins.numero AS varchar(10)) + '/' + CAST(ins.ano AS varchar(4)))
			FROM inserted AS ins 
				INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON ins.id_natureza = nat.NDE_IDTY
				INNER JOIN TAB_ALFA AS alf WITH(NOLOCK) ON ins.id_estancia = alf.ALF_IDTY
				INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON ins.id_cliente = cli.CLI_IDTY
				INNER JOIN TAB_DECL AS dcl WITH(NOLOCK) ON ins.id_declarante = dcl.DEC_IDTY
			WHERE DATEDIFF(MONTH, ISNULL(ins.dataRegistoLiquidacao, @DataAtual), @DataAtual) < 1 
				AND (((SELECT COUNT(*) FROM PRO_MCAU WITH(NOLOCK) WHERE id_declaracaoDAR = ins.id) = (SELECT COUNT(*) FROM PRO_CCCA WITH(NOLOCK) WHERE DUC_PNUM = ins.numero AND DUC_EANO = ins.ano AND DUC_TIPO = 3))
					OR (((SELECT COUNT(*) FROM PRO_MCAU WITH(NOLOCK) WHERE id_declaracaoDAR = ins.id) * 2) = (SELECT COUNT(*) FROM PRO_CCCA WITH(NOLOCK) WHERE DUC_PNUM = ins.numero AND DUC_EANO = ins.ano AND DUC_TIPO = 3)))
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @Ano, @Numero, @Data, @RegimeIVA, @NumeroNRM, @DataNRM, @CodEstancia, @CodCliente, @CodDeclarante, @Caucao, @TotalIVA, 
			@NumeroRL, @DataRL, @BeneficiarioIVA, @TipoEntCaucao, @DescricaoDeclaracao
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF (@RegimeIVA = 3) AND (@BeneficiarioIVA = 0) AND (ISNULL(@Caucao, '') <> '') AND (ISNULL(@NumeroRL, '') <> '') 
			BEGIN
				IF CHARINDEX('/', @Caucao) = 0
				BEGIN
					SET @AnoCaucao = ('20' + LEFT(@Caucao, 2))					
					SET @NumCaucao = RIGHT(@Caucao, 7)					
					SET @TipoCaucao = '0'
				END
				ELSE
				BEGIN
					SET @AnoCaucao = SUBSTRING(@Caucao, 1, CHARINDEX('/', @Caucao) - 1)
					SET @Caucao = STUFF(@Caucao, 1, CHARINDEX('/', @Caucao), '')
					SET @NumCaucao = SUBSTRING(@Caucao, 1, CHARINDEX('/', @Caucao) - 1)
					SET @Caucao = STUFF(@Caucao, 1, CHARINDEX('/', @Caucao), '')
					SET @TipoCaucao = @Caucao
				END
				IF @TipoEntCaucao = 1 
					SET @CodEntCaucao = @CodDeclarante
				ELSE
					IF @TipoEntCaucao = 2 
						SET @CodEntCaucao = @CodCliente
					ELSE
						SET @CodEntCaucao = NULL
				SET @TipoEntCaucao = (@TipoEntCaucao - 1)
				EXEC SP_lancaDocUnicoCaucao @TipoEntCaucao, @CodEntCaucao, @NumCaucao, @AnoCaucao, @TipoCaucao, @CodEstancia, @Numero, @Ano, @Data, @DescricaoDeclaracao, @NumeroNRM, @DataNRM, @CodCliente, @TotalIVA, 0, 3, 0, @IdDeclaracao
			END
			ELSE
			BEGIN
				DELETE FROM PRO_MCAU
				WHERE id_declaracaoDAR = @IdDeclaracao
			END
			FETCH NEXT FROM Declaracoes INTO @IdDeclaracao, @Ano, @Numero, @Data, @RegimeIVA, @NumeroNRM, @DataNRM, @CodEstancia, @CodCliente, @CodDeclarante, @Caucao, @TotalIVA, 
				@NumeroRL, @DataRL, @BeneficiarioIVA, @TipoEntCaucao, @DescricaoDeclaracao
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAU_PRO_DUCG') AND type = 'TR')
	DROP TRIGGER TAU_PRO_DUCG  
GO
CREATE TRIGGER TAU_PRO_DUCG ON PRO_DUCG WITH ENCRYPTION FOR UPDATE AS 
BEGIN
	SET DATEFORMAT DMY
	SET NOCOUNT ON
-- declaracao de variaveis 
	DECLARE @DUC_PNUM int, @DUC_EANO int, @DUC_NORD varchar(20), @DUC_NDAT datetime, @NumTD int, @ValorEUR numeric(38, 6), @DataLiquidacao datetime, @CodNatureza varchar(3), 
		@CodTipoDocConta varchar(4), @Utilizador varchar(30), @CodCliente varchar(18), @NumMascaras int, @TipoMascara int, @CodMascara int, @Observacoes varchar(5000), 
		@ValorLiqRecapitulativa numeric(38, 6), @NumDocTransporte varchar(18), @TipoCliente varchar(3), @NumContribuinte varchar(18), @CodPais varchar(2), @Artigo int, @DataVoo datetime, 
		@CodAlfandega varchar(8), @NomeAlfandega varchar(70), @AnoSDS int, @NumSDS int, @NLinhaSDS int, @CodDocSDS varchar(5), @NomeDocSDS varchar(70), @NDocSDS int, @TipoDestinatario int, 
		@Data datetime, @CaucaoGlobal bit, @CaucaoNumero varchar(24), @CaucaoTipoEntidade int, @CaucaoAno varchar(4), @CaucaoTipo varchar(1), @TotalAdicoes int, @NumRegLiquidacao varchar(20), 
		@CaucaoCodEntidade varchar(18), @DescricaoDeclaracao varchar(15), @AdicionalIVA int, @TotalMovsCaucao int, @TotalMovsCaucaoCC int, @ContextoIMP int
-- obtem das declarações para efetuar o respetivo lançamento na caução
	IF UPDATE(DUC_DATA) OR UPDATE(NDE_CODI) OR UPDATE(DUC_DST8) OR UPDATE(DEC_CO14) OR UPDATE(DUC_NORD) OR UPDATE(DUC_NDAT) OR UPDATE(DUC_CGLB) OR UPDATE(DUC_CAUC) OR UPDATE(DUC_CENT) 
	OR UPDATE(DUC_CANO) OR UPDATE(DUC_CTIP) OR UPDATE(DUC_ADI5) OR UPDATE(ALF_CODI) OR UPDATE(DUC_VLRC) OR UPDATE(DUC_REGL)
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO, DUC_DATA, DUC_DST8, DUC_NORD, DUC_NDAT, DUC_CGLB, DUC_CAUC, DUC_CENT, DUC_CANO, DUC_CTIP, DUC_ADI5, ALF_CODI, ISNULL(DUC_VLRC, 0), DUC_REGL, DUC_DUNO, 
				(CASE DUC_CENT WHEN 0 THEN DEC_CO14 ELSE DUC_DST8 END), 
				(NDE_CODI + '.' + REPLICATE('0', 6 - LEN(CAST(DUC_PNUM AS varchar(10)))) + CAST(DUC_PNUM AS varchar(10)) + '/' + CAST(DUC_EANO AS varchar(4))), 
				(SELECT TOP 1 DUA_AIVA FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = inserted.DUC_EANO AND DUC_PNUM = inserted.DUC_PNUM AND DUA_CODI = 1),
				(SELECT COUNT(*) FROM PRO_MCAU WITH(NOLOCK) WHERE DUC_PNUM = inserted.DUC_PNUM and DUC_EANO = inserted.DUC_EANO), 
				(SELECT COUNT(*) FROM PRO_CCCA WITH(NOLOCK) WHERE DUC_PNUM = inserted.DUC_PNUM and DUC_EANO = inserted.DUC_EANO)
			FROM inserted
			WHERE DUC_DUNO IN (1, 2) AND DATEDIFF(MONTH, ISNULL(DUC_DTRL, GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()) < 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @Data, @CodCliente, @DUC_NORD, @DUC_NDAT, @CaucaoGlobal, @CaucaoNumero, @CaucaoTipoEntidade, @CaucaoAno, @CaucaoTipo, @TotalAdicoes, 
			@CodAlfandega, @ValorLiqRecapitulativa, @NumRegLiquidacao, @ContextoIMP, @CaucaoCodEntidade, @DescricaoDeclaracao, @AdicionalIVA, @TotalMovsCaucao, @TotalMovsCaucaoCC
		WHILE @@FETCH_STATUS = 0
		BEGIN
			IF (ISNULL(@CodCliente, '') <> '') AND (@CaucaoGlobal = 1) AND (ISNULL(@CaucaoNumero, '') <> '') AND (@TotalAdicoes > 0) AND (ISNULL(@NumRegLiquidacao, '') <> '')
			BEGIN
				IF (@TotalMovsCaucao = @TotalMovsCaucaoCC) OR ((@TotalMovsCaucao * 2) = @TotalMovsCaucaoCC)
				BEGIN
					IF @ContextoIMP = 2 --em IMP-CAU extrai apenas o número 
					BEGIN
						IF CHARINDEX('/', @CaucaoNumero) = 0
							SET @CaucaoNumero = RIGHT(@CaucaoNumero, 7)						
						ELSE
						BEGIN
							SET @CaucaoNumero = STUFF(@CaucaoNumero, 1, CHARINDEX('/', @CaucaoNumero), '')
							SET @CaucaoNumero = SUBSTRING(@CaucaoNumero, 1, CHARINDEX('/', @CaucaoNumero) - 1)
						END
					END
					EXEC SP_lancaDocUnicoCaucao @CaucaoTipoEntidade, @CaucaoCodEntidade, @CaucaoNumero, @CaucaoAno, @CaucaoTipo, @CodAlfandega, @DUC_PNUM, @DUC_EANO, @Data, @DescricaoDeclaracao, @DUC_NORD, @DUC_NDAT, @CodCliente, @ValorLiqRecapitulativa, 0, 0, @AdicionalIVA
				END
			END
			ELSE
			BEGIN
				DELETE FROM PRO_MCAU
				WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO
			END
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @Data, @CodCliente, @DUC_NORD, @DUC_NDAT, @CaucaoGlobal, @CaucaoNumero, @CaucaoTipoEntidade, @CaucaoAno, @CaucaoTipo, @TotalAdicoes, 
				@CodAlfandega, @ValorLiqRecapitulativa, @NumRegLiquidacao, @ContextoIMP, @CaucaoCodEntidade, @DescricaoDeclaracao, @AdicionalIVA, @TotalMovsCaucao, @TotalMovsCaucaoCC
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- verifica se campos de Num Ordem DGA e Data foram alterados
	IF UPDATE(DUC_NORD) or UPDATE(DUC_NDAT)
	BEGIN	
-- busca dados alterados
		DECLARE Detalhe CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO, DUC_NORD, DUC_NDAT
			FROM inserted
		OPEN Detalhe
		FETCH NEXT FROM Detalhe INTO @DUC_PNUM, @DUC_EANO, @DUC_NORD, @DUC_NDAT
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- actualiza Num Ordem DGA e Data na Caução 
			UPDATE PRO_MCAU SET MCA_NORD = @DUC_NORD, MCA_DORD = @DUC_NDAT	
			WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO and DUC_TIPO = 0
-- actualiza Num Ordem DGA e Data na Conta 
			ALTER TABLE FAC_CDOC DISABLE TRIGGER TAU_FAC_CDOC
			UPDATE FAC_CDOC SET CDO_NORD = @DUC_NORD, CDO_DTAC = @DUC_NDAT
			WHERE CDO_PANO = @DUC_EANO and CDO_NPRO = @DUC_PNUM and CDO_IMEX = 0
			ALTER TABLE FAC_CDOC ENABLE TRIGGER TAU_FAC_CDOC

			FETCH NEXT FROM Detalhe INTO @DUC_PNUM, @DUC_EANO, @DUC_NORD, @DUC_NDAT
		END
		CLOSE Detalhe
		DEALLOCATE Detalhe
	END
-- verifica se campo Data de Liquidaçao foi alterado
	IF UPDATE(DUC_DTRL)
	BEGIN	
-- busca dados alterados
		DECLARE Detalhe CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO, DUC_DTRL
			FROM inserted
		OPEN Detalhe
		FETCH NEXT FROM Detalhe INTO @DUC_PNUM, @DUC_EANO, @DataLiquidacao
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- actualiza Data de Liquidaçao na Caução 
			UPDATE PRO_MCAU SET MCA_DTRL = @DataLiquidacao
			WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO and DUC_TIPO = 0
			FETCH NEXT FROM Detalhe INTO @DUC_PNUM, @DUC_EANO, @DataLiquidacao
		END
		CLOSE Detalhe
		DEALLOCATE Detalhe
	END	
-- verifica se campo de "Nº Titulo Depósito" foi alterado
	IF UPDATE(DUC_NTDP)
	BEGIN		
-- obtem declarações alteradas que tenham adições
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO, DUC_NTDP
			FROM inserted
			WHERE DUC_DUNO IN (0, 1) AND EXISTS(SELECT DUA_CODI FROM PRO_DUAD WITH(NOLOCK) WHERE DUC_EANO = inserted.DUC_EANO and DUC_PNUM = inserted.DUC_PNUM and DUA_CODI = 1)
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @NumTD
		WHILE @@FETCH_STATUS = 0
		BEGIN			
-- verifica se documento "9Z07" já existe na 1ª adição. Se sim edita dados, senão insere documento
			IF EXISTS(SELECT DDO_CODI FROM PRO_DDOC WITH(NOLOCK) WHERE DUC_EANO = @DUC_EANO and DUC_PNUM = @DUC_PNUM and DUA_CODI = 1 and DOC_CODI = '9Z07')
			BEGIN
				UPDATE PRO_DDOC SET DDO_NUME = CAST(@NumTD as varchar(20)), DDO_DINI = CAST(CONVERT(varchar(10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT(), 105) as datetime)
				WHERE DUC_EANO = @DUC_EANO and DUC_PNUM = @DUC_PNUM and DUA_CODI = 1 and DOC_CODI = '9Z07'				
			END
			ELSE
			BEGIN				
				INSERT INTO PRO_DDOC(DUC_EANO, DUC_PNUM, DUA_CODI, DDO_CODI, DOC_CODI, DOC_NOME, DDO_NUME, DDO_DINI, DDO_MONT, DDO_DPRZ)
				SELECT @DUC_EANO, @DUC_PNUM, 1, (ISNULL((SELECT MAX(DDO_CODI) FROM PRO_DDOC WHERE DUC_EANO = @DUC_EANO and DUC_PNUM = @DUC_PNUM and DUA_CODI = 1), 0) + 1), 
					DOC_CODI, DOC_NOME, CAST(@NumTD as varchar(20)), CAST(CONVERT(varchar(10), GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT(), 105) as datetime), 0, 0
				FROM TAB_DOCU WITH(NOLOCK)
				WHERE DOC_CODI = '9Z07'
			END
-- processa remoção da menção "PCEDP"		
			DELETE PRO_DDOC 
			WHERE DUC_EANO = @DUC_EANO and DUC_PNUM = @DUC_PNUM and DUA_CODI = 1 and DOC_CODI = 'PCEDP'
-- processa a atualização dos códigos internos dos documentos
			UPDATE PRO_DDOC SET DDO_CODI = NEW_CODI
			FROM PRO_DDOC AS ddo INNER JOIN (SELECT ROW_NUMBER() OVER(ORDER BY DDO_CODI) AS NEW_CODI, DDO_CODI
				FROM PRO_DDOC
				WHERE DUC_EANO = @DUC_EANO and DUC_PNUM = @DUC_PNUM and DUA_CODI = 1) AS ddn ON ddo.DDO_CODI = ddn.DDO_CODI
			WHERE ddo.DUC_EANO = @DUC_EANO and ddo.DUC_PNUM = @DUC_PNUM and ddo.DUA_CODI = 1 and ddo.DDO_CODI <> ddn.NEW_CODI		
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @NumTD
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END
-- verifica se campo de "Artigo Franquia" ou campo "NIF Destinatário" foram alterados e campos adicionais dos Par. Despachos for "FEDEX", "UPS", "DHL" ou "TNT"
	IF (UPDATE(DUC_ARTI) OR UPDATE(DUC_DNIF)) and (EXISTS(SELECT PDE_CODI FROM TAB_PDES WITH(NOLOCK) WHERE PDE_CADI IN (1, 2, 3, 4)))
	BEGIN	
-- obtem declarações alteradas que tenham o "Artigo Franquia" preenchido e o "País Destinatário" como "PT" e "NIF Destinatário" a começar por "1", "2", "3" , "5", "6", "7", "8" ou "9" ou "País Destinatário" diferente de "PT" e que ainda não tenham "Aut. Saída"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT ALF_CODI, ALF_NOME, DUC_CPRT, DUC_VEUR, DUC_DNIF, PAI_DLIV, DUC_ARTI, DUC_DTVO, DUC_TPDS
			FROM inserted
			WHERE DUC_ARTI IS NOT NULL AND DUC_ASAI = 0 AND DUC_DUNO IN (1, 2) 
				AND ((PAI_DLIV = 'PT' AND SUBSTRING(DUC_DNIF, 1, 1) IN ('1', '2', '3', '5', '6', '7', '8', '9')) OR (PAI_DLIV <> 'PT')) 
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @CodAlfandega, @NomeAlfandega, @NumDocTransporte, @ValorEUR, @NumContribuinte, @CodPais, @Artigo, @DataVoo, @TipoDestinatario
		WHILE @@FETCH_STATUS = 0
		BEGIN
			SELECT TOP 1 @AnoSDS = dsd.DSC_EANO, @NumSDS = dsd.DSC_NPRO, @NLinhaSDS = dsd.DSD_NUME
			FROM PRO_SDSD AS dsd WITH(NOLOCK) 
				INNER JOIN PRO_SDSC AS dsc WITH(NOLOCK) ON dsd.DSC_EANO = dsc.DSC_EANO AND dsd.DSC_NPRO = dsc.DSC_NPRO
			WHERE dsc.DSC_TIPO = 0 AND dsd.DSD_NRMH = @NumDocTransporte AND CAST(CONVERT(varchar(10), dsc.DSC_DTVO, 105) AS datetime) = CAST(CONVERT(varchar(10), @DataVoo, 105) AS datetime)
-- se AWB existir num Manifesto de Importação SDS p/ a Data de Voo c/ status de "Por Enviar", processa atualizações
			IF @AnoSDS IS NOT NULL
			BEGIN
-- actualiza campos de "Id. Destinatário", "Valor" e "Artigo Franquia" da AWB do Manifesto de Importação SDS relacionado			
				UPDATE PRO_SDSD SET 
					DSD_IDED = (CASE 
									WHEN (@CodPais = 'PT') AND (@TipoDestinatario <> 3) THEN (@CodPais + '/NIF/' + @NumContribuinte) 
									WHEN (@CodPais <> 'PT') AND (@TipoDestinatario = 3) THEN (@CodPais + '/P/' + @NumContribuinte) ELSE (@CodPais + '/EORI/' + @NumContribuinte) 
								END), 
					DSD_VALO = @ValorEUR, 
					DSD_AFRQ = @Artigo, 
					DSD_EFRQ = 0, 
					DSD_DNOW = GETDATE()
				WHERE DSC_EANO = @AnoSDS AND DSC_NPRO = @NumSDS AND DSD_NUME = @NLinhaSDS
-- processa a inserção/edição do detalhe de documentos da linha AWB do Manifesto de Importação SDS relacionado
				IF (UPDATE(DUC_ARTI)) AND (@Artigo IN (23, 25, 42, 87))
				BEGIN
					DECLARE Docs CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
						SELECT DOC_CODI, DOC_NOME
						FROM TAB_DOCU WITH(NOLOCK)
						WHERE DOC_CODI IN (SELECT tbl.DOC_CODI
							FROM (SELECT (CASE @Artigo WHEN 23 THEN 'IFC07' WHEN 25 THEN 'IFC08' ELSE NULL END) AS DOC_CODI
								UNION
								SELECT (CASE @Artigo WHEN 23 THEN 'PFC07' WHEN 25 THEN 'PFC08' WHEN 42 THEN 'PFC11' WHEN 87 THEN 'PFC31' ELSE NULL END)) as tbl
							WHERE ISNULL(tbl.DOC_CODI, '') <> '')
					OPEN Docs
					FETCH NEXT FROM Docs INTO @CodDocSDS, @NomeDocSDS
					WHILE @@FETCH_STATUS = 0
					BEGIN
						IF NOT EXISTS(SELECT SDD_NUME FROM PRO_SSDD WITH(NOLOCK) WHERE DSC_EANO = @AnoSDS AND DSC_NPRO = @NumSDS AND DSD_NUME = @NLinhaSDS AND DOC_CODI = @CodDocSDS)
						BEGIN
							SET @NDocSDS = ISNULL((SELECT MAX(SDD_NUME) FROM PRO_SSDD WHERE DSC_EANO = @AnoSDS AND DSC_NPRO = @NumSDS AND DSD_NUME = @NLinhaSDS), 0) + 1
							INSERT INTO PRO_SSDD(DSC_EANO, DSC_NPRO, DSD_NUME, SDD_NUME, DOC_CODI, DOC_NOME, SDD_NDOC, SDD_DDOC, EAD_CODI, EAD_NOME, SDD_SDOC)
							VALUES(@AnoSDS, @NumSDS, @NLinhaSDS, @NDocSDS, @CodDocSDS, @NomeDocSDS, @NumDocTransporte, CAST(CONVERT(varchar(10), GETDATE(), 105) AS datetime), 
								@CodAlfandega, @NomeAlfandega, 'T')
						END
						ELSE
						BEGIN
							UPDATE PRO_SSDD SET SDD_NDOC = @NumDocTransporte, SDD_DDOC = CAST(CONVERT(varchar(10), GETDATE(), 105) AS datetime), EAD_CODI = @CodAlfandega, 
								EAD_NOME = @NomeAlfandega, SDD_SDOC = 'T'
							WHERE DSC_EANO = @AnoSDS AND DSC_NPRO = @NumSDS AND DSD_NUME = @NLinhaSDS AND DOC_CODI = @CodDocSDS 
						END
						FETCH NEXT FROM Docs INTO @CodDocSDS, @NomeDocSDS
					END
					CLOSE Docs
					DEALLOCATE Docs
				END
			END
			FETCH NEXT FROM Declaracoes INTO @CodAlfandega, @NomeAlfandega, @NumDocTransporte, @ValorEUR, @NumContribuinte, @CodPais, @Artigo, @DataVoo, @TipoDestinatario
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes
	END	
-- verifica se campo de "Montante Casa 22" foi alterado e campos adicionais dos Par. Despachos for "CTT"	
	IF (UPDATE(DUC_MT22)) and (EXISTS(SELECT PDE_CODI FROM TAB_PDES WITH(NOLOCK) WHERE PDE_CADI = 5))
    BEGIN   
-- obtem declarações alteradas da Natureza "PRE"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO, DUC_VEUR
			FROM inserted
			WHERE NDE_CODI = 'PRE'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @ValorEUR
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- actualiza Método de Avaliação e Regime B das adições da declaração
			UPDATE PRO_DUAD SET DUA_MAVA = NULL, DUA_R37B = (CASE WHEN @ValorEUR < 150 THEN 'C07' ELSE DUA_R37B END)
			WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @ValorEUR
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes                           
    END       
-- verifica se campo "Natureza" foi alterado e campos adicionais dos Par. Despachos for "CTT"       
	IF (UPDATE(NDE_CODI)) and (EXISTS(SELECT PDE_CODI FROM TAB_PDES WITH(NOLOCK) WHERE PDE_CADI = 5))
    BEGIN   
-- obtem declarações alteradas para a Natureza "BAL"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO
			FROM inserted
			WHERE NDE_CODI = 'BAL'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- actualiza Nº.Referência(7) da declaração            
			UPDATE PRO_DUCG SET DUC_REF7 = ('BAL/' + CAST(@DUC_PNUM as varchar(20)) + '/' + CAST(@DUC_EANO as varchar(4)))
			WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes 
    END     
-- verifica se campo de "Status" foi alterado e campos adicionais dos Par. Despachos for "CTT"	
	IF (UPDATE(DUC_STAT)) and (EXISTS(SELECT PDE_CODI FROM TAB_PDES WITH(NOLOCK) WHERE PDE_CADI = 5))
    BEGIN   
-- obtem declarações alteradas da Natureza "PRE"
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO
			FROM inserted
			WHERE NDE_CODI = 'PRE'
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- actualiza Natureza da declaração		
			UPDATE PRO_DUCG SET NDE_CODI = 'DAR', NDE_NOME = (SELECT NDE_NOME FROM TAB_NDES WITH(NOLOCK) WHERE NDE_CODI = 'DAR')
			WHERE DUC_PNUM = @DUC_PNUM and DUC_EANO = @DUC_EANO
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes                           
    END  
-- verifica se campo de "Aut. Saída" foi alterado e campo de "Faturação Automática Ativa" selecionado nos Par. Faturação Automática
	IF (UPDATE(DUC_ASAI)) and (EXISTS(SELECT FTA_IDEN FROM TAB_PFTA WITH(NOLOCK) WHERE FTA_ACTI = 1))
    BEGIN   
-- obtem declarações alteradas c/ campo "Aut. Saída" 
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT duc.DUC_PNUM, duc.DUC_EANO, duc.NDE_CODI, duc.DUC_DST8, duc.DUC_CPRT, duc.DUC_UALT, ISNULL(duc.DUC_VLRC, 0), 
				(CASE ISNULL(nat.NDE_TLCV, -1) WHEN 0 THEN duc.TDO_DOCU ELSE (SELECT PDE_TDOC FROM TAB_PDES WITH(NOLOCK)) END), 
				(CASE WHEN (SELECT PDE_IDCV FROM TAB_PDES WITH(NOLOCK)) = 0 THEN NULL WHEN duc.DUC_DTYP IN ('A5' , 'A6') THEN 'ACC' WHEN duc.DUC_DTYP = 'CA' THEN 'COD' WHEN duc.DUC_DTYP IN ('D5', 'D6') THEN 'EXB' ELSE NULL END)
			FROM inserted AS duc INNER JOIN TAB_CLIE AS cli WITH(NOLOCK) ON duc.DUC_DST8 = cli.CLI_CODI
				INNER JOIN TAB_NDES AS nat WITH(NOLOCK) ON duc.NDE_CODI = nat.NDE_CODI
			WHERE duc.DUC_ASAI = 1 AND duc.DUC_TSHI < 2 AND cli.CLI_DUCT = 1 AND nat.NDE_CRCO = 1 and ISNULL(nat.NDE_TLCV, 0) <> 1 
				AND (CASE (SELECT FTA_DUVR FROM TAB_PFTA WITH(NOLOCK)) WHEN 1 THEN (CASE WHEN ISNULL(duc.DUC_NVRF, '') <> '' THEN 1 ELSE 0 END) WHEN 2 THEN (CASE WHEN ISNULL(duc.DUC_NVRF, '') = '' THEN 1 ELSE 0 END) ELSE 1 END) = 1
				AND (SELECT COUNT(*) from FAC_CDOC WITH(NOLOCK) where CDO_IMEX = 0 and CDO_PANO = duc.DUC_EANO and CDO_NPRO = duc.DUC_PNUM) = 0
				AND (SELECT COUNT(*) from FAC_DVEN WITH(NOLOCK) where DVE_IMEX = 0 and DVE_PANO = duc.DUC_EANO and DVE_NPRO = duc.DUC_PNUM) = 0
				AND (CASE WHEN ISNULL(nat.NDE_TLCV, -1) = 0 AND ISNULL(duc.TDO_DOCU, '') = '' THEN 0 ELSE 1 END) = 1
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @CodNatureza, @CodCliente, @NumDocTransporte, @Utilizador, @ValorLiqRecapitulativa, @CodTipoDocConta, @TipoCliente
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- obtem a máscara para a Conta
			SET @TipoMascara = 0
			SET @CodMascara = 0
			EXEC SP_ObtemMascaraFacturacao @CodCliente, @CodNatureza, @NumMascaras OUTPUT, @TipoMascara OUTPUT, @CodMascara OUTPUT
-- atualiza na declaração a máscara obtida p/ o documento de Conta
			UPDATE PRO_DUCG SET DUC_TMSF = @TipoMascara, DUC_MASC = @CodMascara
			WHERE DUC_PNUM = @DUC_PNUM AND DUC_EANO = @DUC_EANO
-- obtem as observações para a Conta
			EXEC SP_ObtemObservacoesParaConta @CodMascara, @DUC_EANO, @DUC_PNUM, @CodCliente, @CodNatureza, '', @Observacoes OUTPUT			
-- processa a geração do documento de Conta
			EXEC SP_geraContas @DUC_PNUM, @DUC_EANO, @CodTipoDocConta, @CodNatureza, @Utilizador, @TipoMascara, @CodMascara, 0, @Observacoes, @ValorLiqRecapitulativa, @NumDocTransporte, 0, @TipoCliente, 1
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO, @CodNatureza, @CodCliente, @NumDocTransporte, @Utilizador, @ValorLiqRecapitulativa, @CodTipoDocConta, @TipoCliente
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes    
    END
-- verifica se campo "Tipo de Shipment" foi alterado, processar a cópia dos valores totais originais nas declarações cujo tipo de shipment mudou p/ "Part-Shipment"
	IF UPDATE(DUC_TSHI)
    BEGIN   
-- grava os valores totais originais para as declarações cujo tipo de shipment mudou p/ "Part-Shipment" e valores originais ainda não guardados
		UPDATE PRO_DUCG SET DUC_TMOO = ISNULL(del.DUC_MT22, 0), DUC_TFRO = ISNULL(del.DUC_FRET, 0), DUC_TSEO = ISNULL(del.DUC_SEGU, 0), DUC_TMLO = ISNULL(del.DUC_MLQT, 0), DUC_TMBO = ISNULL(del.DUC_MBRT, 0), 
			DUC_TVEO = ISNULL(del.DUC_VEUR, 0), DUC_TVAO = ISNULL(del.DUC_VATT, 0), DUC_TLRO = ISNULL(del.DUC_VLRC, 0), 
			DUC_TOPO = ISNULL((SELECT SUM(ISNULL(ad.DUA_VOPT, 0)) FROM PRO_DUAD AS ad WITH(NOLOCK) WHERE ad.DUC_EANO = del.DUC_EANO AND ad.DUC_PNUM = del.DUC_PNUM), 0)			
		FROM PRO_DUCG AS duc WITH(NOLOCK) INNER JOIN inserted AS ins ON duc.DUC_IDTY = ins.DUC_IDTY
			INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY			
		WHERE ins.DUC_TSHI = 1 AND del.DUC_TSHI = 0 AND ins.DUC_TMOO = 0 AND del.DUC_TMOO = 0 
-- grava o valor do iva original das adições para as declarações cujo tipo de shipment mudou p/ "Part-Shipment" e valores originais ainda não guardados
		UPDATE PRO_DUAD SET DUA_TIVO = ISNULL(dua.DUA_VIVA, 0)		
		FROM PRO_DUAD AS dua WITH(NOLOCK) INNER JOIN inserted AS ins ON dua.DUC_EANO = ins.DUC_EANO AND dua.DUC_PNUM = ins.DUC_PNUM
			INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY			
		WHERE ins.DUC_TSHI = 1 AND del.DUC_TSHI = 0 AND dua.DUA_TIVO = 0
-- copia o detalhe da liquidação recapitulativa para as declarações cujo tipo de shipment mudou p/ "Part-Shipment" e valores originais ainda não guardados
		INSERT INTO PRO_DULO(DUC_PNUM, DUC_EANO, RRE_CODI, RRE_NOME, DUL_MONT, DUL_RPRO, DUL_MTAG, DUL_UCRI, DUL_DTCR)
		SELECT dlr.DUC_PNUM, dlr.DUC_EANO, dlr.RRE_CODI, dlr.RRE_NOME, ISNULL(dlr.DUL_MONT, 0), ISNULL(dlr.DUL_RPRO, 0), dlr.DUL_MTAG, ins.DUC_UALT, GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
		FROM PRO_DULR AS dlr WITH(NOLOCK) INNER JOIN inserted AS ins ON dlr.DUC_PNUM = ins.DUC_PNUM AND dlr.DUC_EANO = ins.DUC_EANO
			INNER JOIN deleted AS del ON ins.DUC_IDTY = del.DUC_IDTY			
		WHERE ins.DUC_TSHI = 1 AND del.DUC_TSHI = 0 AND NOT EXISTS(SELECT DUC_PNUM FROM PRO_DULO WHERE DUC_PNUM = ins.DUC_PNUM AND DUC_EANO = ins.DUC_EANO)
    END     
-- verifica se campos "Status", "Versão", "Revisão" ou "Estado Operação" foram alterados e nos Par. Despachos o valor do campo "Campos Adicionais" for "ENTREPOSTO" para colocar declarações como pendentes de envio para Portal MyRangel
	IF (UPDATE(DUC_STAT) OR UPDATE(DUC_VERS) OR UPDATE(DUC_REVI) OR UPDATE(DUC_ESTO)) AND (EXISTS(SELECT 1 FROM TAB_PDES WITH(NOLOCK) WHERE PDE_CADI = 8)) --Campos Adicionais = "ENTREPOSTO"
	BEGIN
		DECLARE Declaracoes CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DUC_PNUM, DUC_EANO
			FROM inserted 
			WHERE DUC_STAT = 3 OR DUC_VERS > 0 OR DUC_REVI > 0 OR ISNULL(DUC_ESTO, '') <> ''
		OPEN Declaracoes
		FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		WHILE @@FETCH_STATUS = 0
		BEGIN	
			UPDATE PRO_DUCG SET 
				DUC_PMRP = 1				
			WHERE DUC_PNUM = @DUC_PNUM AND DUC_EANO = @DUC_EANO
			FETCH NEXT FROM Declaracoes INTO @DUC_PNUM, @DUC_EANO
		END
		CLOSE Declaracoes
		DEALLOCATE Declaracoes				
	END
END
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TAU_PRO_SDSC') AND type = 'TR')
	DROP TRIGGER TAU_PRO_SDSC  
GO
CREATE TRIGGER TAU_PRO_SDSC ON PRO_SDSC WITH ENCRYPTION AFTER UPDATE AS 
BEGIN
	SET NOCOUNT ON
	SET DATEFORMAT DMY
-- declaração de variáveis	
	DECLARE @NomeBDParaSDSExportacao varchar(8), @IdContramarca varchar(20), @NumCMFixo varchar(8), @NumCMVar varchar(6), @UtilizadorAlteracao varchar(30), 
		@DataAlteracao datetime, @StatusCM int, @UtilizadorEnvioCMCriacao varchar(30), @DataEnvioCMCriacao datetime, @UtilizadorObterCMCriacao varchar(30), 
		@DataObterCMCriacao datetime, @UtilizadorEnvioCMAlteracao varchar(30), @DataEnvioCMAlteracao datetime, @UtilizadorObterCMAlteracao varchar(30), 
		@DataObterCMAlteracao datetime, @UtilizadorEnvioCMAnulacao varchar(30), @DataEnvioCMAnulacao datetime, @UtilizadorObterCMAnulacao varchar(30), 
		@DataObterCMAnulacao datetime, @EstadoCM varchar(3), @SQLAExecutar nvarchar(4000), @LstVarSQL nvarchar(1000) 
-- obtem o nome da BD de Manifestos SDS de Exportação dos Parâmetros SDS - Via Aérea
	SELECT TOP 1 @NomeBDParaSDSExportacao = ISNULL((CASE PSD_BDEX WHEN 1 THEN (NULLIF(PSD_NBDE, '') + '..') ELSE NULL END), '')
	FROM TAB_PSDS WITH(NOLOCK)
-- processa automatismos relacionados com a alteração dos campos de Contramarca
	IF UPDATE(DSC_NCMF) OR UPDATE(DSC_NCMV) OR UPDATE(DSC_STCM) OR UPDATE(DSC_ESTA)
	BEGIN
-- obtem os Manifestos de Importação alterados
		DECLARE Manifestos CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
			SELECT DSC_IDCM, DSC_NCMF, DSC_NCMV, DSC_UALT, DSC_DALT, DSC_STCM, DSC_UCCM, DSC_DCCM, DSC_UCCR, DSC_DCCR, DSC_UUCM, DSC_DUCM, DSC_UUCR, DSC_DUCR, DSC_UACM, 
				DSC_DACM, DSC_UACR, DSC_DACR, DSC_ESTA
			FROM inserted
			WHERE DSC_TIPO = 0
		OPEN Manifestos
		FETCH NEXT FROM Manifestos INTO @IdContramarca, @NumCMFixo, @NumCMVar, @UtilizadorAlteracao, @DataAlteracao, @StatusCM, @UtilizadorEnvioCMCriacao, @DataEnvioCMCriacao, 
			@UtilizadorObterCMCriacao, @DataObterCMCriacao, @UtilizadorEnvioCMAlteracao, @DataEnvioCMAlteracao, @UtilizadorObterCMAlteracao, @DataObterCMAlteracao, 
			@UtilizadorEnvioCMAnulacao, @DataEnvioCMAnulacao, @UtilizadorObterCMAnulacao, @DataObterCMAnulacao, @EstadoCM
		WHILE @@FETCH_STATUS = 0
		BEGIN
-- atualiza os dados da CM no Manifesto SDS de Exportação correspondente na própria BD ou da BD diferente
			SET @SQLAExecutar = N'UPDATE ' + @NomeBDParaSDSExportacao + 'PRO_SDSC SET 			
					DSC_NCMF = @INNumCMFixo, 
					DSC_NCMV = @INNumCMVar,
					DSC_STCM = @INStatusCM, 
					DSC_UCCM = @INUtilizadorEnvioCMCriacao,
					DSC_DCCM = @INDataEnvioCMCriacao,
					DSC_UCCR = @INUtilizadorObterCMCriacao, 
					DSC_DCCR = @INDataObterCMCriacao,
					DSC_UUCM = @INUtilizadorEnvioCMAlteracao,
					DSC_DUCM = @INDataEnvioCMAlteracao,
					DSC_UUCR = @INUtilizadorObterCMAlteracao, 
					DSC_DUCR = @INDataObterCMAlteracao,
					DSC_UACM = @INUtilizadorEnvioCMAnulacao,
					DSC_DACM = @INDataEnvioCMAnulacao,
					DSC_UACR = @INUtilizadorObterCMAnulacao, 
					DSC_DACR = @INDataObterCMAnulacao,		
					DSC_ESTA = @INEstadoCM, 					
					DSC_UALT = @INUtilizadorAlteracao,
					DSC_DALT = @INDataAlteracao		
				WHERE DSC_TIPO = 1 AND DSC_IDCM = @INIdContramarca'			
			SET @LstVarSQL = N'@INIdContramarca varchar(20), @INNumCMFixo varchar(8), @INNumCMVar varchar(6), @INUtilizadorAlteracao varchar(30), @INDataAlteracao datetime, @INStatusCM int, @INUtilizadorEnvioCMCriacao varchar(30), @INDataEnvioCMCriacao datetime, @INUtilizadorObterCMCriacao varchar(30), @INDataObterCMCriacao datetime, @INUtilizadorEnvioCMAlteracao varchar(30), @INDataEnvioCMAlteracao datetime, @INUtilizadorObterCMAlteracao varchar(30), @INDataObterCMAlteracao datetime, @INUtilizadorEnvioCMAnulacao varchar(30), @INDataEnvioCMAnulacao datetime, @INUtilizadorObterCMAnulacao varchar(30), @INDataObterCMAnulacao datetime, @INEstadoCM varchar(3)'
			EXEC sp_executesql @SQLAExecutar, @LstVarSQL, @INIdContramarca = @IdContramarca, @INNumCMFixo = @NumCMFixo, @INNumCMVar = @NumCMVar, @INUtilizadorAlteracao = @UtilizadorAlteracao, @INDataAlteracao = @DataAlteracao, @INStatusCM = @StatusCM, @INUtilizadorEnvioCMCriacao = @UtilizadorEnvioCMCriacao, @INDataEnvioCMCriacao = @DataEnvioCMCriacao, @INUtilizadorObterCMCriacao = @UtilizadorObterCMCriacao, @INDataObterCMCriacao = @DataObterCMCriacao, @INUtilizadorEnvioCMAlteracao = @UtilizadorEnvioCMAlteracao, @INDataEnvioCMAlteracao = @DataEnvioCMAlteracao, @INUtilizadorObterCMAlteracao = @UtilizadorObterCMAlteracao, @INDataObterCMAlteracao = @DataObterCMAlteracao, @INUtilizadorEnvioCMAnulacao = @UtilizadorEnvioCMAnulacao, @INDataEnvioCMAnulacao = @DataEnvioCMAnulacao, @INUtilizadorObterCMAnulacao = @UtilizadorObterCMAnulacao, @INDataObterCMAnulacao = @DataObterCMAnulacao, @INEstadoCM = @EstadoCM 
			FETCH NEXT FROM Manifestos INTO @IdContramarca, @NumCMFixo, @NumCMVar, @UtilizadorAlteracao, @DataAlteracao, @StatusCM, @UtilizadorEnvioCMCriacao, @DataEnvioCMCriacao, 
				@UtilizadorObterCMCriacao, @DataObterCMCriacao, @UtilizadorEnvioCMAlteracao, @DataEnvioCMAlteracao, @UtilizadorObterCMAlteracao, @DataObterCMAlteracao, 
				@UtilizadorEnvioCMAnulacao, @DataEnvioCMAnulacao, @UtilizadorObterCMAnulacao, @DataObterCMAnulacao, @EstadoCM
		END
		CLOSE Manifestos
		DEALLOCATE Manifestos
	END
END
GO
UPDATE TAB_UMED SET UME_EXPT = 1
WHERE UME_EXPT = 0
GO
IF NOT EXISTS(SELECT 1 FROM tb_TBL_Desdobramentos WITH(NOLOCK) WHERE tipoDeclaracao = 'IM' AND regime = '6123' AND desdobramento1 = 'F01' AND desdobramento2 = '410' AND ISNULL(desdobramento3, '') = '' AND ISNULL(desdobramento4, '') = '' AND ISNULL(desdobramento5, '') = '')
BEGIN
	DECLARE @IdUtilizador int, @DataAtual datetime
	SELECT @IdUtilizador = UTI_IDTY, @DataAtual = GIDWIN.dbo.FNT_Geral_ObtemDataHoraGMT()
	FROM GIDWIN.dbo.FAP_UTIL WITH(NOLOCK)
	WHERE UTI_UTIL = 'singeste'
	INSERT INTO tb_TBL_Desdobramentos(tipoDeclaracao, regime, desdobramento1, desdobramento2, desdobramento3, desdobramento4, desdobramento5, id_utilizadorControlo, dataControlo) 
	VALUES ('IM', '6123', 'F01', '410', NULL, NULL, NULL, @IdUtilizador, @DataAtual)
END
GO
UPDATE TAB_PAPL SET PAP_VERS = '17.2'
GO
