{ *******************************************************************************
Title: T2Ti ERP
Description: Janela Para Emissão de MDF-e

The MIT License

Copyright: Copyright (C) 2017 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 contaMDFed at:
t2ti.com@gmail.com

@author Albert Eije (alberteije@gmail.com)
@version 1.0
******************************************************************************* }
unit UMDFe;

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,
  ActnCtrls, Generics.Collections, ACBrDFeUtil, pcnConversao, StrUtils,
  LabeledCtrls, DB, DBClient, JvBaseEdits, JvExExtCtrls, JvNetscapeSplitter,
  Biblioteca, Actions, EmpresaVO, NFeConfiguracaoVO, NFeNumeroVO,
  ACBrMDFe, ACBrMDFeDAMDFeClass, ACBrMail, ACBrBase, ACBrDFe,
  ACBrMDFeDAMDFEFR, pmdfeConversaoMDFe, ACBrMDFeManifestos, Controller;


type

  TFMDFe = class(TFTelaCadastro)
    ActionManager: TActionManager;
    ScrollBox: TScrollBox;
    BevelEdits: TBevel;
    ActionToolBarEdits: TActionToolBar;
    PageControlEdits: TPageControl;
    TabSheetDadosNotaFiscal: TTabSheet;
    PanelDadosMDFe: TPanel;
    EditNumeroMDFe: TLabeledEdit;
    EditSerie: TLabeledEdit;
    EditNaturezaOperacao: TLabeledEdit;
    GroupBoxDestinatario: TGroupBox;
    EditEmitenteCpfCnpj: TLabeledEdit;
    EditEmitenteIE: TLabeledEdit;
    EditEmitenteTelefone: TLabeledEdit;
    EditEmitenteLogradouro: TLabeledEdit;
    EditEmitenteNumero: TLabeledEdit;
    EditEmitenteBairro: TLabeledEdit;
    EditEmitenteCEP: TLabeledEdit;
    EditEmitenteCidade: TLabeledEdit;
    EditEmitenteUF: TLabeledEdit;
    EditEmitenteComplemento: TLabeledEdit;
    EditEmitenteRazao: TLabeledEdit;
    EditEmitenteEmail: TLabeledEdit;
    TabSheetTipoTransporte: TTabSheet;
    TabSheetInformacoesAdicionais: TTabSheet;
    TabSheetCobranca: TTabSheet;
    PanelCobranca: TPanel;
    PanelFatura: TPanel;
    GroupBoxFatura: TGroupBox;
    TabSheetRespostaSefaz: TTabSheet;
    MemoRespostas: TMemo;
    EditDataHoraEmissao: TLabeledDateEdit;
    EditDataPrevisaoViagem: TLabeledDateEdit;
    ComboTipoEmitente: TLabeledComboBox;
    ComboTipoTransportadora: TLabeledComboBox;
    ComboModal: TLabeledComboBox;
    EditChaveAcesso: TLabeledEdit;
    GroupBox1: TGroupBox;
    GridNFe: TJvDBUltimGrid;
    EditCodigoNumerico: TLabeledEdit;
    EditDigitoChaveAcesso: TLabeledEdit;
    PageControlReferenciado: TPageControl;
    TabSheetTransporteRodoviario: TTabSheet;
    TabSheetTransporteAereo: TTabSheet;
    TabSheetTransporteAquaviario: TTabSheet;
    TabSheetTransporteFerroviario: TTabSheet;
    GridMDFeReferenciada: TJvDBUltimGrid;
    EditEmitenteId: TLabeledCalcEdit;
    ComboboxModeloNotaFiscal: TLabeledComboBox;
    PageControlTotais: TPageControl;
    tsTotaisGeral: TTabSheet;
    PanelTotais: TPanel;
    EditPesoBrutoCarga: TLabeledCalcEdit;
    EditValorTotalCarga: TLabeledCalcEdit;
    PanelInformacoesAdicionais: TPanel;
    ActionIncluirItem: TAction;
    ActionExcluirItem: TAction;
    ActionExcluirTipoTransporte: TAction;
    ActionToolBar2: TActionToolBar;
    ActionExcluirEntregaRetirada: TAction;
    ActionExcluirTransporte: TAction;
    ActionToolBar5: TActionToolBar;
    ActionExcluirCobranca: TAction;
    ActionSelecionarCertificado: TAction;
    ActionConsultarSefaz: TAction;
    ActionImprimirDaMDFe: TAction;
    ActionCancelarMDFe: TAction;
    ActionEnviar: TAction;
    ActionAssinar: TAction;
    ActionValidar: TAction;
    ActionAtualizarTotais: TAction;
    EditIdVenda: TLabeledCalcEdit;
    EditEmitenteCodigoIbge: TLabeledEdit;
    ActionInutilizarMDFe: TAction;
    ActionCCe: TAction;
    PageControlInformacoesAdicionais: TPageControl;
    TabSheet1: TTabSheet;
    Remetente: TTabSheet;
    Recebedor: TTabSheet;
    Expedidor: TTabSheet;
    EditAereoNumeroMinuta: TLabeledEdit;
    LabeledEdit43: TLabeledEdit;
    LabeledDateEdit1: TLabeledDateEdit;
    GroupBox7: TGroupBox;
    LabeledEdit44: TLabeledEdit;
    PageControl1: TPageControl;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    GridPedagio: TJvDBUltimGrid;
    TabSheet5: TTabSheet;
    GridVeiculo: TJvDBUltimGrid;
    GridMotorista: TJvDBUltimGrid;
    GridCiot: TJvDBUltimGrid;
    GroupBox8: TGroupBox;
    LabeledEdit48: TLabeledEdit;
    LabeledEdit49: TLabeledEdit;
    LabeledCalcEdit4: TLabeledCalcEdit;
    LabeledCalcEdit5: TLabeledCalcEdit;
    PageControl2: TPageControl;
    TabSheet6: TTabSheet;
    JvDBUltimGrid5: TJvDBUltimGrid;
    GroupBox9: TGroupBox;
    LabeledEdit47: TLabeledEdit;
    LabeledEdit50: TLabeledEdit;
    LabeledCalcEdit6: TLabeledCalcEdit;
    PageControl3: TPageControl;
    TabSheet7: TTabSheet;
    JvDBUltimGrid6: TJvDBUltimGrid;
    TabSheet8: TTabSheet;
    JvDBUltimGrid7: TJvDBUltimGrid;
    ActionStatusServico: TAction;
    GroupBox2: TGroupBox;
    GridSeguros: TJvDBUltimGrid;
    GroupBox3: TGroupBox;
    GridPercursos: TJvDBUltimGrid;
    GroupBox4: TGroupBox;
    GridMunicipiosCarregamento: TJvDBUltimGrid;
    GroupBox5: TGroupBox;
    GridLacres: TJvDBUltimGrid;
    GridMunicipiosDescarregamento: TJvDBUltimGrid;
    GroupBox6: TGroupBox;
    GridCTe: TJvDBUltimGrid;
    procedure FormCreate(Sender: TObject);
    procedure ActionSelecionarCertificadoExecute(Sender: TObject);
    procedure ActionConsultarSefazExecute(Sender: TObject);
    procedure ActionImprimirDaMDFeExecute(Sender: TObject);
    procedure ActionCancelarMDFeExecute(Sender: TObject);
    procedure ActionEnviarExecute(Sender: TObject);
    procedure ActionAssinarExecute(Sender: TObject);
    procedure ActionValidarExecute(Sender: TObject);
    procedure ActionGerarXmlExecute(Sender: TObject);
    procedure EditEmitenteIdKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure EditIdVendaKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure ActionStatusServicoExecute(Sender: TObject);
  private
    { Private declarations }
    procedure ConfigurarMDFe;
    procedure LimparCamposDestinatario;
  public
    { Public declarations }
    procedure GridParaEdits; override;
    procedure LimparCampos; override;

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

    procedure ConfigurarLayoutTela;
  end;

var
  FMDFe: TFMDFe;
  ObjetoNFeConfiguracaoVO: TNFeConfiguracaoVO;
  NFeNumeroVO: TNFeNumeroVO;
  Mensagem: String;

implementation

uses UDataModuleMDFe, UDataModule,

  MDFeCabecalhoVO, MDFePercursoVO, MDFeInformacaoSeguroVO, MDFeLacreVO,
  MDFeMunicipioCarregamentoVO, MDFeRodoviarioMotoristaVO, MDFeRodoviarioCiotVO,
  MDFeRodoviarioVeiculoVO, MDFeRodoviarioPedagioVO, MDFeInformacaoNFeVO,
  MDFeInformacaoCTeVO, MDFeMunicipioDescarregamentoVO,

  ViewPessoaClienteVO, ViewPessoaClienteController,
  ViewPessoaTransportadoraVO, ViewPessoaTransportadoraController,
  VendaCabecalhoVO,

  MDFeCabecalhoController, VendaCabecalhoController,
  NFeNumeroController, NFeConfiguracaoController, EmpresaController;

{$R *.dfm}
{ TFMDFe }

{$REGION 'Infra'}
procedure TFMDFe.FormCreate(Sender: TObject);
begin
  ClasseObjetoGridVO := TMDFeCabecalhoVO;
  ObjetoController := TMDFeCabecalhoController.Create;
  inherited;

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSPercurso, TMDFePercursoVO);
  ConfiguraGridFromVO(GridPercursos, TMDFePercursoVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSSeguro, TMDFeInformacaoSeguroVO);
  ConfiguraGridFromVO(GridSeguros, TMDFeInformacaoSeguroVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSLacre, TMDFeLacreVO);
  ConfiguraGridFromVO(GridLacres, TMDFeLacreVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSMunicipioCarregamento, TMDFeMunicipioCarregamentoVO);
  ConfiguraGridFromVO(GridMunicipiosCarregamento, TMDFeMunicipioCarregamentoVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSMotorista, TMDFeRodoviarioMotoristaVO);
  ConfiguraGridFromVO(GridMotorista, TMDFeRodoviarioMotoristaVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSCiot, TMDFeRodoviarioCiotVO);
  ConfiguraGridFromVO(GridCiot, TMDFeRodoviarioCiotVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSVeiculo, TMDFeRodoviarioVeiculoVO);
  ConfiguraGridFromVO(GridVeiculo, TMDFeRodoviarioVeiculoVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSPedagio, TMDFeRodoviarioPedagioVO);
  ConfiguraGridFromVO(GridPedagio, TMDFeRodoviarioPedagioVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSNfe, TMDFeInformacaoNFeVO);
  ConfiguraGridFromVO(GridNfe, TMDFeInformacaoNFeVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSCte, TMDFeInformacaoCTeVO);
  ConfiguraGridFromVO(GridCte, TMDFeInformacaoCTeVO);

  ConfiguraCDSFromVO(FDataModuleMDFe.CDSMunicipioDescarregamento, TMDFeMunicipioDescarregamentoVO);
  ConfiguraGridFromVO(GridMunicipiosDescarregamento, TMDFeMunicipioDescarregamentoVO);

  /// EXERCICIO
  ///  Crie uma tabela de configuração exclusiva para o MDFe
  ObjetoNFeConfiguracaoVO := TNFeConfiguracaoController.ConsultaObjeto('ID=1'); //ObjetoNFeConfiguracaoVO := TNFeConfiguracaoVO(TController.BuscarObjeto('NFeConfiguracaoController.TNFeConfiguracaoController', 'ConsultaObjeto', ['ID=1'], 'GET'));

  FiltroComplementar := '';
end;

procedure TFMDFe.LimparCampos;
begin
  inherited;
  FDataModuleMDFe.CDSPercurso.EmptyDataSet;
  FDataModuleMDFe.CDSSeguro.EmptyDataSet;
  FDataModuleMDFe.CDSLacre.EmptyDataSet;
  FDataModuleMDFe.CDSMunicipioCarregamento.EmptyDataSet;
  FDataModuleMDFe.CDSMotorista.EmptyDataSet;
  FDataModuleMDFe.CDSCiot.EmptyDataSet;
  FDataModuleMDFe.CDSVeiculo.EmptyDataSet;
  FDataModuleMDFe.CDSPedagio.EmptyDataSet;
  FDataModuleMDFe.CDSNfe.EmptyDataSet;
  FDataModuleMDFe.CDSMunicipioDescarregamento.EmptyDataSet;
  FDataModuleMDFe.CDSCte.EmptyDataSet;
  ConfigurarLayoutTela;
end;

procedure TFMDFe.LimparCamposDestinatario;
begin
  EditEmitenteCpfCnpj.Clear;
  EditEmitenteRazao.Clear;
  EditEmitenteLogradouro.Clear;
  EditEmitenteNumero.Clear;
  EditEmitenteComplemento.Clear;
  EditEmitenteBairro.Clear;
  EditEmitenteCodigoIbge.Clear;
  EditEmitenteCidade.Clear;
  EditEmitenteUF.Clear;
  EditEmitenteCEP.Clear;
  EditEmitenteTelefone.Clear;
  EditEmitenteIE.Clear;
  EditEmitenteEmail.Clear;
end;

procedure TFMDFe.ConfigurarLayoutTela;
begin
  PageControlEdits.ActivePageIndex := 0;
end;

procedure TFMDFe.ConfigurarMDFe;
begin

  ObjetoNFeConfiguracaoVO := TNFeConfiguracaoVO.Create;
  ObjetoNFeConfiguracaoVO.SalvarXml := 'S';
  ObjetoNFeConfiguracaoVO.WebserviceUf := 'DF';
  ObjetoNFeConfiguracaoVO.WebserviceAmbiente := 1;
  ObjetoNFeConfiguracaoVO.WebserviceVisualizar := 'S';
  ObjetoNFeConfiguracaoVO.CaminhoSalvarXml := 'C:\T2Ti\MDFe\XML\';
  ObjetoNFeConfiguracaoVO.CaminhoSchemas := 'C:\Componentes\ACBr\Exemplos\ACBrDFe\Schemas\MDFe';
  ObjetoNFeConfiguracaoVO.CertificadoDigitalSerie := '1B06CF';

  if ObjetoNFeConfiguracaoVO.SalvarXml = 'S' then
    FDataModule.ACBrMDFe.Configuracoes.Geral.Salvar := True
  else
    FDataModule.ACBrMDFe.Configuracoes.Geral.Salvar := False;

  FDataModule.ACBrMDFe.Configuracoes.WebServices.Uf := ObjetoNFeConfiguracaoVO.WebserviceUf;

  if ObjetoNFeConfiguracaoVO.WebserviceAmbiente = 0 then
    FDataModule.ACBrMDFe.Configuracoes.WebServices.Ambiente := taProducao
  else
    FDataModule.ACBrMDFe.Configuracoes.WebServices.Ambiente := taHomologacao;

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

  FDataModule.ACBrMDFe.Configuracoes.Arquivos.PathSalvar := ObjetoNFeConfiguracaoVO.CaminhoSalvarXml;
  FDataModule.ACBrMDFe.Configuracoes.Arquivos.PathSchemas := ObjetoNFeConfiguracaoVO.CaminhoSchemas;

  FDataModule.ACBrMDFe.Configuracoes.Certificados.NumeroSerie := ObjetoNFeConfiguracaoVO.CertificadoDigitalSerie;

  FDataModule.ACBrMDFe.Configuracoes.Geral.VersaoDF := ve300;
end;
{$ENDREGION}

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

    if Result then
    begin
      ConfigurarMDFe;

      /// EXERCICIO:
      ///  É preciso/permitido trabalhar com o número e a série separados
      ///  assim como fizemos com a NFe? Controle os números do MDF-e
      ///  pois abaixo estamos utilizando a numeração da NF-e

      //Pega um número
      NFeNumeroVO := TNFeNumeroController.ConsultaObjeto('1=1');// TNFeNumeroVO(TController.BuscarObjeto('NFeNumeroController.', 'ConsultaObjeto', ['1=1'], 'GET'));

      //Persiste a nota com o status "0 - Em Edição"
      EditDataHoraEmissao.Date := Now;
      EditSerie.Text := NFeNumeroVO.Serie;
      EditNumeroMDFe.Text := StringOfChar('0', 9 - Length(IntToStr(NFeNumeroVO.Numero))) + IntToStr(NFeNumeroVO.Numero);
      EditCodigoNumerico.Text := StringOfChar('0', 8 - Length(IntToStr(NFeNumeroVO.Numero))) + IntToStr(NFeNumeroVO.Numero);
      EditChaveAcesso.Text :=   IntToStr(Sessao.Empresa.CodigoIbgeUf) +
                                FormatDateTime('yy', EditDataHoraEmissao.Date) +
                                FormatDateTime('mm', EditDataHoraEmissao.Date) +
                                Sessao.Empresa.Cnpj +
                                '58' +
                                EditSerie.Text +
                                EditNumeroMDFe.Text +
                                '1' +
                                EditCodigoNumerico.Text;
      EditDigitoChaveAcesso.Text := Modulo11(EditChaveAcesso.Text);
      EditChaveAcesso.Text := EditChaveAcesso.Text + EditDigitoChaveAcesso.Text;

      BotaoSalvar.Click;
      BotaoAlterar.Click;
    end;
  finally
    FreeAndNil(NFeNumeroVO);
  end;
end;

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

  if Result then
  begin
    ConfigurarMDFe;
    StatusTela := stEditando;
    EditIdVenda.SetFocus;
  end;
end;

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

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

function TFMDFe.DoSalvar: Boolean;
begin
  FormatSettings.DecimalSeparator := '.';

  if StatusTela = stEditando then
  begin
    if (Trim(EditNumeroMDFe.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;

    ActionAtualizarTotais.Execute;
  end;

  Result := inherited DoSalvar;

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

      TMDFeCabecalhoVO(ObjetoVO).IdEmpresa := Sessao.Empresa.Id;
      TMDFeCabecalhoVO(ObjetoVO).EmpresaVO := TEmpresaController.ConsultaObjeto('ID=' + Sessao.Empresa.Id.ToString);//TEmpresaVO(TController.BuscarObjeto('EmpresaController.TEmpresaController', 'ConsultaObjeto', ['ID=' + Sessao.Empresa.Id.ToString], 'GET'));;

      /// EXERCICIO
      ///  Complemente o código com os objetos, listas e campos faltantes

      TMDFeCabecalhoVO(ObjetoVO).Uf := UFToInt(Sessao.Empresa.EnderecoPrincipal.Uf);
      TMDFeCabecalhoVO(ObjetoVO).CodigoNumerico := EditCodigoNumerico.Text;

      /// EXERCICIO
      ///  Existe natureza da operação no MDF-e?
      // TMDFeCabecalhoVO(ObjetoVO).NaturezaOperacao := EditNaturezaOperacao.Text;

      TMDFeCabecalhoVO(ObjetoVO).Modelo := Copy(ComboboxModeloNotaFiscal.Text, 1, 2);
      TMDFeCabecalhoVO(ObjetoVO).Serie := EditSerie.Text;
      TMDFeCabecalhoVO(ObjetoVO).NumeroMdfe := EditNumeroMDFe.Text;
      TMDFeCabecalhoVO(ObjetoVO).DataHoraEmissao := EditDataHoraEmissao.Date;
      TMDFeCabecalhoVO(ObjetoVO).TipoEmitente := ComboTipoEmitente.ItemIndex;
      TMDFeCabecalhoVO(ObjetoVO).TipoTransportadora := ComboTipoTransportadora.ItemIndex;
      TMDFeCabecalhoVO(ObjetoVO).ChaveAcesso := EditChaveAcesso.Text;
      TMDFeCabecalhoVO(ObjetoVO).DigitoVerificador := StrToInt(EditDigitoChaveAcesso.Text);
      TMDFeCabecalhoVO(ObjetoVO).ProcessoEmissao := ObjetoNFeConfiguracaoVO.ProcessoEmissao;
      TMDFeCabecalhoVO(ObjetoVO).VersaoProcessoEmissao := ObjetoNFeConfiguracaoVO.VersaoProcessoEmissao;
      TMDFeCabecalhoVO(ObjetoVO).PesoBrutoCarga := EditPesoBrutoCarga.Value;
      TMDFeCabecalhoVO(ObjetoVO).ValorCarga := EditValorTotalCarga.Value;

      // só fica em modo de inserção no início para pegar seu número, logo depois fica sempre em modo de edição
      if StatusTela = stEditando then
      begin
        TMDFeCabecalhoVO(ObjetoVO).Id := IdRegistroSelecionado;

        { Emitente }
        (*
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.IdMDFeCabecalho := TMDFeCabecalhoVO(ObjetoVO).Id;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Cnpj := EditEmitenteCpfCnpj.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Nome := EditEmitenteRazao.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Logradouro := EditEmitenteLogradouro.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Numero := EditEmitenteNumero.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Complemento := EditEmitenteComplemento.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Bairro := EditEmitenteBairro.Text;
        if Trim(EditEmitenteCodigoIbge.Text) <> '' then
          TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.CodigoMunicipio := StrToInt(EditEmitenteCodigoIbge.Text);
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.NomeMunicipio := EditEmitenteCidade.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Uf := EditEmitenteUF.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Cep := EditEmitenteCEP.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.CodigoPais := 1058;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.NomePais := 'Brazil';
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Telefone := EditEmitenteTelefone.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Ie := EditEmitenteIE.Text;
        TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Email := EditEmitenteEmail.Text;
        *)

        { MDF-e Percurso }
        //if FDataModuleMDFe.CDSPercurso.RecordCount > 0 then
        //  TController.PreencherObjectListFromCDS<TMDFePercursoVO>(TMDFeCabecalhoVO(ObjetoVO).ListaMDFePercursoVO, FDataModuleMDFe.CDSPercurso);

        { MDF-e Seguro }
        //if FDataModuleMDFe.CDSMDFeSeguro.RecordCount > 0 then
        //  TController.PreencherObjectListFromCDS<TMDFeSeguroVO>(TMDFeCabecalhoVO(ObjetoVO).ListaMDFeSeguroVO, FDataModuleMDFe.CDSMDFeSeguro);

        { MDF-e Município Carregamento }

        { MDF-e Município Lacres }

        { MDFe Rodoviário }
          { MDFe Rodoviário CIOT }
          { MDFe Rodoviário Motorista }
          { MDFe Rodoviário Veículo }
          { MDFe Rodoviário Pedágio }

        { MDF-e Município Descarregamento }
          { MDFe Município Descarregamento - Informação NF-e }
          { MDFe Município Descarregamento - Informação CT-e }
      end;

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

{$REGION 'Controle de Grids e ClientDataSets'}
procedure TFMDFe.GridParaEdits;
begin
  inherited;

  if not CDSGrid.IsEmpty then
  begin
    ObjetoVO := TMDFeCabecalhoController.ConsultaObjeto('ID=' + IdRegistroSelecionado.ToString);//TMDFeCabecalhoVO(TController.BuscarObjeto('MDFeCabecalhoController.TMDFeCabecalhoController', 'ConsultaObjeto', ['ID=' + IdRegistroSelecionado.ToString], 'GET'));
  end;

  if Assigned(ObjetoVO) then
  begin
    { MDF-e Cabeçalho }
    EditCodigoNumerico.Text := TMDFeCabecalhoVO(ObjetoVO).CodigoNumerico;
    ComboboxModeloNotaFiscal.ItemIndex := AnsiIndexStr(TMDFeCabecalhoVO(ObjetoVO).Modelo, ['01', '55', '58']);
    EditSerie.Text := TMDFeCabecalhoVO(ObjetoVO).Serie;
    EditNumeroMDFe.Text := TMDFeCabecalhoVO(ObjetoVO).NumeroMDFe;
    EditDataHoraEmissao.Date := TMDFeCabecalhoVO(ObjetoVO).DataHoraEmissao;
    EditChaveAcesso.Text := TMDFeCabecalhoVO(ObjetoVO).ChaveAcesso;
    EditDigitoChaveAcesso.Text := TMDFeCabecalhoVO(ObjetoVO).DigitoVerificador.ToString;
    EditValorTotalCarga.Value := TMDFeCabecalhoVO(ObjetoVO).ValorCarga;

    /// EXERCICIO
    ///  Carregue os demais objetos e listas

    { Emitente }
    (*
    if TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Id > 0 then
    begin
      EditEmitenteUF.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Uf;
      EditEmitenteCpfCnpj.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Cnpj;
      EditEmitenteRazao.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Nome;
      EditEmitenteLogradouro.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Logradouro;
      EditEmitenteNumero.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Numero;
      EditEmitenteComplemento.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Complemento;
      EditEmitenteBairro.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Bairro;
      EditEmitenteCodigoIbge.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.CodigoMunicipio.ToString;
      EditEmitenteCidade.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.NomeMunicipio;
      EditEmitenteUF.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Uf;
      EditEmitenteCEP.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Cep;
      EditEmitenteTelefone.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Telefone;
      EditEmitenteIE.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Ie;
      EditEmitenteEmail.Text := TMDFeCabecalhoVO(ObjetoVO).MDFeEmitenteVO.Email;
    end;
    /*)

    { MDF-e Percurso }

    { MDF-e Seguro }
    //TController.TratarRetorno<TMDFeSeguroVO>(TMDFeCabecalhoVO(ObjetoVO).ListaMDFeSeguroVO, True, True, FDataModuleMDFe.CDSMDFeSeguro);

    { MDF-e Município Carregamento }

    { MDF-e Município Lacres }

    { MDFe Rodoviário }
      { MDFe Rodoviário CIOT }
      { MDFe Rodoviário Motorista }
      { MDFe Rodoviário Veículo }
      { MDFe Rodoviário Pedágio }

    { MDF-e Município Descarregamento }
      { MDFe Município Descarregamento - Informação NF-e }
      { MDFe Município Descarregamento - Informação CT-e }

    (*
    MDFeMunicipioDescarregamentonumerator := TMDFeCabecalhoVO(ObjetoVO).ListaMDFeMunicipioDescarregamentoVO.GetEnumerator;
    try
      with MDFeNFEnumerator do
      begin
        while MoveNext do
        begin
          { Informação NF-e }
          if Current.MDFeInformacaoNfeVO.Id > 0 then
          begin
            FDataModuleMDFe.CDSNfe.Append;
            FDataModuleMDFe.CDSNfe.FieldByName('ID').AsInteger := Current.MDFeInformacaoNfeVO.Id;
            FDataModuleMDFe.CDSNfe.FieldByName('CHAVE_NFE').AsInteger := Current.MDFeInformacaoNfeVO.ChaveNfe;
            FDataModuleMDFe.CDSNfe.FieldByName('SEGUNDO_CODIGO_BARRA').AsInteger := Current.MDFeInformacaoNfeVO.SegundoCodigoBarra;
            FDataModuleMDFe.CDSNfe.FieldByName('INDICADOR_REENTREGA').AsString := Current.MDFeInformacaoNfeVO.IndicadorReentrega;
            FDataModuleMDFe.CDSNfe.Post;
          end;

          { Informação CT-e }
          if Current.MDFeInformacaoCTeVO.Id > 0 then
          begin
            FDataModuleMDFe.CDSCTe.Append;
            FDataModuleMDFe.CDSCTe.FieldByName('ID').AsInteger := Current.MDFeInformacaoCTeVO.Id;
            FDataModuleMDFe.CDSCTe.FieldByName('CHAVE_NFE').AsInteger := Current.MDFeInformacaoCTeVO.ChaveNfe;
            FDataModuleMDFe.CDSCTe.FieldByName('SEGUNDO_CODIGO_BARRA').AsInteger := Current.MDFeInformacaoCTeVO.SegundoCodigoBarra;
            FDataModuleMDFe.CDSCTe.FieldByName('INDICADOR_REENTREGA').AsString := Current.MDFeInformacaoCTeVO.IndicadorReentrega;
            FDataModuleMDFe.CDSCTe.Post;
          end;
        end;
      end;
    finally
    end;
    *)
  end;
end;
{$ENDREGION}

{$REGION 'Exclusões Internas'}
/// EXERCICIO
///  Implemente as exclusões internas tomando como base a NF-e e o CT-e
{$EndREGION 'Exclusões Internas'}

{$REGION 'Actions MDF-e'}
procedure TFMDFe.ActionSelecionarCertificadoExecute(Sender: TObject);
begin
  try
    ObjetoNFeConfiguracaoVO.CertificadoDigitalSerie := FDataModule.ACBrMDFe.SSL.SelecionarCertificado;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao tentar selecionar o certificado.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionStatusServicoExecute(Sender: TObject);
begin
  FDataModule.ACBrMDFe.WebServices.StatusServico.Executar;
end;

procedure TFMDFe.ActionConsultarSefazExecute(Sender: TObject);
begin
  try
    FDataModule.ACBrMDFe.WebServices.Consulta.MDFeChave := EditChaveAcesso.Text;
    FDataModule.ACBrMDFe.WebServices.Consulta.Executar;
    MemoRespostas.Lines.Text := UTF8Encode(FDataModule.ACBrMDFe.WebServices.Consulta.RetWS);
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro durante a consulta.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionImprimirDaMDFeExecute(Sender: TObject);
begin
  FDataModule.ACBrMDFe.Manifestos.Clear;
  FDataModule.ACBrMDFe.Manifestos.LoadFromFile(ObjetoNFeConfiguracaoVO.CaminhoSalvarXml + TMDFeCabecalhoVO(ObjetoVO).ChaveAcesso + '-MDFe.xml');
  FDataModule.ACBrMDFe.Manifestos.ImprimirPDF;
end;

procedure TFMDFe.ActionCancelarMDFeExecute(Sender: TObject);
var
  Chave, Lote, Justificativa: String;
begin
  try
    Lote := '1';
    if not(InputQuery('Cancelamento MDF-e', 'Identificador de Controle do Lote', Lote)) then
      Exit;
    if not(InputQuery('Cancelamento MDF-e', 'Justificativa', Justificativa)) then
      Exit;

    FDataModule.ACBrMDFe.EventoMDFe.Evento.Clear;
    FDataModule.ACBrMDFe.EventoMDFe.idLote := StrToInt(Lote);
    with FDataModule.ACBrMDFe.EventoMDFe.Evento.Add do
    begin
     infEvento.dhEvento := now;
     infEvento.tpEvento := teCancelamento;
     infEvento.detEvento.xJust := Justificativa;
    end;
    FDataModule.ACBrMDFe.EnviarEvento(StrToInt(Lote));

    MemoRespostas.Lines.Text := FDataModule.ACBrMDFe.WebServices.EnvEvento.RetWS;

    //TMDFeCabecalhoVO(ObjetoVO).InformacoesAddContribuinte := 'NOTA FISCAL CANCELADA. LOTE: ' + Lote + '. JUSTIFICATIVA: ' + Justificativa;
    //TController.ExecutarMetodo('MDFeCabecalhoController.TMDFeCabecalhoController', 'Altera', [TMDFeCabecalhoVO(ObjetoVO)], 'POST', 'Boolean');
    BotaoCancelar.Click;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao tentar imprimir o DAMDFe.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionEnviarExecute(Sender: TObject);
begin
  try
    FDataModule.ACBrMDFe.Enviar(1, true);
    FDataModule.ACBrMDFe.Manifestos.ImprimirPDF;

    MemoRespostas.Lines.Text := UTF8Encode(FDataModule.ACBrMDFe.WebServices.Retorno.RetWS);
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao tentar enviar o MDF-e.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionAssinarExecute(Sender: TObject);
begin
  try
    FDataModule.ACBrMDFe.Manifestos.LoadFromFile(ObjetoNFeConfiguracaoVO.CaminhoSalvarXml + EditChaveAcesso.Text + '-MDFe.xml');
    if Assigned(FDataModule.ACBrMDFe.Manifestos.Items[0]) then
    begin
      FDataModule.ACBrMDFe.Manifestos.Assinar;
      Application.MessageBox('MDF-e assinado!', 'Informação do Sistema', MB_OK + MB_ICONEXCLAMATION);
    end;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao tentar assinar o MDF-e.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionValidarExecute(Sender: TObject);
begin
  try
    FDataModule.ACBrMDFe.Manifestos.LoadFromFile(ObjetoNFeConfiguracaoVO.CaminhoSalvarXml + TMDFeCabecalhoVO(ObjetoVO).ChaveAcesso + '-MDFe.xml');
    if Assigned(FDataModule.ACBrMDFe.Manifestos.Items[0]) then
    begin
      FDataModule.ACBrMDFe.Manifestos.Validar;
      Application.MessageBox('Nota fiscal válida!', 'Informação do Sistema', MB_OK + MB_ICONEXCLAMATION);
    end;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao tentar validar o MDF-e.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;

procedure TFMDFe.ActionGerarXmlExecute(Sender: TObject);
var
  i, j: Integer;
  OK: Boolean;
begin
  try
    if FDataModule.ACBrMDFe.Configuracoes.Certificados.NumeroSerie = '' then
    begin
      ObjetoNFeConfiguracaoVO.CertificadoDigitalSerie := FDataModule.ACBrMDFe.SSL.SelecionarCertificado;
    end;

    FDataModule.ACBrMDFe.Manifestos.Clear;

     with FDataModule.ACBrMDFe.Manifestos.Add.MDFe do
     begin
       //
       // Dados de Identificação do MDF-e
       //
       Ide.cUF := 53;
       Ide.tpAmb := taHomologacao;

      with seg.Add do begin
        respSeg := rsEmitente;
        CNPJCPF := '77871256670';
        xSeg    := 'PORTO SEGURO';
        CNPJ    := '60831344000174';
        nApol   := '654685030U65468599';
        with aver.Add do begin
          nAver  := '123456789';
        end;
      end;

       // TMDFeTpEmitente = ( teTransportadora, teTranspCargaPropria );
       Ide.tpEmit  := teTransportadora;
       Ide.modelo  := '58';
       Ide.serie   := 1;
       Ide.nMDF    := StrToInt(TMDFeCabecalhoVO(ObjetoVO).NumeroMDFe);
       Ide.cMDF    := 1;  // Código Aleatório
       // TMDFeModal = ( moRodoviario, moAereo, moAquaviario, moFerroviario );
       Ide.modal   := moRodoviario;
       Ide.dhEmi   := Now;
       // TpcnTipoEmissao = (teNormal, teContingencia, teSCAN, teDPEC, teFSDA);
       Ide.tpEmis  := teNormal;
       // TpcnProcessoEmissao = (peAplicativoContribuinte, peAvulsaFisco, peAvulsaContribuinte, peContribuinteAplicativoFisco);
       Ide.procEmi := peAplicativoContribuinte;
       Ide.verProc := '1.0';
    //   Ide.UFIni   := 'SP';
    //   Ide.UFFim   := 'SP';

       Ide.UFIni   := 'DF';
       Ide.UFFim   := 'DF';

       with Ide.infMunCarrega.Add do
        begin
         cMunCarrega := 5300108;
         xMunCarrega := 'BRASILIA';
        end;

       //
       // Dados do Emitente
       //
       Emit.CNPJ := Sessao.Empresa.Cnpj;
       Emit.Ie := Sessao.Empresa.InscricaoEstadual;
       Emit.xNome := Sessao.Empresa.RazaoSocial;
       Emit.xFant := Sessao.Empresa.NomeFantasia;

       Emit.EnderEmit.xLgr := Sessao.Empresa.EnderecoPrincipal.Logradouro;
       Emit.EnderEmit.nro := Sessao.Empresa.EnderecoPrincipal.Numero;
       Emit.EnderEmit.xCpl := Sessao.Empresa.EnderecoPrincipal.Complemento;
       Emit.EnderEmit.xBairro := Sessao.Empresa.EnderecoPrincipal.Bairro;
       Emit.EnderEmit.cMun := Sessao.Empresa.CodigoIbgeCidade;
       Emit.EnderEmit.xMun := Sessao.Empresa.EnderecoPrincipal.Cidade;
       Emit.EnderEmit.Uf := Sessao.Empresa.EnderecoPrincipal.Uf;
       Emit.EnderEmit.Cep := StrToInt(Sessao.Empresa.EnderecoPrincipal.Cep);
       Emit.EnderEmit.Fone := Sessao.Empresa.EnderecoPrincipal.Fone;
       Emit.enderEmit.email   := 'endereco@provedor.com.br';

       rodo.RNTRC := '12345678';
       rodo.CIOT  := '123456789112';

      with rodo.infANTT.infContratante.Add do
      begin
       CNPJCPF := '61189288000189';
      end;

       rodo.veicTracao.cInt    := '001';
       rodo.veicTracao.placa   := Labelededit44.Text;
       rodo.veicTracao.RENAVAM := '123456789';
       rodo.veicTracao.tara    := 5000;
       rodo.veicTracao.capKG   := 4500;
       rodo.veicTracao.capM3   := 400;

       // TpcteTipoRodado = (trNaoAplicavel, trTruck, trToco, trCavaloMecanico, trVAN, trUtilitario, trOutros);
       // Para o MDF-e não utilizar o trNaoAplicavel.
       rodo.veicTracao.tpRod := trTruck;

       // TpcteTipoCarroceria = (tcNaoAplicavel, tcAberta, tcFechada, tcGraneleira, tcPortaContainer, tcSider);
       rodo.veicTracao.tpCar := tcFechada;

       rodo.veicTracao.UF := 'DF';

       with rodo.veicTracao.condutor.Add do
        begin
         xNome := 'JOAO';
         CPF   := '12345678912';
        end;

       with rodo.veicReboque.Add do
        begin
         cInt    := '002';
         placa   := 'XYZ4567';
         RENAVAM := '123456789';
         tara    := 4000;
         capKG   := 3000;
         capM3   := 300;

         // TpcteTipoCarroceria = (tcNaoAplicavel, tcAberta, tcFechada, tcGraneleira, tcPortaContainer, tcSider);
         tpCar := tcFechada;

         UF := 'DF';
        end;

       with rodo.valePed.disp.Add do
        begin
         CNPJForn := '12345678000199';
         CNPJPg   := '21543876000188';
         nCompra  := '789';
        end;

       with infDoc.infMunDescarga.Add do
        begin
         cMunDescarga := 5300108;
         xMunDescarga := 'BRASILIA';

         with infCTe.Add do
          begin
           chCTe := '35110803911545000148570010000001011000001018';

          // Informações das Unidades de Transporte (Carreta/Reboque/Vagão)

          with infUnidTransp.Add do
           begin
            //TpcnUnidTransp = ( utRodoTracao, utRodoReboque, utNavio, utBalsa, utAeronave, utVagao, utOutros );
            tpUnidTransp := utRodoTracao;
            idUnidTransp := 'ABC1234'; // informar a placa se rodoviário
            with lacUnidTransp.Add do
             begin
              nLacre := '123';
             end;
            // Informações das Unidades de carga (Containeres/ULD/Outros)
            with infUnidCarga.Add do
             begin
              // TpcnUnidCarga  = ( ucContainer, ucULD, ucPallet, ucOutros );
              tpUnidCarga := ucOutros;
              idUnidCarga := 'AB45'; // informar o numero da unidade da carga
              with lacUnidCarga.Add do
               begin
                nLacre := '123';
               end;
              qtdRat := 1.0;
             end;
            qtdRat := 1.0;
           end;

          end; // fim do with

         with infCTe.Add do
          begin
           chCTe := '35110803911545000148570010000001021000001023';

          // Informações das Unidades de Transporte (Carreta/Reboque/Vagão)

          with infUnidTransp.Add do
           begin
            //TpcnUnidTransp = ( utRodoTracao, utRodoReboque, utNavio, utBalsa, utAeronave, utVagao, utOutros );
            tpUnidTransp := utRodoReboque;
            idUnidTransp := 'XYZ5678';
            with lacUnidTransp.Add do
             begin
              nLacre := '321';
             end;
            // Informações das Unidades de carga (Containeres/ULD/Outros)
            with infUnidCarga.Add do
             begin
              // TpcnUnidCarga  = ( ucContainer, ucULD, ucPallet, ucOutros );
              tpUnidCarga := ucOutros;
              idUnidCarga := 'DD98';
              with lacUnidCarga.Add do
               begin
                nLacre := '321';
               end;
              qtdRat := 1.0;
             end;
            qtdRat := 1.0;
           end;

          end; // fim do with

        end;

       tot.qCTe := 2;
       tot.vCarga := 3500.00;
       // UnidMed = (uM3,uKG, uTON, uUNIDADE, uLITROS);
       tot.cUnid  :=  uTon;
       tot.qCarga := 2.8000;

       with lacres.Add do
        begin
         nLacre := '123';
        end;

       infAdic.infCpl     := 'Empresa optante pelo Simples Nacional.; Caminhao VW.';
       infAdic.infAdFisco := '';
      end;

     FDataModule.ACBrMDFe.Manifestos.GerarMDFe;
  except
    on E: Exception do
      Application.MessageBox(PChar('Ocorreu um erro ao gerar o arquivo XML do MDF-e.' + #13 + #13 + E.Message), 'Erro do sistema', MB_OK + MB_ICONERROR);
  end;
end;
{$ENDREGION}

{$REGION 'Campos Transientes'}
procedure TFMDFe.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
      LimparCamposDestinatario;
      if not PopulaCamposTransientes(Filtro, TViewPessoaClienteVO, TViewPessoaClienteController) then
        PopulaCamposTransientesLookup(TViewPessoaClienteVO, TViewPessoaClienteController);
      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;
        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('CIDADE').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;
        EditEmitenteIE.Text := CDSTransiente.FieldByName('RG_IE').AsString;
      end
      else
      begin
        Exit;
        EditEmitenteId.SetFocus;
      end;
    finally
      CDSTransiente.Close;
    end;
  end;
end;

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

    try
      EditIdVenda.Clear;
      if not PopulaCamposTransientes(Filtro, TVendaCabecalhoVO, TVendaCabecalhoController) then
        PopulaCamposTransientesLookup(TVendaCabecalhoVO, TVendaCabecalhoController);

      if CDSTransiente.RecordCount > 0 then
      begin
        EditIdVenda.Text := CDSTransiente.FieldByName('ID').AsString;
      end
      else
      begin
        Exit;
        EditIdVenda.SetFocus;
      end;
    finally
      CDSTransiente.Close;
    end;
  end;
end;
{$ENDREGION}

end.
