{ 
  Variáveis externas disponíveis: 
    Output: string; 
    Datasets: TspdXSDDataset;
}	
{$I Tipos.txt}  
Var	
	_DS,_DSAux, _DSAux2: TDataSet;
	_TotParcial, _TotParcial2 : Extended;	
	_TotICMS51 : Extended;
	_Valida : Boolean;
	_aux,_aux2,_regrasExtras : string;
	_auxint, _numnotas, i, j, k, l : integer;
	_auxdouble : Double;
	_array : Array of String;
	_XML,_nota, _validacao : string;
	_decodedChave : TspdDecodeChaveNFe;
	_data : string;
	_Rejeicoes, _AcumladorRejeicoes, _Handles, _output : TstringList;	

{$I Funcoes.txt}

{$I UpdateDETDatasets.txt}

//funções importadas do BD
%s

{$I CST_CFOP\Regras.txt}	

{$I CEP\ExecutaRegras.txt}

{$I ICMSUFDest\Regras.txt}

{$I ..\Esquemas\ExpConsts.txt}

{$I ..\Esquemas\Funcoes.txt}

{$I ..\Esquemas\DefineMensagem.txt}	

begin
	_regrasExtras := '';
	_Rejeicoes := TstringList.Create;
	_AcumladorRejeicoes := TstringList.Create;
	_Handles := TstringList.Create;
	_output := TstringList.Create;
	try
		_xml := input;
		_numnotas :=  XmlSelectCountNode(_Xml, '//*[local-name()="NFe"]');
		if _numnotas > 0 then
		begin
			for i := 0 to _numnotas-1 do	
			begin
				_nota := XmlSelectItemIndexNode(_xml, '//*[local-name()="NFe"]',i); 				 
				Datasets.LoadFromXMLContent(_nota);							
				_validacao := ValidarEsquemaXML(_nota,'http://www.portalfiscal.inf.br/nfe',Datasets.XsdFile);
				if Params.values['versaomanual'] = 'vm50' then
					_data := '01/01/2014'
				else
					_data := FormatarData(FieldValue('NFe','dhEmi_B09').AsString);
				if trim(_validacao) = '' then
				begin				
					// os regras do cliente serão inseridas aqui
					%s	
					
					if trim(Params.Values['ValidarAssinatura']) <> 'false' then
					begin
						if not IsValidSignature(_nota) then
						begin
							_Rejeicoes.add('Assinatura inválida');
						end;
					end;
					_valida := true;
					if not(PosStr('rejeição',LowerCase(_Rejeicoes.Text)) <= 0) then				
						_Valida := false;
					if not(PosStr('Assinatura inválida',_Rejeicoes.Text) <= 0) then
						_valida := false;
						
					if (Trim(_Rejeicoes.text) = '') or (_Valida) then
					begin
						_Rejeicoes.Add('XML Válido');
					end;
				end 
				else
				begin				
					_Rejeicoes.add(TraduzirMensagem(_validacao));
				end;
				_output.add(Trim(_Rejeicoes.Text) + '&spdHandleDlmt;' +'&spdDlmt;');
				_Rejeicoes.clear;
			end;			
			Output := _output.text;
		end
		else
			Output := 'Falha de Esquema: Não existem notas validas neste xml, para realizar a  validação, a nota deve conter o elemento NFe.';
    finally
		_Rejeicoes.Free;
    _AcumladorRejeicoes.Free;
		_Handles.Free;
		_output.free;
	end;
end.
