{ *******************************************************************************
Title: T2Ti ERP
Description: Janela Para Entrada de Nota Fiscal

The MIT License

Copyright: Copyright (C) 2016 T2Ti.COM

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

The author may be contacted at:
t2ti.com@gmail.com

@author Albert Eije (alberteije@gmail.com)
@version 2.0
******************************************************************************* }
unit UEntradaNF;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UTelaCadastro, Menus, StdCtrls, ExtCtrls, Buttons, Grids, DBGrids,
  JvExDBGrids, JvDBGrid, JvDBUltimGrid, ComCtrls, Atributos, Constantes,
  ActnList, RibbonSilverStyleActnCtrls, ActnMan, JvExStdCtrls, JvEdit,
  JvValidateEdit, JvCombobox, Mask, JvExMask, JvToolEdit, ToolWin, pcnNFeRTXT,
  ActnCtrls, Generics.Collections, ACBrDFeUtil, pcnConversao, pcnConversaoNFe, StrUtils,
  LabeledCtrls, DB, DBClient, JvBaseEdits, NfeConfiguracaoController, NfeConfiguracaoVO,
  JvExExtCtrls, JvNetscapeSplitter, System.Actions, Controller;

type
  [TFormDescription(TConstantes.MODULO_ESTOQUE, 'Entrada de Nota Fiscal')]

  TFEntradaNF = class(TFTelaCadastro)
    ActionManager: TActionManager;
    ActionSelecionarArquivo: TAction;
    ScrollBox: TScrollBox;
    BevelEdits: TBevel;
    ActionToolBarEdits: TActionToolBar;
    PageControlEdits: TPageControl;
    TabSheetDadosNotaFiscal: TTabSheet;
    PanelDadosNotaFiscal: TPanel;
    EditNumeroNfe: TLabeledEdit;
    EditSerie: TLabeledEdit;
    EditNaturezaOperacao: TLabeledEdit;
    GroupBoxEmitente: TGroupBox;
    EditEmitenteCpfCnpj: TLabeledEdit;
    EditEmitenteFantasia: TLabeledEdit;
    EditEmitenteIE: TLabeledEdit;
    EditEmitenteTelefone: TLabeledEdit;
    EditEmitenteLogradouro: TLabeledEdit;
    EditEmitenteNumero: TLabeledEdit;
    EditEmitenteBairro: TLabeledEdit;
    EditEmitenteCEP: TLabeledEdit;
    EditEmitenteCidade: TLabeledEdit;
    EditEmitenteUF: TLabeledEdit;
    EditEmitenteComplemento: TLabeledEdit;
    EditEmitenteRazao: TLabeledEdit;
    EditEmitenteEmail: TLabeledEdit;
    EditEmitenteTipo: TLabeledEdit;
    TabSheetDocumentosReferenciados: TTabSheet;
    TabSheetEntregaRetirada: TTabSheet;
    PanelEntregaRetirada: TPanel;
    GroupBoxEntrega: TGroupBox;
    EditEntregaCpfCnpj: TLabeledEdit;
    EditEntregaLogradouro: TLabeledEdit;
    EditEntregaNumero: TLabeledEdit;
    EditEntregaBairro: TLabeledEdit;
    EditEntregaCidade: TLabeledEdit;
    EditEntregaUf: TLabeledEdit;
    EditEntregaComplemento: TLabeledEdit;
    GroupBoxRetirada: TGroupBox;
    EditRetiradaCpfCnpj: TLabeledEdit;
    EditRetiradaLogradouro: TLabeledEdit;
    EditRetiradaNumero: TLabeledEdit;
    EditRetiradaBairro: TLabeledEdit;
    EditRetiradaCidade: TLabeledEdit;
    EditRetiradaUf: TLabeledEdit;
    EditRetiradaComplemento: TLabeledEdit;
    TabSheetProdutos: TTabSheet;
    PanelDetalhes: TPanel;
    GridItens: TJvDBUltimGrid;
    TabSheetTransporte: TTabSheet;
    PanelTransporte: TPanel;
    GroupBoxTransportador: TGroupBox;
    EditTransportadorCpfCnpj: TLabeledEdit;
    EditTransportadorIE: TLabeledEdit;
    EditTransportadorLogradouro: TLabeledEdit;
    EditTransportadorCidade: TLabeledEdit;
    EditTransportadorUF: TLabeledEdit;
    EditTransportadorRazaoSocial: TLabeledEdit;
    GroupBoxTransporteRetencaoICMS: TGroupBox;
    EditRetencaoIcmsUf: TLabeledEdit;
    GroupBoxVeiculo: TGroupBox;
    EditVeiculoRntc: TLabeledEdit;
    EditVeiculoPlaca: TLabeledEdit;
    EditVeiculoUf: TLabeledEdit;
    GroupBoxReboque: TGroupBox;
    GroupBoxVolumes: TGroupBox;
    TabSheetInformacoesAdicionais: TTabSheet;
    TabSheetCobranca: TTabSheet;
    PanelCobranca: TPanel;
    PanelFatura: TPanel;
    GroupBoxFatura: TGroupBox;
    EditFaturaNumero: TLabeledEdit;
    EditDataEmissao: TLabeledDateEdit;
    EditDataEntradaSaida: TLabeledDateEdit;
    EditHoraEntradaSaida: TLabeledMaskEdit;
    ComboTipoOperacao: TLabeledComboBox;
    ComboTipoEmissao: TLabeledComboBox;
    ComboFinalidadeEmissao: TLabeledComboBox;
    ComboFormaImpDanfe: TLabeledComboBox;
    ComboBoxFormaPagamento: TLabeledComboBox;
    EditChaveAcesso: TLabeledEdit;
    ComboModalidadeFrete: TLabeledComboBox;
    ComboEmitenteCrt: TLabeledComboBox;
    GroupBox1: TGroupBox;
    GridDuplicatas: TJvDBUltimGrid;
    EditFaturaValorOriginal: TLabeledCalcEdit;
    EditFaturaValorDesconto: TLabeledCalcEdit;
    EditFaturaValorLiquido: TLabeledCalcEdit;
    GridReboque: TJvDBUltimGrid;
    GridVolumes: TJvDBUltimGrid;
    EditCodigoNumerico: TLabeledEdit;
    EditDigitoChaveAcesso: TLabeledEdit;
    EditEntregaIbge: TLabeledCalcEdit;
    EditRetiradaIbge: TLabeledCalcEdit;
    EditRetencaoIcmsBaseCalculo: TLabeledCalcEdit;
    EditRetencaoIcmsAliquota: TLabeledCalcEdit;
    EditRetencaoIcmsValorServico: TLabeledCalcEdit;
    EditRetencaoIcmsIcmsRetido: TLabeledCalcEdit;
    EditRetencaoIcmsCidade: TLabeledCalcEdit;
    PageControlReferenciado: TPageControl;
    TabSheetReferenciadoNfe: TTabSheet;
    TabSheetReferenciadoNf: TTabSheet;
    TabSheetReferenciadoCte: TTabSheet;
    TabSheetReferenciadoRural: TTabSheet;
    TabSheetReferenciadoCupom: TTabSheet;
    GridNfeReferenciada: TJvDBUltimGrid;
    GridNfReferenciada: TJvDBUltimGrid;
    GridCteReferenciado: TJvDBUltimGrid;
    GridNfRuralReferenciada: TJvDBUltimGrid;
    GridCupomReferenciado: TJvDBUltimGrid;
    EditEmitenteId: TLabeledCalcEdit;
    EditTransportadorId: TLabeledCalcEdit;
    EditTransporteVagao: TLabeledEdit;
    EditTransporteBalsa: TLabeledEdit;
    EditRetencaoIcmsCfop: TLabeledCalcEdit;
    ComboboxModeloNotaFiscal: TLabeledComboBox;
    PageControlTotais: TPageControl;
    tsTotaisGeral: TTabSheet;
    PanelTotais: TPanel;
    EditBCIcms: TLabeledCalcEdit;
    EditValorIcms: TLabeledCalcEdit;
    EditBCIcmsSt: TLabeledCalcEdit;
    EditValorIcmsSt: TLabeledCalcEdit;
    EditValorCOFINS: TLabeledCalcEdit;
    EditValorIPI: TLabeledCalcEdit;
    EditTotalProdutos: TLabeledCalcEdit;
    EditTotalImpostoImportacao: TLabeledCalcEdit;
    EditValorTotalNota: TLabeledCalcEdit;
    EditValorFrete: TLabeledCalcEdit;
    EditValorSeguro: TLabeledCalcEdit;
    EditValorOutrasDespesas: TLabeledCalcEdit;
    EditValorPIS: TLabeledCalcEdit;
    EditValorDesconto: TLabeledCalcEdit;
    tsOutrosTotais: TTabSheet;
    PanelOutrosTotais: TPanel;
    EditBaseCalculoIssqn: TLabeledCalcEdit;
    EditValorIssqn: TLabeledCalcEdit;
    EditValorPisIssqn: TLabeledCalcEdit;
    EditValorCofinsIssqn: TLabeledCalcEdit;
    EditValorRetidoPis: TLabeledCalcEdit;
    EditValorRetidoCofins: TLabeledCalcEdit;
    EditValorRetidoCsll: TLabeledCalcEdit;
    EditValorTotalServicos: TLabeledCalcEdit;
    EditBaseCalculoIrrf: TLabeledCalcEdit;
    EditValorRetidoIrrf: TLabeledCalcEdit;
    EditBaseCalculoPrevidencia: TLabeledCalcEdit;
    EditValorRetidoPrevidencia: TLabeledCalcEdit;
    PanelInformacoesAdicionais: TPanel;
    MemoInfComplementarFisco: TLabeledMemo;
    MemoInfComplementarContribuinte: TLabeledMemo;
    GroupBox2: TGroupBox;
    EditComexLocalEmbarque: TLabeledEdit;
    EditComexUfEmbarque: TLabeledEdit;
    GroupBox3: TGroupBox;
    EditCompraPedido: TLabeledEdit;
    EditCompraNotaEmpenho: TLabeledEdit;
    EditCompraContrato: TLabeledEdit;
    EditEmitenteIEST: TLabeledEdit;
    EditEmitenteIM: TLabeledEdit;
    EditEmitenteCnae: TLabeledEdit;
    ActionToolBar1: TActionToolBar;
    ActionCadastrarProduto: TAction;
    PanelDetalhesAnexo: TPanel;
    JvNetscapeSplitter1: TJvNetscapeSplitter;
    GroupBoxLacres: TGroupBox;
    GridVolumesLacres: TJvDBUltimGrid;
    ActionIncluirItem: TAction;
    ActionExcluirItem: TAction;
    ActionExcluirDocumentosReferenciados: TAction;
    ActionToolBar2: TActionToolBar;
    ActionToolBar3: TActionToolBar;
    ActionExcluirEntregaRetirada: TAction;
    ActionToolBar4: TActionToolBar;
    ActionExcluirTransporte: TAction;
    ActionToolBar5: TActionToolBar;
    ActionExcluirCobranca: TAction;
    EditEmitenteCodigoIbge: TLabeledEdit;
    EditIdEmpresa: TLabeledCalcEdit;
    EditEmpresa: TLabeledEdit;
    procedure ActionSelecionarArquivoExecute(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure GridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure GridItensDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure ActionCadastrarProdutoExecute(Sender: TObject);
    procedure ActionIncluirItemExecute(Sender: TObject);
    procedure ActionExcluirItemExecute(Sender: TObject);
    procedure ActionExcluirDocumentosReferenciadosExecute(Sender: TObject);
    procedure ActionExcluirEntregaRetiradaExecute(Sender: TObject);
    procedure ActionExcluirTransporteExecute(Sender: TObject);
    procedure ActionExcluirCobrancaExecute(Sender: TObject);
    procedure EditEmitenteIdKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EditTransportadorIdKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EditIdEmpresaKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
    procedure ConfiguraNFe;
    procedure CarregarDadosXML;
    function VerificarProdutosCadatrados: Boolean;
    procedure LimparCamposEmitente;
    procedure LimparCamposTransportadora;
    procedure ExcluirDadosReferenciados;
    procedure ExcluirDadosEntregaRetirada;
    procedure ExcluirDadosTransporte;
    procedure ExcluirDadosCobranca;
  public
    { Public declarations }
    procedure GridParaEdits; override;
    procedure LimparCampos; override;
    procedure ControlaBotoes; override;
    procedure ControlaPopupMenu; override;

    // Controles CRUD
    function DoInserir: Boolean; override;
    function DoEditar: Boolean; override;
    function DoExcluir: Boolean; override;
    function DoSalvar: Boolean; override;

    procedure ConfiguraLayoutTela;
  end;

var
  FEntradaNF: TFEntradaNF;
  ObjetoNfeConfiguracaoVO: TNfeConfiguracaoVO;
  SeqItem: Integer;

implementation

uses Biblioteca, UDataModuleNFe, UDataModule, ULookup, NfeCabecalhoController,
  EmpresaController, NfeCabecalhoVO,
  NfeReferenciadaVO, NfeEmitenteVO, NfeLocalEntregaVO, NfeLocalRetiradaVO,
  NfeTransporteVO, NfeFaturaVO, NfeDuplicataVO, NfeDetalheVO, ProdutoLoteVO,
  NfeCupomFiscalReferenciadoVO, NfeDetalheImpostoCofinsVO, NfeDetalheImpostoIcmsVO,
  NfeDetalheImpostoPisVO, NfeDetalheImpostoIiVO, NfeDetalheImpostoIssqnVO,
  NfeDetalheImpostoIpiVO, NfeDeclaracaoImportacaoVO, NfeImportacaoDetalheVO,
  NfeDetEspecificoVeiculoVO, NfeDetEspecificoCombustivelVO, NfeDetEspecificoMedicamentoVO,
  NfeDetEspecificoArmamentoVO, NfeNfReferenciadaVO, NfeCteReferenciadoVO,
  NfeProdRuralReferenciadaVO, NfeTransporteReboqueVO, NfeTransporteVolumeVO,
  ViewPessoaFornecedorVO, ViewPessoaFornecedorController, NfeTransporteVolumeLacreVO,
  ViewPessoaTransportadoraVO, ViewPessoaTransportadoraController,
  ProdutoVO, ProdutoController, UNfeDetalheAnexo, UProduto, EmpresaVO;
{$R *.dfm}
{ TFEntradaNF }

{$REGION 'Infra'}
procedure TFEntradaNF.FormCreate(Sender: TObject);
begin
  ClasseObjetoGridVO := TNfeCabecalhoVO;
  ObjetoController := TNfeCabecalhoController.Create;
  inherited;

  FNFeDetalheAnexo := TFNFeDetalheAnexo.Create(PanelDetalhesAnexo);
  with FNFeDetalheAnexo do
  begin
    Align := alClient;
    BorderStyle := bsNone;
    Parent := PanelDetalhesAnexo;
  end;
  FNFeDetalheAnexo.Show;

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeDetalheArmamento, TNfeDetEspecificoArmamentoVO);
  ConfiguraGridFromVO(FNFeDetalheAnexo.GridDetalheArmamento, TNfeDetEspecificoArmamentoVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeDetalheMedicamento, TNfeDetEspecificoMedicamentoVO);
  ConfiguraGridFromVO(FNFeDetalheAnexo.GridDetalheMedicamento, TNfeDetEspecificoMedicamentoVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeDeclaracaoImportacao, TNfeDeclaracaoImportacaoVO);
  ConfiguraGridFromVO(FNFeDetalheAnexo.GridDeclaracaoImportacao, TNfeDeclaracaoImportacaoVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeImportacaoDetalhe, TNfeImportacaoDetalheVO);
  ConfiguraGridFromVO(FNFeDetalheAnexo.GridDeclaracaoImportacaoDetalhe, TNfeImportacaoDetalheVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfReferenciada, TNfeNfReferenciadaVO);
  ConfiguraGridFromVO(GridNfReferenciada, TNfeNfReferenciadaVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSCteReferenciado, TNfeCteReferenciadoVO);
  ConfiguraGridFromVO(GridCteReferenciado, TNfeCteReferenciadoVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfRuralReferenciada, TNfeProdRuralReferenciadaVO);
  ConfiguraGridFromVO(GridNfRuralReferenciada, TNfeProdRuralReferenciadaVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSCupomReferenciado, TNfeCupomFiscalReferenciadoVO);
  ConfiguraGridFromVO(GridCupomReferenciado, TNfeCupomFiscalReferenciadoVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeReferenciada, TNfeReferenciadaVO);
  ConfiguraGridFromVO(GridNfeReferenciada, TNfeReferenciadaVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSNfeDetalhe, TNfeDetalheVO);
  ConfiguraGridFromVO(GridItens, TNfeDetalheVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSVolumes, TNfeTransporteVolumeVO);
  ConfiguraGridFromVO(GridVolumes, TNfeTransporteVolumeVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSDuplicata, TNfeDuplicataVO);
  ConfiguraGridFromVO(GridDuplicatas, TNfeDuplicataVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSReboque, TNfeTransporteReboqueVO);
  ConfiguraGridFromVO(GridReboque, TNfeTransporteReboqueVO);

  ConfiguraCDSFromVO(FDataModuleNfe.CDSVolumesLacres, TNfeTransporteVolumeLacreVO);
  ConfiguraGridFromVO(GridVolumesLacres, TNfeTransporteVolumeLacreVO);

  ObjetoNfeConfiguracaoVO := TNfeConfiguracaoVO(TController.BuscarObjeto('NfeConfiguracaoController.TNfeConfiguracaoController', 'ConsultaObjeto', ['ID=1'], 'GET'));

  FiltroComplementar := ' and TIPO_OPERACAO = 0';
end;

procedure TFEntradaNF.LimparCampos;
begin
  inherited;
  SeqItem := 0;
  FDataModuleNFe.CDSNfeDetalhe.EmptyDataSet;
  FDataModuleNFe.CDSNfeReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSCupomReferenciado.EmptyDataSet;
  FDataModuleNFe.CDSNfeDeclaracaoImportacao.EmptyDataSet;
  FDataModuleNFe.CDSNfeImportacaoDetalhe.EmptyDataSet;
  FDataModuleNFe.CDSNfRuralReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSCteReferenciado.EmptyDataSet;
  FDataModuleNFe.CDSDuplicata.EmptyDataSet;
  FDataModuleNFe.CDSNfeDetalheVeiculo.EmptyDataSet;
  FDataModuleNFe.CDSNfeDetalheArmamento.EmptyDataSet;
  FDataModuleNFe.CDSVolumes.EmptyDataSet;
  FDataModuleNFe.CDSNfReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSReboque.EmptyDataSet;
  FDataModuleNFe.CDSNfeDetalheCombustivel.EmptyDataSet;
  FDataModuleNFe.CDSNfeDetalheMedicamento.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoCofins.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoIcms.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoImportacao.EmptyDataSet;
  FDataModuleNFe.CDSVolumesLacres.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoIpi.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoIssqn.EmptyDataSet;
  FDataModuleNFe.CDSNfeImpostoPis.EmptyDataSet;
  ConfiguraLayoutTela;
end;

procedure TFEntradaNF.LimparCamposEmitente;
begin
  EditEmitenteCpfCnpj.Clear;
  EditEmitenteRazao.Clear;
  EditEmitenteFantasia.Clear;
  EditEmitenteLogradouro.Clear;
  EditEmitenteNumero.Clear;
  EditEmitenteComplemento.Clear;
  EditEmitenteBairro.Clear;
  EditEmitenteCodigoIbge.Clear;
  EditEmitenteCidade.Clear;
  EditEmitenteUF.Clear;
  EditEmitenteCEP.Clear;
  EditEmitenteTelefone.Clear;
  EditEmitenteIE.Clear;
  EditEmitenteIEST.Clear;
  EditEmitenteIM.Clear;;
  EditEmitenteCnae.Clear;
  EditEmitenteEmail.Clear;
end;

procedure TFEntradaNF.LimparCamposTransportadora;
begin
  EditTransportadorCpfCnpj.Clear;
  EditTransportadorRazaoSocial.Clear;
  EditTransportadorIE.Clear;
  EditTransportadorLogradouro.Clear;
  EditTransportadorCidade.Clear;
  EditTransportadorUF.Clear;
end;

procedure TFEntradaNF.ConfiguraLayoutTela;
begin
  PageControlEdits.ActivePageIndex := 0;
end;

procedure TFEntradaNF.ConfiguraNFe;
begin
  if ObjetoNfeConfiguracaoVO.SalvarXml = 'S' then
    FDataModule.ACBrNFe.Configuracoes.Geral.Salvar := True
  else
    FDataModule.ACBrNFe.Configuracoes.Geral.Salvar := False;

  FDataModule.ACBrNFe.Configuracoes.WebServices.Uf := ObjetoNfeConfiguracaoVO.WebserviceUf;

  if ObjetoNfeConfiguracaoVO.WebserviceAmbiente = 1 then
    FDataModule.ACBrNFe.Configuracoes.WebServices.Ambiente := taProducao
  else
    FDataModule.ACBrNFe.Configuracoes.WebServices.Ambiente := taHomologacao;

  if ObjetoNfeConfiguracaoVO.WebserviceVisualizar = 'S' then
    FDataModule.ACBrNFe.Configuracoes.WebServices.Visualizar := True
  else
    FDataModule.ACBrNFe.Configuracoes.WebServices.Visualizar := False;

  FDataModule.ACBrNFe.Configuracoes.Arquivos.PathSalvar := ObjetoNfeConfiguracaoVO.CaminhoSalvarXml;
  FDataModule.ACBrNFe.Configuracoes.Arquivos.PathSchemas := ObjetoNfeConfiguracaoVO.CaminhoSchemas;
  FDataModule.ACBrNFeDanfeFR.FastFile := ObjetoNfeConfiguracaoVO.CaminhoArquivoDanfe;
  FDataModule.ACBrNFeDanfeFR.PathPDF := ObjetoNfeConfiguracaoVO.CaminhoSalvarPdf;
end;

procedure TFEntradaNF.ControlaBotoes;
begin
  inherited;
  BotaoImprimir.Visible := False;
end;

procedure TFEntradaNF.ControlaPopupMenu;
begin
  inherited;
  menuImprimir.Visible := False;
end;
{$ENDREGION}

{$REGION 'Controles CRUD'}
function TFEntradaNF.DoInserir: Boolean;
begin
  Result := inherited DoInserir;

  if Result then
  begin
    ConfiguraNFe;
    EditIdEmpresa.AsInteger := Sessao.Empresa.Id;
    EditEmpresa.Text := Sessao.Empresa.RazaoSocial;
    ComboboxModeloNotaFiscal.SetFocus;
    ActionSelecionarArquivo.Enabled := True;
  end;
end;

function TFEntradaNF.DoEditar: Boolean;
begin
  Result := inherited DoEditar;

  if Result then
  begin
    ConfiguraNFe;
    SeqItem := FDataModuleNFe.CDSNfeDetalhe.RecordCount;
    ComboboxModeloNotaFiscal.SetFocus;
  end;
end;

function TFEntradaNF.DoExcluir: Boolean;
begin
  if inherited DoExcluir then
  begin
    try
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'Exclui', [IdRegistroSelecionado], 'DELETE', 'Boolean');
      Result := TController.RetornoBoolean;
    except
      Result := False;
    end;
  end
  else
  begin
    Result := False;
  end;

  if Result then
    TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'Consulta', [Trim(Filtro), Pagina.ToString, False], 'GET', 'Lista');
end;

function TFEntradaNF.DoSalvar: Boolean;
var
  NfeDetalhe: TNfeDetalheVO;
  NfeDeclaracaoImportacao: TNfeDeclaracaoImportacaoVO;
  NfeImportacaoDetalhe: TNfeImportacaoDetalheVO;
  NfeDetalheMedicamento: TNfeDetEspecificoMedicamentoVO;
  NfeDetalheArmamento: TNfeDetEspecificoArmamentoVO;
begin
  if ComboboxModeloNotaFiscal.ItemIndex = 1 then
  begin
    if (Trim(EditNumeroNfe.Text) = '') or (Trim(EditChaveAcesso.Text) = '') then
    begin
      Application.MessageBox('Número da nota ou chave de acesso não podem ficar em branco.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
      Exit(False);
    end;
  end;

  if not VerificarProdutosCadatrados then
  begin
    Application.MessageBox('Existem produtos não cadastrados.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
    Exit(False);
  end;

  Result := inherited DoSalvar;

  if Result then
  begin
    try
      if not Assigned(ObjetoVO) then
        ObjetoVO := TNfeCabecalhoVO.Create;

      TNfeCabecalhoVO(ObjetoVO).EmpresaVO := TEmpresaVO(TController.BuscarObjeto('EmpresaController.TEmpresaController', 'ConsultaObjeto', ['ID=' + EditIdEmpresa.Text], 'GET'));;
      TNfeCabecalhoVO(ObjetoVO).IdEmpresa := TNfeCabecalhoVO(ObjetoVO).EmpresaVO.Id;

      TNfeCabecalhoVO(ObjetoVO).IdFornecedor := EditEmitenteId.AsInteger;
      TNfeCabecalhoVO(ObjetoVO).UfEmitente := UFToInt(EditEmitenteUF.Text);
      TNfeCabecalhoVO(ObjetoVO).CodigoNumerico := EditCodigoNumerico.Text;
      TNfeCabecalhoVO(ObjetoVO).NaturezaOperacao := EditNaturezaOperacao.Text;
      TNfeCabecalhoVO(ObjetoVO).IndicadorFormaPagamento := ComboBoxFormaPagamento.ItemIndex;
      TNfeCabecalhoVO(ObjetoVO).CodigoModelo := Copy(ComboboxModeloNotaFiscal.Text, 1, 2);
      TNfeCabecalhoVO(ObjetoVO).Serie := EditSerie.Text;
      TNfeCabecalhoVO(ObjetoVO).Numero := EditNumeroNfe.Text;
      TNfeCabecalhoVO(ObjetoVO).DataHoraEmissao := EditDataEmissao.Date;
      TNfeCabecalhoVO(ObjetoVO).DataHoraEntradaSaida := EditDataEntradaSaida.Date;
      TNfeCabecalhoVO(ObjetoVO).TipoOperacao := ComboTipoOperacao.ItemIndex;
      if Trim(EditEmitenteCodigoIbge.Text) <> '' then
        TNfeCabecalhoVO(ObjetoVO).CodigoMunicipio := StrToInt(EditEmitenteCodigoIbge.Text);
      TNfeCabecalhoVO(ObjetoVO).FormatoImpressaoDanfe := ComboFormaImpDanfe.ItemIndex + 1;
      TNfeCabecalhoVO(ObjetoVO).TipoEmissao := ComboTipoEmissao.ItemIndex + 1;
      TNfeCabecalhoVO(ObjetoVO).ChaveAcesso := EditChaveAcesso.Text;
      TNfeCabecalhoVO(ObjetoVO).DigitoChaveAcesso := EditDigitoChaveAcesso.Text;
      TNfeCabecalhoVO(ObjetoVO).Ambiente := ObjetoNfeConfiguracaoVO.WebserviceAmbiente;
      TNfeCabecalhoVO(ObjetoVO).FinalidadeEmissao := ComboFinalidadeEmissao.ItemIndex + 1;
      TNfeCabecalhoVO(ObjetoVO).ProcessoEmissao := ObjetoNfeConfiguracaoVO.ProcessoEmissao;
      TNfeCabecalhoVO(ObjetoVO).VersaoProcessoEmissao := ObjetoNfeConfiguracaoVO.VersaoProcessoEmissao;
      TNfeCabecalhoVO(ObjetoVO).BaseCalculoIcms := EditBCIcms.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorIcms := EditValorIcms.Value;
      TNfeCabecalhoVO(ObjetoVO).BaseCalculoIcmsSt := EditBCIcmsSt.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorIcmsSt := EditValorIcmsSt.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorTotalProdutos := EditTotalProdutos.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorFrete := EditValorFrete.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorSeguro := EditValorSeguro.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorDesconto := EditValorDesconto.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorImpostoImportacao := EditTotalImpostoImportacao.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorIpi := EditValorIPI.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorPis := EditValorPIS.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorCofins := EditValorCOFINS.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorDespesasAcessorias := EditValorOutrasDespesas.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorTotal := EditValorTotalNota.Value;

      TNfeCabecalhoVO(ObjetoVO).ValorServicos := EditValorTotalServicos.Value;
      TNfeCabecalhoVO(ObjetoVO).BaseCalculoIssqn := EditBaseCalculoIssqn.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorIssqn := EditValorIssqn.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorPisIssqn := EditValorPisIssqn.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorCofinsIssqn := EditValorCofinsIssqn.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorRetidoPis := EditValorRetidoPis.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorRetidoCofins := EditValorRetidoCofins.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorRetidoCsll := EditValorRetidoCsll.Value;
      TNfeCabecalhoVO(ObjetoVO).BaseCalculoIrrf := EditBaseCalculoIrrf.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorRetidoIrrf := EditValorRetidoIrrf.Value;
      TNfeCabecalhoVO(ObjetoVO).BaseCalculoPrevidencia := EditBaseCalculoPrevidencia.Value;
      TNfeCabecalhoVO(ObjetoVO).ValorRetidoPrevidencia := EditValorRetidoPrevidencia.Value;
      TNfeCabecalhoVO(ObjetoVO).ComexUfEmbarque := EditComexUfEmbarque.Text;
      TNfeCabecalhoVO(ObjetoVO).ComexLocalEmbarque := EditComexLocalEmbarque.Text;
      TNfeCabecalhoVO(ObjetoVO).CompraNotaEmpenho := EditCompraNotaEmpenho.Text;
      TNfeCabecalhoVO(ObjetoVO).CompraPedido := EditCompraPedido.Text;
      TNfeCabecalhoVO(ObjetoVO).CompraContrato := EditCompraContrato.Text;

      TNfeCabecalhoVO(ObjetoVO).InformacoesAddFisco := MemoInfComplementarFisco.Text;
      TNfeCabecalhoVO(ObjetoVO).InformacoesAddContribuinte := MemoInfComplementarContribuinte.Text;

      if StatusTela = stEditando then
        TNfeCabecalhoVO(ObjetoVO).Id := IdRegistroSelecionado;

      { Emitente }
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.CpfCnpj := EditEmitenteCpfCnpj.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Nome := EditEmitenteRazao.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Fantasia := EditEmitenteFantasia.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Logradouro := EditEmitenteLogradouro.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Numero := EditEmitenteNumero.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Complemento := EditEmitenteComplemento.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Bairro := EditEmitenteBairro.Text;
      if Trim(EditEmitenteCodigoIbge.Text) <> '' then
        TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.CodigoMunicipio := StrToInt(EditEmitenteCodigoIbge.Text);
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.NomeMunicipio := EditEmitenteCidade.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Uf := EditEmitenteUF.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Cep := EditEmitenteCEP.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.CodigoPais := 1058;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.NomePais := 'Brazil';
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Telefone := EditEmitenteTelefone.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoEstadual := EditEmitenteIE.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoEstadualSt := EditEmitenteIEST.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoMunicipal := EditEmitenteIM.Text;;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Cnae := EditEmitenteCnae.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Crt := IntToStr(ComboEmitenteCrt.ItemIndex + 1);
      TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Email := EditEmitenteEmail.Text;

      { NfeDetalhe }
      //FDataModuleNFe.CDSNfeDetalhe.DisableControls; - se for habilitado deverá filtrar os dados dos detalhes em anexo
      FDataModuleNFe.CDSNfeDetalhe.First;
      while not FDataModuleNFe.CDSNfeDetalhe.Eof do
      begin
        NfeDetalhe := TNfeDetalheVO.Create;
        NfeDetalhe.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
        if FDataModuleNFe.CDSNfeDetalhe.FieldByName('PERSISTE').AsString  = 'I' then
          NfeDetalhe.Id := 0
        else
          NfeDetalhe.Id := FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger;
        NfeDetalhe.IdProduto := FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_PRODUTO').AsInteger;
        NfeDetalhe.NumeroItem := FDataModuleNFe.CDSNfeDetalhe.FieldByName('NUMERO_ITEM').AsInteger;
        NfeDetalhe.CodigoProduto := FDataModuleNFe.CDSNfeDetalhe.FieldByName('CODIGO_PRODUTO').AsString;
        NfeDetalhe.Gtin := FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN').AsString;
        NfeDetalhe.NomeProduto := FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString;
        NfeDetalhe.Ncm := FDataModuleNFe.CDSNfeDetalhe.FieldByName('NCM').AsString;
        NfeDetalhe.ExTipi := FDataModuleNFe.CDSNfeDetalhe.FieldByName('EX_TIPI').AsInteger;
        NfeDetalhe.Cfop := FDataModuleNFe.CDSNfeDetalhe.FieldByName('CFOP').AsInteger;
        NfeDetalhe.UnidadeComercial := FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_COMERCIAL').AsString;
        NfeDetalhe.QuantidadeComercial := FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_COMERCIAL').AsExtended;
        NfeDetalhe.ValorUnitarioComercial := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_COMERCIAL').AsExtended;
        NfeDetalhe.ValorBrutoProduto := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_BRUTO_PRODUTO').AsExtended;
        NfeDetalhe.GtinUnidadeTributavel := FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN_UNIDADE_TRIBUTAVEL').AsString; ;
        NfeDetalhe.UnidadeTributavel := FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_TRIBUTAVEL').AsString;
        NfeDetalhe.QuantidadeTributavel := FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_TRIBUTAVEL').AsExtended;
        NfeDetalhe.ValorUnitarioTributavel := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_TRIBUTAVEL').AsExtended;
        NfeDetalhe.ValorFrete := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_FRETE').AsExtended;
        NfeDetalhe.ValorSeguro := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SEGURO').AsExtended;
        NfeDetalhe.ValorDesconto := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_DESCONTO').AsExtended;
        NfeDetalhe.ValorOutrasDespesas := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_OUTRAS_DESPESAS').AsExtended;
        NfeDetalhe.EntraTotal := FDataModuleNFe.CDSNfeDetalhe.FieldByName('ENTRA_TOTAL').AsInteger;
        NfeDetalhe.ValorSubtotal := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SUBTOTAL').AsExtended;
        NfeDetalhe.ValorTotal := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_TOTAL').AsExtended;
        NfeDetalhe.InformacoesAdicionais := FDataModuleNFe.CDSNfeDetalhe.FieldByName('INFORMACOES_ADICIONAIS').AsString;

        { NfeDetalhe - Imposto - ICMS }
        if FDataModuleNFe.CDSNfeImpostoIcms.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoIcms.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoIcmsVO.Id := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.OrigemMercadoria := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ORIGEM_MERCADORIA').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.CstIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CST_ICMS').AsString;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.Csosn := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CSOSN').AsString;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ModalidadeBcIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.TaxaReducaoBcIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('TAXA_REDUCAO_BC_ICMS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.BaseCalculoIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('BASE_CALCULO_ICMS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.AliquotaIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.MotivoDesoneracaoIcms := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MOTIVO_DESONERACAO_ICMS').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ModalidadeBcIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS_ST').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.PercentualMvaIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_MVA_ICMS_ST').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.PercentualReducaoBcIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_REDUCAO_BC_ICMS_ST').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorBaseCalculoIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BASE_CALCULO_ICMS_ST').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.AliquotaIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS_ST').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorIcmsSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorBcIcmsStRetido := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_RETIDO').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorIcmsStRetido := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_RETIDO').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorBcIcmsStDestino := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_DESTINO').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorIcmsStDestino := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_DESTINO').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.AliquotaCreditoIcmsSn := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_CREDITO_ICMS_SN').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.ValorCreditoIcmsSn := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_CREDITO_ICMS_SN').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.PercentualBcOperacaoPropria := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_BC_OPERACAO_PROPRIA').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIcmsVO.UfSt := FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('UF_ST').AsString;
          end;
        end;

        { NfeDetalhe - Imposto - ISSQN }
        if FDataModuleNFe.CDSNfeImpostoIssqn.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoIssqn.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoIssqnVO.Id := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.BaseCalculoIssqn := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('BASE_CALCULO_ISSQN').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.AliquotaIssqn := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ALIQUOTA_ISSQN').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.ValorIssqn := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('VALOR_ISSQN').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.MunicipioIssqn := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('MUNICIPIO_ISSQN').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIssqnVO.ItemListaServicos := FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ITEM_LISTA_SERVICOS').AsInteger;
          end;
        end;

        { NfeDetalhe - Imposto - IPI }
        if FDataModuleNFe.CDSNfeImpostoIpi.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoIpi.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoIpiVO.Id := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIpiVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIpiVO.EnquadramentoIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_IPI').AsString;
            NfeDetalhe.NfeDetalheImpostoIpiVO.CnpjProdutor := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CNPJ_PRODUTOR').AsString;
            NfeDetalhe.NfeDetalheImpostoIpiVO.CodigoSeloIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CODIGO_SELO_IPI').AsString;
            NfeDetalhe.NfeDetalheImpostoIpiVO.QuantidadeSeloIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_SELO_IPI').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIpiVO.EnquadramentoLegalIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_LEGAL_IPI').AsString;
            NfeDetalhe.NfeDetalheImpostoIpiVO.CstIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CST_IPI').AsString;
            NfeDetalhe.NfeDetalheImpostoIpiVO.ValorBaseCalculoIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_BASE_CALCULO_IPI').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIpiVO.AliquotaIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ALIQUOTA_IPI').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIpiVO.QuantidadeUnidadeTributavel := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_UNIDADE_TRIBUTAVEL').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIpiVO.ValorUnidadeTributavel := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_UNIDADE_TRIBUTAVEL').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIpiVO.ValorIpi := FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_IPI').AsExtended;
          end;
        end;

        { NfeDetalhe - Imposto - II }
        if FDataModuleNFe.CDSNfeImpostoImportacao.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoImportacao.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoIiVO.Id := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIiVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoIiVO.ValorBcIi := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_BC_II').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIiVO.ValorDespesasAduaneiras := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_DESPESAS_ADUANEIRAS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIiVO.ValorImpostoImportacao := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IMPOSTO_IMPORTACAO').AsExtended;
            NfeDetalhe.NfeDetalheImpostoIiVO.ValorIof := FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IOF').AsExtended;
          end;
        end;

        { NfeDetalhe - Imposto - PIS }
        if FDataModuleNFe.CDSNfeImpostoPis.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoPis.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoPisVO.Id := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoPisVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoPisVO.CstPis := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('CST_PIS').AsString;
            NfeDetalhe.NfeDetalheImpostoPisVO.QuantidadeVendida := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('QUANTIDADE_VENDIDA').AsExtended;
            NfeDetalhe.NfeDetalheImpostoPisVO.ValorBaseCalculoPis := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_BASE_CALCULO_PIS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoPisVO.AliquotaPisPercentual := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_PERCENTUAL').AsExtended;
            NfeDetalhe.NfeDetalheImpostoPisVO.AliquotaPisReais := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_REAIS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoPisVO.ValorPis := FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_PIS').AsExtended;
          end;
        end;

        { NfeDetalhe - Imposto - COFINS }
        if FDataModuleNFe.CDSNfeImpostoCofins.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeImpostoCofins.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetalheImpostoCofinsVO.Id := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.CstCofins := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('CST_COFINS').AsString;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.QuantidadeVendida := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('QUANTIDADE_VENDIDA').AsExtended;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.BaseCalculoCofins := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('BASE_CALCULO_COFINS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.AliquotaCofinsPercentual := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_PERCENTUAL').AsExtended;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.AliquotaCofinsReais := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_REAIS').AsExtended;
            NfeDetalhe.NfeDetalheImpostoCofinsVO.ValorCofins := FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('VALOR_COFINS').AsExtended;
          end;
        end;

        { NfeDetalhe - Declaração Importação }
        if FDataModuleNFe.CDSNfeDeclaracaoImportacao.RecordCount > 0 then
        begin
          FDataModuleNFe.CDSNfeDeclaracaoImportacao.DisableControls;
          FDataModuleNFe.CDSNfeDeclaracaoImportacao.First;
          while not FDataModuleNFe.CDSNfeDeclaracaoImportacao.Eof do
          begin
            NfeDeclaracaoImportacao := TNfeDeclaracaoImportacaoVO.Create;

            NfeDeclaracaoImportacao.Id := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('ID').AsInteger;
            NfeDeclaracaoImportacao.IdNfeDetalhe := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDeclaracaoImportacao.NumeroDocumento := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('NUMERO_DOCUMENTO').AsString;
            NfeDeclaracaoImportacao.DataRegistro := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('DATA_REGISTRO').AsDateTime;
            NfeDeclaracaoImportacao.LocalDesembaraco := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('LOCAL_DESEMBARACO').AsString;
            NfeDeclaracaoImportacao.UfDesembaraco := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('UF_DESEMBARACO').AsString;
            NfeDeclaracaoImportacao.DataDesembaraco := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('DATA_DESEMBARACO').AsDateTime;
            NfeDeclaracaoImportacao.UfDesembaraco := FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('UF_DESEMBARACO').AsString;

            { NfeDetalhe - Declaração Importação - Adições }
            if FDataModuleNFe.CDSNfeImportacaoDetalhe.RecordCount > 0 then
            begin
              FDataModuleNFe.CDSNfeImportacaoDetalhe.DisableControls;
              FDataModuleNFe.CDSNfeImportacaoDetalhe.First;
              while not FDataModuleNFe.CDSNfeImportacaoDetalhe.Eof do
              begin
                NfeImportacaoDetalhe := TNfeImportacaoDetalheVO.Create;

                NfeImportacaoDetalhe.Id := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('ID').AsInteger;
                NfeImportacaoDetalhe.IdNfeDeclaracaoImportacao := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('ID_NFE_DECLARACAO_IMPORTACAO').AsInteger;
                NfeImportacaoDetalhe.NumeroAdicao := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('NUMERO_ADICAO').AsInteger;
                NfeImportacaoDetalhe.NumeroSequencial := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('NUMERO_SEQUENCIAL').AsInteger;
                NfeImportacaoDetalhe.CodigoFabricanteEstrangeiro := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('CODIGO_FABRICANTE_ESTRANGEIRO').AsString;
                NfeImportacaoDetalhe.ValorDesconto := FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('VALOR_DESCONTO').AsExtended;

                NfeDeclaracaoImportacao.ListaNfeImportacaoDetalheVO.Add(NfeImportacaoDetalhe);
                FDataModuleNFe.CDSNfeImportacaoDetalhe.Next;
              end;
            end;

            NfeDetalhe.ListaNfeDeclaracaoImportacaoVO.Add(NfeDeclaracaoImportacao);
            FDataModuleNFe.CDSNfeDeclaracaoImportacao.Next;
          end;
          FDataModuleNFe.CDSNfeDeclaracaoImportacao.First;
          FDataModuleNFe.CDSNfeDeclaracaoImportacao.EnableControls;
        end;

        { NfeDetalhe - Específico - Veículo }
        if FDataModuleNFe.CDSNfeDetalheVeiculo.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeDetalheVeiculo.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Id := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.TipoOperacao := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_OPERACAO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Chassi := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CHASSI').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Cor := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('COR').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.DescricaoCor := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DESCRICAO_COR').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.PotenciaMotor := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('POTENCIA_MOTOR').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Cilindradas := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CILINDRADAS').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.PesoLiquido := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_LIQUIDO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.PesoBruto := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_BRUTO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.NumeroSerie := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_SERIE').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.TipoCombustivel := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_COMBUSTIVEL').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.NumeroMotor := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_MOTOR').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.CapacidadeMaximaTracao := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CAPACIDADE_MAXIMA_TRACAO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.DistanciaEixos := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DISTANCIA_EIXOS').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.AnoModelo := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_MODELO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.AnoFabricacao := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_FABRICACAO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.TipoPintura := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_PINTURA').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.TipoVeiculo := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_VEICULO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.EspecieVeiculo := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ESPECIE_VEICULO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.CondicaoVin := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VIN').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.CondicaoVeiculo := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VEICULO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.CodigoMarcaModelo := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_MARCA_MODELO').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.CodigoCor := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_COR').AsString;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Lotacao := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('LOTACAO').AsInteger;
            NfeDetalhe.NfeDetEspecificoVeiculoVO.Restricao := FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('RESTRICAO').AsString;
          end;
        end;

        { NfeDetalhe - Específico - Combustível }
        if FDataModuleNFe.CDSNfeDetalheCombustivel.RecordCount > 0 then
        begin
          if FDataModuleNFe.CDSNfeDetalheCombustivel.Locate('ID_NFE_DETALHE', FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger, [loPartialKey]) then
          begin
            NfeDetalhe.NfeDetEspecificoCombustivelVO.Id := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ID').AsInteger;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.IdNfeDetalhe := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.CodigoAnp := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIGO_ANP').AsInteger;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.Codif := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIF').AsString;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.QuantidadeTempAmbiente := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('QUANTIDADE_TEMP_AMBIENTE').AsExtended;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.UfConsumo := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('UF_CONSUMO').AsString;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.BaseCalculoCide := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('BASE_CALCULO_CIDE').AsExtended;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.AliquotaCide := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ALIQUOTA_CIDE').AsExtended;
            NfeDetalhe.NfeDetEspecificoCombustivelVO.ValorCide := FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('VALOR_CIDE').AsExtended;
          end;
        end;

        { NfeDetalhe - Específico - Medicamento }
        if FDataModuleNFe.CDSNfeDetalheMedicamento.RecordCount > 0 then
        begin
          FDataModuleNFe.CDSNfeDetalheMedicamento.DisableControls;
          FDataModuleNFe.CDSNfeDetalheMedicamento.First;
          while not FDataModuleNFe.CDSNfeDetalheMedicamento.Eof do
          begin
            NfeDetalheMedicamento := TNfeDetEspecificoMedicamentoVO.Create;

            NfeDetalheMedicamento.Id := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('ID').AsInteger;
            NfeDetalheMedicamento.IdNfeDetalhe := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalheMedicamento.NumeroLote := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('NUMERO_LOTE').AsString;
            NfeDetalheMedicamento.QuantidadeLote := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('QUANTIDADE_LOTE').AsExtended;
            NfeDetalheMedicamento.DataFabricacao := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('DATA_FABRICACAO').AsDateTime;
            NfeDetalheMedicamento.DataValidade := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('DATA_VALIDADE').AsDateTime;
            NfeDetalheMedicamento.PrecoMaximoConsumidor := FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('PRECO_MAXIMO_CONSUMIDOR').AsExtended;

            NfeDetalhe.ListaNfeDetEspecificoMedicamentoVO.Add(NfeDetalheMedicamento);
            FDataModuleNFe.CDSNfeDetalheMedicamento.Next;
          end;
          FDataModuleNFe.CDSNfeDetalheMedicamento.First;
          FDataModuleNFe.CDSNfeDetalheMedicamento.EnableControls;
        end;

        { NfeDetalhe - Específico - Armamento }
        if FDataModuleNFe.CDSNfeDetalheArmamento.RecordCount > 0 then
        begin
          FDataModuleNFe.CDSNfeDetalheArmamento.DisableControls;
          FDataModuleNFe.CDSNfeDetalheArmamento.First;
          while not FDataModuleNFe.CDSNfeDetalheArmamento.Eof do
          begin
            NfeDetalheArmamento := TNfeDetEspecificoArmamentoVO.Create;

            NfeDetalheArmamento.Id := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('ID').AsInteger;
            NfeDetalheArmamento.IdNfeDetalhe := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('ID_NFE_DETALHE').AsInteger;
            NfeDetalheArmamento.TipoArma := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('TIPO_ARMA').AsInteger;
            NfeDetalheArmamento.NumeroSerieArma := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('NUMERO_SERIE_ARMA').AsString;
            NfeDetalheArmamento.NumeroSerieCano := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('NUMERO_SERIE_CANO').AsString;
            NfeDetalheArmamento.Descricao := FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('DESCRICAO').AsString;

            NfeDetalhe.ListaNfeDetEspecificoArmamentoVO.Add(NfeDetalheArmamento);
            FDataModuleNFe.CDSNfeDetalheArmamento.Next;
          end;
          FDataModuleNFe.CDSNfeDetalheArmamento.First;
          FDataModuleNFe.CDSNfeDetalheArmamento.EnableControls;
        end;

        TNfeCabecalhoVO(ObjetoVO).ListaNfeDetalheVO.Add(NfeDetalhe);
        FDataModuleNFe.CDSNfeDetalhe.Next;
      end;
      FDataModuleNFe.CDSNfeDetalhe.First;
      FDataModuleNFe.CDSNfeDetalhe.EnableControls;

      (* Grupo de informação dos documentos referenciados *)

      { NF-e Referenciada }
      if FDataModuleNFe.CDSNfeReferenciada.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeReferenciadaVO, FDataModuleNFe.CDSNfeReferenciada);

      { NF 1/1A Referenciada }
      if FDataModuleNFe.CDSNfReferenciada.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeNfReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeNfReferenciadaVO, FDataModuleNFe.CDSNfReferenciada);

      { NF Rural Referenciada }
      if FDataModuleNFe.CDSNfRuralReferenciada.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeProdRuralReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeProdRuralReferenciadaVO, FDataModuleNFe.CDSNfRuralReferenciada);

      { CT-e Referenciado }
      if FDataModuleNFe.CDSCteReferenciado.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeCteReferenciadoVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeCteReferenciadoVO, FDataModuleNFe.CDSCteReferenciado);

      { Cupom Fiscal Referenciado }
      if FDataModuleNFe.CDSCupomReferenciado.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeCupomFiscalReferenciadoVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeCupomFiscalReferenciadoVO, FDataModuleNFe.CDSCupomReferenciado);

      { Local Entrega }
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.CpfCnpj := EditEntregaCpfCnpj.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Logradouro := EditEntregaLogradouro.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Numero := EditEntregaNumero.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Complemento := EditEntregaComplemento.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Bairro := EditEntregaBairro.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.CodigoMunicipio := EditEntregaIbge.AsInteger;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.NomeMunicipio := EditEntregaCidade.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Uf := EditEntregaUf.Text;

      { Local Retirada }
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.CpfCnpj := EditRetiradaCpfCnpj.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Logradouro := EditRetiradaLogradouro.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Numero := EditRetiradaNumero.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Complemento := EditRetiradaComplemento.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Bairro := EditRetiradaBairro.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.CodigoMunicipio := EditRetiradaIbge.AsInteger;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.NomeMunicipio := EditRetiradaCidade.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Uf := EditRetiradaUf.Text;

      (* Grupo de Transporte *)

      { Transporte }
      if EditTransportadorId.AsInteger > 0 then
      begin
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.IdTransportadora := EditTransportadorId.AsInteger;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ModalidadeFrete := StrToInt(Copy(ComboModalidadeFrete.Text, 1, 1));
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.CpfCnpj := EditTransportadorCpfCnpj.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Nome := EditTransportadorRazaoSocial.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.InscricaoEstadual := EditTransportadorIE.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.EmpresaEndereco := EditTransportadorLogradouro.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.NomeMunicipio := EditTransportadorCidade.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Uf := EditTransportadorUF.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorServico := EditRetencaoIcmsValorServico.Value;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorBcRetencaoIcms := EditRetencaoIcmsBaseCalculo.Value;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.AliquotaRetencaoIcms := EditRetencaoIcmsAliquota.Value;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorIcmsRetido := EditRetencaoIcmsIcmsRetido.Value;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Cfop := StrToIntDef(EditRetencaoIcmsCfop.Text, 0);
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Municipio := StrToIntDef(EditRetencaoIcmsCidade.Text, 0);
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.PlacaVeiculo := EditVeiculoPlaca.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.UfVeiculo := EditVeiculoUf.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.RntcVeiculo := EditVeiculoRntc.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Vagao := EditTransporteVagao.Text;
        TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Balsa := EditTransporteBalsa.Text;

        { Tranporte - Reboque }
        if FDataModuleNFe.CDSReboque.RecordCount > 0 then
          TController.PreencherObjectListFromCDS<TNfeTransporteReboqueVO>(TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ListaNfeTransporteReboqueVO, FDataModuleNFe.CDSReboque);

        { Tranporte - Volumes }
        if FDataModuleNFe.CDSVolumes.RecordCount > 0 then
          TController.PreencherObjectListFromCDS<TNfeTransporteVolumeVO>(TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ListaNfeTransporteVolumeVO, FDataModuleNFe.CDSVolumes);
      end;

      (* Grupo de Cobrança *)

      { Cobrança - Fatura }
      TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.IdNfeCabecalho := TNfeCabecalhoVO(ObjetoVO).Id;
      TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.Numero := EditFaturaNumero.Text;
      TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorOriginal := EditFaturaValorOriginal.Value;
      TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorDesconto := EditFaturaValorDesconto.Value;
      TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorLiquido := EditFaturaValorLiquido.Value;

      { Cobrança - Duplicatas }
      if FDataModuleNFe.CDSDuplicata.RecordCount > 0 then
        TController.PreencherObjectListFromCDS<TNfeDuplicataVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeDuplicataVO, FDataModuleNFe.CDSDuplicata);

      if StatusTela = stInserindo then
      begin
        TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'Insere', [TNfeCabecalhoVO(ObjetoVO)], 'PUT', 'Lista');
      end
      else if StatusTela = stEditando then
      begin
        if TNfeCabecalhoVO(ObjetoVO).ToJSONString <> StringObjetoOld then
        begin
          TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'Altera', [TNfeCabecalhoVO(ObjetoVO)], 'POST', 'Boolean');
        end
        else
          Application.MessageBox('Nenhum dado foi alterado.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
      end;
    except
      Result := False;
    end;
  end;
end;
{$ENDREGION}

{$REGION 'Controle de Grids e ClientDataSets'}
procedure TFEntradaNF.GridItensDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if FDataModuleNFe.CDSNfeDetalhe.FieldByName('CADASTRADO').AsString = 'N' then
    GridItens.Canvas.Brush.Color := $00C6C6FF;
  GridItens.DefaultDrawDataCell(Rect, GridItens.columns[datacol].field, State);
end;

procedure TFEntradaNF.GridItensKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_F1 then
  begin
    ActionIncluirItem.Execute;
  end;
end;

procedure TFEntradaNF.GridParaEdits;
var
  NfeDetalheEnumerator: TEnumerator<TNfeDetalheVO>;
begin
  ActionSelecionarArquivo.Enabled := False;

  inherited;

  if not CDSGrid.IsEmpty then
  begin
    ObjetoVO := TNfeCabecalhoVO(TController.BuscarObjeto('NfeCabecalhoController.TNfeCabecalhoController', 'ConsultaObjeto', ['ID=' + IdRegistroSelecionado.ToString], 'GET'));
  end;

  if Assigned(ObjetoVO) then
  begin
    { NF-e Cabeçalho }
    EditCodigoNumerico.Text := TNfeCabecalhoVO(ObjetoVO).CodigoNumerico;
    EditNaturezaOperacao.Text := TNfeCabecalhoVO(ObjetoVO).NaturezaOperacao;
    ComboBoxFormaPagamento.ItemIndex := TNfeCabecalhoVO(ObjetoVO).IndicadorFormaPagamento;
    ComboboxModeloNotaFiscal.ItemIndex := AnsiIndexStr(TNfeCabecalhoVO(ObjetoVO).CodigoModelo, ['01', '55']);
    EditSerie.Text := TNfeCabecalhoVO(ObjetoVO).Serie;
    EditNumeroNfe.Text := TNfeCabecalhoVO(ObjetoVO).Numero;
    EditDataEmissao.Date := TNfeCabecalhoVO(ObjetoVO).DatahoraEmissao;
    EditDataEntradaSaida.Date := TNfeCabecalhoVO(ObjetoVO).DataHoraEntradaSaida;
    EditHoraEntradaSaida.Text := FormatDateTime('hh:mm:ss', TNfeCabecalhoVO(ObjetoVO).DataHoraEmissao);
    ComboTipoOperacao.ItemIndex := TNfeCabecalhoVO(ObjetoVO).TipoOperacao;
    EditEmitenteCodigoIbge.Text := TNfeCabecalhoVO(ObjetoVO).CodigoMunicipio.ToString;
    ComboFormaImpDanfe.ItemIndex := TNfeCabecalhoVO(ObjetoVO).FormatoImpressaoDanfe - 1;
    ComboTipoEmissao.ItemIndex := TNfeCabecalhoVO(ObjetoVO).TipoEmissao - 1;
    EditChaveAcesso.Text := TNfeCabecalhoVO(ObjetoVO).ChaveAcesso;
    EditDigitoChaveAcesso.Text := TNfeCabecalhoVO(ObjetoVO).DigitoChaveAcesso;
    ComboFinalidadeEmissao.ItemIndex := TNfeCabecalhoVO(ObjetoVO).FinalidadeEmissao - 1;
    EditBCIcms.Value := TNfeCabecalhoVO(ObjetoVO).BaseCalculoIcms;
    EditValorIcms.Value := TNfeCabecalhoVO(ObjetoVO).ValorIcms;
    EditBCIcmsSt.Value := TNfeCabecalhoVO(ObjetoVO).BaseCalculoIcmsSt;
    EditValorIcmsSt.Value := TNfeCabecalhoVO(ObjetoVO).ValorIcmsSt;
    EditTotalProdutos.Value := TNfeCabecalhoVO(ObjetoVO).ValorTotalProdutos;
    EditValorFrete.Value := TNfeCabecalhoVO(ObjetoVO).ValorFrete;
    EditValorSeguro.Value := TNfeCabecalhoVO(ObjetoVO).ValorSeguro;
    EditValorDesconto.Value := TNfeCabecalhoVO(ObjetoVO).ValorDesconto;
    EditTotalImpostoImportacao.Value := TNfeCabecalhoVO(ObjetoVO).ValorImpostoImportacao;
    EditValorIPI.Value := TNfeCabecalhoVO(ObjetoVO).ValorIpi;
    EditValorPIS.Value := TNfeCabecalhoVO(ObjetoVO).ValorPis;
    EditValorCOFINS.Value := TNfeCabecalhoVO(ObjetoVO).ValorCofins;
    EditValorOutrasDespesas.Value := TNfeCabecalhoVO(ObjetoVO).ValorDespesasAcessorias;
    EditValorTotalNota.Value := TNfeCabecalhoVO(ObjetoVO).ValorTotal;

    EditValorTotalServicos.Value := TNfeCabecalhoVO(ObjetoVO).ValorServicos;
    EditBaseCalculoIssqn.Value := TNfeCabecalhoVO(ObjetoVO).BaseCalculoIssqn;
    EditValorIssqn.Value := TNfeCabecalhoVO(ObjetoVO).ValorIssqn;
    EditValorPisIssqn.Value := TNfeCabecalhoVO(ObjetoVO).ValorPisIssqn;
    EditValorCofinsIssqn.Value := TNfeCabecalhoVO(ObjetoVO).ValorCofinsIssqn;
    EditValorRetidoPis.Value := TNfeCabecalhoVO(ObjetoVO).ValorRetidoPis;
    EditValorRetidoCofins.Value := TNfeCabecalhoVO(ObjetoVO).ValorRetidoCofins;
    EditValorRetidoCsll.Value := TNfeCabecalhoVO(ObjetoVO).ValorRetidoCsll;
    EditBaseCalculoIrrf.Value := TNfeCabecalhoVO(ObjetoVO).BaseCalculoIrrf;
    EditValorRetidoIrrf.Value := TNfeCabecalhoVO(ObjetoVO).ValorRetidoIrrf;
    EditBaseCalculoPrevidencia.Value := TNfeCabecalhoVO(ObjetoVO).BaseCalculoPrevidencia;
    EditValorRetidoPrevidencia.Value := TNfeCabecalhoVO(ObjetoVO).ValorRetidoPrevidencia;

    EditComexUfEmbarque.Text := TNfeCabecalhoVO(ObjetoVO).ComexUfEmbarque;
    EditComexLocalEmbarque.Text := TNfeCabecalhoVO(ObjetoVO).ComexLocalEmbarque;
    EditCompraNotaEmpenho.Text := TNfeCabecalhoVO(ObjetoVO).CompraNotaEmpenho;
    EditCompraPedido.Text := TNfeCabecalhoVO(ObjetoVO).CompraPedido;
    EditCompraContrato.Text := TNfeCabecalhoVO(ObjetoVO).CompraContrato;

    MemoInfComplementarFisco.Text := TNfeCabecalhoVO(ObjetoVO).InformacoesAddFisco;
    MemoInfComplementarContribuinte.Text := TNfeCabecalhoVO(ObjetoVO).InformacoesAddContribuinte;

    { Emitente }
    if TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Id > 0 then
    begin
      EditEmitenteId.AsInteger := TNfeCabecalhoVO(ObjetoVO).IdFornecedor;
      EditEmitenteUF.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Uf;
      EditEmitenteCpfCnpj.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.CpfCnpj;
      EditEmitenteRazao.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Nome;
      EditEmitenteFantasia.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Fantasia;
      EditEmitenteLogradouro.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Logradouro;
      EditEmitenteNumero.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Numero;
      EditEmitenteComplemento.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Complemento;
      EditEmitenteBairro.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Bairro;
      EditEmitenteCodigoIbge.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.CodigoMunicipio.ToString;
      EditEmitenteCidade.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.NomeMunicipio;
      EditEmitenteUF.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Uf;
      EditEmitenteCEP.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Cep;
      EditEmitenteTelefone.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Telefone;
      EditEmitenteIE.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoEstadual;
      if TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Crt <> '' then
        ComboEmitenteCrt.ItemIndex := StrToInt(TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Crt);
      EditEmitenteEmail.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Email;
      EditEmitenteIEST.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoEstadualSt;
      EditEmitenteIM.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.InscricaoMunicipal;
      EditEmitenteCnae.Text := TNfeCabecalhoVO(ObjetoVO).NfeEmitenteVO.Cnae;
    end;

    { Local Entrega }
    if TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Id > 0 then
    begin
      EditEntregaCpfCnpj.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.CpfCnpj;
      EditEntregaLogradouro.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Logradouro;
      EditEntregaNumero.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Numero;
      EditEntregaComplemento.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Complemento;
      EditEntregaBairro.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Bairro;
      EditEntregaIbge.Text := IntToStr(TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.CodigoMunicipio);
      EditEntregaCidade.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.NomeMunicipio;
      EditEntregaUf.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalEntregaVO.Uf;
    end;

    { Local Retirada }
    if TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Id > 0 then
    begin
      EditRetiradaCpfCnpj.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.CpfCnpj;
      EditRetiradaLogradouro.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Logradouro;
      EditRetiradaNumero.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Numero;
      EditRetiradaComplemento.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Complemento;
      EditRetiradaBairro.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Bairro;
      EditRetiradaIbge.Text := IntToStr(TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.CodigoMunicipio);
      EditRetiradaCidade.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.NomeMunicipio;
      EditRetiradaUf.Text := TNfeCabecalhoVO(ObjetoVO).NfeLocalRetiradaVO.Uf;
    end;

    { NF-e Referenciada }
    TController.TratarRetorno<TNfeReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeReferenciadaVO, True, True, FDataModuleNFe.CDSNfeReferenciada);
    { NF Referenciada }
    TController.TratarRetorno<TNfeNfReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeNfReferenciadaVO, True, True, FDataModuleNFe.CDSNfReferenciada);
    { NF Rural Referenciada }
    TController.TratarRetorno<TNfeProdRuralReferenciadaVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeProdRuralReferenciadaVO, True, True, FDataModuleNFe.CDSNfeReferenciada);
    { CTF-e Referenciado }
    TController.TratarRetorno<TNfeCteReferenciadoVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeCteReferenciadoVO, True, True, FDataModuleNFe.CDSCteReferenciado);
    { Cupom Fiscal Referenciado }
    TController.TratarRetorno<TNfeCupomFiscalReferenciadoVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeCupomFiscalReferenciadoVO, True, True, FDataModuleNFe.CDSCupomReferenciado);

    (* Grupo de Transporte *)
    { Transporte }
    if TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Id > 0 then
    begin
      EditTransportadorId.AsInteger := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.IdTransportadora;
      ComboModalidadeFrete.ItemIndex := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ModalidadeFrete;
      EditTransportadorCpfCnpj.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.CpfCnpj;
      EditTransportadorRazaoSocial.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Nome;
      EditTransportadorIE.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.InscricaoEstadual;
      EditTransportadorLogradouro.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.EmpresaEndereco;
      EditTransportadorCidade.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.NomeMunicipio;
      EditTransportadorUF.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Uf;
      EditRetencaoIcmsValorServico.Value := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorServico;
      EditRetencaoIcmsBaseCalculo.Value := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorBcRetencaoIcms;
      EditRetencaoIcmsAliquota.Value := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.AliquotaRetencaoIcms;
      EditRetencaoIcmsIcmsRetido.Value := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ValorIcmsRetido;
      EditRetencaoIcmsCfop.AsInteger := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Cfop;
      EditRetencaoIcmsCidade.AsInteger := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Municipio;
      EditVeiculoPlaca.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.PlacaVeiculo;
      EditVeiculoUf.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.UfVeiculo;
      EditVeiculoRntc.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.RntcVeiculo;
      EditRetencaoIcmsUf.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Uf;
      EditTransporteVagao.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Vagao;
      EditTransporteBalsa.Text := TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.Balsa;

      { Tranporte - Reboque }
      TController.TratarRetorno<TNfeTransporteReboqueVO>(TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ListaNfeTransporteReboqueVO, True, True, FDataModuleNFe.CDSReboque);
      { Tranporte - Volume }
      TController.TratarRetorno<TNfeTransporteVolumeVO>(TNfeCabecalhoVO(ObjetoVO).NfeTransporteVO.ListaNfeTransporteVolumeVO, True, True, FDataModuleNFe.CDSVolumes);
    end;
    (* Fim Grupo de Transporte *)

    (* Grupo de Cobrança *)
    { Cobrança - Fatura }
    if TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.Id > 0 then
    begin
      EditFaturaNumero.Text := TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.Numero;
      EditFaturaValorOriginal.Value := TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorOriginal;
      EditFaturaValorDesconto.Value := TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorDesconto;
      EditFaturaValorLiquido.Value := TNfeCabecalhoVO(ObjetoVO).NfeFaturaVO.ValorLiquido;
    end;

    { Cobrança - Duplicatas }
    TController.TratarRetorno<TNfeDuplicataVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeDuplicataVO, True, True, FDataModuleNFe.CDSDuplicata);
    (* Fim Grupo de Cobrança *)

    (* Grupo de Detalhe *)
    // NfeDetalheEnumerator
    TController.TratarRetorno<TNfeDetalheVO>(TNfeCabecalhoVO(ObjetoVO).ListaNfeDetalheVO, True, True, FDataModuleNFe.CDSNfeDetalhe);

    NfeDetalheEnumerator := TNfeCabecalhoVO(ObjetoVO).ListaNfeDetalheVO.GetEnumerator;
    try
      with NfeDetalheEnumerator do
      begin
        while MoveNext do
        begin
          { NfeDetalhe - Imposto - ICMS }
          if Current.NfeDetalheImpostoIcmsVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoIcms.Append;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoIcmsVO.Id;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoIcmsVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ORIGEM_MERCADORIA').AsInteger := Current.NfeDetalheImpostoIcmsVO.OrigemMercadoria;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CST_ICMS').AsString := Current.NfeDetalheImpostoIcmsVO.CstIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CSOSN').AsString := Current.NfeDetalheImpostoIcmsVO.Csosn;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS').AsInteger := Current.NfeDetalheImpostoIcmsVO.ModalidadeBcIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('TAXA_REDUCAO_BC_ICMS').AsExtended := Current.NfeDetalheImpostoIcmsVO.TaxaReducaoBcIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('BASE_CALCULO_ICMS').AsExtended := Current.NfeDetalheImpostoIcmsVO.BaseCalculoIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS').AsExtended := Current.NfeDetalheImpostoIcmsVO.AliquotaIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MOTIVO_DESONERACAO_ICMS').AsInteger := Current.NfeDetalheImpostoIcmsVO.MotivoDesoneracaoIcms;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS_ST').AsInteger := Current.NfeDetalheImpostoIcmsVO.ModalidadeBcIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_MVA_ICMS_ST').AsExtended := Current.NfeDetalheImpostoIcmsVO.PercentualMvaIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_REDUCAO_BC_ICMS_ST').AsExtended := Current.NfeDetalheImpostoIcmsVO.PercentualReducaoBcIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BASE_CALCULO_ICMS_ST').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorBaseCalculoIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS_ST').AsExtended := Current.NfeDetalheImpostoIcmsVO.AliquotaIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorIcmsSt;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_RETIDO').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorBcIcmsStRetido;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_RETIDO').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorIcmsStRetido;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_DESTINO').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorBcIcmsStDestino;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_DESTINO').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorIcmsStDestino;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_CREDITO_ICMS_SN').AsExtended := Current.NfeDetalheImpostoIcmsVO.AliquotaCreditoIcmsSn;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_CREDITO_ICMS_SN').AsExtended := Current.NfeDetalheImpostoIcmsVO.ValorCreditoIcmsSn;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_BC_OPERACAO_PROPRIA').AsExtended := Current.NfeDetalheImpostoIcmsVO.PercentualBcOperacaoPropria;
            FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('UF_ST').AsString := Current.NfeDetalheImpostoIcmsVO.UfSt;
            FDataModuleNFe.CDSNfeImpostoIcms.Post;
          end;

          { NfeDetalhe - Imposto - ISSQN }
          if Current.NfeDetalheImpostoIssqnVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoIssqn.Append;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoIssqnVO.Id;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoIssqnVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('BASE_CALCULO_ISSQN').AsExtended := Current.NfeDetalheImpostoIssqnVO.BaseCalculoIssqn;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ALIQUOTA_ISSQN').AsExtended := Current.NfeDetalheImpostoIssqnVO.AliquotaIssqn;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('VALOR_ISSQN').AsExtended := Current.NfeDetalheImpostoIssqnVO.ValorIssqn;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('MUNICIPIO_ISSQN').AsInteger := Current.NfeDetalheImpostoIssqnVO.MunicipioIssqn;
            FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ITEM_LISTA_SERVICOS').AsInteger := Current.NfeDetalheImpostoIssqnVO.ItemListaServicos;
            FDataModuleNFe.CDSNfeImpostoIssqn.Post;
          end;

          { NfeDetalhe - Imposto - IPI }
          if Current.NfeDetalheImpostoIpiVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoIpi.Append;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoIpiVO.Id;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoIpiVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_IPI').AsString := Current.NfeDetalheImpostoIpiVO.EnquadramentoIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CNPJ_PRODUTOR').AsString := Current.NfeDetalheImpostoIpiVO.CnpjProdutor;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CODIGO_SELO_IPI').AsString := Current.NfeDetalheImpostoIpiVO.CodigoSeloIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_SELO_IPI').AsInteger := Current.NfeDetalheImpostoIpiVO.QuantidadeSeloIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_LEGAL_IPI').AsString := Current.NfeDetalheImpostoIpiVO.EnquadramentoLegalIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CST_IPI').AsString := Current.NfeDetalheImpostoIpiVO.CstIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_BASE_CALCULO_IPI').AsExtended := Current.NfeDetalheImpostoIpiVO.ValorBaseCalculoIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ALIQUOTA_IPI').AsExtended := Current.NfeDetalheImpostoIpiVO.AliquotaIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_UNIDADE_TRIBUTAVEL').AsExtended := Current.NfeDetalheImpostoIpiVO.QuantidadeUnidadeTributavel;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_UNIDADE_TRIBUTAVEL').AsExtended := Current.NfeDetalheImpostoIpiVO.ValorUnidadeTributavel;
            FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_IPI').AsExtended := Current.NfeDetalheImpostoIpiVO.ValorIpi;
            FDataModuleNFe.CDSNfeImpostoIpi.Post;
          end;

          { NfeDetalhe - Imposto - II }
          if Current.NfeDetalheImpostoIiVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoImportacao.Append;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoIiVO.Id;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoIiVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_BC_II').AsExtended := Current.NfeDetalheImpostoIiVO.ValorBcIi;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_DESPESAS_ADUANEIRAS').AsExtended := Current.NfeDetalheImpostoIiVO.ValorDespesasAduaneiras;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IMPOSTO_IMPORTACAO').AsExtended := Current.NfeDetalheImpostoIiVO.ValorImpostoImportacao;
            FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IOF').AsExtended := Current.NfeDetalheImpostoIiVO.ValorIof;
            FDataModuleNFe.CDSNfeImpostoImportacao.Post;
          end;

          { NfeDetalhe - Imposto - PIS }
          if Current.NfeDetalheImpostoPisVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoPis.Append;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoPisVO.Id;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoPisVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('CST_PIS').AsString := Current.NfeDetalheImpostoPisVO.CstPis;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('QUANTIDADE_VENDIDA').AsExtended := Current.NfeDetalheImpostoPisVO.QuantidadeVendida;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_BASE_CALCULO_PIS').AsExtended := Current.NfeDetalheImpostoPisVO.ValorBaseCalculoPis;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_PERCENTUAL').AsExtended := Current.NfeDetalheImpostoPisVO.AliquotaPisPercentual;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_REAIS').AsExtended := Current.NfeDetalheImpostoPisVO.AliquotaPisReais;
            FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_PIS').AsExtended := Current.NfeDetalheImpostoPisVO.ValorPis;
            FDataModuleNFe.CDSNfeImpostoPis.Post;
          end;

          { NfeDetalhe - Imposto - COFINS }
          if Current.NfeDetalheImpostoCofinsVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeImpostoCofins.Append;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID').AsInteger := Current.NfeDetalheImpostoCofinsVO.Id;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetalheImpostoCofinsVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('CST_COFINS').AsString := Current.NfeDetalheImpostoCofinsVO.CstCofins;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('QUANTIDADE_VENDIDA').AsExtended := Current.NfeDetalheImpostoCofinsVO.QuantidadeVendida;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('BASE_CALCULO_COFINS').AsExtended := Current.NfeDetalheImpostoCofinsVO.BaseCalculoCofins;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_PERCENTUAL').AsExtended := Current.NfeDetalheImpostoCofinsVO.AliquotaCofinsPercentual;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_REAIS').AsExtended := Current.NfeDetalheImpostoCofinsVO.AliquotaCofinsReais;
            FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('VALOR_COFINS').AsExtended := Current.NfeDetalheImpostoCofinsVO.ValorCofins;
            FDataModuleNFe.CDSNfeImpostoCofins.Post;
          end;

          { NfeDetalhe - Declaração Importação }
          TController.TratarRetorno<TNfeDeclaracaoImportacaoVO>(Current.ListaNfeDeclaracaoImportacaoVO, True, True, FDataModuleNFe.CDSNfeDeclaracaoImportacao);

          { NfeDetalhe - Específico - Veículo }
          if Current.NfeDetEspecificoVeiculoVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeDetalheVeiculo.Append;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ID').AsInteger := Current.NfeDetEspecificoVeiculoVO.Id;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetEspecificoVeiculoVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_OPERACAO').AsString := Current.NfeDetEspecificoVeiculoVO.TipoOperacao;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CHASSI').AsString := Current.NfeDetEspecificoVeiculoVO.Chassi;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('COR').AsString := Current.NfeDetEspecificoVeiculoVO.Cor;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DESCRICAO_COR').AsString := Current.NfeDetEspecificoVeiculoVO.DescricaoCor;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('POTENCIA_MOTOR').AsString := Current.NfeDetEspecificoVeiculoVO.PotenciaMotor;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CILINDRADAS').AsString := Current.NfeDetEspecificoVeiculoVO.Cilindradas;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_LIQUIDO').AsString := Current.NfeDetEspecificoVeiculoVO.PesoLiquido;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_BRUTO').AsString := Current.NfeDetEspecificoVeiculoVO.PesoBruto;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_SERIE').AsString := Current.NfeDetEspecificoVeiculoVO.NumeroSerie;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_COMBUSTIVEL').AsString := Current.NfeDetEspecificoVeiculoVO.TipoCombustivel;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_MOTOR').AsString := Current.NfeDetEspecificoVeiculoVO.NumeroMotor;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CAPACIDADE_MAXIMA_TRACAO').AsString := Current.NfeDetEspecificoVeiculoVO.CapacidadeMaximaTracao;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DISTANCIA_EIXOS').AsString := Current.NfeDetEspecificoVeiculoVO.DistanciaEixos;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_MODELO').AsString := Current.NfeDetEspecificoVeiculoVO.AnoModelo;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_FABRICACAO').AsString := Current.NfeDetEspecificoVeiculoVO.AnoFabricacao;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_PINTURA').AsString := Current.NfeDetEspecificoVeiculoVO.TipoPintura;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_VEICULO').AsString := Current.NfeDetEspecificoVeiculoVO.TipoVeiculo;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ESPECIE_VEICULO').AsString := Current.NfeDetEspecificoVeiculoVO.EspecieVeiculo;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VIN').AsString := Current.NfeDetEspecificoVeiculoVO.CondicaoVin;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VEICULO').AsString := Current.NfeDetEspecificoVeiculoVO.CondicaoVeiculo;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_MARCA_MODELO').AsString := Current.NfeDetEspecificoVeiculoVO.CodigoMarcaModelo;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_COR').AsString := Current.NfeDetEspecificoVeiculoVO.CodigoCor;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('LOTACAO').AsInteger := Current.NfeDetEspecificoVeiculoVO.Lotacao;
            FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('RESTRICAO').AsString := Current.NfeDetEspecificoVeiculoVO.Restricao;
            FDataModuleNFe.CDSNfeDetalheVeiculo.Post;
          end;

          { NfeDetalhe - Específico - Combustível }
          if Current.NfeDetEspecificoCombustivelVO.Id > 0 then
          begin
            FDataModuleNFe.CDSNfeDetalheCombustivel.Append;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ID').AsInteger := Current.NfeDetEspecificoCombustivelVO.Id;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ID_NFE_DETALHE').AsInteger := Current.NfeDetEspecificoCombustivelVO.IdNfeDetalhe;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIGO_ANP').AsInteger := Current.NfeDetEspecificoCombustivelVO.CodigoAnp;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIF').AsString := Current.NfeDetEspecificoCombustivelVO.Codif;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('QUANTIDADE_TEMP_AMBIENTE').AsExtended := Current.NfeDetEspecificoCombustivelVO.QuantidadeTempAmbiente;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('UF_CONSUMO').AsString := Current.NfeDetEspecificoCombustivelVO.UfConsumo;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('BASE_CALCULO_CIDE').AsExtended := Current.NfeDetEspecificoCombustivelVO.BaseCalculoCide;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ALIQUOTA_CIDE').AsExtended := Current.NfeDetEspecificoCombustivelVO.AliquotaCide;
            FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('VALOR_CIDE').AsExtended := Current.NfeDetEspecificoCombustivelVO.ValorCide;
            FDataModuleNFe.CDSNfeDetalheCombustivel.Post;
          end;

          { NfeDetalhe - Específico - Medicamento }
          TController.TratarRetorno<TNfeDetEspecificoMedicamentoVO>(Current.ListaNfeDetEspecificoMedicamentoVO, True, True, FDataModuleNFe.CDSNfeDetalheMedicamento);

          { NfeDetalhe - Específico - Armamento }
          TController.TratarRetorno<TNfeDetEspecificoArmamentoVO>(Current.ListaNfeDetEspecificoArmamentoVO, True, True, FDataModuleNFe.CDSNfeDetalheArmamento);
        end;
      end;
    finally
      NfeDetalheEnumerator.Free;
    end;
    (* Fim do Grupo de Detalhe *)
  end;
end;
{$ENDREGION}

{$REGION 'Exclusões Internas'}
procedure TFEntradaNF.ActionExcluirCobrancaExecute(Sender: TObject);
begin
  if Application.MessageBox('Tem certeza que deseja remover os dados de cobrança?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
  begin
    if StatusTela = stInserindo then
      ExcluirDadosCobranca
    else if StatusTela = stEditando then
    begin
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'ExcluiCobranca', [IdRegistroSelecionado], 'DELETE', 'Boolean');
      if TController.RetornoBoolean then
        ExcluirDadosCobranca;
    end;
  end;
end;

procedure TFEntradaNF.ExcluirDadosCobranca;
begin
  FDataModuleNFe.CDSDuplicata.EmptyDataSet;
  //
  EditFaturaNumero.Clear;
  EditFaturaValorOriginal.Clear;
  EditFaturaValorDesconto.Clear;
  EditFaturaValorLiquido.Clear;
end;

procedure TFEntradaNF.ActionExcluirDocumentosReferenciadosExecute(Sender: TObject);
begin
  if Application.MessageBox('Tem certeza que deseja remover os documentos referenciados?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
  begin
    if StatusTela = stInserindo then
      ExcluirDadosReferenciados
    else if StatusTela = stEditando then
    begin
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'ExcluiReferenciado', [IdRegistroSelecionado], 'DELETE', 'Boolean');
      if TController.RetornoBoolean then
        ExcluirDadosReferenciados;
    end;
  end;
end;

procedure TFEntradaNF.ExcluirDadosReferenciados;
begin
  FDataModuleNFe.CDSNfeReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSNfReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSCupomReferenciado.EmptyDataSet;
  FDataModuleNFe.CDSNfRuralReferenciada.EmptyDataSet;
  FDataModuleNFe.CDSCteReferenciado.EmptyDataSet;
end;

procedure TFEntradaNF.ActionExcluirEntregaRetiradaExecute(Sender: TObject);
begin
  if Application.MessageBox('Tem certeza que deseja remover os dados de entrega/retirada?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
  begin
    if StatusTela = stInserindo then
      ExcluirDadosEntregaRetirada
    else if StatusTela = stEditando then
    begin
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'ExcluiEntregaRetirada', [IdRegistroSelecionado], 'DELETE', 'Boolean');
      if TController.RetornoBoolean then
        ExcluirDadosEntregaRetirada;
    end;
  end;
end;

procedure TFEntradaNF.ExcluirDadosEntregaRetirada;
begin
  { Local Entrega }
  EditEntregaCpfCnpj.Clear;
  EditEntregaLogradouro.Clear;
  EditEntregaNumero.Clear;
  EditEntregaComplemento.Clear;
  EditEntregaBairro.Clear;
  EditEntregaIbge.Clear;
  EditEntregaCidade.Clear;
  EditEntregaUf.Clear;

  { Local Retirada }
  EditRetiradaCpfCnpj.Clear;
  EditRetiradaLogradouro.Clear;
  EditRetiradaNumero.Clear;
  EditRetiradaComplemento.Clear;
  EditRetiradaBairro.Clear;
  EditRetiradaIbge.Clear;
  EditRetiradaCidade.Clear;
  EditRetiradaUf.Clear;
end;

procedure TFEntradaNF.ActionExcluirTransporteExecute(Sender: TObject);
begin
  if Application.MessageBox('Tem certeza que deseja remover os dados de transporte?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
  begin
    if StatusTela = stInserindo then
      ExcluirDadosTransporte
    else if StatusTela = stEditando then
    begin
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'ExcluiTransporte', [IdRegistroSelecionado], 'DELETE', 'Boolean');
      if TController.RetornoBoolean then
        ExcluirDadosTransporte;
    end;
  end;
end;

procedure TFEntradaNF.ExcluirDadosTransporte;
begin
  FDataModuleNFe.CDSReboque.EmptyDataSet;
  FDataModuleNFe.CDSVolumes.EmptyDataSet;
  FDataModuleNFe.CDSVolumesLacres.EmptyDataSet;
  //
  EditTransportadorId.Clear;
  ComboModalidadeFrete.ItemIndex := 0;
  EditTransportadorCpfCnpj.Clear;
  EditTransportadorRazaoSocial.Clear;
  EditTransportadorIE.Clear;
  EditTransportadorLogradouro.Clear;
  EditTransportadorCidade.Clear;
  EditTransportadorUF.Clear;
  EditRetencaoIcmsValorServico.Clear;
  EditRetencaoIcmsBaseCalculo.Clear;
  EditRetencaoIcmsAliquota.Clear;
  EditRetencaoIcmsIcmsRetido.Clear;
  EditRetencaoIcmsCfop.Clear;
  EditRetencaoIcmsCidade.Clear;
  EditVeiculoPlaca.Clear;
  EditVeiculoUf.Clear;
  EditVeiculoRntc.Clear;
  EditRetencaoIcmsUf.Clear;
  EditTransporteVagao.Clear;
  EditTransporteBalsa.Clear;
end;

procedure TFEntradaNF.ActionExcluirItemExecute(Sender: TObject);
begin
  if Application.MessageBox('Tem certeza que deseja remover o item da nota fiscal?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
  begin
    if StatusTela = stInserindo then
      FDataModuleNFe.CDSNfeDetalhe.Delete
    else if StatusTela = stEditando then
    begin
      TController.ExecutarMetodo('NfeCabecalhoController.TNfeCabecalhoController', 'ExcluiItem', [FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger], 'DELETE', 'Boolean');
      if TController.RetornoBoolean then
        FDataModuleNFe.CDSNfeDetalhe.Delete;
    end;
  end;
end;
{$EndREGION 'Exclusões Internas'}

{$REGION 'Actions'}
procedure TFEntradaNF.ActionCadastrarProdutoExecute(Sender: TObject);
begin
  if not FDataModuleNFe.CDSNfeDetalhe.IsEmpty then
  begin
    if FDataModuleNFe.CDSNfeDetalhe.FieldByName('CADASTRADO').AsString = 'N' then
    begin
      if Application.MessageBox('Deseja cadatrar o produto selecionado?', 'Pergunta do Sistema', MB_YesNo + MB_IconQuestion) = IdYes then
      begin
        Application.CreateForm(TFproduto, FProduto);
        FProduto.Position := poScreenCenter;
        FProduto.UsadoPorOutroModulo := True;
        FProduto.BotaoInserir.Click;
        Fproduto.EditGtin.Text := FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN').AsString;
        Fproduto.EditNcm.Text := FDataModuleNFe.CDSNfeDetalhe.FieldByName('NCM').AsString;
        Fproduto.EditNome.Text := Copy(FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString, 1, 100);
        Fproduto.EditDescricaoPdv.Text := Copy(FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString, 1, 30);
        Fproduto.MemoDescricao.Text := FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString;
        Fproduto.EditValorCompra.Value := FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_BRUTO_PRODUTO').AsExtended;
        Fproduto.EditExTipi.Text := FDataModuleNFe.CDSNfeDetalhe.FieldByName('EX_TIPI').AsString;
        FProduto.ShowModal;
        VerificarProdutosCadatrados;
      end;
    end
    else
      Application.MessageBox('O produto já está cadastrado.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
  end
  else
    Application.MessageBox('Não existem itens para cadastro.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
end;

procedure TFEntradaNF.ActionIncluirItemExecute(Sender: TObject);
begin
  { Importar Produto - Inclusão Manual da Nota}
  try
    PopulaCamposTransientesLookup(TProdutoVO, TProdutoController);
    if CDSTransiente.RecordCount > 0 then
    begin
      inc(SeqItem);
      FDataModuleNFe.CDSNfeDetalhe.Append;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger := SeqItem;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_PRODUTO').AsInteger := CDSTransiente.FieldByName('ID').AsInteger;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_NFE_CABECALHO').AsInteger := 0;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('NUMERO_ITEM').AsInteger := SeqItem;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('CADASTRADO').AsString := 'S';
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('CODIGO_PRODUTO').AsString := CDSTransiente.FieldByName('GTIN').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN').AsString := CDSTransiente.FieldByName('GTIN').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString := CDSTransiente.FieldByName('NOME').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('NCM').AsString := CDSTransiente.FieldByName('NCM').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('EX_TIPI').AsString := CDSTransiente.FieldByName('EX_TIPI').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('CFOP').AsInteger := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_COMERCIAL').AsString := CDSTransiente.FieldByName('UNIDADE_PRODUTO.SIGLA').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_COMERCIAL').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_COMERCIAL').AsExtended := CDSTransiente.FieldByName('VALOR_VENDA').AsExtended;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_BRUTO_PRODUTO').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN_UNIDADE_TRIBUTAVEL').AsString := CDSTransiente.FieldByName('GTIN').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_TRIBUTAVEL').AsString := CDSTransiente.FieldByName('UNIDADE_PRODUTO.SIGLA').AsString;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_TRIBUTAVEL').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_TRIBUTAVEL').AsExtended := CDSTransiente.FieldByName('VALOR_VENDA').AsExtended;
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_FRETE').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SEGURO').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_DESCONTO').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_OUTRAS_DESPESAS').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('ENTRA_TOTAL').AsString := '0';
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SUBTOTAL').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_TOTAL').AsExtended := 0; //usuário deve digitar
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('PERSISTE').AsString := 'I';
    end;
  finally
    CDSTransiente.Close;
  end;
end;

procedure TFEntradaNF.ActionSelecionarArquivoExecute(Sender: TObject);
begin
  try
    CarregarDadosXML;
    VerificarProdutosCadatrados;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro. Informe a mensagem ao Administrador do sistema.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFEntradaNF.CarregarDadosXML;
var
  i, j, k: Integer;
  NFeRTXT: TNFeRTXT;
  NfeCabecalhoVO: TNfeCabecalhoVO;
begin
  FDataModule.OpenDialog.FileName := '';
  FDataModule.OpenDialog.Title := 'Selecione a NFE';
  FDataModule.OpenDialog.DefaultExt := '*-nfe.XML';
  FDataModule.OpenDialog.Filter := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Arquivos TXT (*.TXT)|*.TXT|Todos os Arquivos (*.*)|*.*';
  FDataModule.OpenDialog.InitialDir := FDataModule.ACBrNFe.Configuracoes.Arquivos.PathSalvar;

  if FDataModule.OpenDialog.Execute then
  begin
    FDataModule.ACBrNFe.NotasFiscais.Clear;

    try
      FDataModule.ACBrNFe.NotasFiscais.LoadFromFile(FDataModule.OpenDialog.FileName);
    except
      Application.MessageBox('Arquivo NFe Inválido.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
      Exit;
    end;

    with FDataModule.ACBrNFe.NotasFiscais.Items[0].NFe do begin

      //Verifica se a nota já foi importada e está gravada no banco de dados
      NfeCabecalhoVO := TNfeCabecalhoVO(TController.BuscarObjeto('NfeCabecalhoController.TNfeCabecalhoController', 'ConsultaObjeto', ['CHAVE_ACESSO=' + QuotedStr(procNFe.chNFe)], 'GET'));
      if Assigned(NfeCabecalhoVO) then
      begin
        Application.MessageBox('A nota selecionada já foi importada.', 'Mensagem do Sistema', MB_OK + MB_ICONINFORMATION);
        FDataModule.ACBrNFe.NotasFiscais.Clear;
        Exit;
      end;

      { NFe Cabeçalho }
      EditCodigoNumerico.Text := IntToStr(Ide.cNF);
      EditNaturezaOperacao.Text := Ide.natOp;
      ComboBoxFormaPagamento.ItemIndex := StrToInt(IndpagToStr(Ide.indPag));
      ComboboxModeloNotaFiscal.ItemIndex := AnsiIndexStr(IntToStr(Ide.Modelo), ['1', '55']); ;
      EditSerie.Text := IntToStr(Ide.Serie);
      EditNumeroNfe.Text := IntToStr(Ide.nNF);
      EditDataEmissao.Date := Ide.dEmi;
      EditDataEntradaSaida.Date := Ide.dSaiEnt;
      EditHoraEntradaSaida.Text := FormatDateTime('hh:MM:ss', Ide.hSaiEnt);
      ComboTipoOperacao.ItemIndex := StrToInt(tpNFToStr(Ide.tpNF));
      ComboFormaImpDanfe.ItemIndex := StrToInt(TpImpToStr(Ide.tpImp)) - 1;
      ComboTipoEmissao.ItemIndex := StrToInt(TpEmisToStr(Ide.tpEmis)) - 1;
      EditChaveAcesso.Text := procNFe.chNFe;
      EditDigitoChaveAcesso.Text := IntToStr(Ide.cDV);
      ComboFinalidadeEmissao.ItemIndex := StrToInt(FinNFeToStr(Ide.finNFe)) - 1;

      { NFe Cabeçalho -- Totais }
      EditBCIcms.Value := Total.ICMSTot.vBC;
      EditValorIcms.Value := Total.ICMSTot.vICMS;
      EditBCIcmsSt.Value := Total.ICMSTot.vBCST;
      EditValorIcmsSt.Value := Total.ICMSTot.vST;
      EditTotalProdutos.Value := Total.ICMSTot.vProd;
      EditValorFrete.Value := Total.ICMSTot.vFrete;
      EditValorSeguro.Value := Total.ICMSTot.vSeg;
      EditValorDesconto.Value := Total.ICMSTot.vDesc;
      EditTotalImpostoImportacao.Value := Total.ICMSTot.vII;
      EditValorIPI.Value := Total.ICMSTot.vIPI;
      EditValorPIS.Value := Total.ICMSTot.vPIS;
      EditValorCOFINS.Value := Total.ICMSTot.vCOFINS;
      EditValorOutrasDespesas.Value := Total.ICMSTot.vOutro;
      EditValorTotalNota.Value := Total.ICMSTot.vNF;

      EditValorTotalServicos.Value := Total.ISSQNtot.vServ;
      EditBaseCalculoIssqn.Value := total.ISSQNtot.vBC;
      EditValorIssqn.Value := total.ISSQNtot.vISS;
      EditValorPisIssqn.Value := total.ISSQNtot.vPIS;
      EditValorCofinsIssqn.Value := total.ISSQNtot.vCOFINS;

      EditValorRetidoPis.Value := total.retTrib.vRetPIS;
      EditValorRetidoCofins.Value := total.retTrib.vRetCOFINS;
      EditValorRetidoCsll.Value := total.retTrib.vRetCSLL;
      EditBaseCalculoIrrf.Value := total.retTrib.vBCIRRF;
      EditValorRetidoIrrf.Value := total.retTrib.vIRRF;
      EditBaseCalculoPrevidencia.Value := total.retTrib.vBCRetPrev;
      EditValorRetidoPrevidencia.Value := total.retTrib.vRetPrev;

      { NFe Cabeçalho -- Informações Adicionais }

      EditComexUfEmbarque.Text := exporta.UFembarq;
      EditComexLocalEmbarque.Text := exporta.xLocEmbarq;
      EditCompraNotaEmpenho.Text := compra.xNEmp;
      EditCompraPedido.Text := compra.xPed;
      EditCompraContrato.Text := compra.xCont;
      MemoInfComplementarFisco.Text := InfAdic.infAdFisco;
      MemoInfComplementarContribuinte.Text := InfAdic.infCpl;


      { Emitente }
      EditEmitenteId.Text := '';
      EditEmitenteCpfCnpj.Text := Emit.CNPJCPF;
      EditEmitenteRazao.Text := Emit.xNome;
      EditEmitenteFantasia.Text := Emit.xFant;
      EditEmitenteLogradouro.Text := Emit.EnderEmit.xLgr;
      EditEmitenteNumero.Text := Emit.EnderEmit.nro;
      EditEmitenteComplemento.Text := Emit.EnderEmit.xCpl;
      EditEmitenteBairro.Text := Emit.EnderEmit.xBairro;
      EditEmitenteCodigoIbge.Text := Emit.EnderEmit.cMun.ToString;
      EditEmitenteCidade.Text := Emit.EnderEmit.xMun;
      EditEmitenteUF.Text := Emit.EnderEmit.Uf;
      EditEmitenteCEP.Text := IntToStr(Emit.EnderEmit.Cep);
      EditEmitenteTelefone.Text := Emit.EnderEmit.fone;
      EditEmitenteIE.Text := Emit.Ie;
      EditEmitenteIEST.Text := Emit.IEST;
      EditEmitenteIM.Text := Emit.IM;
      ComboEmitenteCrt.ItemIndex := StrToInt(CRTToStr(Emit.Crt)) - 1;
      EditEmitenteCNAE.Text := Emit.CNAE;

      { NFe Detalhe }
      FDataModuleNFe.CDSNfeDetalhe.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoIcms.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoIssqn.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoIpi.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoImportacao.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoPis.EmptyDataSet;
      FDataModuleNFe.CDSNfeImpostoCofins.EmptyDataSet;
      FDataModuleNFe.CDSNfeDeclaracaoImportacao.EmptyDataSet;
      FDataModuleNFe.CDSNfeImportacaoDetalhe.EmptyDataSet;
      FDataModuleNFe.CDSNfeDetalheVeiculo.EmptyDataSet;
      FDataModuleNFe.CDSNfeDetalheMedicamento.EmptyDataSet;
      FDataModuleNFe.CDSNfeDetalheArmamento.EmptyDataSet;
      FDataModuleNFe.CDSNfeDetalheCombustivel.EmptyDataSet;
      for i := 0 to Det.Count - 1 do begin
        with Det.Items[i] do begin
          FDataModuleNFe.CDSNfeDetalhe.Append;
          // O ID será setado como "i" para facilitar a vinculação com as tabelas filhas no momento de uma inclusão e será zerado antes de subir para o servidor
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID').AsInteger := i;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_PRODUTO').AsInteger := 0;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_NFE_CABECALHO').AsInteger := 0;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('NUMERO_ITEM').AsInteger := Prod.nItem;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('CODIGO_PRODUTO').AsString := Prod.cProd;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN').AsString := Prod.cEAN;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('NOME_PRODUTO').AsString := Prod.xProd;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('NCM').AsString := Prod.Ncm;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('EX_TIPI').AsString := Prod.ExTipi;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('CFOP').AsInteger := StrToInt(Prod.Cfop);
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_COMERCIAL').AsString := Prod.uCom;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_COMERCIAL').AsExtended := Prod.qCom;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_COMERCIAL').AsExtended := Prod.vUnCom;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_BRUTO_PRODUTO').AsExtended := Prod.vProd;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN_UNIDADE_TRIBUTAVEL').AsString := Prod.cEANTrib;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('UNIDADE_TRIBUTAVEL').AsString := Prod.uTrib;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('QUANTIDADE_TRIBUTAVEL').AsExtended := Prod.qTrib;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_UNITARIO_TRIBUTAVEL').AsExtended := Prod.vUnTrib;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_FRETE').AsExtended := Prod.vFrete;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SEGURO').AsExtended := Prod.vSeg;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_DESCONTO').AsExtended := Prod.vDesc;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_OUTRAS_DESPESAS').AsExtended := Prod.vOutro;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('ENTRA_TOTAL').AsString := indTotToStr(Prod.IndTot);
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_SUBTOTAL').AsExtended := Prod.qCom * Prod.vUnCom;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('VALOR_TOTAL').AsExtended := (Prod.qCom * Prod.vUnCom) + Prod.vFrete + Prod.vSeg + Prod.vOutro - Prod.vDesc;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('INFORMACOES_ADICIONAIS').AsString := infAdProd;
          FDataModuleNFe.CDSNfeDetalhe.FieldByName('PERSISTE').AsString := 'I';

          { Impostos }
          with Imposto do begin
            if ISSQN.cSitTrib = ISSQNcSitTribVazio then begin
              with ICMS do begin
                FDataModuleNFe.CDSNfeImpostoIcms.Append;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ORIGEM_MERCADORIA').AsString := OrigToStr(orig);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CST_ICMS').AsString := CSTICMSToStr(CST);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('CSOSN').AsString := CSOSNIcmsToStr(Csosn);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS').AsString := modBCToStr(modBC);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('TAXA_REDUCAO_BC_ICMS').AsExtended := pRedBC;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('BASE_CALCULO_ICMS').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS').AsExtended := pICMS;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS').AsExtended := vICMS;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MOTIVO_DESONERACAO_ICMS').AsString := motDesICMSToStr(motDesICMS);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('MODALIDADE_BC_ICMS_ST').AsString := modBCSTToStr(modBCST);
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_MVA_ICMS_ST').AsExtended := pMVAST;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_REDUCAO_BC_ICMS_ST').AsExtended := pRedBCST;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BASE_CALCULO_ICMS_ST').AsExtended := vBCST;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_ICMS_ST').AsExtended := pICMSST;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST').AsExtended := vICMSST;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_RETIDO').AsExtended := vBCSTRet;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_RETIDO').AsExtended := vICMSSTRet;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_BC_ICMS_ST_DESTINO').AsExtended := vBCSTDest;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_ICMS_ST_DESTINO').AsExtended := vICMSSTDest;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('ALIQUOTA_CREDITO_ICMS_SN').AsExtended := pCredSN;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('VALOR_CREDITO_ICMS_SN').AsExtended := vCredICMSSN;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('PERCENTUAL_BC_OPERACAO_PROPRIA').AsExtended := pBCOp;
                FDataModuleNFe.CDSNfeImpostoIcms.FieldByName('UF_ST').AsString := UfSt;
                FDataModuleNFe.CDSNfeImpostoIcms.Post;
              end;
            end
            else begin
              with ISSQN do begin
                FDataModuleNFe.CDSNfeImpostoIssqn.Append;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('BASE_CALCULO_ISSQN').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ALIQUOTA_ISSQN').AsExtended := vAliq;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('VALOR_ISSQN').AsExtended := vISSQN;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('MUNICIPIO_ISSQN').AsInteger := cMunFG;
                FDataModuleNFe.CDSNfeImpostoIssqn.FieldByName('ITEM_LISTA_SERVICOS').AsString := cListServ;
                FDataModuleNFe.CDSNfeImpostoIssqn.Post;
              end;
            end;

            if (IPI.vBC > 0) then begin
              with IPI do begin
                FDataModuleNFe.CDSNfeImpostoIpi.Append;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_IPI').AsString := clEnq;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CNPJ_PRODUTOR').AsString := CNPJProd;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CODIGO_SELO_IPI').AsString := cSelo;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_SELO_IPI').AsInteger := qSelo;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ENQUADRAMENTO_LEGAL_IPI').AsString := cEnq;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('CST_IPI').AsString := CSTIPIToStr(CST);
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_BASE_CALCULO_IPI').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('ALIQUOTA_IPI').AsExtended := pIPI;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('QUANTIDADE_UNIDADE_TRIBUTAVEL').AsExtended := qUnid;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_UNIDADE_TRIBUTAVEL').AsExtended := vUnid;
                FDataModuleNFe.CDSNfeImpostoIpi.FieldByName('VALOR_IPI').AsExtended := vIPI;
                FDataModuleNFe.CDSNfeImpostoIpi.Post;
              end;
            end;

            if (II.vBC > 0) then begin
              with II do begin
                FDataModuleNFe.CDSNfeImpostoImportacao.Append;
                FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_BC_II').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_DESPESAS_ADUANEIRAS').AsExtended := vDespAdu;
                FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IMPOSTO_IMPORTACAO').AsExtended := vII;
                FDataModuleNFe.CDSNfeImpostoImportacao.FieldByName('VALOR_IOF').AsExtended := vIOF;
                FDataModuleNFe.CDSNfeImpostoImportacao.Post;
              end;
            end;

            with PIS do begin
              FDataModuleNFe.CDSNfeImpostoPis.Append;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('CST_PIS').AsString := CSTPISToStr(CST);
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('QUANTIDADE_VENDIDA').AsExtended := qBCProd;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_BASE_CALCULO_PIS').AsExtended := vBC;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_PERCENTUAL').AsExtended := pPIS;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_REAIS').AsExtended := vAliqProd;
              FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_PIS').AsExtended := vPIS;
              FDataModuleNFe.CDSNfeImpostoPis.Post;
            end;

            if (PISST.vBC > 0) then begin
              with PISST do begin
                FDataModuleNFe.CDSNfeImpostoPis.Append;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('QUANTIDADE_VENDIDA').AsExtended := qBCProd;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_BASE_CALCULO_PIS').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_PERCENTUAL').AsExtended := pPIS;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('ALIQUOTA_PIS_REAIS').AsExtended := vAliqProd;
                FDataModuleNFe.CDSNfeImpostoPis.FieldByName('VALOR_PIS').AsExtended := vPIS;
                FDataModuleNFe.CDSNfeImpostoPis.Post;
              end;
            end;

            with COFINS do begin
              FDataModuleNFe.CDSNfeImpostoCofins.Append;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('CST_COFINS').AsString := CSTCOFINSToStr(CST);
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('QUANTIDADE_VENDIDA').AsExtended := qBCProd;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('BASE_CALCULO_COFINS').AsExtended := vBC;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_PERCENTUAL').AsExtended := pCOFINS;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_REAIS').AsExtended := vAliqProd;
              FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('VALOR_COFINS').AsExtended := vCOFINS;
              FDataModuleNFe.CDSNfeImpostoCofins.Post;
            end;

            if (COFINSST.vBC > 0) then begin
              with COFINSST do begin
                FDataModuleNFe.CDSNfeImpostoCofins.Append;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('QUANTIDADE_VENDIDA').AsExtended := qBCProd;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('BASE_CALCULO_COFINS').AsExtended := vBC;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_PERCENTUAL').AsExtended := pCOFINS;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('ALIQUOTA_COFINS_REAIS').AsExtended := vAliqProd;
                FDataModuleNFe.CDSNfeImpostoCofins.FieldByName('VALOR_COFINS').AsExtended := vCOFINS;
                FDataModuleNFe.CDSNfeImpostoCofins.Post;
              end;
            end;
          end;

          { Declaração Importação }
          for j := 0 to Prod.DI.Count - 1 do begin
            if Prod.DI.Items[j].nDi <> '' then begin
              with Prod.DI.Items[j] do begin
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.Append;
                // O ID será setado como "i" para facilitar a vinculação com as tabelas filhas no momento de uma inclusão e será zerado antes de subir para o servidor
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('ID').AsInteger := i + j;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('ID_NFE_DETALHE').AsInteger := i;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('NUMERO_DOCUMENTO').AsString := nDi;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('DATA_REGISTRO').AsDateTime := dDi;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('LOCAL_DESEMBARACO').AsString := xLocDesemb;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('UF_DESEMBARACO').AsString := UFDesemb;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('DATA_DESEMBARACO').AsDateTime := dDesemb;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.FieldByName('UF_DESEMBARACO').AsString := cExportador;
                FDataModuleNFe.CDSNfeDeclaracaoImportacao.Post;

                for k := 0 to adi.Count - 1 do begin
                  with adi.Items[k] do begin
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.Append;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('ID_NFE_DECLARACAO_IMPORTACAO').AsInteger := i + j;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('NUMERO_ADICAO').AsInteger := nAdicao;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('NUMERO_SEQUENCIAL').AsInteger := nSeqAdi;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('CODIGO_FABRICANTE_ESTRANGEIRO').AsString := cFabricante;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.FieldByName('VALOR_DESCONTO').AsExtended := vDescDI;
                    FDataModuleNFe.CDSNfeImportacaoDetalhe.Post;
                  end;
                end;
              end;
            end
            else
              Break;
          end;

          { Detalhamento Específico de Veículos novos }
          if Prod.veicProd.Chassi <> '' then begin
            with Prod.veicProd do begin
              FDataModuleNFe.CDSNfeDetalheVeiculo.Append;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_OPERACAO').AsString := tpOPToStr(tpOP);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CHASSI').AsString := Chassi;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('COR').AsString := cCor;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DESCRICAO_COR').AsString := xCor;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('POTENCIA_MOTOR').AsString := pot;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CILINDRADAS').AsString := Cilin;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_LIQUIDO').AsString := pesoL;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('PESO_BRUTO').AsString := pesoB;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_SERIE').AsString := nSerie;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_COMBUSTIVEL').AsString := tpComb;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('NUMERO_MOTOR').AsString := nMotor;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CAPACIDADE_MAXIMA_TRACAO').AsString := CMT;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('DISTANCIA_EIXOS').AsString := dist;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_MODELO').AsString := IntToStr(anoMod);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ANO_FABRICACAO').AsString := IntToStr(anoFab);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_PINTURA').AsString := tpPint;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('TIPO_VEICULO').AsString := IntToStr(tpVeic);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('ESPECIE_VEICULO').AsString := IntToStr(espVeic);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VIN').AsString := VIN;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CONDICAO_VEICULO').AsString := condVeicToStr(condVeic);
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_MARCA_MODELO').AsString := cMod;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('CODIGO_COR').AsString := cCorDENATRAN;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('LOTACAO').AsInteger := lota;
              FDataModuleNFe.CDSNfeDetalheVeiculo.FieldByName('RESTRICAO').AsInteger := tpRest;
              FDataModuleNFe.CDSNfeDetalheVeiculo.Post;
            end;
          end;

          { Detalhamento Específico de Medicamento }
          for j := 0 to Prod.med.Count - 1 do begin
            with Prod.med.Items[j] do begin
              FDataModuleNFe.CDSNfeDetalheMedicamento.Append;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('NUMERO_LOTE').AsString := nLote;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('QUANTIDADE_LOTE').AsExtended := qLote;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('DATA_FABRICACAO').AsDateTime := dFab;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('DATA_VALIDADE').AsDateTime := dVal;
              FDataModuleNFe.CDSNfeDetalheMedicamento.FieldByName('PRECO_MAXIMO_CONSUMIDOR').AsExtended := vPMC;
              FDataModuleNFe.CDSNfeDetalheMedicamento.Post;
            end;
          end;

          { Detalhamento Específico de Armamentos }
          for j := 0 to Prod.arma.Count - 1 do begin
            with Prod.arma.Items[j] do begin
              FDataModuleNFe.CDSNfeDetalheArmamento.Append;
              FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('TIPO_ARMA').AsString := tpArmaToStr(tpArma);
              FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('NUMERO_SERIE_ARMA').AsString := nSerie;
              FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('NUMERO_SERIE_CANO').AsString := nCano;
              FDataModuleNFe.CDSNfeDetalheArmamento.FieldByName('DESCRICAO').AsString := descr;
              FDataModuleNFe.CDSNfeDetalheArmamento.Post;
            end;
          end;

          { Detalhamento Específico de Combustíveis }
          if (Prod.comb.cProdANP > 0) then begin
            with Prod.comb do begin
              FDataModuleNFe.CDSNfeDetalheCombustivel.Append;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ID_NFE_DETALHE').AsInteger := i;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIGO_ANP').AsInteger := cProdANP;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('CODIF').AsString := Codif;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('QUANTIDADE_TEMP_AMBIENTE').AsExtended := qTemp;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('UF_CONSUMO').AsString := UFCons;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('BASE_CALCULO_CIDE').AsExtended := CIDE.qBCProd;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('ALIQUOTA_CIDE').AsExtended := CIDE.vAliqProd;
              FDataModuleNFe.CDSNfeDetalheCombustivel.FieldByName('VALOR_CIDE').AsExtended := CIDE.vCIDE;
              FDataModuleNFe.CDSNfeDetalheCombustivel.Post;
            end;
          end;

          FDataModuleNFe.CDSNfeDetalhe.Post;
        end;
      end;

      { Grupo de informação das NF/NF-e referenciadas }
      FDataModuleNFe.CDSNfeReferenciada.EmptyDataSet;
      FDataModuleNFe.CDSNfReferenciada.EmptyDataSet;
      FDataModuleNFe.CDSNfRuralReferenciada.EmptyDataSet;
      FDataModuleNFe.CDSCteReferenciado.EmptyDataSet;
      FDataModuleNFe.CDSCupomReferenciado.EmptyDataSet;
      for i := 0 to Ide.NFref.Count - 1 do begin
        { NF-e Referenciadas }
        if Ide.NFref.Items[i].refNFe <> '' then begin
          FDataModuleNFe.CDSNfeReferenciada.Append;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('ID_NFE_CABECALHO').AsInteger := i;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('CHAVE_ACESSO').AsString := Ide.NFref.Items[i].refNFe;
          FDataModuleNFe.CDSNfeReferenciada.Post;
        end;

        { NF 1/1A Referenciadas }
        if Ide.NFref.Items[i].RefNF.Cnpj <> '' then begin
          FDataModuleNFe.CDSNfeReferenciada.Append;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('ID_NFE_CABECALHO').AsInteger := i;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('CODIGO_UF').AsInteger := Ide.NFref.Items[i].RefNF.cUF;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('ANO_MES').AsString := Ide.NFref.Items[i].RefNF.AAMM;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('CNPJ').AsString := Ide.NFref.Items[i].RefNF.Cnpj;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('MODELO').AsInteger := Ide.NFref.Items[i].RefNF.Modelo;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('SERIE').AsInteger := Ide.NFref.Items[i].RefNF.Serie;
          FDataModuleNFe.CDSNfeReferenciada.FieldByName('NUMERO_NF').AsInteger := Ide.NFref.Items[i].RefNF.nNF;
          FDataModuleNFe.CDSNfeReferenciada.Post;
        end;

        { NF de produtor rural referenciada }
        if Ide.NFref.Items[i].RefNFP.CNPJCPF <> '' then begin
          FDataModuleNFe.CDSNfRuralReferenciada.Append;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('ID_NFE_CABECALHO').AsInteger := i;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('CODIGO_UF').AsInteger := Ide.NFref.Items[i].RefNFP.cUF;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('ANO_MES').AsString := Ide.NFref.Items[i].RefNFP.AAMM;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('CNPJ').AsString := Ide.NFref.Items[i].RefNFP.CNPJCPF;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('CPF').AsString := Ide.NFref.Items[i].RefNFP.CNPJCPF;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('INSCRICAO_ESTADUAL').AsString := Ide.NFref.Items[i].RefNFP.Ie;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('MODELO').AsString := Ide.NFref.Items[i].RefNFP.Modelo;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('SERIE').AsInteger := Ide.NFref.Items[i].RefNFP.Serie;
          FDataModuleNFe.CDSNfRuralReferenciada.FieldByName('NUMERO_NF').AsInteger := Ide.NFref.Items[i].RefNFP.nNF;
          FDataModuleNFe.CDSNfRuralReferenciada.Post;
        end;

        { CTF-e Referenciados }
        if Ide.NFref.Items[i].refCTe <> '' then begin
          FDataModuleNFe.CDSCteReferenciado.Append;
          FDataModuleNFe.CDSCteReferenciado.FieldByName('ID_NFE_CABECALHO').AsInteger := i;
          FDataModuleNFe.CDSCteReferenciado.FieldByName('CHAVE_ACESSO').AsString := Ide.NFref.Items[i].refCTe;
          FDataModuleNFe.CDSCteReferenciado.Post;
        end;

        { Cupom Fiscal Referenciados }
        if Ide.NFref.Items[i].RefECF.nCOO <> '' then begin
          FDataModuleNFe.CDSCupomReferenciado.Append;
          FDataModuleNFe.CDSCupomReferenciado.FieldByName('ID_NFE_CABECALHO').AsInteger := i;
          FDataModuleNFe.CDSCupomReferenciado.FieldByName('MODELO_DOCUMENTO_FISCAL').AsString := ECFModRefToStr(Ide.NFref.Items[i].RefECF.Modelo);
          FDataModuleNFe.CDSCupomReferenciado.FieldByName('NUMERO_ORDEM_ECF').AsInteger := StrToInt(Ide.NFref.Items[i].RefECF.nECF);
          FDataModuleNFe.CDSCupomReferenciado.FieldByName('COO').AsString := Ide.NFref.Items[i].RefECF.nCOO;
          FDataModuleNFe.CDSCupomReferenciado.Post;
        end;
      end;

      { Local Entrega }
      if Entrega.CNPJCPF <> '' then begin
        EditEntregaCpfCnpj.Text := Entrega.CNPJCPF;
        EditEntregaLogradouro.Text := Entrega.xLgr;
        EditEntregaNumero.Text := Entrega.nro;
        EditEntregaComplemento.Text := Entrega.xCpl;
        EditEntregaBairro.Text := Entrega.xBairro;
        EditEntregaIbge.AsInteger := Entrega.cMun;
        EditEntregaCidade.Text := Entrega.xMun;
        EditEntregaUf.Text := Entrega.Uf;
      end;

      { Local Retirada }
      if Retirada.CNPJCPF <> '' then begin
        EditRetiradaCpfCnpj.Text := Retirada.CNPJCPF;
        EditRetiradaLogradouro.Text := Retirada.xLgr;
        EditRetiradaNumero.Text := Retirada.nro;
        EditRetiradaComplemento.Text := Retirada.xCpl;
        EditRetiradaBairro.Text := Retirada.xBairro;
        EditRetiradaIbge.AsInteger := Retirada.cMun;
        EditRetiradaCidade.Text := Retirada.xMun;
        EditRetiradaUf.Text := Retirada.Uf;
      end;

      { Transporte }
      EditTransportadorId.Text := '';
      ComboModalidadeFrete.ItemIndex := StrToInt(modFreteToStr(Transp.modFrete));
      EditTransportadorCpfCnpj.Text := Transp.Transporta.CNPJCPF;
      EditTransportadorRazaoSocial.Text := Transp.Transporta.xNome;
      EditTransportadorIE.Text := Transp.Transporta.Ie;
      EditTransportadorLogradouro.Text := Transp.Transporta.xEnder;
      EditTransportadorCidade.Text := Transp.Transporta.xMun;
      EditTransportadorUF.Text := Transp.Transporta.Uf;
      EditRetencaoIcmsValorServico.Value := Transp.retTransp.vServ;
      EditRetencaoIcmsBaseCalculo.Value := Transp.retTransp.vBCRet;
      EditRetencaoIcmsAliquota.Value := Transp.retTransp.pICMSRet;
      EditRetencaoIcmsIcmsRetido.Value := Transp.retTransp.vICMSRet;
      EditRetencaoIcmsCfop.Text := Transp.retTransp.Cfop;
      EditRetencaoIcmsCidade.AsInteger := Transp.retTransp.cMunFG;
      EditVeiculoPlaca.Text := Transp.veicTransp.Placa;
      EditVeiculoUf.Text := Transp.veicTransp.Uf;
      EditVeiculoRntc.Text := Transp.veicTransp.Rntc;
      EditTransporteVagao.Text := Transp.Vagao;
      EditTransporteBalsa.Text := Transp.Balsa;

      FDataModuleNFe.CDSReboque.EmptyDataSet;
      for i := 0 to Transp.Reboque.Count - 1 do begin
        with Transp.Reboque.Items[i] do begin
          FDataModuleNFe.CDSReboque.Append;
          FDataModuleNFe.CDSReboque.FieldByName('PLACA').AsString := Transp.Reboque.Items[i].Placa;
          FDataModuleNFe.CDSReboque.FieldByName('UF').AsString := Transp.Reboque.Items[i].Uf;
          FDataModuleNFe.CDSReboque.FieldByName('RNTC').AsString := Transp.Reboque.Items[i].Rntc;
          FDataModuleNFe.CDSReboque.Post;
        end;
      end;

      FDataModuleNFe.CDSVolumes.EmptyDataSet;
      FDataModuleNFe.CDSVolumesLacres.EmptyDataSet;
      for i := 0 to Transp.Vol.Count - 1 do begin
        with Transp.Vol.Items[i] do begin
          FDataModuleNFe.CDSVolumes.Append;
          FDataModuleNFe.CDSVolumes.FieldByName('QUANTIDADE').AsExtended := qVol;
          FDataModuleNFe.CDSVolumes.FieldByName('ESPECIE').AsString := esp;
          FDataModuleNFe.CDSVolumes.FieldByName('MARCA').AsString := Marca;
          FDataModuleNFe.CDSVolumes.FieldByName('NUMERACAO').AsString := nVol;
          FDataModuleNFe.CDSVolumes.FieldByName('PESO_LIQUIDO').AsExtended := pesoL;
          FDataModuleNFe.CDSVolumes.FieldByName('PESO_BRUTO').AsExtended := pesoB;
          FDataModuleNFe.CDSVolumes.Post;

          for j := 0 to Lacres.Count - 1 do begin
            FDataModuleNFe.CDSVolumesLacres.Append;
            FDataModuleNFe.CDSVolumesLacres.FieldByName('NUMERO').AsString := Lacres.Items[j].nLacre;
            FDataModuleNFe.CDSVolumesLacres.Post;
          end;
        end;
      end;

      { Fatura }
      EditFaturaNumero.Text := Cobr.Fat.nFat;
      EditFaturaValorOriginal.Value := Cobr.Fat.vOrig;
      EditFaturaValorDesconto.Value := Cobr.Fat.vDesc;
      EditFaturaValorLiquido.Value := Cobr.Fat.vLiq;

      { Duplicatas }
      FDataModuleNFe.CDSDuplicata.EmptyDataSet;
      for i := 0 to Cobr.Dup.Count - 1 do begin
        with Cobr.Dup.Items[i] do begin
          FDataModuleNFe.CDSDuplicata.Append;
          FDataModuleNFe.CDSDuplicata.FieldByName('NUMERO').AsString := nDup;
          FDataModuleNFe.CDSDuplicata.FieldByName('DATA_VENCIMENTO').AsDateTime := dVenc;
          FDataModuleNFe.CDSDuplicata.FieldByName('VALOR').AsExtended := vDup;
          FDataModuleNFe.CDSDuplicata.Post;
        end;
      end;

      MemoInfComplementarContribuinte.Text := InfAdic.infCpl;
      MemoInfComplementarFisco.Text := InfAdic.infAdFisco;
    end;
    ActionSelecionarArquivo.Enabled := False;
  end;
end;

function TFEntradaNF.VerificarProdutosCadatrados: Boolean;
var
  ProdutoVO: TProdutoVO;
  TodosCadastrados: Boolean;
begin
  TodosCadastrados := True;
  FDataModuleNFe.CDSNfeDetalhe.DisableControls;
  FDataModuleNFe.CDSNfeDetalhe.First;
  while not FDataModuleNFe.CDSNfeDetalhe.Eof do
  begin
    ProdutoVO := TProdutoVO(TController.BuscarObjeto('ProdutoController.TProdutoController', 'ConsultaObjeto', ['GTIN=' + FDataModuleNFe.CDSNfeDetalhe.FieldByName('GTIN').AsString], 'GET'));
    FDataModuleNFe.CDSNfeDetalhe.Edit;
    if Assigned(ProdutoVO) then
    begin
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('CADASTRADO').AsString := 'S';
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('ID_PRODUTO').AsInteger := ProdutoVO.Id;
    end
    else
    begin
      FDataModuleNFe.CDSNfeDetalhe.FieldByName('CADASTRADO').AsString := 'N';
      TodosCadastrados := False;
    end;
    FDataModuleNFe.CDSNfeDetalhe.Post;
    FDataModuleNFe.CDSNfeDetalhe.Next;
    FreeAndNil(ProdutoVO);
  end;
  FDataModuleNFe.CDSNfeDetalhe.First;
  FDataModuleNFe.CDSNfeDetalhe.EnableControls;
  //
  Result := TodosCadastrados;
end;
{$ENDREGION}

{$REGION 'Campos Transientes'}
procedure TFEntradaNF.EditEmitenteIdKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  Filtro: String;
begin
  if Key = VK_F1 then
  begin
    if EditEmitenteId.Value <> 0 then
      Filtro := 'ID = ' + EditEmitenteId.Text
    else
      Filtro := 'ID=0';

    try
      LimparCamposEmitente;
      if not PopulaCamposTransientes(Filtro, TViewPessoaFornecedorVO, TViewPessoaFornecedorController) then
        PopulaCamposTransientesLookup(TViewPessoaFornecedorVO, TViewPessoaFornecedorController);
      if CDSTransiente.RecordCount > 0 then
      begin
        EditEmitenteId.Text := CDSTransiente.FieldByName('ID').AsString;
        EditEmitenteCpfCnpj.Text := CDSTransiente.FieldByName('CPF_CNPJ').AsString;
        EditEmitenteRazao.Text := CDSTransiente.FieldByName('NOME').AsString;
        EditEmitenteFantasia.Text := CDSTransiente.FieldByName('NOME').AsString;
        EditEmitenteLogradouro.Text := CDSTransiente.FieldByName('LOGRADOURO').AsString;
        EditEmitenteNumero.Text := CDSTransiente.FieldByName('NUMERO').AsString;
        EditEmitenteComplemento.Text := CDSTransiente.FieldByName('COMPLEMENTO').AsString;
        EditEmitenteBairro.Text := CDSTransiente.FieldByName('BAIRRO').AsString;
        EditEmitenteCodigoIbge.Text := CDSTransiente.FieldByName('MUNICIPIO_IBGE').AsString;
        EditEmitenteCidade.Text := CDSTransiente.FieldByName('MUNICIPIO_IBGE').AsString;
        EditEmitenteUF.Text := CDSTransiente.FieldByName('UF').AsString;
        EditEmitenteCEP.Text := CDSTransiente.FieldByName('CEP').AsString;
        EditEmitenteTelefone.Text := CDSTransiente.FieldByName('FONE').AsString;
        EditEmitenteEmail.Text := CDSTransiente.FieldByName('EMAIL').AsString;
      end
      else
      begin
        Exit;
        EditEmitenteId.SetFocus;
      end;
    finally
      CDSTransiente.Close;
    end;
  end;
end;

procedure TFEntradaNF.EditIdEmpresaKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  Filtro: String;
begin
  if Key = VK_F1 then
  begin
    if EditIdEmpresa.Value <> 0 then
      Filtro := 'ID = ' + EditIdEmpresa.Text
    else
      Filtro := 'ID=0';

    try
      EditIdEmpresa.Clear;
      EditEmpresa.Clear;
      if not PopulaCamposTransientes(Filtro, TEmpresaVO, TEmpresaController) then
        PopulaCamposTransientesLookup(TEmpresaVO, TEmpresaController);
      if CDSTransiente.RecordCount > 0 then
      begin
        EditIdEmpresa.Text := CDSTransiente.FieldByName('ID').AsString;
        EditEmpresa.Text := CDSTransiente.FieldByName('RAZAO_SOCIAL').AsString;
      end
      else
      begin
        Exit;
        EditNaturezaOperacao.SetFocus;
      end;
    finally
      CDSTransiente.Close;
    end;
  end;
end;

procedure TFEntradaNF.EditTransportadorIdKeyUp(Sender: TObject; var Key: Word;  Shift: TShiftState);
var
  Filtro: String;
begin
  if Key = VK_F1 then
  begin
    if EditTransportadorId.Value <> 0 then
      Filtro := 'ID = ' + EditTransportadorId.Text
    else
      Filtro := 'ID=0';

    try
      LimparCamposTransportadora;
      if not PopulaCamposTransientes(Filtro, TViewPessoaTransportadoraVO, TViewPessoaTransportadoraController) then
        PopulaCamposTransientesLookup(TViewPessoaTransportadoraVO, TViewPessoaTransportadoraController);
      if CDSTransiente.RecordCount > 0 then
      begin
        EditTransportadorId.Text := CDSTransiente.FieldByName('ID').AsString;
        EditTransportadorCpfCnpj.Text := CDSTransiente.FieldByName('CPF_CNPJ').AsString;
        EditTransportadorRazaoSocial.Text := CDSTransiente.FieldByName('NOME').AsString;
        EditTransportadorLogradouro.Text := CDSTransiente.FieldByName('LOGRADOURO').AsString;
        EditTransportadorCidade.Text := CDSTransiente.FieldByName('MUNICIPIO_IBGE').AsString;
        EditTransportadorUF.Text := CDSTransiente.FieldByName('UF').AsString;
      end
      else
      begin
        Exit;
        EditTransportadorId.SetFocus;
      end;
    finally
      CDSTransiente.Close;
    end;
  end;
end;
{$ENDREGION}


/// EXERCICIO
///  Implemente a rotina para importar a nota diretamente do site da Sefaz
///  através da consulta à chave de acesso.

end.
