Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 2183 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Configurei o ACBrNFSe_Exemplo para emitir NFSe no provedor DSF (em particular a prefeitura de Uberlândia), no início os testes foram OK, mas quando consegui começar a emitir lotes de teste começou a aparecer um problema na validação de um XSD.

A mensagem de erro que aparece é essa:

image.png.a63024ec6ab8dc8e3c42a0d4b81f66e2.png

Comecei a depurar e cheguei na unit ACBrDFeXsMsXml, mais precisamente na função TDFeSSLXmlSignMsXml.Validar:

function TDFeSSLXmlSignMsXml.Validar(const ConteudoXML, ArqSchema: String; out MsgErro: String): Boolean;
var
  DOMDocument: IXMLDOMDocument2;
  ParseError: IXMLDOMParseError;
  Schema: XMLSchemaCache50;
  AXml: String;
  ResultInitialize: HRESULT;
  Inicializado: Boolean;
begin
  Result := False;
  ResultInitialize := CoInitialize(nil);
  if (ResultInitialize = E_FAIL) then
    raise EACBrDFeException.Create('Erro ao inicializar biblioteca COM');

  Inicializado := (ResultInitialize in [ S_OK, S_FALSE ]);
  try
    DOMDocument := CoDOMDocument50.Create;
    Schema := CoXMLSchemaCache50.Create;
    try
      DOMDocument.async := False;
      DOMDocument.resolveExternals := False;
      DOMDocument.validateOnParse := True;

      // Carregando ConteudoXML em XMLDOC. Nota: IXMLDOMDocument2 deve usar a String Nativa da IDE //
      {$IfDef FPC2}
       AXml := ACBrUTF8ToAnsi(ConteudoXML);
      {$Else}
       AXml := UTF8ToNativeString(ConteudoXML);
      {$EndIf}

      if (not DOMDocument.loadXML(WideString(AXml))) then
      begin
        ParseError := DOMDocument.parseError;
        MsgErro := ACBrStr('Não foi possível carregar o arquivo.')+sLineBreak+
                   'Err: '+IntToStr(ParseError.errorCode) + ', ' +
                   'Lin: '+IntToStr(ParseError.line) + ', ' +
                   'Pos: '+IntToStr(ParseError.linepos) + ' - ' +
                   String(ParseError.reason);
        exit;
      end;

      Schema.add(WideString(FpDFeSSL.NameSpaceURI), ArqSchema); <<<--- CHAMADA QUE GERA A EXCEÇÃO

      DOMDocument.schemas := Schema;
      ParseError := DOMDocument.validate;

      Result := (ParseError.errorCode = 0);
      MsgErro := String(ParseError.reason);
    finally
      ParseError := nil;
      DOMDocument := nil;
      Schema := nil;
    end;
  finally
    if Inicializado then
      CoUninitialize;
  end;
end;

No momento em que o depurador passa a linha "Schema.add(WideString(FpDFeSSL.NameSpaceURI), ArqSchema);" o delphi lança uma  "excepiton".

O valor das variáveis são os seguintes:

FpDFeSSL.NameSpaceURI := 'http://localhost:8080/WsNFe2/lote'

ArqSchema := 'D:\Install\Componentes\ACBr\Exemplos\ACBrDFe\ACBrNFSe\Delphi\ReqEnvioLoteRPS.xsd'

O conteúdo de ReqEnvioLoteRPS.xsd é:

<xs:schema xmlns:tipos="http://localhost:8080/WsNFe2/tp"
	xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
	xmlns:ns1="http://localhost:8080/WsNFe2/lote" targetNamespace="http://localhost:8080/WsNFe2/lote">
	<xs:import namespace="http://localhost:8080/WsNFe2/tp"
		schemaLocation="Tipos.xsd" />
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
		schemaLocation="xmldsig-core-schema_v1.01.xsd" />
	<xs:element name="ReqEnvioLoteRPS">
		<xs:annotation>
			<xs:documentation>Schema utilizado para envio de lote de RPS.</xs:documentation>
			<xs:documentation>Este Schema XML é utilizado pelos prestadores
				de serviços para substituição em lote de RPS por NFS-e.
			</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="Cabecalho">
					<xs:annotation>
						<xs:documentation>Cabeçalho do Lote.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="CodCidade" type="tipos:tpCodCidade" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Informe o Codigo da Cidade no Padrão SIAFI.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="CPFCNPJRemetente" type="tipos:tpCPFCNPJ" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										CNPJ do contribuinte ou CPF do Responsável Legal autorizado a entregar o lote.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="RazaoSocialRemetente" type="tipos:tpRazaoSocial" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o Nome do Contribuinte ou do Responsável Legal
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="transacao" type="xs:boolean"
								default="true" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe se os RPS a serem
										substituídos por
										NF-e farão
										parte de uma mesma transação.
										True - Os RPS só serão
										substituídos por NF-e se não
										ocorrer nenhum evento de erro
										durante o processamento de todo
										o lote; False - Os RPS válidos
										serão substituídos por NF-e,
										mesmo que ocorram eventos de
										erro durante processamento de
										outros RPS deste lote. Por definição
										estão sendo aceitos apenas lotes com RPS válidos,
										o lote é
										recusado caso haja algum RPS inválido.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="dtInicio" type="xs:date" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a data de início do
										período
										transmitido
										(AAAA-MM-DD).
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="dtFim" type="xs:date" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a data final do período
										transmitido
										(AAAA-MM-DD).
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="QtdRPS" type="tipos:tpQtdRpsLote" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o total de RPS contidos
										na mensagem
										XML. OBS: O xml não pode ultrapassar o tamanho maximo de 500kb.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="ValorTotalServicos" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o valor total dos
										serviços prestados
										dos RPS
										contidos na mensagem XML.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="ValorTotalDeducoes" type="tipos:tpValor" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe o valor total das
										deduções dos RPS
										contidos na
										mensagem XML.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="Versao" type="tipos:tpVersao" fixed="1" minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>
										Informe a Versão do Schema XML
										utilizado.
									</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="MetodoEnvio" type="tipos:tpMetodoEnvio"
								minOccurs="1" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Informe o Método de Envio</xs:documentation>
								</xs:annotation>
							</xs:element>
							<xs:element name="VersaoComponente" type="tipos:tpVersaoComponente"
								minOccurs="0" maxOccurs="1">
								<xs:annotation>
									<xs:documentation>Versão da DLL de envio de lote. Não é necessário informar esse campo caso não utilize a DLL.
									</xs:documentation>
								</xs:annotation>
							</xs:element>

						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="Lote" type="tipos:tpLote" minOccurs="1" maxOccurs="1">
					<xs:annotation>
						<xs:documentation>Informe os RPS a serem substituidos por
							NF-e.</xs:documentation>
					</xs:annotation>
				</xs:element>
				<xs:element ref="ds:Signature" minOccurs="0" maxOccurs="1" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

A exceção é gerada devido ao sistema encontrar um tipo não declarado, mas pelo que eu vejo no XSD me parece correto. O que pode estar acontecendo?

Descobrimos o problema, no diretório raiz do exemplo faltou dois XSD que estavam em um subdiretório, e isso gerou o erro. Corrigimos colocando todos no mesmo diretório raiz do exemplo.

Vlw galera!

  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora ACBr Pro

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

  • Este tópico foi criado há 2183 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...