Como vc resolveu os niveis, tag det, impostos, etc?
Desenvolvi tudo em delphi...
Não sei se ajuda, mas de qualquer forma segue abaixo:
var
NodeInfNfe,NodeIde,NodEmi,NodeEnderEmit,NodeCobr,NodeDup: IXMLNode;
vXMLDoc: TXMLDocument;
sIDForn: String;
begin
//-- abre arquivo xml
FComercio.OpenDialog1.DefaultExt := 'xml';
FComercio.OpenDialog1.Filter := 'Documentos XML (*.xml)|*.xml';
FComercio.OpenDialog1.InitialDir := '%USERPROFILE%\Desktop\';
FComercio.OpenDialog1.Execute;
if empty( FComercio.OpenDialog1.FileName ) then Abort;
try
//-- cria componente
vXMLDoc := TXMLDocument.Create(Self);
//-- atribui arquivo ao componente
vXMLDoc.LoadFromFile(FComercio.OpenDialog1.FileName);
//-- começa a ler o arquivo xml
NodeInfNfe := vXMLDoc.DocumentElement.childNodes.First.ChildNodes.FindNode('infNFe');
//-- pega valores da ide da nfe
NodeIde := NodeInfNfe.ChildNodes.FindNode('ide');
NodeIde.ChildNodes.First;
//-- pega dados do emitente
NodEmi := NodeInfNfe.ChildNodes.FindNode('emit');
NodEmi.ChildNodes.First;
//-- pega endereco emitente
NodeEnderEmit := NodEmi.ChildNodes.FindNode('enderEmit');
NodeEnderEmit.ChildNodes.First;
if sn('Confirma inclusão da NF-e no Contas a Pagar?') = 'N' then Abort;
//-- pega valores de cobrança
NodeCobr := NodeInfNfe.ChildNodes.FindNode('cobr');
NodeCobr.ChildNodes.First;
//-- pega duplicata
NodeDup := NodeCobr.ChildNodes['dup'];
NodeDup.ChildNodes.First;
//-- consulta o fornecedor
with QConsForn do
begin
Close;
SQL.Clear;
SQL.Add(' SELECT idfornecedor,nome,cgc ');
SQL.Add(' FROM fornecedores ');
SQL.Add(' WHERE cgc = '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text)));
Open;
end;
sIDForn := QConsFornIDFornecedor.AsString;
if empty( QConsFornCGC.AsString ) then
begin
//-- inclui fornecedor
Alert('Atenção... Fornecedor não Cadastrado!','!');
if sn('Cadastrar Fornecedor?') = 'N' then Abort;
{ implementado nesse caso em 25.07.2012 }
AbreParametros;
//-- salva número do fornecedor em parametros
dm.TBParametros.Edit;
dm.TBParametrosCodFornecedor.AsInteger := ( dm.TBParametrosCodFornecedor.AsInteger + 1 );
dm.TBParametros.Post;
//-- busca estado
with CQUF do
begin
Close;
SQL.Clear;
SQL.Add(' SELECT iduf,sigla ');
SQL.Add(' FROM estados ');
SQL.Add(' WHERE sigla = '+QuotedStr(NodeEnderEmit.ChildNodes['UF'].Text));
Open;
end;
//-- insere dados coletados do xml
with dm.qpadrao do
begin
Close;
SQL.Clear;
SQL.Add(' INSERT INTO fornecedores (idfornecedor,tipofornecedor, ');
SQL.Add(' nome,endereco,cep,cidade,cgc,ie,telefone,uf,datainicial, ');
SQL.Add(' bairro,nomefantasia,codmunnfe,numero) ');
SQL.Add(' VALUES ('+aspas(Colzers(dm.TBParametrosCodFornecedor.AsString,5)));
SQL.Add(' ,'+aspas('1')+', '+aspas(UPPERCASE(onlycharscomespaco(semacento(NodEmi.ChildNodes['xNome'].Text))))+', ');
SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xLgr'].Text))+', ');
SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['CEP'].Text)+', ');
SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xMun'].Text))+', ');
SQL.Add(' '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text))+', ');
SQL.Add(' '+aspas(NodEmi.ChildNodes['IE'].Text)+', ');
SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['fone'].Text)+', ');
SQL.Add(' '+aspas(CQUFiduf.AsString)+', ');
SQL.Add(' CURRENT_DATE, ');
SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xBairro'].Text))+', ');
SQL.Add(' '+aspas(UPPERCASE(onlycharscomespaco(semacento(NodEmi.ChildNodes['xFant'].Text))))+', ');
SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['cMun'].Text)+', ');
SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['nro'].Text)+' ) ');
ExecSQL;
ApplyUpdates;
end;
{ abre cadastro de fornecedores }
FCadFornecedores := (TestaForm(TFCadFornecedores,Self) as TFCadFornecedores);
FComercio.FechaCad := True;
//-- tratar erro na atualização das querys
DSContasPagar.Enabled := False;
//-- edita
FCadFornecedores.BitBtn2Click(Sender);
//-- trava a procedure até cadastrar o fornecedor
while ( FComercio.FechaCad = True ) do
begin
Application.ProcessMessages;
end;
end;
//-- consulta o fornecedor
with QConsForn do
begin
Close;
SQL.Clear;
SQL.Add(' SELECT idfornecedor,nome,cgc ');
SQL.Add(' FROM fornecedores ');
SQL.Add(' WHERE cgc = '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text)));
Open;
end;
sIDForn := QConsFornIDFornecedor.AsString;
//-- loop p/ pegar duplicatas
repeat
//-- começa inclusão
QContasPagar.Append;
QContasPagarNumeroDocumento.Value := NodeDup.ChildNodes['nDup'].Text;
QContasPagarTipo.Value := '1';
QContasPagarNotaFiscal.Value := NodeIde.ChildNodes['nNF'].Text;
QContasPagarFornecedor.Value := sIDForn;
QContasPagarDocumentoOriginal.Value := NodeDup.ChildNodes['nDup'].Text;
QContasPagarEmissao.AsString := AcertaData(NodeIde.ChildNodes['dEmi'].Text);
if empty(bancoXML) then
begin
//-- atribui qual tela
FComercio.IdentTela := 4;
//-- procura banco
FProcuraBanco := (TestaForm(TFProcuraBanco,Self) as TFProcuraBanco);
FComercio.FechaCad := True;
//-- trava a procedure até cadastrar o fornecedor
while FComercio.FechaCad = True do
begin
Application.ProcessMessages;
end;
end;
QContasPagarBancoCobranca.Value := bancoXML;
QContasPagarValorDuplicata.AsString := PontoPorVirgula(NodeDup.ChildNodes['vDup'].Text);
QContasPagarDataVencimento.AsString := AcertaData(NodeDup.ChildNodes['dVenc'].Text);
QContasPagarDigitacao.Value := (now);
QContasPagarUsuario.Value := FComercio.XUsuario.Text;
QContasPagarOrigem.Value := 'XML';
QContasPagarValorOriginal.AsString := PontoPorVirgula(NodeDup.ChildNodes['vDup'].Text);
QContasPagar.Post;
//-- vai p/ próxima duplicata
NodeDup := NodeDup.NextSibling;
//-- até zerar
until NodeDup = nil;
{ qualquer erro na importação, retorna (31.07.2012) }
except
Alert('Erro no XML, não foi possível fazer a importação!','!');
Abort;
end;
DSContasPagar.Enabled := True;
//-- atualiza form
Self.FormShow(Sender);