unit cadNF;

interface

uses
 Windows, system.UItypes, IB_Access, Messages, SysUtils, Variants, Classes, Graphics, Controls,
 Forms,
 Dialogs, ModeloCadastro, UCBase, ImgList, AppEvnts, IB_Components,
 ExtCtrls, StdCtrls, jpeg, Grids, IB_Grid, Buttons, ComCtrls,
 ACBrNFeDANFEClass, ACBrNFe, IB_Controls, Mask, DBGrids, Rotinas, pcnConversao,
 pcnConversaoNFe, ACBrUtil,
 Menus, ppCtrls, ppStrtch, ppRichTx, ppPrnabl, ppClass, ppCache, ppBands,
 ppComm, ppRelatv, ppProd, ppReport, cxGraphics, cxLookAndFeels,
 cxLookAndFeelPainters, cxButtons, ppDesignLayer, ppParameter, IB_EditButton,
 System.ImageList, Data.DB, Datasnap.DBClient, dxSkinsCore, dxSkinOffice2010Blue, cxImageList;

type
 TfrmNF = class(TFrModeloCadastro)
  PaginasManutencao: TPageControl;
  tabCliente: TTabSheet;
  GroupBox7: TGroupBox;
  edtBairroTransporte: TIB_Edit;
  edtCepTransporte: TIB_Edit;
  edtEnderecoTransporte: TIB_Edit;
  edtCidadeTransporte: TIB_Edit;
  edtNumeroTransporte: TIB_Edit;
  edtComplementoTransporte: TIB_Edit;
  edtTele1: TIB_Edit;
  edtTele2: TIB_Edit;
  dbNomeFantasia: TIB_Edit;
  Produtos: TTabSheet;
  pnlIncluiProdutos: TPanel;
  btnIncluirProdutos: TBitBtn;
  Panel9: TPanel;
  grdProdutos: TIB_Grid;
  Outros: TTabSheet;
  Despacho: TTabSheet;
  dbVolumes: TIB_Edit;
  GroupBox6: TGroupBox;
  dbNomeTransportador: TIB_Edit;
  btnPesquisaTransportador: TBitBtn;
  btnIncluiTransportador: TBitBtn;
  dbCodigoTransportador: TIB_Edit;
  Historico: TTabSheet;
  Panel5: TPanel;
  Panel8: TPanel;
  BitBtn1: TBitBtn;
  BitBtn2: TBitBtn;
  Panel4: TPanel;
  dbItems: TIB_Edit;
  dbValorDesconto: TIB_Edit;
  dbPercentualDesconto: TIB_Edit;
  dbTotalProdutos: TIB_Edit;
  dbTotalPedidos: TIB_Edit;
  edtEspecieMercadoria: TIB_LookupCombo;
  btnPesquisaEspecieMercadoria: TBitBtn;
  BitBtn5: TBitBtn;
  IB_Edit4: TIB_Edit;
  IB_Edit5: TIB_Edit;
  IB_Edit8: TIB_Edit;
  IB_Edit9: TIB_Edit;
  dbNumeroPedido: TIB_Edit;
  GroupBox4: TGroupBox;
  IB_Edit11: TIB_Edit;
  IB_LookupCombo3: TIB_LookupCombo;
  TabSheet1: TTabSheet;
  IB_Edit12: TIB_Edit;
  IB_LookupCombo4: TIB_LookupCombo;
  IB_Edit13: TIB_Edit;
  IB_Edit14: TIB_Edit;
  IB_Edit15: TIB_Edit;
  IB_Edit16: TIB_Edit;
  IB_Edit17: TIB_Edit;
  IB_Edit18: TIB_Edit;
  IB_Edit19: TIB_Edit;
  IB_Memo1: TIB_Memo;
  btnImprimir: TBitBtn;
  qryUsuario: TIB_Query;
  dtUsuario: TIB_DataSource;
  qryCliente: TIB_Query;
  dtCliente: TIB_DataSource;
  qryCondicoesPagamento: TIB_Query;
  dtCondicoesPagamento: TIB_DataSource;
  qryTransportador: TIB_Query;
  dtTransportador: TIB_DataSource;
  qrUF_Cliente: TIB_Query;
  dsrUf_Cliente: TIB_DataSource;
  dbCondicaoPagamento: TIB_LookupCombo;
  btnPesqCondicao: TBitBtn;
  btnIncluiCondicao: TBitBtn;
  qryEspecie_Mercadoria: TIB_Query;
  dtEspecie_Mercadoria: TIB_DataSource;
  IB_Edit3: TIB_Edit;
  IB_Edit6: TIB_Edit;
  IB_Edit7: TIB_Edit;
  qrUF_Veiculo: TIB_Query;
  dtUF_Veiculo: TIB_DataSource;
  grpCliente: TGroupBox;
  edtCNPJ: TLabeledEdit;
  btnPesquisaCliente: TBitBtn;
  BitBtn3: TBitBtn;
  pnlBotoesAcoesNF: TPanel;
  Panel12: TPanel;
  edtNum: TIB_Edit;
  IB_Edit1: TIB_Edit;
  IB_Edit20: TIB_Edit;
  edtdataCadastro: TIB_Edit;
  edtDataEmissao: TIB_Date;
  edtDataSaida: TIB_Date;
  edtHora: TIB_Edit;
  IB_Edit21: TIB_Edit;
  qrUF_Transportador: TIB_Query;
  dtUF_Transportador: TIB_DataSource;
  IB_Edit22: TIB_Edit;
  qryTotalItens: TIB_Query;
  dtTotalItens: TIB_DataSource;
  qryItens: TIB_Query;
  dtItens: TIB_DataSource;
  OpenDialog1: TOpenDialog;
  qryRegras_Imposto: TIB_Query;
  dbInscricao: TIB_Edit;
  edtCFOP: TIB_Edit;
  btnPesquisaCFOP: TBitBtn;
  dbRazaoSocial: TIB_Edit;
  dbCod_Municipio_IBGE: TIB_Edit;
  edtUfTransporte: TIB_LookupCombo;
  IB_Edit10: TIB_Edit;
  dbICMST: TIB_Edit;
  IB_Grid1: TIB_Grid;
  qryHistorico: TIB_Query;
  dtHistorico: TIB_DataSource;
  btnAlteraCliente: TBitBtn;
  qryPedido: TIB_Query;
  qryCFOP: TIB_Query;
  dtCFOP: TIB_DataSource;
  popCopiar: TPopupMenu;
  CopiarCNPJ1: TMenuItem;
  btnImprimeDespacho: TBitBtn;
  ppEtiquetaDespacho: TppReport;
  ppDetailBand8: TppDetailBand;
  ppShape10: TppShape;
  ppDestino: TppRichText;
  ppLabel51: TppLabel;
  ppPedidoNF: TppLabel;
  ppShape15: TppShape;
  ppLabel63: TppLabel;
  ppNF: TppLabel;
  ppCabecalho_Etiqueta: TppImage;
  dbObservacao_2: TIB_Memo;
  salvar: TSaveDialog;
  qryVencimentos: TIB_Query;
  dtVencimentos: TIB_DataSource;
  dbAliquota: TIB_ComboBox;
  IB_Edit23: TIB_Edit;
  IB_Edit2: TIB_Edit;
  dbNumeracaoVolumes: TIB_Edit;
  qryInscricaoST: TIB_Query;
  dbSimplesNacional: TIB_CheckBox;
  TabSheet2: TTabSheet;
  dbChaveAcesso: TIB_Edit;
  edtProtocolo: TIB_Edit;
  btnXML2: TcxButton;
  btnVerificaWebService: TcxButton;
  btnEmail2: TcxButton;
  lblAmbienteNFe: TLabel;
  btnVerificaTransmissao: TcxButton;
  btnNFeTudo: TcxButton;
  btnGerarXML: TImage;
  btnValidar: TImage;
  btnEnviar: TImage;
  btnEmail: TcxButton;
  btnXML: TcxButton;
  btnPDF2: TcxButton;
  btnPDF: TcxButton;
  dbFinalidade: TIB_ComboBox;
  dbChaveNfeReferencia: TIB_Edit;
  lblIEnviarXML: TLabel;
  lblVerificarprotocolo: TLabel;
  IB_Edit24: TIB_Edit;
  IB_RadioGroup1: TIB_RadioGroup;
  IB_Edit25: TIB_Edit;
  MemoDados: TMemo;
  cdsAlteracaoINF: TClientDataSet;
  qrItemCartaCorrecao: TIB_Query;
  qrCartaCorrecao: TIB_Query;
  popRepositorio: TPopupMenu;
  RepositrioNacional1: TMenuItem;
  RepositrioEstadual1: TMenuItem;
  cxImageList1: TcxImageList;
    IB_RadioGroup2: TIB_RadioGroup;
    IB_Edit26: TIB_Edit;
    pnlCancelado: TPanel;
    lblStatus: TLabel;
    IB_Text3: TIB_Text;
    IB_Text6: TIB_Text;
    Data: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    IB_Text4: TIB_Text;
    IB_Memo2: TIB_Memo;
  procedure FormCreate(Sender: TObject);
  procedure btnPesquisaClienteClick(Sender: TObject);
  procedure BitBtn3Click(Sender: TObject);
  procedure btnPesqCondicaoClick(Sender: TObject);
  procedure btnIncluiCondicaoClick(Sender: TObject);
  procedure btnPesquisaTransportadorClick(Sender: TObject);
  procedure btnIncluiTransportadorClick(Sender: TObject);
  procedure BtCancelarClick(Sender: TObject);
  procedure btnEditar2Click(Sender: TObject);
  procedure BtAnteriorClick(Sender: TObject);
  procedure BtProximoClick(Sender: TObject);
  procedure dbCodigoClienteKeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState);
  procedure dbCodigoTransportadorKeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState);
  procedure btnGerarXMLClick(Sender: TObject);
  procedure BtGravarClick(Sender: TObject);
  procedure BtInserirClick(Sender: TObject);
  procedure BitBtn5Click(Sender: TObject);
  procedure btnPesquisaEspecieMercadoriaClick(Sender: TObject);
  procedure btnIncluirProdutosClick(Sender: TObject);
  procedure edtCNPJExit(Sender: TObject);
  procedure BtEditarClick(Sender: TObject);
  procedure btnRetirarItemClick(Sender: TObject);
  procedure btnValidarClick(Sender: TObject);
  procedure btnEnviarClick(Sender: TObject);
  procedure btnImprimirClick(Sender: TObject);
  procedure edtCNPJEnter(Sender: TObject);
  procedure edtCNPJKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  procedure edtCFOPExit(Sender: TObject);
  procedure edtDataEmissaoExit(Sender: TObject);
  procedure btnPesquisaCFOPClick(Sender: TObject);
  procedure dbValorDescontoExit(Sender: TObject);
  procedure dbPercentualDescontoExit(Sender: TObject);
  procedure btnAlteraClienteClick(Sender: TObject);
  procedure BtExcluirClick(Sender: TObject);
  procedure btnVoltarClick(Sender: TObject);
  procedure dbNumeroPedidoExit(Sender: TObject);
  procedure btnImprimeDespachoClick(Sender: TObject);
  procedure AtualizaTela;
  procedure dbCodigoTransportadorExit(Sender: TObject);
  function LocalizaCliente(CNPJ, CODIGO: string): Boolean;
  function TesteDeRestricoes: Boolean;
  procedure btnPDFClick(Sender: TObject);
  procedure edtHoraKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  procedure edtCFOPKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure btnNFeTudoClick(Sender: TObject);
  procedure btnVerificaTransmissaoClick(Sender: TObject);
  procedure btnXML2Click(Sender: TObject);
  procedure cxButton5Click(Sender: TObject);
  procedure btnPDF2Click(Sender: TObject);
  procedure dbFinalidadeExit(Sender: TObject);
  procedure RepositrioNacional1Click(Sender: TObject);
  procedure RepositrioEstadual1Click(Sender: TObject);
  procedure btnVerificaWebServiceClick(Sender: TObject);
 private
  CartaCorrecaoGerada: Boolean;

  procedure Gerar;
  procedure Assinar;
  procedure Validar;
  procedure Transmitir;
  procedure Distribuir_Frete_Itens;
  procedure ObservacaoCredito;
  function CadastrarCliente: Boolean;
  procedure CadastrarCondicaoPagamento;
  procedure TotalizaItens;
  procedure CalculaDesconto;
  procedure MontaMascaraCPF_CNPJ;
  function RegrasImposto(UF, INSCRICAO, ENTRADA_SAIDA: string; CFOP: integer): Boolean;
  function SemSubstituicaoTributaria: Boolean;
  procedure Mostra_CFOP;
  procedure Distribuir_Desconto_Itens;
  procedure AlterarCliente;
  procedure AtualizaPedido;
  procedure AvisarAtendimentos;
  procedure FiltraRegrasporCFOP;
  function PegaInscricaoSubstituicao: String;
  function ValidarRegrasNegocio: Boolean;
  procedure BuscaTag_DoXml_Carta_Correcao(CampoBD_Alterado: string; var XML_GRUPO, XML_CAMPO: string);
  procedure AjustaCamposAptosAlteracao;
  { Private declarations }
 public
  Consulta: Boolean;
  RegraImpostoAtribuida: integer;
  function GeraCartaCorrecao: Boolean;
  procedure AtribuiCliente;
  procedure GravarHistorico(numero, Historico: String);
  procedure GerarNFe1(NumNFe: String);
  procedure GerarNFe2(NumNFe: String);
  procedure ArquivarXML(arquivo: String);

  { Public declarations }
 end;

var
 frmNF: TfrmNF;
 ChaveAcesso: String;
 PegouRegrasImposto: Boolean;
 PrimeiraParcela, ValorParcela, Valor_Duplicata, TotalPagar: Real;
 PrazoMedio, Parcelas, DiasPrazo: integer;
 Letra_Duplicata: String;
 Vencimento_Duplicata: TDate;

implementation

uses ModeloPesquisa, CadCliente, CadCondicoesPagamento, CadTransportadores,
 CadTipoPagamento, DataModulo, ConfigacaoSistema,
 CadEspecieMercadoria, IncluiProdutosNF, pcnNFe, AvisoAtendimentoCliente,
 Math, DataModulo_NFe, TeladeEspera, ACBrNFeConfiguracoes, InsctrucoesCC,
  CadCartaCorrecao;

{$R *.dfm}

procedure TfrmNF.AtualizaTela;
begin
 btnImprimir.Visible      := btnEditar2.Visible;
 btnGerarXML.Visible      := btnEditar2.Visible;
 btnValidar.Visible       := btnEditar2.Visible;
 btnEnviar.Visible        := btnEditar2.Visible;
 btnAlteraCliente.Visible := btGravar.Visible;
 btnEmail.Visible         := btnEditar2.Visible;
 btnEmail2.Visible        := btnEditar2.Visible;
 btnXML.Visible           := btnEditar2.Visible;
 btnXML2.Visible          := btnEditar2.Visible;
 btnPDF.Visible           := btnEditar2.Visible;
 btnPDF2.Visible          := btnEditar2.Visible;

 qryItens.Close;
 qryItens.ParamByName('VARNF').Value := TbPrincipal.FieldByName('NUMERO').Value;
 qryItens.Open;

 qryHistorico.Close;
 qryHistorico.ParamByName('VARNF').Value := TbPrincipal.FieldByName('NUMERO').Value;
 qryHistorico.Open;

 Mostra_CFOP;

 if not qryUsuario.Locate('COD_USUARIO', TbPrincipal.FieldByName('COD_USUARIO') .Value, []) then
 begin
   if not qryUsuario.Bof then
   begin
     qryUsuario.First;
     qryUsuario.Prior;
   end;
 end;

 edtCNPJ.Text := TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString;
 edtCNPJ.Text := FormataCPF_CNPJ(edtCNPJ.Text);

 LocalizaCliente(TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString, '');

 if TbPrincipal.FieldByName('CLIENTE_CNPJ').IsNull then
   btnAlteraCliente.Visible := False
 else
   btnAlteraCliente.Visible := True;

 if not qryEspecie_Mercadoria.Locate('COD_ESPECIE_MERCADORIA', TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value, []) then
    InicioDaTabela(qryEspecie_Mercadoria);

 if not qryCondicoesPagamento.Locate('COD_CONDICAO_PAGAMENTO', TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value, []) then
    InicioDaTabela(qryCondicoesPagamento);

 if not qryTransportador.Locate('COD_TRANSPORTADOR', TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value, []) then
    InicioDaTabela(qryTransportador);

 if not qrUF_Veiculo.Locate('COD_UF', TbPrincipal.FieldByName('VEICULO_UF').Value, []) then
    InicioDaTabela(qrUF_Veiculo);


 if not qrUF_Transportador.Locate('COD_UF', qryTransportador.FieldByName('COD_UF').Value, []) then
   InicioDaTabela(qrUF_Transportador);

 if ((TbPrincipal.FieldByName('CANCELADO').AsString = 'T') and (TbPrincipal.FieldByName('PROTOCOLO_CANCELAMENTO').AsString <> '')) then
 begin
   pnlCancelado.Color := $004A4AFF;
   lblStatus.Caption := 'NF Cancelada';
 end;

 if TbPrincipal.FieldByName('STATUS').AsString = 'D' then
 begin
  pnlCancelado.Color := clGray;
  lblStatus.Caption := 'Denegada';
 end;

 if (((   TbPrincipal.FieldByName('CANCELADO').AsString = 'T')
     and (TbPrincipal.FieldByName('PROTOCOLO_CANCELAMENTO').AsString <> '')) or
         (TbPrincipal.FieldByName('STATUS').AsString = 'D')) then
  pnlCancelado.Visible := True
 else
  pnlCancelado.Visible := False;

 if TbPrincipal.FieldByName('FINALIDADE_EMISSAO').Value <> 'fnNormal' then
  dbChaveNfeReferencia.Visible := True;

 if TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').AsString <> '' then
  btnNFeTudo.Visible := False
 else
  btnNFeTudo.Visible := True;

end;

procedure TfrmNF.FormCreate(Sender: TObject);
begin
 frmTelaEspera := TfrmTelaEspera.Create(Self);
 frmTelaEspera.Show;

 Application.ProcessMessages;

 DMNFE := TDMNFE.Create(Self);

 AvisaVencimentoCertificado;

 lblVerificarprotocolo.Caption := '';
 lblIEnviarXML.Caption         := '';
 lblAmbienteNFe.Caption        := Dados.qryParametro_NF.FieldByName('HAMBIENTE_NFE').AsString;

 qryCFOP.Open;
 qryUsuario.Open;
 qryCliente.Open;
 qrUF_Cliente.Open;
 qryCondicoesPagamento.Open;
 qryEspecie_Mercadoria.Open;
 qryTransportador.Open;
 qrUF_Veiculo.Open;
 qrUF_Transportador.Open;
 qryHistorico.Open;

 PegouRegrasImposto := False;
 pnlCancelado.Top   := pnlBotoesAcoesNF.Top + 71;
 pnlCancelado.left  := dbICMST.left;

 if Dados.qryMVA.IsEmpty then
 begin
    MessageDlg('Deve ser informado o valor de MVA em Configuração/Parâmetros/NF', mtWarning, [mbOK], 0);
    Exit;
 end;

 FreeAndNil(frmTelaEspera);

 inherited;

end;

procedure TfrmNF.btnPesquisaClienteClick(Sender: TObject);
begin
 inherited;
 qryCliente.SQLWhere.Clear;

 frmModeloPesquisa                   := TfrmModeloPesquisa.Create(Application);
 frmModeloPesquisa.Tabela            := qryCliente;
 frmModeloPesquisa.lblTitulo.Caption := 'Pesquisa Clientes';

 if frmModeloPesquisa.ShowModal = mrOk then
 begin
  if LocalizaCliente('', frmModeloPesquisa.TbPrincipal.FieldByName('cod_cliente').Value) then
  begin
    AtribuiCliente;
    TesteDeRestricoes;
  end;
 end
 else
   qryCliente.SQLWhere.Add(' WHERE CLIENTE.CLIENTE.cod_cliente=:VARCODIGO ');

 frmModeloPesquisa.Destroy;
 RegrasImposto(TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString,
               TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString,
               TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString,
               TbPrincipal.FieldByName('COD_CFOP').AsInteger);

 Screen.OnActiveControlChange := TrocaCor;

 edtCFOP.SetFocus;

 PaginasManutencao.ActivePage := tabCliente;
end;

procedure TfrmNF.BitBtn3Click(Sender: TObject);
begin
 inherited;
 CadastrarCliente;
end;

function TfrmNF.CadastrarCliente: Boolean;
begin
 frmCadCliente                     := TfrmCadCliente.Create(Application);
 frmCadCliente.OutraTela           := True;
 frmCadCliente.BtInserir.Click;
 frmCadCliente.edtCNPJ.Field.Value := edtCNPJ.Text;
 frmCadCliente.ShowModal;
 frmCadCliente.Destroy;

 if NOT LocalizaCliente(LimpaTexto(edtCNPJ.Text), '') then
 begin
  Result := False;
  edtCNPJ.Clear;
  edtCNPJ.SetFocus;
  Exit;
 end;

 AtribuiCliente;
 TesteDeRestricoes;

 RegrasImposto(TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString,
               TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString,
               TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString,
               TbPrincipal.FieldByName('COD_CFOP').AsInteger);

 Result := True;
end;

procedure TfrmNF.btnPesqCondicaoClick(Sender: TObject);
begin
 inherited;
 frmModeloPesquisa                   := TfrmModeloPesquisa.Create(Application);
 frmModeloPesquisa.Tabela            := qryCondicoesPagamento;
 frmModeloPesquisa.lblTitulo.Caption := 'Pesquisa Condição de Pagamento';

 if frmModeloPesquisa.ShowModal = mrOk then
 begin
  qryCondicoesPagamento.Locate('COD_CONDICAO_PAGAMENTO', frmModeloPesquisa.TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value, []);
  TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value := qryCondicoesPagamento.FieldByName('COD_CONDICAO_PAGAMENTO').Value;
 end;
 frmModeloPesquisa.Destroy;
 AtualizaTela;

 Screen.OnActiveControlChange := TrocaCor;

end;

procedure TfrmNF.btnIncluiCondicaoClick(Sender: TObject);
begin
 inherited;
 CadastrarCondicaoPagamento;
end;

procedure TfrmNF.CadastrarCondicaoPagamento;
begin
 frmCadCondicoesPagamento           := TfrmCadCondicoesPagamento.Create(Application);
 frmCadCondicoesPagamento.OutraTela := True;
 frmCadCondicoesPagamento.BtInserirClick(Self);
 frmCadCondicoesPagamento.ShowModal;

 // ============== Localiza a nova Condição de pagamento cadastrado ============
 TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value := frmCadCondicoesPagamento.TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value;
 frmCadCondicoesPagamento.Destroy;
 qryCondicoesPagamento.RefreshAll;
 AtualizaTela;
 Screen.OnActiveControlChange := TrocaCor;
end;

procedure TfrmNF.btnPesquisaTransportadorClick(Sender: TObject);
begin
 inherited;
 frmModeloPesquisa                   := TfrmModeloPesquisa.Create(Application);
 frmModeloPesquisa.Tabela            := qryTransportador;
 frmModeloPesquisa.lblTitulo.Caption := 'Pesquisa Transportador';

 if frmModeloPesquisa.ShowModal = mrOk then
 begin
  qryTransportador.Locate('COD_TRANSPORTADOR', frmModeloPesquisa.TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value, []);
  TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value := qryTransportador.FieldByName('COD_TRANSPORTADOR').Value;
  TbPrincipal.FieldByName('VEICULO_PLACA').Value     := qryTransportador.FieldByName('VEICULO_PLACA').Value;
  TbPrincipal.FieldByName('VEICULO_UF').Value        := qryTransportador.FieldByName('VEICULO_UF').Value;
 end;

 frmModeloPesquisa.Destroy;
 AtualizaTela;

 Screen.OnActiveControlChange := TrocaCor;

end;

procedure TfrmNF.btnIncluiTransportadorClick(Sender: TObject);
begin
 inherited;
 frmCadTransportadores := TfrmCadTransportadores.Create(Application);
 frmCadTransportadores.OutraTela := True;
 frmCadTransportadores.BtInserirClick(Self);
 frmCadTransportadores.ShowModal;

 // ============== Localiza o Novo Transportador cadastrado ============

 TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value := frmCadTransportadores.TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value;
 TbPrincipal.FieldByName('VEICULO_PLACA').Value     := qryTransportador.FieldByName('VEICULO_PLACA').Value;
 TbPrincipal.FieldByName('VEICULO_UF').Value        := qryTransportador.FieldByName ('VEICULO_UF').Value;
 frmCadTransportadores.Destroy;

 qryTransportador.RefreshAll;
 AtualizaTela;
 Screen.OnActiveControlChange := TrocaCor;

end;


procedure TfrmNF.BtCancelarClick(Sender: TObject);
begin
 inherited;
 AtualizaTela;
end;

procedure TfrmNF.btnEditar2Click(Sender: TObject);
begin

 cdsAlteracaoINF.Close;
 cdsAlteracaoINF.CreateDataSet;

 if TbPrincipal.FieldByName('STATUS').AsString = 'C' then
 begin
  MessageDlg('Esta NF está cancelada', mtWarning, [mbOK], 0);
  Exit;
 end;

 if TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').IsNotNull then
 begin
  MessageDlg ('NF já transmitida observe se o que deseja alterar é passível de carta de correção',mtWarning, [mbOK], 0);
  frmInstrucoesCC := TfrmInstrucoesCC.Create(Application);
  frmInstrucoesCC.ShowModal;
  frmInstrucoesCC.Destroy;
 end;

 // ================= Desabilita os controle da pagina de manutencao ==============
 Manutencao.Enabled := False;

 inherited;

 try
  btnImprimir.Visible            := False;
  btnEmail.Visible               := False;
  btnPDF.Visible                 := False;
  btnXML.Visible                 := False;
  btnNFeTudo.Visible             := False;
  btnVerificaTransmissao.Visible := False;

  AjustaCamposAptosAlteracao;

 finally
  // ================= Habilita os controle da pagina de manutencao ==============
  Manutencao.Enabled := True;

 end;
end;

procedure TfrmNF.BtAnteriorClick(Sender: TObject);
begin
 inherited;
 AtualizaTela;

end;

procedure TfrmNF.BtProximoClick(Sender: TObject);
begin
 inherited;
 AtualizaTela;

end;

procedure TfrmNF.dbCodigoClienteKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 inherited;
 if (Key = VerificaAtalho(Dados.tbConfig.FieldByName('ATALHO_PESQUISA').AsString)) and (edtCNPJ.Focused) then
 begin
  if btnPesquisaCliente.Enabled = True then
     btnPesquisaCliente.Click;
 end;

end;

procedure TfrmNF.dbCodigoTransportadorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 inherited;
 if (Key = VerificaAtalho(Dados.tbConfig.FieldByName('ATALHO_PESQUISA').AsString)) and (dbCodigoTransportador.Focused) then
 begin
  if btnPesquisaTransportador.Enabled = True then
   btnPesquisaTransportador.Click;
 end;

end;

procedure TfrmNF.btnGerarXMLClick(Sender: TObject);
begin
 Gerar;

 ShowMessage('Arquivo gerado em: ' + DMNFE.NFe.NotasFiscais.Items[0].NomeArq);
 TbPrincipal.RefreshRows;
 GravarHistorico(TbPrincipal.FieldByName('NUMERO').AsString, 'Geração XML: ' + TbPrincipal.FieldByName('CHAVE_ACESSO').AsString);

end;

procedure TfrmNF.BtGravarClick(Sender: TObject);
begin
 if NOT TesteDeRestricoes then
  Exit;

 TbPrincipal.FieldByName('COD_CFOP').Value               := qryCFOP.FieldByName('COD_CFOP').Value;
 TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value := qryCondicoesPagamento.FieldByName('COD_CONDICAO_PAGAMENTO').Value;
 TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value := qryEspecie_Mercadoria.FieldByName('COD_ESPECIE_MERCADORIA').Value;
 TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value      := qryTransportador.FieldByName('COD_TRANSPORTADOR').Value;
 TbPrincipal.FieldByName('VEICULO_UF').Value             := qrUF_Veiculo.FieldByName('COD_UF').Value;
 TbPrincipal.FieldByName('TOTAL_NF').Value               := TbPrincipal.FieldByName('TOTAL_NF').AsFloat + TbPrincipal.FieldByName('OUTRAS_DESPESAS').AsFloat;

 if TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').AsFloat > 0 then
  TbPrincipal.FieldByName('INSCRICAO_SUBSTITUICAO').Value := PegaInscricaoSubstituicao
 else
  TbPrincipal.FieldByName('INSCRICAO_SUBSTITUICAO').Value := Null;

 qryCliente.Edit;
 qryCliente.FieldByName('ULTIMA_MOVIMENTACAO').Value := Date;
 qryCliente.Post;

 if TbPrincipal.FieldByName('VALOR_FRETE').AsFloat > 0 then
  Distribuir_Frete_Itens;

 if GeraCartaCorrecao then
  CartaCorrecaoGerada := True
 else
  CartaCorrecaoGerada := False;

 inherited;
 // ===================== Update nos paramentros com o codigo da ultima NF gerada para a numeracao continuar em sequencia =====================
 qryPesquisa.Close;
 qryPesquisa.SQL.Clear;
 qryPesquisa.SQL.Add(' select max(numero) as numero from NF ');
 qryPesquisa.Open;

 Dados.qryParametro_NF.Edit;
 Dados.qryParametro_NF.FieldByName('ULTIMA_NF_CADASTRADA').Value := qryPesquisa.FieldByName('numero').AsInteger;
 Dados.qryParametro_NF.Post;

 if NOT TbPrincipal.FieldByName('COD_PEDIDO').IsNull then
  AtualizaPedido;

 if CartaCorrecaoGerada then
 begin
  if (MessageDlg('Foi gerada uma carta de correção  ' + #13 + #10 +
    'para justificar as alterações ocorridas.' + #13 + #10 + '' + #13 + #10 +
    'Deseja ir para a carta de correção agora?', mtConfirmation, [mbYes, mbNo],
    0) = mrYes) then
  begin
    frmCadCartaCorrecao := TfrmCadCartaCorrecao.Create(Application);
    frmCadCartaCorrecao.OutraTela := True;
    frmCadCartaCorrecao.TbPrincipal.Close;
    frmCadCartaCorrecao.TbPrincipal.Filter := ' COD_TABELA_CORRIGIDA = ' + QuotedStr(TbPrincipal.FieldByName('NUMERO').AsString);
    frmCadCartaCorrecao.TbPrincipal.Filtered := True;
    frmCadCartaCorrecao.TbPrincipal.Open;
    frmCadCartaCorrecao.btEditar.Click;
    frmCadCartaCorrecao.ShowModal;
    frmCadCartaCorrecao.Destroy;
   end;

 end;

 qryPesquisa.Close;

 AtualizaTela;
end;

procedure TfrmNF.BtInserirClick(Sender: TObject);
begin
 Dados.qryParametro_NF.RefreshAll;
 if (Dados.qryParametro_NF.FieldByName('ULTIMA_NF_CADASTRADA').AsString = '') or
   (Dados.qryParametro_NF.FieldByName('SERIE_NF').AsString = '') then
 begin
  if MessageDlg('É necessário informar a Numeração e Série da NF' + #13 + #10 +
    'nos parâmetros do sistema.' + #13 + #10 + '' + #13 + #10 +
    'Deseja informar agora?', mtWarning, [mbYes, mbNo], 0) = mrYes then
  begin
   frmConfiguracao                        := TfrmConfiguracao.Create(Application);
   frmConfiguracao.pgPrincipal.ActivePage := frmConfiguracao.tabNF;
   frmConfiguracao.ShowModal;
   frmConfiguracao.Destroy;
   Screen.OnActiveControlChange := TrocaCor;
  end;

  Exit;
 end;

 PaginasManutencao.ActivePage := tabCliente;

 inherited;

 TbPrincipal.FieldByName('NUMERO').Value             := Dados.qryParametro_NF.FieldByName('ULTIMA_NF_CADASTRADA').Value + 1;
 TbPrincipal.FieldByName('SERIE').Value              := Dados.qryParametro_NF.FieldByName('SERIE_NF').Value;
 TbPrincipal.FieldByName('ENTRADA_SAIDA').Value      := 'S';
 TbPrincipal.FieldByName('STATUS').Value             := 'A';
 TbPrincipal.FieldByName('FINALIDADE_EMISSAO').Value := 'fnNormal';

 TbPrincipal.FieldByName('DATA_CADASTRO').Value      := Date;
 TbPrincipal.FieldByName('DATA_EMISSAO').Value       := Date;
 TbPrincipal.FieldByName('DATA_SAIDA').Value         := Date;
 TbPrincipal.FieldByName('HORA_SAIDA').Value         := Time;
 TbPrincipal.FieldByName('COD_FILIAL').Value         := Dados.qrFilial.FieldByName('COD_FILIAL').Value;
 TbPrincipal.FieldByName('COD_USUARIO').Value        := Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
 TbPrincipal.FieldByName('CIF_FOB').Value            := Dados.qryParametro_NF.FieldByName('MODALIDADE_FRETE').Value;

 if Dados.qryParametro_NF.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger > 0 then
  TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').Value := Dados.qryParametro_NF.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger;

 if Dados.qryParametro_NF.FieldByName('COD_ESPECIE_MERCADORIA').AsInteger > 0 then
  TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value := Dados.qryParametro_NF.FieldByName('COD_ESPECIE_MERCADORIA').AsInteger;

 if Dados.qryParametro_NF.FieldByName('COD_TRANSPORTADOR').AsInteger > 0 then
  TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value := Dados.qryParametro_NF.FieldByName('COD_TRANSPORTADOR').AsInteger;

 AtualizaTela;
 edtDataEmissao.SetFocus;
end;

procedure TfrmNF.BitBtn5Click(Sender: TObject);
begin
 inherited;
 frmCadEspecieMercadoria := TfrmCadEspecieMercadoria.Create(Application);
 frmCadEspecieMercadoria.OutraTela := True;
 frmCadEspecieMercadoria.BtInserirClick(Self);
 frmCadEspecieMercadoria.ShowModal;

 // ============== Localiza a nova espécie cadastrada ============
 TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value := frmCadEspecieMercadoria.TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value;
 frmCadEspecieMercadoria.Destroy;
 qryEspecie_Mercadoria.RefreshAll;
 AtualizaTela;
 Screen.OnActiveControlChange := TrocaCor;
end;

procedure TfrmNF.btnPesquisaEspecieMercadoriaClick(Sender: TObject);
begin
 inherited;
 frmModeloPesquisa := TfrmModeloPesquisa.Create(Application);
 frmModeloPesquisa.Tabela := qryEspecie_Mercadoria;
 frmModeloPesquisa.lblTitulo.Caption := 'Pesquisa Espécie Mercadoria';
 if frmModeloPesquisa.ShowModal = mrOk then
 begin
  qryEspecie_Mercadoria.Locate('COD_ESPECIE_MERCADORIA', frmModeloPesquisa.TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value, []);
  TbPrincipal.FieldByName('COD_ESPECIE_MERCADORIA').Value := qryEspecie_Mercadoria.FieldByName('COD_ESPECIE_MERCADORIA').Value;
 end;
 frmModeloPesquisa.Destroy;
 AtualizaTela;

 Screen.OnActiveControlChange := TrocaCor;

end;

procedure TfrmNF.btnIncluirProdutosClick(Sender: TObject);
begin
 inherited;
 if TbPrincipal.FieldByName('COD_CLIENTE').IsNull then
 begin
  MessageDlg('É necessário selecionar o Cliente', mtWarning, [mbOK], 0);
  edtCNPJ.SetFocus;
  Exit;
 end
 else if NOT TesteDeRestricoes then
  Exit
 else
 if (qryCFOP.FieldByName('COD_CFOP').AsString = '') then
 begin
  Exit;
  MessageDlg('É necessário selecionar o CFOP-Código Fiscal de Operação', mtWarning, [mbOK], 0);
  edtCFOP.SetFocus;
 end;

 TbPrincipal.PostRetaining;

 frmIncluiProdutosNF := TfrmIncluiProdutosNF.Create(Application);
 frmIncluiProdutosNF.ShowModal;
 frmIncluiProdutosNF.Destroy;
 TotalizaItens;
 AtualizaTela;
end;

procedure TfrmNF.edtCNPJExit(Sender: TObject);
var
 tipoPessoa, erro: string;
begin
 inherited;
 if TbPrincipal.State in [dssBrowse] then
 begin
  MontaMascaraCPF_CNPJ;
  Exit;
 end;

 if Trim(edtCNPJ.Text) = '' then
  Exit;

 if ValidaCNPJCEICPF(edtCNPJ.Text, tipoPessoa, erro) = False then
 begin
  MessageDlg(erro, mtWarning, [mbOK], 0);
  edtCNPJ.SetFocus;
  Exit;
 end;

 if edtCNPJ.Text = '' then
  Exit;
 if NOT LocalizaCliente(LimpaTexto(edtCNPJ.Text), '') then
 begin
  if MessageDlg('Cliente não cadastrado' + #13 + #10 +
    'Deseja cadastrar agora?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
  begin
   edtCNPJ.Clear;
   edtCNPJ.SetFocus;
   Exit;
  end
  else if NOT CadastrarCliente then
   Exit;
 end;
 Screen.OnActiveControlChange := TrocaCor;
 AtribuiCliente;
 MontaMascaraCPF_CNPJ;
 if TesteDeRestricoes then
  RegrasImposto(TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString,
                TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString,
                TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString,
                TbPrincipal.FieldByName('COD_CFOP').AsInteger);
end;

procedure TfrmNF.BtEditarClick(Sender: TObject);
begin
 inherited;
 AtualizaTela;
end;

procedure TfrmNF.btnRetirarItemClick(Sender: TObject);
begin
 inherited;
 if (MessageDlg('Confirma exclusão deste item?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
 begin

  while NOT qryItens.IsEmpty do
   qryItens.Delete;

  TotalizaItens;
  CalculaDesconto;
  AtualizaTela;
 end;

end;

procedure TfrmNF.TotalizaItens;
begin
 qryTotalItens.Close;
 qryTotalItens.ParamByName('VARNF').Value := TbPrincipal.FieldByName('NUMERO').Value;
 qryTotalItens.Open;

 TbPrincipal.FieldByName('BASE_ICMS_SUBSTITUICAO').Value := qryTotalItens.FieldByName('BASE_ICMS_ST').AsFloat;
 TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').Value      := qryTotalItens.FieldByName('TOTAL_SUBSTITUICAO').AsFloat;
 TbPrincipal.FieldByName('TOTAL_PRODUTOS').Value         := qryTotalItens.FieldByName('TOTAL').AsFloat;
 TbPrincipal.FieldByName('DESCONTO_VALOR').Value         := qryTotalItens.FieldByName('DESCONTO_TOTAL').AsFloat;

 TbPrincipal.FieldByName('BASE_CALCULO').Value           := qryTotalItens.FieldByName('BASE_CALCULO').AsFloat;
 TbPrincipal.FieldByName('VALOR_ICMS').Value             := qryTotalItens.FieldByName('VALOR_ICMS').AsFloat;
 TbPrincipal.FieldByName('TOTAL_IPI').Value              := qryTotalItens.FieldByName('TOTAL_IPI').AsFloat;

 CalculaDesconto;

 TbPrincipal.FieldByName('TOTAL_NF').Value := qryTotalItens.FieldByName('TOTAL').AsFloat  - TbPrincipal.FieldByName('DESCONTO_VALOR').Value;
 TbPrincipal.FieldByName('TOTAL_NF').Value := TbPrincipal.FieldByName('TOTAL_NF').AsFloat + TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
 TbPrincipal.FieldByName('TOTAL_NF').Value := TbPrincipal.FieldByName('TOTAL_NF').AsFloat + TbPrincipal.FieldByName('TOTAL_IPI').AsFloat;

 TbPrincipal.FieldByName('DIFAL_VALOR_FCP').Value             := qryTotalItens.FieldByName('DIFAL_VALOR_FCP_DESTINO').AsFloat;
 TbPrincipal.FieldByName('DIFAL_VALOR_ICMS_UF_DESTINO').Value := qryTotalItens.FieldByName('DIFAL_VALOR_INTERESTADUAL_DEST').AsFloat;
 TbPrincipal.FieldByName('DIFAL_VALOR_ICMS_UF_REMETEN').Value := qryTotalItens.FieldByName('DIFAL_VALOR_INTERESTADUAL_REME').AsFloat;

 // INICIO ==========   CALCULO DOS PESOS CONFORME DETERMINADO NOS PARÂMETROS DA NF =============
 if Dados.qryParametro_NF.FieldByName('FORMA_CALCULO_PESO').AsString = 'PESO REAL' then
  TbPrincipal.FieldByName('PESO_LIQUIDO').Value := qryTotalItens.FieldByName('TOTAL_PESO').AsFloat
 else
 if Dados.qryParametro_NF.FieldByName('FORMA_CALCULO_PESO').AsString = 'TOTAL NF / 6' then
   TbPrincipal.FieldByName('PESO_LIQUIDO').Value := ((TbPrincipal.FieldByName('TOTAL_NF').AsFloat / 6) * 10) / 10;

 TbPrincipal.FieldByName('PESO_BRUTO').Value := TbPrincipal.FieldByName('PESO_LIQUIDO').Value;

 // FIM   ==========   CALCULO DOS PESOS CONFORME DETERMINADO NOS PARÂMETROS DA NF =============

 // INICIO ==========   CALCULO DAS QUANTIDADES CONFORME DETERMINADO NOS PARÂMETROS DA NF =============
 if Dados.qryParametro_NF.FieldByName('QUANTIDADE_IGUAL_VOLUMES').AsString = 'T'
 then
  TbPrincipal.FieldByName('VOLUMES').Value := qryTotalItens.FieldByName('TOTAL_QTE').AsFloat;
 // FIM    ==========   CALCULO DAS QUANTIDADES CONFORME DETERMINADO NOS PARÂMETROS DA NF =============

 TbPrincipal.FieldByName('ITEMS').Value := qryTotalItens.FieldByName('QTE_ITENS').AsFloat;

 if ((Dados.qryParametro_NF.FieldByName('GERAR_CREDITO').AsString = 'T') and
   (not Dados.qryParametro_NF.FieldByName('INFORMACAO_CREDITO').IsNull)) then
  ObservacaoCredito;

 if (TbPrincipal.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat = 0) then
  SemSubstituicaoTributaria;

 if (TbPrincipal.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat > 0) and
   (qryCliente.FieldByName('OPTANTE_SIMPLES').IsBoolean) and (qrUF_Cliente.FieldByName('DESCRICAO').AsString = 'PR') then
  TbPrincipal.FieldByName('OBS_FISCO').Value := TbPrincipal.FieldByName('OBS_FISCO').Value + #13#10 +
    '// OPERAÇÃO DESTINADA A CONTRIBUINTE ENQUADRADO NO SIMPLES NACIONAL, MVA REDUZIDA ART. 12-D DO ANEXO X DO RICMS/PR';

end;

procedure TfrmNF.CalculaDesconto;
begin
 if TbPrincipal.FieldByName('DESCONTO_VALOR').AsFloat <> qryTotalItens.FieldByName('TOTAL_DESCONTO').AsFloat then
  Distribuir_Desconto_Itens;
end;

procedure TfrmNF.btnValidarClick(Sender: TObject);
begin
 inherited;
 if NOT ValidarRegrasNegocio then
  Exit;
 Assinar;
 Validar;
end;

procedure TfrmNF.btnEnviarClick(Sender: TObject);
begin
 inherited;
 Transmitir;

 GravarHistorico(TbPrincipal.FieldByName('NUMERO').AsString, 'Transmitida: ' + TbPrincipal.FieldByName('CHAVE_ACESSO').AsString);

 TbPrincipal.RefreshRows;

end;

procedure TfrmNF.btnImprimirClick(Sender: TObject);
var
 Caminho, arquivo: string;
begin
 inherited;
 TbPrincipal.RefreshAll;

 arquivo := TbPrincipal.FieldByName('CHAVE_ACESSO').AsString + '-nfe.XML';

 if TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').IsNotNull then
  Caminho := DMNFE.ImpressaoNFe.PathPDF
 else
  Caminho := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;

 if TbPrincipal.FieldByName('CANCELADO').IsNotNull then
  Caminho := CaminhoEXE + 'NFE\CANCELADAS\';

 arquivo := Caminho + arquivo;
 if NOT ExisteArquivo(arquivo) then
 begin
  OpenDialog1.Title      := 'Selecione a NFE';
  OpenDialog1.DefaultExt := '*-nfe.XML';
  OpenDialog1.Filter     :=  'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;
  if OpenDialog1.Execute then
   arquivo := OpenDialog1.FileName
  else
   Exit;
 end;

 DMNFE.NFe.NotasFiscais.Clear;
 DMNFE.NFe.NotasFiscais.LoadFromFile(arquivo);
 if DMNFE.NFe.NotasFiscais.Items[0].NFe.Ide.tpEmis = teDPEC then
 begin
  DMNFE.NFe.WebServices.Consulta.NFeChave := DMNFE.NFe.NotasFiscais.Items[0] .NFe.infNFe.ID;
  DMNFE.NFe.WebServices.Consulta.Executar;
  // DMNFE.NFe.DANFE.ProtocoloNFe := DMNFE.NFe.WebServices.ConsultaDPEC.nRegDPEC +' '+ DateTimeToStr(DMNFE.NFe.WebServices.ConsultaDPEC.retDPEC.dhRegDPEC);
 end;
 if Dados.qryParametro_NF.FieldByName('CARREGAR_LOGO').AsBoolean then
  DMNFE.ImpressaoNFe.Logo := Dados.tbConfig.FieldByName('LOCAL_IMAGENS').AsString + 'logo.bmp';

 DMNFE.ImpressaoNFe.NumCopias := Dados.qryParametro_NF.FieldByName('QTE_VIAS_NF').AsInteger;
 DMNFE.NFe_Imprimir_Individual(TbPrincipal.FieldByName('NUMERO').AsInteger);

 // DMNFE.NFe.NotasFiscais.Imprimir;

 if NOT qryCliente.FieldByName('EMAIL').IsNull then
  if (MessageDlg ('O Cliente desta NF tem email cadastrado. Deseja enviar XML ao cliente?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
   btnEmail.Click;
end;

procedure TfrmNF.MontaMascaraCPF_CNPJ;
begin
 // ================= monta a mascara do cpf ou cnpj ==============
 if Length(edtCNPJ.Text) = 11 then
 begin
  edtCNPJ.EditLabel.Caption := 'CPF';
 end
 else if Length(qryCliente.FieldByName('CNPJ').AsString) = 14 then
 begin
  edtCNPJ.EditLabel.Caption := 'CNPJ';
 end
 else
 begin
  edtCNPJ.EditLabel.Caption := 'CPF/CNPJ';
 end;
 edtCNPJ.Text := qryCliente.FieldByName('CNPJ').AsString;
 edtCNPJ.Text := FormataCPF_CNPJ(edtCNPJ.Text);
end;

procedure TfrmNF.edtCNPJEnter(Sender: TObject);
begin
 inherited;
 qryCliente.FieldByName('CNPJ').EditMask := '';
end;

procedure TfrmNF.edtCNPJKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 inherited;
 if (Key = VerificaAtalho(Dados.tbConfig.FieldByName('ATALHO_PESQUISA').AsString)) and (edtCNPJ.Focused) then
  btnPesquisaCliente.Click;
 if Key = VK_RETURN then
  edtCFOP.SetFocus;
end;

function TfrmNF.TesteDeRestricoes: Boolean;
var
 pendencias: String;
begin
 Result := False;
 // INICIO ============== PENDÊNCIAS NO CADASTRO DO CLIENTE ===========================
 pendencias := '';

 if (TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString = '') then
  pendencias := '[ CNPJ ] ';

 if TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString = '' then
  pendencias := pendencias + '[Inscrição] ';

 if TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_CIDADE').AsString = '' then
  pendencias := pendencias + '[Código Município] ';

 if (TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString = '') or
    (TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString = '') OR
    (TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_CIDADE').AsString = '') then
 begin
  if (MessageDlg('Cadastro Cliente incompleto para gerar NF' + #13 + #10 +
    'Campo:' + pendencias + #13 + #10 + 'Deseja alterar agora?', mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
    AlterarCliente
  else
    Exit;
 end
 else
  Result := True;


end;

function TfrmNF.RegrasImposto(UF, INSCRICAO, ENTRADA_SAIDA: string;
  CFOP: integer): Boolean;
var
 qte_regras: integer;
begin
 PegouRegrasImposto := True;

 Dados.qryMVA.Filtered := False;
 Dados.qryMVA.Filter := ' ESTADO =' + QuotedStr(qrUF_Cliente.FieldByName('DESCRICAO').AsString);
 Dados.qryMVA.Filtered := True;

 qryRegras_Imposto.Close;
 qryRegras_Imposto.ParamByName('varUF').Value := '%' + qrUF_Cliente.FieldByName('DESCRICAO').AsString + '%';
 if qryCliente.FieldByName('INSCRICAO').AsString = 'ISENTO' then
  qryRegras_Imposto.ParamByName('varINSCRICAO').Value := 'F'
 else
  qryRegras_Imposto.ParamByName('varINSCRICAO').Value := 'T';

 qryRegras_Imposto.ParamByName('varENTRADA_SAIDA').Value := ENTRADA_SAIDA;

 qryRegras_Imposto.Open;
 qte_regras := qryRegras_Imposto.RecordCount;

 if (qte_regras > 1) or (qte_regras = 0) then
 begin
  MessageDlg('Problemas nas regras de imposto' + #13 + #10 +
    'Isto é um erro severo, não é possível continuar.' + #13 + #10 + '' + #13 +
    #10 + 'Por favor entre em contato com o suporte', mtError, [mbOK], 0);
  Result := False;
  Exit;
 end
 else
 begin
  Result := True;
  TbPrincipal.FieldByName('COD_CFOP').Value := qryRegras_Imposto.FieldByName('COD_CFOP').Value;
  Mostra_CFOP;
 end;

 // INICIO ============== INCREMENTA DADOS COMPLEMENTARES ===========================
 if (qryCFOP.FieldByName('DENTRO_FORA').AsString = 'D') AND
   (TbPrincipal.FieldByName('OBSERVACAO').AsString = '') then
  TbPrincipal.FieldByName('OBSERVACAO').AsString := Dados.qryParametro_NF.FieldByName('INFORMACAO_COMPLEMENTAR').AsString;

 TbPrincipal.FieldByName('ALIQUOTA').Value := qryRegras_Imposto.FieldByName('ALIQUOTA').Value;

end;

procedure TfrmNF.RepositrioEstadual1Click(Sender: TObject);
begin
 inherited;
 DMNFE.NFe_Consultar_Status_WebService_MG;
end;

procedure TfrmNF.RepositrioNacional1Click(Sender: TObject);
begin
 inherited;
 DMNFE.NFe_Consultar_Status_WebService_Nacional;
end;

function TfrmNF.SemSubstituicaoTributaria: Boolean;
begin
 if TbPrincipal.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat > 0 then
  TbPrincipal.FieldByName('OBS_FISCO').Value := TbPrincipal.FieldByName('OBS_FISCO').Value + #13#10 +
                                                'VALOR ICMS OPERAÇÃO PRÓPRIA PARA CRÉDITO DO CÁLCULO DA ST:' +
                                                 Padr(FormatFloat('#0.00', TbPrincipal.FieldByName('BASE_ICMS_SUBSTITUICAO').Value), 10);
 Result := True;
end;

procedure TfrmNF.edtCFOPExit(Sender: TObject);
begin
 inherited;
 if edtCFOP.Text = '' then
  Exit;

 qryCFOP.RefreshAll;
 if not qryCFOP.Locate('COD_CFOP', LimpaTexto(edtCFOP.Text), []) then
 begin
  MessageDlg('CFOP não cadastrado', mtWarning, [mbOK], 0);
  edtCFOP.Clear;
  Exit;
 end;

 TbPrincipal.FieldByName('COD_CFOP').Value      := qryCFOP.FieldByName('COD_CFOP').Value;
 TbPrincipal.FieldByName('ENTRADA_SAIDA').Value := qryCFOP.FieldByName('ENTRADA_SAIDA').Value;
end;

procedure TfrmNF.Mostra_CFOP;
begin
 if not qryCFOP.Locate('COD_CFOP', TbPrincipal.FieldByName('COD_CFOP').Value, [])then
 begin
  if not qryCFOP.Bof then
  begin
   qryCFOP.First;
   qryCFOP.Prior;
  end;
 end;
end;

procedure TfrmNF.edtDataEmissaoExit(Sender: TObject);
begin
 inherited;
 edtDataSaida.Text := edtDataEmissao.Text;
end;

procedure TfrmNF.GerarNFe1(NumNFe: String);
var
 i: integer;
 CFOP_Impressao: String;
begin
 DMNFE.NFe.Configuracoes.Geral.FormaEmissao := teNormal;
 DMNFE.NFe.NotasFiscais.Clear;

 with DMNFE.NFe.NotasFiscais.Add.NFe do
 begin
  if Dados.qryParametro_NF.FieldByName('IMPRIMIR_CFOP').AsString = 'DESCRIÇÃO'
  then
   CFOP_Impressao := qryCFOP.FieldByName('DESCRICAO').AsString
  else if Dados.qryParametro_NF.FieldByName('IMPRIMIR_CFOP').AsString = 'CFOP'
  then
   CFOP_Impressao := qryCFOP.FieldByName('COD_CFOP').AsString
  else
   CFOP_Impressao := qryCFOP.FieldByName('COD_CFOP').AsString + '-' +
     qryCFOP.FieldByName('DESCRICAO').AsString;

  Ide.tpImp   := tiRetrato;
  Ide.natOp   := Copy(CFOP_Impressao, 1, 60);
  Ide.nNF     := StrToInt(NumNFe);
  Ide.cNF     := StrToInt(NumNFe);
  Ide.modelo  := StrToInt(Dados.qryParametro_NF.FieldByName('MODELO_NF').AsString);
  Ide.serie   := TbPrincipal.FieldByName('SERIE').AsInteger;
  Ide.dEmi    := TbPrincipal.FieldByName('DATA_EMISSAO').AsDate;
  Ide.dSaiEnt := TbPrincipal.FieldByName('DATA_SAIDA').AsDate;
  Ide.hSaiEnt := TbPrincipal.FieldByName('HORA_SAIDA').AsDateTime;

  if TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString = 'E' then
   Ide.tpNF := tnEntrada
  else
  if TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString = 'S' then
   Ide.tpNF := tnSaida;

  // Condição de Pagamento À VISTA deve ser sempre código 1
  if TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger = 0 then
   Ide.indPag := ipOutras
  else
  if TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger = 1 then
   Ide.indPag := ipVista
  else
  begin
   Ide.indPag := ipPrazo;

   PrazoMedio := qryCondicoesPagamento.FieldByName('PRAZOMEDIO').AsInteger;
   Parcelas := qryCondicoesPagamento.FieldByName('PARCELAS').AsInteger;

   qryVencimentos.Close;
   qryVencimentos.ParamByName('VARCONDICAO').Value := qryCondicoesPagamento.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger;
   qryVencimentos.Open;

   TotalPagar := TbPrincipal.FieldByName('TOTAL_NF').AsFloat;

   if Parcelas > 0 then
    ValorParcela := TotalPagar / Parcelas
   else
    ValorParcela := TotalPagar;
   ArredondaParcelas(Parcelas, ValorParcela, TotalPagar, PrimeiraParcela);

   qryVencimentos.First;
   i := 0;
   repeat
    inc(i);

    if i = 1 then
     Letra_Duplicata := '[A]';
    if i = 2 then
     Letra_Duplicata := '[B]';
    if i = 3 then
     Letra_Duplicata := '[C]';
    if i = 4 then
     Letra_Duplicata := '[D]';
    if i = 5 then
     Letra_Duplicata := '[E]';
    if i = 6 then
     Letra_Duplicata := '[F]';

    DiasPrazo := qryVencimentos.FieldByName('PRAZO').AsInteger;
    Vencimento_Duplicata := AcrescentaDias(TbPrincipal.FieldByName('DATA_SAIDA').Value, DiasPrazo - 1);

    if i = 1 then
     Valor_Duplicata := PrimeiraParcela
    else
     Valor_Duplicata := ValorParcela;

    with Cobr.Dup.Add do
    begin
     nDup  := Letra_Duplicata;
     dVenc := Vencimento_Duplicata;
     vDup  := Valor_Duplicata;
    end;

    qryVencimentos.Next;
   until i = Parcelas;

  end;

  Ide.verProc := '2.0.0';

  Dados.qrUF.Open;
  // =============== Atualiza os UF  ================
  if not Dados.qrUF.Locate('COD_UF', Dados.qrRegistro.FieldByName('COD_UF').Value, []) then
  begin
   if NOT Dados.qrUF.Bof then
   begin
    Dados.qrUF.First;
    Dados.qrUF.Prior;
   end;
  end;

  Ide.cUF := StrToIntDef(Copy(Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE').AsString, 1, 2), 0);
  Ide.cMunFG := StrToIntDef(Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE').AsString, 0);

  Ide.tpEmis             := teNormal;
  Ide.tpAmb              := DMNFE.NFe.Configuracoes.WebServices.Ambiente;

  Emit.CNPJCPF           := Dados.qrRegistro.FieldByName('CNPJ').AsString;
  Emit.IE                := Dados.qrRegistro.FieldByName('INSCRICAO').AsString;
  Emit.xNome             := Dados.qrRegistro.FieldByName('RAZAO_SOCIAL').AsString;
  Emit.xFant             := Dados.qrRegistro.FieldByName('APELIDO').AsString;
  Emit.EnderEmit.fone    := Dados.qrRegistro.FieldByName('TELEFONE1').AsString;
  Emit.EnderEmit.CEP     := Dados.qrRegistro.FieldByName('CEP').AsInteger;
  Emit.EnderEmit.xLgr    := Dados.qrRegistro.FieldByName('LOGRADOURO').AsString;
  Emit.EnderEmit.nro     := Dados.qrRegistro.FieldByName('NUMERO').AsString;
  Emit.EnderEmit.xCpl    := Dados.qrRegistro.FieldByName('COMPLEMENTO').AsString;
  Emit.EnderEmit.xBairro := Dados.qrRegistro.FieldByName('BAIRRO').AsString;
  Emit.EnderEmit.cMun    := Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE').AsInteger;
  Emit.EnderEmit.xMun    := Dados.qrRegistro.FieldByName('CIDADE').AsString;
  Emit.EnderEmit.UF      := Dados.qrUF.FieldByName('DESCRICAO').AsString;
  Emit.EnderEmit.cPais   := 1058;
  Emit.EnderEmit.xPais   := 'BRASIL';
  Emit.IEST              := TbPrincipal.FieldByName('INSCRICAO_SUBSTITUICAO').AsString;

  case Dados.qrRegistro.FieldByName('CODIGO_REGIME_TRIBUTACAO').AsInteger of
   1:
    Emit.CRT := crtSimplesNacional;
   2:
    Emit.CRT := crtSimplesExcessoReceita;
   3:
    Emit.CRT := crtRegimeNormal;
  end;

  Dest.CNPJCPF           := TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString;
  Dest.EnderDest.CEP     := TbPrincipal.FieldByName('CLIENTE_ENDERECO_CEP').AsInteger;
  Dest.EnderDest.xLgr    := TbPrincipal.FieldByName('CLIENTE_ENDERECO_LOGRADOURO').AsString;
  Dest.EnderDest.nro     := TbPrincipal.FieldByName('CLIENTE_ENDERECO_NUMERO').AsString;
  Dest.EnderDest.xCpl    := TbPrincipal.FieldByName('CLIENTE_ENDERECO_COMPLEMENTO').AsString;
  Dest.EnderDest.xBairro := TbPrincipal.FieldByName('CLIENTE_ENDERECO_BAIRRO').AsString;
  Dest.EnderDest.cMun    := TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_CIDADE').AsInteger;
  Dest.EnderDest.xMun    := TbPrincipal.FieldByName('CLIENTE_ENDERECO_CIDADE').AsString;
  Dest.EnderDest.UF      := TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString;
  Dest.EnderDest.fone    := TbPrincipal.FieldByName('CLIENTE_TELEFONE1').AsString;
  Dest.IE                := TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString;
  Dest.xNome             := TbPrincipal.FieldByName('CLIENTE_RAZAO_SOCIAL').AsString;
  Dest.EnderDest.cPais   := 1058;
  Dest.EnderDest.xPais   := 'BRASIL';

  qryItens.First;
  while NOT qryItens.Eof do
  begin
   with Det.Add do
   begin
    Prod.nItem      := qryItens.FieldByName('ITEM').AsInteger;
    Prod.cProd   := qryItens.FieldByName('COD_PRODUTO').AsString;
    Prod.xProd   := qryItens.FieldByName('NOME_PRODUTO').AsString;
    Prod.cEAN    := qryItens.FieldByName('CODIGO_BARRAS').AsString;
    Prod.NCM     := qryItens.FieldByName('CLASSIFICACAO_FISCAL').AsString;
    Prod.CFOP    := qryItens.FieldByName('COD_CFOP').AsString;
    Prod.uCom    := qryItens.FieldByName('UNIDADE').AsString;
    Prod.qCom    := qryItens.FieldByName('QTE').AsFloat;
    Prod.vUnCom  := qryItens.FieldByName('VALOR_UNITARIO').AsFloat;
    Prod.vProd   := qryItens.FieldByName('VALOR_TOTAL').AsFloat;
    Prod.qTrib   := qryItens.FieldByName('QTE').AsFloat;
    Prod.vUnTrib := qryItens.FieldByName('VALOR_UNITARIO').AsFloat;
    Prod.uTrib   := qryItens.FieldByName('UNIDADE').AsString;
    Prod.vDesc   := qryItens.FieldByName('DESCONTO_VALOR').AsFloat;
    Prod.vOutro  := qryItens.FieldByName('OUTROS').AsFloat;

    infAdProd    := qryItens.FieldByName('INFORMACAO_ADICIONAL').AsString;

    with Imposto do
    begin
     with ICMS do
     begin
      if Emit.CRT = crtSimplesNacional then
      // Ajuste SINIEF nº 3, de 09.07.2010 – DOU 1 de 13.07.2010

      begin
       case qryItens.FieldByName('COD_CSOSN').AsInteger of
        101:
         begin
          ICMS.CSOSN                 := csosn101;
          ICMS.vBC         := qryItens.FieldByName('BASE_CALCULO').AsFloat;
          ICMS.pICMS       := qryItens.FieldByName('ALIQUOTA').AsFloat;
          ICMS.vICMS       := qryItens.FieldByName('VALOR_ICMS').AsFloat;
          ICMS.pCredSN     := Dados.qryParametro_NF.FieldByName('ALIQUOTA_CREDITO').AsFloat;
          ICMS.vCredICMSSN := (qryItens.FieldByName('VALOR_TOTAL').AsFloat - qryItens.FieldByName('DESCONTO_VALOR').AsFloat) *
                               (Dados.qryParametro_NF.FieldByName('ALIQUOTA_CREDITO').AsFloat / 100);
         end;
        201:
         begin
          ICMS.CSOSN    := csosn201;
          ICMS.vBCST    := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pICMSST  := qryItens.FieldByName('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.vICMSST  := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pRedBCST := qryItens.FieldByName('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
         end;
        400:
         begin
          ICMS.CSOSN    := csosn400;
          ICMS.vBCST    := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pICMSST  := qryItens.FieldByName('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.vICMSST  := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pRedBCST := qryItens.FieldByName('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
         end;
        900:
         begin
          ICMS.CSOSN := csosn900;
          ICMS.vBC   := qryItens.FieldByName('BASE_CALCULO').AsFloat;
          ICMS.pICMS := qryItens.FieldByName('ALIQUOTA').AsFloat;
          ICMS.vICMS := qryItens.FieldByName('VALOR_ICMS').AsFloat;
         end;
       end
      end
      else
      begin
       if qryItens.FieldByName('COD_CST').AsString = '000' then
        CST := cst00
       else if qryItens.FieldByName('COD_CST').AsString = '010' then
        CST := cst10
       else if qryItens.FieldByName('COD_CST').AsString = '020' then
        CST := cst20
       else if qryItens.FieldByName('COD_CST').AsString = '030' then
        CST := cst30
       else if qryItens.FieldByName('COD_CST').AsString = '040' then
        CST := cst40
       else if qryItens.FieldByName('COD_CST').AsString = '041' then
        CST := cst41
       else if qryItens.FieldByName('COD_CST').AsString = '050' then
        CST := cst50
       else if qryItens.FieldByName('COD_CST').AsString = '051' then
        CST := cst51
       else if qryItens.FieldByName('COD_CST').AsString = '060' then
        CST := cst60
       else if qryItens.FieldByName('COD_CST').AsString = '070' then
        CST := cst70
       else if qryItens.FieldByName('COD_CST').AsString = '090' then
        CST := cst90;

       ICMS.modBC   := dbiPrecoTabelado;
       ICMS.pICMS   := qryItens.FieldByName('ALIQUOTA').AsFloat;
       ICMS.vICMS   := qryItens.FieldByName('VALOR_ICMS').AsFloat;
       ICMS.vBC     := qryItens.FieldByName('BASE_CALCULO').AsFloat;
       ICMS.vBCST   := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
       ICMS.pICMSST := qryItens.FieldByName ('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
       ICMS.vICMSST := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
       ICMS.pRedBC  := qryItens.FieldByName ('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
      end;
     end;
     IPI.CST := ipi99;
     if qryItens.FieldByName('VALOR_IPI').AsFloat > 0 then
     begin
      IPI.vBC := qryItens.FieldByName('BASE_CALCULO').AsFloat;
      IPI.pIPI := qryItens.FieldByName('ALIQUOTA_IPI').AsFloat;
      IPI.vIPI := qryItens.FieldByName('VALOR_IPI').AsFloat;
     end;
     PIS.CST := pis99;
     COFINS.CST := cof99;

    end;
   end;
   qryItens.Next;
  end;

  if TbPrincipal.FieldByName('CIF_FOB').Value = 'C' then
   Transp.modFrete := mfContaEmitente
  else if TbPrincipal.FieldByName('CIF_FOB').Value = 'F' then
   Transp.modFrete := mfContaDestinatario;
  Transp.Transporta.CNPJCPF := qryTransportador.FieldByName('CNPJ').AsString;
  Transp.Transporta.xNome := qryTransportador.FieldByName
    ('RAZAO_SOCIAL').AsString;
  Transp.Transporta.IE := qryTransportador.FieldByName('INSCRICAO').AsString;
  Transp.Transporta.xEnder := qryTransportador.FieldByName
    ('ENDERECO_LOGRADOURO').AsString + ' ' + qryTransportador.FieldByName
    ('ENDERECO_NUMERO').AsString + ' ' + qryTransportador.FieldByName
    ('ENDERECO_COMPLEMENTO').AsString + ' - ' + qryTransportador.FieldByName
    ('ENDERECO_BAIRRO').AsString;
  Transp.Transporta.xMun := qryTransportador.FieldByName
    ('ENDERECO_CIDADE').AsString;
  Transp.Transporta.UF := qrUF_Transportador.FieldByName('DESCRICAO').AsString;
  Transp.veicTransp.placa := TbPrincipal.FieldByName('VEICULO_PLACA').AsString;
  Transp.veicTransp.UF := qrUF_Veiculo.FieldByName('DESCRICAO').AsString;
  Transp.veicTransp.RNTC := TbPrincipal.FieldByName('RNTC').AsString;

  with Transp.Vol.Add do
  begin
   qVol := TbPrincipal.FieldByName('VOLUMES').AsInteger;
   esp := qryEspecie_Mercadoria.FieldByName('DESCRICAO').AsString;
   marca := TbPrincipal.FieldByName('MARCA').AsString;
   nVol := TbPrincipal.FieldByName('NUMERACAO_VOLUME').AsString;
   pesoL := TbPrincipal.FieldByName('PESO_LIQUIDO').AsFloat;
   pesoB := TbPrincipal.FieldByName('PESO_BRUTO').AsFloat;
  end;

  Total.ICMSTot.vBC := TbPrincipal.FieldByName('BASE_CALCULO').AsFloat;
  Total.ICMSTot.vICMS := TbPrincipal.FieldByName('VALOR_ICMS').AsFloat;
  Total.ICMSTot.vNF := TbPrincipal.FieldByName('TOTAL_NF').AsFloat;
  Total.ICMSTot.vProd := TbPrincipal.FieldByName('TOTAL_PRODUTOS').AsFloat;
  Total.ICMSTot.vBCST := TbPrincipal.FieldByName
    ('BASE_ICMS_SUBSTITUICAO').AsFloat;
  Total.ICMSTot.vST := TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
  Total.ICMSTot.vFrete := TbPrincipal.FieldByName('VALOR_FRETE').AsFloat;
  Total.ICMSTot.vSeg := TbPrincipal.FieldByName('VALOR_SEGURO').AsFloat;
  Total.ICMSTot.vDesc := TbPrincipal.FieldByName('DESCONTO_VALOR').AsFloat;
  Total.ICMSTot.vOutro := TbPrincipal.FieldByName('OUTRAS_DESPESAS').AsFloat;
  Total.ICMSTot.vIPI := TbPrincipal.FieldByName('TOTAL_IPI').AsFloat;

  InfAdic.infCpl := TbPrincipal.FieldByName('OBSERVACAO').AsString;
  InfAdic.infAdFisco := TbPrincipal.FieldByName('OBS_FISCO').AsString;
 end;
end;

procedure TfrmNF.btnPesquisaCFOPClick(Sender: TObject);
begin
 inherited;
 frmModeloPesquisa := TfrmModeloPesquisa.Create(Application);
 frmModeloPesquisa.Tabela := qryCFOP;
 frmModeloPesquisa.lblTitulo.Caption := 'Pesquisa CFOP';
 if frmModeloPesquisa.ShowModal = mrOk then
 begin
  qryCFOP.Locate('COD_CFOP', frmModeloPesquisa.TbPrincipal.FieldByName
    ('COD_CFOP').Value, []);
  TbPrincipal.FieldByName('COD_CFOP').Value :=
    qryCFOP.FieldByName('COD_CFOP').Value;
 end;
 frmModeloPesquisa.Destroy;
 FiltraRegrasporCFOP;
 AtualizaTela;
 Screen.OnActiveControlChange := TrocaCor;

end;

procedure TfrmNF.AtribuiCliente;
begin
 edtCNPJ.Text                                                  := FormataCPF_CNPJ(qryCliente.FieldByName('CNPJ').Value);
 TbPrincipal.FieldByName('COD_CLIENTE').Value                  := qryCliente.FieldByName('COD_CLIENTE').Value;
 TbPrincipal.FieldByName('CLIENTE_CNPJ').Value                 := qryCliente.FieldByName('CNPJ').Value;
 TbPrincipal.FieldByName('CLIENTE_INSCRICAO').Value            := qryCliente.FieldByName('INSCRICAO').Value;
 TbPrincipal.FieldByName('CLIENTE_TELEFONE1').Value            := qryCliente.FieldByName('TELEFONE1').Value;
 TbPrincipal.FieldByName('CLIENTE_TELEFONE2').Value            := qryCliente.FieldByName('TELEFONE2').Value;
 TbPrincipal.FieldByName('CLIENTE_RAZAO_SOCIAL').Value         := qryCliente.FieldByName('RAZAOSOCIAL').Value;
 TbPrincipal.FieldByName('CLIENTE_NOME_FANTASIA').Value        := qryCliente.FieldByName('NOMEFANTASIA').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_LOGRADOURO').Value  := qryCliente.FieldByName('ENDERECO_ENTREGA_LOGRADOURO').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_NUMERO').Value      := qryCliente.FieldByName('ENDERECO_ENTREGA_NUMERO').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_COMPLEMENTO').Value := qryCliente.FieldByName('ENDERECO_ENTREGA_COMPLEMENTO').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_BAIRRO').Value      := qryCliente.FieldByName('ENDERECO_ENTREGA_BAIRRO').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_CIDADE').Value      := qryCliente.FieldByName('ENDERECO_ENTREGA_CIDADE').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').Value          := qrUF_Cliente.FieldByName('DESCRICAO').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_CEP').Value         := qryCliente.FieldByName('ENDERECO_ENTREGA_CEP').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_CIDADE').Value  := qryCliente.FieldByName('COD_MUNICIPIO_IBGE').Value;
 TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_UF').Value      := qryCliente.FieldByName('COD_UF_IBGE').Value;
 TbPrincipal.FieldByName('CLIENTE_SIMPLES_NACIONAL').Value     := qryCliente.FieldByName('OPTANTE_SIMPLES').Value;
 TbPrincipal.FieldByName('CLIENTE_EMAIL').Value                := qryCliente.FieldByName('EMAIL').AsString;

 AvisarAtendimentos;
end;

function TfrmNF.LocalizaCliente(CNPJ, CODIGO: string): Boolean;
begin
 qryCliente.SQLWhere.Clear;

 if CNPJ <> '' then
 begin
  qryCliente.Close;
  qryCliente.SQLWhere.Add(' WHERE CLIENTE.CNPJ = ' + QuotedStr(CNPJ));
  qryCliente.Open;
 end
 else if CODIGO <> '' then
 begin
  qryCliente.Close;
  qryCliente.SQLWhere.Add(' WHERE CLIENTE.cod_cliente= ' + QuotedStr(CODIGO));
  qryCliente.Open;
 end;

 if qryCliente.RecordCount > 0 then
 begin
  Result := True;
  if not qrUF_Cliente.Locate('COD_UF',
    qryCliente.FieldByName('ENDERECO_ENTREGA_COD_UF').Value, []) then
  begin
   if NOT qrUF_Cliente.Bof then
   begin
    qrUF_Cliente.First;
    qrUF_Cliente.Prior;
   end;
  end;
 end
 else
  Result := False;
end;

procedure TfrmNF.ArquivarXML(arquivo: String);
var
 NomeArquivo: String;
begin
 NomeArquivo := PegaNomeArquivoNoCaminho(arquivo);

 MoveFile(pchar(DMNFE.NFe.Configuracoes.Arquivos.PathSalvar + NomeArquivo),
   pchar(DMNFE.ImpressaoNFe.PathPDF + NomeArquivo));
end;

procedure TfrmNF.Distribuir_Desconto_Itens;
var
 Vamos: String;
 ValorRateio: Real;
begin
 // RegrasImposto(TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString,TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString,TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString,TbPrincipal.FieldByName('COD_CFOP').AsInteger);

 ValorRateio := (TbPrincipal.FieldByName('DESCONTO_VALOR').AsFloat * 100) /
   TbPrincipal.FieldByName('TOTAL_PRODUTOS').AsFloat;
 TbPrincipal.FieldByName('DESCONTO_PERCENTUAL').AsFloat := ValorRateio;
 ValorRateio := ValorRateio / 100;
 Vamos := FormatFloat('0.00000000000', ValorRateio);
 Vamos := BuscaTroca(Vamos, ',', '.');
 Dados.script.SQL.Clear;
 Dados.script.SQL.Add('UPDATE NF_ITENS ');
 Dados.script.SQL.Add(' SET DESCONTO_VALOR = VALOR_TOTAL * ' + Vamos +
   ' WHERE COD_NF = ' + TbPrincipal.FieldByName('NUMERO').AsString);
 Dados.script.Execute;

 if qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat > 0 then
 begin
  frmIncluiProdutosNF := TfrmIncluiProdutosNF.Create(Application);
  frmIncluiProdutosNF.qryItens.First;
  While NOT frmIncluiProdutosNF.qryItens.Eof do
  begin
   frmIncluiProdutosNF.qryItens.Edit;
   frmIncluiProdutosNF.SubstituicaoTributaria;
   frmIncluiProdutosNF.qryItens.Post;
   frmIncluiProdutosNF.qryItens.Next;
  end;
  frmIncluiProdutosNF.Destroy;
 end;

 qryItens.Close;
 qryItens.Open;

end;

procedure TfrmNF.dbValorDescontoExit(Sender: TObject);
begin
 inherited;
 if TbPrincipal.State in [dssBrowse] then
  Exit;

 if TbPrincipal.FieldByName('DESCONTO_VALOR').AsFloat > TbPrincipal.FieldByName
   ('TOTAL_PRODUTOS').AsFloat then
 begin
  MessageDlg('O desconto não pode ser superior ao total dos produtos', mtError,
    [mbOK], 0);
  dbValorDesconto.SetFocus;
 end;
 CalculaDesconto;
 TotalizaItens;
end;

procedure TfrmNF.dbPercentualDescontoExit(Sender: TObject);
begin
 inherited;
 if TbPrincipal.State in [dssBrowse] then
  Exit;
 if dbPercentualDesconto.Text = '' then
  Exit;

 TbPrincipal.FieldByName('DESCONTO_VALOR').Value :=
   (TbPrincipal.FieldByName('TOTAL_PRODUTOS').Value *
   (TbPrincipal.FieldByName('DESCONTO_PERCENTUAL').AsFloat / 100));
 dbValorDesconto.OnExit(dbValorDesconto);
end;

procedure TfrmNF.GravarHistorico(numero, Historico: String);
begin
 qryHistorico.ReadOnly := False;
 qryHistorico.Insert;
 qryHistorico.FieldByName('COD_NF').Value := numero;
 qryHistorico.FieldByName('DATA_HISTORICO').Value := Date;
 qryHistorico.FieldByName('HORA_HISTORICO').Value := Time;
 qryHistorico.FieldByName('COD_USUARIO').Value :=
   Dados.qrUsuario.FieldByName('COD_USUARIO').AsInteger;
 qryHistorico.FieldByName('DESCRICAO').Value := Historico;
 qryHistorico.FieldByName('COD_FILIAL_NF').Value :=
   TbPrincipal.FieldByName('COD_FILIAL').AsInteger;
 qryHistorico.Post;
 qryHistorico.RefreshAll;
 qryHistorico.ReadOnly := True;
end;

procedure TfrmNF.btnAlteraClienteClick(Sender: TObject);
begin
 inherited;
 AlterarCliente;
end;

procedure TfrmNF.AlterarCliente;
begin
 frmCadCliente := TfrmCadCliente.Create(Application);
 frmCadCliente.OutraTela := True;
 frmCadCliente.TbPrincipal.Close;
 frmCadCliente.TbPrincipal.Filter := ' CNPJ = ' +
   QuotedStr(TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString);
 frmCadCliente.TbPrincipal.Filtered := True;
 frmCadCliente.TbPrincipal.Open;
 frmCadCliente.btEditar.Click;
 if TbPrincipal.State in [dssBrowse] then
  frmCadCliente.btnEditar2.Click;
 frmCadCliente.ShowModal;
 frmCadCliente.Destroy;

 if NOT LocalizaCliente(LimpaTexto(edtCNPJ.Text), '') then
 begin
  edtCNPJ.Clear;
  edtCNPJ.SetFocus;
  Exit;
 end;
 if TbPrincipal.State in [dssedit] then
  AtribuiCliente;
end;

procedure TfrmNF.BtExcluirClick(Sender: TObject);
begin
 if (TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').IsNotNull) then
  MessageDlg('Impossível excluir  pois já foi autorizada eletronicamente' + #13
    + #10 + 'Protocolo: ' + TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO')
    .AsString, mtWarning, [mbOK], 0)
 else
  inherited;
end;

procedure TfrmNF.btnVoltarClick(Sender: TObject);
begin
 inherited;
 pnlCancelado.Visible := False;
end;

procedure TfrmNF.dbNumeroPedidoExit(Sender: TObject);
begin
 inherited;
 if TbPrincipal.State in [dssBrowse] then
  Exit;
 if dbNumeroPedido.Text = '' then
  Exit;

 if dbNumeroPedido.Text <> '' then
 begin
  qryPedido.Close;
  qryPedido.ParamByName('VARPEDIDO').Value := dbNumeroPedido.Text;
  qryPedido.Open;
 end;

 if qryPedido.IsEmpty then
 begin
  MessageDlg('O Pedido informado não existe!', mtWarning, [mbOK], 0);
  dbNumeroPedido.Clear;
 end;
 if qryPedido.FieldByName('DATA_SAIDA').IsNotNull then
 begin
  MessageDlg('O Pedido já foi despachado, não pode ser alterado!', mtWarning,
    [mbOK], 0);
  dbNumeroPedido.Clear;
 end;
end;

procedure TfrmNF.AtualizaPedido;
var
 Valor: Real;
 ValorST: String;
begin

 Valor := TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
 ValorST := FormatFloat('0.00000000000', Valor);
 ValorST := BuscaTroca(ValorST, ',', '.');

 Dados.script.SQL.Clear;
 Dados.script.SQL.Add('UPDATE PEDIDOS ');
 Dados.script.SQL.Add(' SET VALOR_ST = ' + QuotedStr(ValorST));
 Dados.script.SQL.Add(' WHERE COD_PEDIDO=' + dbNumeroPedido.Text);
 Dados.script.Execute;
end;

procedure TfrmNF.btnImprimeDespachoClick(Sender: TObject);
begin
 inherited;
 ppCabecalho_Etiqueta.Picture.LoadFromFile
   (Dados.tbConfig.FieldByName('LOCAL_IMAGENS').AsString +
   'cabecalho_fragil.jpg');
 ppPedidoNF.Text := 'Nota Eletrônica nº';
 ppNF.Caption := TbPrincipal.FieldByName('NUMERO').AsString;
 ppDestino.RichText := dbRazaoSocial.Text + #13 + edtEnderecoTransporte.Text +
   ' ' + edtNumeroTransporte.Text + ' ' + edtComplementoTransporte.Text + ' - '
   + edtBairroTransporte.Text + #13 + FormataCEP(edtCepTransporte.Text) + '    '
   + edtCidadeTransporte.Text + '/' + edtUfTransporte.Text;
 ImpressaoBaseadaNoModelo(ppEtiquetaDespacho, False, 'Etiqueta Despacho ' +
   Dados.qrRegistro.FieldByName('APELIDO').AsString + ' NF nº ' +
   TbPrincipal.FieldByName('NUMERO').AsString, '');

end;

procedure TfrmNF.AvisarAtendimentos;
begin
 { ============= verifica sE o cliente tem atendimentos a avisar ============ }
 frmAvisoAtendimento := TfrmAvisoAtendimento.Create(Application);
 frmAvisoAtendimento.qrAvisoAtendimento.Close;
 frmAvisoAtendimento.qrAvisoAtendimento.ParamByName('cod_cliente').Value :=
   TbPrincipal.FieldByName('cod_cliente').Value;
 frmAvisoAtendimento.qrAvisoAtendimento.Open;

 if frmAvisoAtendimento.qrAvisoAtendimento.IsEmpty then
 begin
  frmAvisoAtendimento.Destroy;
  Screen.OnActiveControlChange := TrocaCor;
  Exit;
 end;

 frmAvisoAtendimento.qrAvisoAtendimento.First;
 while not frmAvisoAtendimento.qrAvisoAtendimento.Eof do
 begin
  frmAvisoAtendimento.ShowModal;
  frmAvisoAtendimento.qrAvisoAtendimento.Next;
 end;
 frmAvisoAtendimento.qrAvisoAtendimento.Close;
 frmAvisoAtendimento.Destroy;
 Screen.OnActiveControlChange := TrocaCor;
end;

procedure TfrmNF.dbCodigoTransportadorExit(Sender: TObject);
begin
 inherited;
 // ================= Se Estiver em modo de visualizacao nao faz nada ==============
 if TbPrincipal.State in [dssBrowse] then
  Exit;

 if dbCodigoTransportador.Text <> '' then
 begin
  if NOT qryTransportador.Locate('COD_TRANSPORTADOR',
    TbPrincipal.FieldByName('COD_TRANSPORTADOR').Value, []) then
  begin
   if (MessageDlg('Transportador não cadastrado! Deseja cadastrar?',
     mtConfirmation, [mbYes, mbNo], 0) = mrYes) then
    btnIncluiTransportador.Click
   else
    dbCodigoTransportador.Field.Clear;
   dbCodigoTransportador.SetFocus;
  end;
 end;
 AtualizaTela;
end;

procedure TfrmNF.btnPDFClick(Sender: TObject);
var
Anexo2, Caminho, arquivo: string;
begin
 inherited;
 TbPrincipal.RefreshAll;
 arquivo := TbPrincipal.FieldByName('CHAVE_ACESSO').AsString + '-nfe.XML';
 if TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').IsNotNull then
  Caminho := DMNFE.ImpressaoNFe.PathPDF
 else
  Caminho := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;

 arquivo := Caminho + arquivo;
 if NOT ExisteArquivo(arquivo) then
 begin
  OpenDialog1.Title := 'Selecione a NFE';
  OpenDialog1.DefaultExt := '*-nfe.XML';
  OpenDialog1.Filter :=
    'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;
  if OpenDialog1.Execute then
   arquivo := OpenDialog1.FileName
  else
   Exit;
 end;

 DMNFE.NFe.NotasFiscais.Clear;
 DMNFE.NFe.NotasFiscais.LoadFromFile(arquivo);
 if DMNFE.NFe.NotasFiscais.Items[0].NFe.Ide.tpEmis = teDPEC then
 begin
  DMNFE.NFe.WebServices.Consulta.NFeChave := DMNFE.NFe.NotasFiscais.Items[0]
    .NFe.infNFe.ID;
  DMNFE.NFe.WebServices.Consulta.Executar;
  // DMNFE.NFe.DANFE.ProtocoloNFe := DMNFE.NFe.WebServices.ConsultaDPEC.nRegDPEC +' '+ DateTimeToStr(DMNFE.NFe.WebServices.ConsultaDPEC.retDPEC.dhRegDPEC);
 end;
 DMNFE.ImpressaoNFe.PathPDF := PastaTemporaria;
 Anexo2 := PegaNomeArquivoNoCaminho(arquivo);
 Anexo2 := LimpaTexto(Anexo2);
 Anexo2 := PastaTemporaria + '\' + Anexo2 + '.pdf';

 DMNFE.ImpressaoNFe.Logo := pchar(Dados.tbConfig.FieldByName('LOCAL_IMAGENS')
   .AsString) + 'logo.bmp';
 DMNFE.NFe.NotasFiscais.ImprimirPDF;

 salvar.FileName := Anexo2;

 salvar.Execute;
end;

procedure TfrmNF.edtHoraKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 inherited;
 if Key = VK_RETURN then
  grpCliente.SetFocus;
end;

procedure TfrmNF.FiltraRegrasporCFOP;
var
 Filtro: String;
 qte_regras: integer;
begin
 PegouRegrasImposto := True;

 qryRegras_Imposto.Close;
 qryRegras_Imposto.SQLWhere.Clear;
 qryRegras_Imposto.SQLWhere.Add(' WHERE COD_CFOP= ' +
   qryCFOP.FieldByName('COD_CFOP').AsString + ' AND ENTRADA_SAIDA =' +
   QuotedStr(TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString));
 qryRegras_Imposto.Open;
 qte_regras := qryRegras_Imposto.RecordCount;

 if (qte_regras = 0) then
 begin
  Exit;
 end
 else if (qte_regras = 1) then
 begin
  if (qryCFOP.FieldByName('DENTRO_FORA').AsString = 'D') AND
    (TbPrincipal.FieldByName('OBSERVACAO').IsNull) then
   TbPrincipal.FieldByName('OBSERVACAO').AsString :=
     Dados.qryParametro_NF.FieldByName('INFORMACAO_COMPLEMENTAR').AsString;

  TbPrincipal.FieldByName('ALIQUOTA').Value := qryRegras_Imposto.FieldByName
    ('ALIQUOTA').Value;
 end;

end;

procedure TfrmNF.edtCFOPKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 inherited;
 if (Key = VerificaAtalho(Dados.tbConfig.FieldByName('ATALHO_PESQUISA')
   .AsString)) and (edtCFOP.Focused) then
  btnPesquisaCFOP.Click;
 if Key = VK_RETURN then
  PaginasManutencao.ActivePage := Produtos;
end;

procedure TfrmNF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 inherited;
 DMNFE.Destroy;
 Dados.qryMVA.Filtered := False;
end;

procedure TfrmNF.btnNFeTudoClick(Sender: TObject);
begin
 inherited;
 Gerar;

 Assinar;

 Validar;

 Transmitir;

 TbPrincipal.RefreshRows;

 GravarHistorico(TbPrincipal.FieldByName('NUMERO').AsString,
   'Transmitida: ' + TbPrincipal.FieldByName('CHAVE_ACESSO').AsString);
end;

procedure TfrmNF.btnVerificaTransmissaoClick(Sender: TObject);
var
 protocolo: string;
begin
 inherited;
 lblVerificarprotocolo.Caption := 'Verificando. Aguarde...';
 Application.ProcessMessages;
 if DMNFE.NFe_Consulta_Protocolo(TbPrincipal.FieldByName('NUMERO').AsInteger,
   protocolo) then
  GravarHistorico(TbPrincipal.FieldByName('NUMERO').AsString,
    'Consulta protocolo:' + protocolo);
 lblVerificarprotocolo.Caption := '';
 TbPrincipal.RefreshRows;

end;

procedure TfrmNF.btnVerificaWebServiceClick(Sender: TObject);
var
 X, y: integer;
begin
 X := btnVerificaWebService.ClientOrigin.X;
 y := btnVerificaWebService.ClientOrigin.y + btnVerificaWebService.Height;
 popRepositorio.Popup(X, y);
end;

procedure TfrmNF.btnXML2Click(Sender: TObject);
begin
 inherited;

 if TbPrincipal.FieldByName('CHAVE_ACESSO').AsString = '' then
 begin
  MessageDlg('A NF não possui chave de acesso' + #13 + #10 +
    'Provavelmente não foi gerado o seu Xml', mtWarning, [mbOK], 0);
  Exit;
 end;

 DMNFE.NFe_CopiarXml(TbPrincipal.FieldByName('NUMERO').AsInteger);
end;

procedure TfrmNF.cxButton5Click(Sender: TObject);
var
 erro, Emails, Email_Remetente, Email_Destinatario, Email_consignatario,
 mensagem: string;
begin
 inherited;
 // ================= Enviar o email para os clientes ==============

 if TbPrincipal.FieldByName('Cliente_Email').AsString <> '' then
  Email_Remetente := TbPrincipal.FieldByName('Cliente_Email').AsString
 else
  Email_Remetente := qryCliente.FieldByName('Email').AsString;

 if Email_Remetente = '' then
 begin
  if (MessageDlg('O remetente não possui E-mail cadastrado' + #13 + #10 +
    'Ele não receberá o xml.' + #13 + #10 + 'Deseja continuar?', mtConfirmation,
    [mbYes, mbNo], 0) = mrNo) then
   Exit;
 end;

 Emails := Email_Remetente;

 lblIEnviarXML.Caption := 'Aguarde enquanto enviamos o Email...';
 Application.ProcessMessages;

 DMNFE.NFe_Enviar_Email(Emails, TbPrincipal.FieldByName('NUMERO')
   .AsInteger, erro);

 lblIEnviarXML.Caption := '';
 if erro = '' then
 begin
  mensagem := 'Arquivos enviados para ';

  if Email_Remetente <> '' then
   mensagem := mensagem + #13 + ' Remetente: ' + Email_Remetente;

  MessageDlg(mensagem, mtWarning, [mbOK], 0);
 end;
end;

procedure TfrmNF.btnPDF2Click(Sender: TObject);
var
Anexo2, Caminho, arquivo: string;
begin
 inherited;
 TbPrincipal.RefreshAll;
 arquivo := TbPrincipal.FieldByName('CHAVE_ACESSO').AsString + '-NFE.XML';
 if TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').IsNotNull then
  Caminho := DMNFE.ImpressaoNFe.PathPDF
 else
  Caminho := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;

 arquivo := Caminho + arquivo;
 if NOT ExisteArquivo(arquivo) then
 begin
  OpenDialog1.Title := 'Selecione a NFE';
  OpenDialog1.DefaultExt := '*-nfe.XML';
  OpenDialog1.Filter :=
    'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := DMNFE.NFe.Configuracoes.Arquivos.PathSalvar;
  if OpenDialog1.Execute then
   arquivo := OpenDialog1.FileName
  else
   Exit;
 end;

 DMNFE.NFe.NotasFiscais.Clear;
 DMNFE.NFe.NotasFiscais.LoadFromFile(arquivo);
 DMNFE.NFe.NotasFiscais.ImprimirPDF;

 Anexo2 := PegaNomeArquivoNoCaminho(arquivo);
 Anexo2 := LimpaTexto(Anexo2);
 if Copy(Caminho, Length(Caminho), Length(Caminho)) <> '\' then
  Caminho := Caminho + '\';

 Anexo2 := Caminho + Anexo2 + '-NFE.pdf';

 salvar.FileName := Anexo2;

 salvar.Execute;

 CopyFile(pchar(Anexo2), pchar(salvar.FileName), True);

end;

function TfrmNF.PegaInscricaoSubstituicao: String;
begin
 qryInscricaoST.Close;
 qryInscricaoST.ParamByName('VARUF').Value :=
   qrUF_Cliente.FieldByName('DESCRICAO').AsString;
 qryInscricaoST.Open;

 if qryInscricaoST.IsEmpty then
  Result := ''
 else
  Result := qryInscricaoST.FieldByName('inscricao_SUBSTITUICAO').AsString;
end;

procedure TfrmNF.GerarNFe2(NumNFe: String);
var
 i: integer;
 CFOP_Impressao: String;
begin
 DMNFE.NFe.Configuracoes.Geral.FormaEmissao := teNormal;
 DMNFE.NFe.NotasFiscais.Clear;

 with DMNFE.NFe.NotasFiscais.Add.NFe do
 begin
  if Dados.qryParametro_NF.FieldByName('IMPRIMIR_CFOP').AsString = 'DESCRIÇÃO'
  then
   CFOP_Impressao := qryCFOP.FieldByName('DESCRICAO').AsString
  else if Dados.qryParametro_NF.FieldByName('IMPRIMIR_CFOP').AsString = 'CFOP'
  then
   CFOP_Impressao := qryCFOP.FieldByName('COD_CFOP').AsString
  else
   CFOP_Impressao := qryCFOP.FieldByName('COD_CFOP').AsString + '-' +
     qryCFOP.FieldByName('DESCRICAO').AsString;

  { Veja que o Manual de Integração - Pág. 152 você encontra para finNFe 3 opções:
    29 - B25 - finNFe - Finalidade de emissão da NF-e
    1 - NF-e normal // fnNormal
    2 - NF-e complementar // fnComplementar
    3 - NF-e de ajuste // fnAjuste
    4 - NF-e Devolução // fnDevolucao }

  if TbPrincipal.FieldByName('FINALIDADE_EMISSAO').AsString = 'COMPLEMENTAR'
  then
   Ide.finNFe := fnComplementar
  else if TbPrincipal.FieldByName('FINALIDADE_EMISSAO').AsString = 'AJUSTE' then
   Ide.finNFe := fnAjuste
  else if TbPrincipal.FieldByName('FINALIDADE_EMISSAO').AsString = 'DEVOLUÇÃO'
  then
   Ide.finNFe := fnDevolucao
  else
   Ide.finNFe := fnNormal;

  if Ide.finNFe <> fnNormal then
  begin
   Ide.NFref.Add;
   Ide.NFref[0].refNFe := TbPrincipal.FieldByName('REFERENCIA_NFE').AsString;
  end;

  Ide.tpImp := tiRetrato;
  Ide.natOp := Copy(CFOP_Impressao, 1, 60);
  Ide.nNF := StrToInt(NumNFe);
  Ide.cNF := StrToInt(NumNFe);
  Ide.modelo := StrToInt(Dados.qryParametro_NF.FieldByName('MODELO_NF')
    .AsString);
  Ide.serie := TbPrincipal.FieldByName('SERIE').AsInteger;
  Ide.dEmi := TbPrincipal.FieldByName('DATA_EMISSAO').AsDate;
  Ide.dSaiEnt := TbPrincipal.FieldByName('DATA_SAIDA').AsDate +
    TbPrincipal.FieldByName('HORA_SAIDA').AsDateTime;
  Ide.hSaiEnt := 0;
  if TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString = 'E' then
   Ide.tpNF := tnEntrada
  else if TbPrincipal.FieldByName('ENTRADA_SAIDA').AsString = 'S' then
   Ide.tpNF := tnSaida;

  // Condição de Pagamento À VISTA deve ser sempre código 1
  if TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger = 0 then
   Ide.indPag := ipOutras
  else if TbPrincipal.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger = 1 then
   Ide.indPag := ipVista
  else
  begin
   Ide.indPag := ipPrazo;

   PrazoMedio := qryCondicoesPagamento.FieldByName('PRAZOMEDIO').AsInteger;
   Parcelas := qryCondicoesPagamento.FieldByName('PARCELAS').AsInteger;

   qryVencimentos.Close;
   qryVencimentos.ParamByName('VARCONDICAO').Value :=
     qryCondicoesPagamento.FieldByName('COD_CONDICAO_PAGAMENTO').AsInteger;
   qryVencimentos.Open;

   TotalPagar := TbPrincipal.FieldByName('TOTAL_NF').AsFloat;

   if Parcelas > 0 then
    ValorParcela := TotalPagar / Parcelas
   else
    ValorParcela := TotalPagar;
   ArredondaParcelas(Parcelas, ValorParcela, TotalPagar, PrimeiraParcela);

   qryVencimentos.First;
   i := 0;
   repeat
    inc(i);

    if i = 1 then
     Letra_Duplicata := '[A]';
    if i = 2 then
     Letra_Duplicata := '[B]';
    if i = 3 then
     Letra_Duplicata := '[C]';
    if i = 4 then
     Letra_Duplicata := '[D]';
    if i = 5 then
     Letra_Duplicata := '[E]';
    if i = 6 then
     Letra_Duplicata := '[F]';

    DiasPrazo := qryVencimentos.FieldByName('PRAZO').AsInteger;
    Vencimento_Duplicata := AcrescentaDias(TbPrincipal.FieldByName('DATA_SAIDA')
      .Value, DiasPrazo - 1);

    if i = 1 then
     Valor_Duplicata := PrimeiraParcela
    else
     Valor_Duplicata := ValorParcela;

    with Cobr.Dup.Add do
    begin
     nDup := Letra_Duplicata;
     dVenc := Vencimento_Duplicata;
     vDup := Valor_Duplicata;
    end;

    qryVencimentos.Next;
   until i = Parcelas;

  end;

  Ide.verProc := PegaVersao;
  // Ide.verProc   := '2.0.0';

  if Dados.qrRegistro.FieldByName('COD_UF').IsNull then
  begin
   MessageDlg('Informe a UF na tabela de Registro do sistema', mtError,
     [mbOK], 0);
   Exit;
  end;

  Dados.qrUF.Open;
  // =============== Atualiza os UF  ================
  if not Dados.qrUF.Locate('COD_UF', Dados.qrRegistro.FieldByName('COD_UF')
    .Value, []) then
  begin
   if NOT Dados.qrUF.Bof then
   begin
    Dados.qrUF.First;
    Dados.qrUF.Prior;
   end;
  end;

  Ide.cUF := StrToIntDef(Copy(Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE')
    .AsString, 1, 2), 0);
  Ide.cMunFG := StrToIntDef(Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE')
    .AsString, 0);

  Ide.tpEmis := teNormal;
  if Dados.qrUsuario.FieldByName('LOGIN').AsString <> 'SYSTEMS' then
   Ide.tpAmb := taProducao
  else
   Ide.tpAmb := DMNFE.NFe.Configuracoes.WebServices.Ambiente;

  Emit.CNPJCPF := Dados.qrRegistro.FieldByName('CNPJ').AsString;
  Emit.IE := Dados.qrRegistro.FieldByName('INSCRICAO').AsString;
  Emit.xNome := Dados.qrRegistro.FieldByName('RAZAO_SOCIAL').AsString;
  Emit.xFant := Dados.qrRegistro.FieldByName('APELIDO').AsString;
  Emit.EnderEmit.fone := Dados.qrRegistro.FieldByName('TELEFONE1').AsString;
  Emit.EnderEmit.CEP := Dados.qrRegistro.FieldByName('CEP').AsInteger;
  Emit.EnderEmit.xLgr := Dados.qrRegistro.FieldByName('LOGRADOURO').AsString;
  Emit.EnderEmit.nro := Dados.qrRegistro.FieldByName('NUMERO').AsString;
  Emit.EnderEmit.xCpl := Dados.qrRegistro.FieldByName('COMPLEMENTO').AsString;
  Emit.EnderEmit.xBairro := Dados.qrRegistro.FieldByName('BAIRRO').AsString;
  Emit.EnderEmit.cMun := Dados.qrRegistro.FieldByName('COD_CIDADE_IBGE')
    .AsInteger;
  Emit.EnderEmit.xMun := Dados.qrRegistro.FieldByName('CIDADE').AsString;
  Emit.EnderEmit.UF := Dados.qrUF.FieldByName('DESCRICAO').AsString;
  Emit.EnderEmit.cPais := 1058;
  Emit.EnderEmit.xPais := 'BRASIL';
  Emit.IEST := TbPrincipal.FieldByName('INSCRICAO_SUBSTITUICAO').AsString;

  case Dados.qrRegistro.FieldByName('CODIGO_REGIME_TRIBUTACAO').AsInteger of
   1:
    Emit.CRT := crtSimplesNacional;
   2:
    Emit.CRT := crtSimplesExcessoReceita;
   3:
    Emit.CRT := crtRegimeNormal;
  end;

  Dest.CNPJCPF := TbPrincipal.FieldByName('CLIENTE_CNPJ').AsString;
  Dest.EnderDest.CEP := TbPrincipal.FieldByName('CLIENTE_ENDERECO_CEP')
    .AsInteger;
  Dest.EnderDest.xLgr := TbPrincipal.FieldByName
    ('CLIENTE_ENDERECO_LOGRADOURO').AsString;
  Dest.EnderDest.nro := TbPrincipal.FieldByName
    ('CLIENTE_ENDERECO_NUMERO').AsString;
  Dest.EnderDest.xCpl := TbPrincipal.FieldByName
    ('CLIENTE_ENDERECO_COMPLEMENTO').AsString;
  Dest.EnderDest.xBairro := TbPrincipal.FieldByName
    ('CLIENTE_ENDERECO_BAIRRO').AsString;
  Dest.EnderDest.cMun := TbPrincipal.FieldByName('CLIENTE_ENDERECO_COD_CIDADE')
    .AsInteger;
  Dest.EnderDest.xMun := TbPrincipal.FieldByName
    ('CLIENTE_ENDERECO_CIDADE').AsString;
  // TpcnDestinoOperacao = (doInterna, doInterestadual, doExterior);
  if Dest.EnderDest.UF = 'EX' then
   Ide.idDest := doExterior
  else if Dest.EnderDest.UF = Emit.EnderEmit.UF then
   Ide.idDest := doInterna
  else
   Ide.idDest := doInterestadual;

  Dest.EnderDest.UF := TbPrincipal.FieldByName('CLIENTE_ENDERECO_UF').AsString;
  Dest.EnderDest.fone := TbPrincipal.FieldByName('CLIENTE_TELEFONE1').AsString;
  if TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString = 'ISENTO' then
   Dest.indIEDest := inIsento
  else if TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString = 'NÃO CONTRIBUINTE'
  then
   Dest.indIEDest := inNaoContribuinte
  else
  begin
   Dest.indIEDest := inContribuinte;
   Dest.IE := TbPrincipal.FieldByName('CLIENTE_INSCRICAO').AsString;
  end;
  Dest.xNome := TbPrincipal.FieldByName('CLIENTE_RAZAO_SOCIAL').AsString;
  Dest.EnderDest.cPais := 1058;
  Dest.EnderDest.xPais := 'BRASIL';

  qryItens.First;
  while NOT qryItens.Eof do
  begin
   with Det.Add do
   begin
    Prod.nItem := qryItens.FieldByName('ITEM').AsInteger;
    Prod.cProd := qryItens.FieldByName('COD_PRODUTO').AsString;
    Prod.xProd := qryItens.FieldByName('NOME_PRODUTO').AsString;
    Prod.cEAN := qryItens.FieldByName('CODIGO_BARRAS').AsString;
    Prod.NCM := qryItens.FieldByName('CLASSIFICACAO_FISCAL').AsString;
    Prod.CFOP := qryItens.FieldByName('COD_CFOP').AsString;
    Prod.uCom := qryItens.FieldByName('UNIDADE').AsString;
    Prod.qCom := qryItens.FieldByName('QTE').AsFloat;
    Prod.vUnCom := qryItens.FieldByName('VALOR_UNITARIO').AsFloat;
    Prod.vProd := qryItens.FieldByName('VALOR_TOTAL').AsFloat;
    Prod.qTrib := qryItens.FieldByName('QTE').AsFloat;
    Prod.vUnTrib := qryItens.FieldByName('VALOR_UNITARIO').AsFloat;
    Prod.uTrib := qryItens.FieldByName('UNIDADE').AsString;
    Prod.vDesc := qryItens.FieldByName('DESCONTO_VALOR').AsFloat;
    Prod.vOutro := qryItens.FieldByName('OUTROS').AsFloat;

    infAdProd := qryItens.FieldByName('INFORMACAO_ADICIONAL').AsString;

    with Imposto do
    begin
     with ICMS do
     begin
      if Emit.CRT = crtSimplesNacional then
      // Ajuste SINIEF nº 3, de 09.07.2010 – DOU 1 de 13.07.2010

      begin
       case qryItens.FieldByName('COD_CSOSN').AsInteger of
        101:
         begin
          ICMS.CSOSN := csosn101;
          ICMS.vBC := qryItens.FieldByName('BASE_CALCULO').AsFloat;
          ICMS.pICMS := qryItens.FieldByName('ALIQUOTA').AsFloat;
          ICMS.vICMS := qryItens.FieldByName('VALOR_ICMS').AsFloat;
          ICMS.pCredSN := Dados.qryParametro_NF.FieldByName
            ('ALIQUOTA_CREDITO').AsFloat;
          ICMS.vCredICMSSN := (qryItens.FieldByName('VALOR_TOTAL').AsFloat -
            qryItens.FieldByName('DESCONTO_VALOR').AsFloat) *
            (Dados.qryParametro_NF.FieldByName('ALIQUOTA_CREDITO')
            .AsFloat / 100);
         end;
        201:
         begin
          ICMS.CSOSN := csosn201;
          ICMS.vBCST := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pICMSST := qryItens.FieldByName
            ('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.vICMSST := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pRedBCST := qryItens.FieldByName
            ('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
         end;
        400:
         begin
          ICMS.CSOSN := csosn400;
          ICMS.vBCST := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pICMSST := qryItens.FieldByName
            ('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
          ICMS.vICMSST := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
          ICMS.pRedBCST := qryItens.FieldByName
            ('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
         end;
        900:
         begin
          ICMS.CSOSN := csosn900;
          ICMS.vBC := qryItens.FieldByName('BASE_CALCULO').AsFloat;
          ICMS.pICMS := qryItens.FieldByName('ALIQUOTA').AsFloat;
          ICMS.vICMS := qryItens.FieldByName('VALOR_ICMS').AsFloat;
         end;
       end
      end
      else
      begin
       if qryItens.FieldByName('COD_CST').AsString = '000' then
        CST := cst00
       else if qryItens.FieldByName('COD_CST').AsString = '010' then
        CST := cst10
       else if qryItens.FieldByName('COD_CST').AsString = '020' then
        CST := cst20
       else if qryItens.FieldByName('COD_CST').AsString = '030' then
        CST := cst30
       else if qryItens.FieldByName('COD_CST').AsString = '040' then
        CST := cst40
       else if qryItens.FieldByName('COD_CST').AsString = '041' then
        CST := cst41
       else if qryItens.FieldByName('COD_CST').AsString = '050' then
        CST := cst50
       else if qryItens.FieldByName('COD_CST').AsString = '051' then
        CST := cst51
       else if qryItens.FieldByName('COD_CST').AsString = '060' then
        CST := cst60
       else if qryItens.FieldByName('COD_CST').AsString = '070' then
        CST := cst70
       else if qryItens.FieldByName('COD_CST').AsString = '090' then
        CST := cst90;
      end;

      ICMS.modBC := dbiPrecoTabelado;
      ICMS.pICMS := qryItens.FieldByName('ALIQUOTA').AsFloat;
      ICMS.vICMS := qryItens.FieldByName('VALOR_ICMS').AsFloat;
      ICMS.vBC := qryItens.FieldByName('BASE_CALCULO').AsFloat;
      ICMS.vBCST := qryItens.FieldByName('BASE_ICMS_SUBSTITUICAO').AsFloat;
      ICMS.pICMSST := qryItens.FieldByName
        ('ALIQUOTA_ICMS_SUBSTITUICAO').AsFloat;
      ICMS.vICMSST := qryItens.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
      ICMS.pRedBC := qryItens.FieldByName
        ('PERCENTUAL_REDUCAO_BASE_CALCULO').AsFloat;
     end;
     IPI.CST := ipi99;
     if qryItens.FieldByName('VALOR_IPI').AsFloat > 0 then
     begin
      IPI.vBC := qryItens.FieldByName('BASE_CALCULO').AsFloat;
      IPI.pIPI := qryItens.FieldByName('ALIQUOTA_IPI').AsFloat;
      IPI.vIPI := qryItens.FieldByName('VALOR_IPI').AsFloat;
     end;
     PIS.CST := pis99;
     COFINS.CST := cof99

    end;
   end;
   qryItens.Next;
  end;

  if TbPrincipal.FieldByName('CIF_FOB').Value = 'C' then
   Transp.modFrete := mfContaEmitente
  else if TbPrincipal.FieldByName('CIF_FOB').Value = 'F' then
   Transp.modFrete := mfContaDestinatario;
  Transp.Transporta.CNPJCPF := qryTransportador.FieldByName('CNPJ').AsString;
  Transp.Transporta.xNome := qryTransportador.FieldByName
    ('RAZAO_SOCIAL').AsString;
  Transp.Transporta.IE := qryTransportador.FieldByName('INSCRICAO').AsString;
  Transp.Transporta.xEnder := qryTransportador.FieldByName
    ('ENDERECO_LOGRADOURO').AsString + ' ' + qryTransportador.FieldByName
    ('ENDERECO_NUMERO').AsString + ' ' + qryTransportador.FieldByName
    ('ENDERECO_COMPLEMENTO').AsString + ' - ' + qryTransportador.FieldByName
    ('ENDERECO_BAIRRO').AsString;
  Transp.Transporta.xMun := qryTransportador.FieldByName
    ('ENDERECO_CIDADE').AsString;
  Transp.Transporta.UF := qrUF_Transportador.FieldByName('DESCRICAO').AsString;
  Transp.veicTransp.placa := TbPrincipal.FieldByName('VEICULO_PLACA').AsString;
  Transp.veicTransp.UF := qrUF_Veiculo.FieldByName('DESCRICAO').AsString;
  Transp.veicTransp.RNTC := TbPrincipal.FieldByName('RNTC').AsString;

  with Transp.Vol.Add do
  begin
   qVol := TbPrincipal.FieldByName('VOLUMES').AsInteger;
   esp := qryEspecie_Mercadoria.FieldByName('DESCRICAO').AsString;
   marca := TbPrincipal.FieldByName('MARCA').AsString;
   nVol := TbPrincipal.FieldByName('NUMERACAO_VOLUME').AsString;
   pesoL := TbPrincipal.FieldByName('PESO_LIQUIDO').AsFloat;
   pesoB := TbPrincipal.FieldByName('PESO_BRUTO').AsFloat;
  end;

  Total.ICMSTot.vBC := TbPrincipal.FieldByName('BASE_CALCULO').AsFloat;
  Total.ICMSTot.vICMS := TbPrincipal.FieldByName('VALOR_ICMS').AsFloat;
  Total.ICMSTot.vNF := TbPrincipal.FieldByName('TOTAL_NF').AsFloat;
  Total.ICMSTot.vProd := TbPrincipal.FieldByName('TOTAL_PRODUTOS').AsFloat;
  Total.ICMSTot.vBCST := TbPrincipal.FieldByName
    ('BASE_ICMS_SUBSTITUICAO').AsFloat;
  Total.ICMSTot.vST := TbPrincipal.FieldByName('ICMS_SUBSTITUICAO').AsFloat;
  Total.ICMSTot.vFrete := TbPrincipal.FieldByName('VALOR_FRETE').AsFloat;
  Total.ICMSTot.vSeg := TbPrincipal.FieldByName('VALOR_SEGURO').AsFloat;
  Total.ICMSTot.vDesc := TbPrincipal.FieldByName('DESCONTO_VALOR').AsFloat;
  Total.ICMSTot.vOutro := TbPrincipal.FieldByName('OUTRAS_DESPESAS').AsFloat;
  Total.ICMSTot.vIPI := TbPrincipal.FieldByName('TOTAL_IPI').AsFloat;

  InfAdic.infCpl := TbPrincipal.FieldByName('OBSERVACAO').AsString;
  InfAdic.infAdFisco := TbPrincipal.FieldByName('OBS_FISCO').AsString;
 end;
end;

procedure TfrmNF.dbFinalidadeExit(Sender: TObject);
begin
 inherited;
 if TbPrincipal.FieldByName('FINALIDADE_EMISSAO').Value <> 'fnNormal' then
  dbChaveNfeReferencia.Visible := True;

end;

procedure TfrmNF.ObservacaoCredito;
var
 observacao: String;
begin
 if ((Dados.qryParametro_NF.FieldByName('GERAR_CREDITO').AsString = 'F') or
   (Dados.qryParametro_NF.FieldByName('GERAR_CREDITO').IsNull)) then
  Exit
 else if (Dados.qryParametro_NF.FieldByName('ALIQUOTA_CREDITO').AsString = '')
   and (Dados.qryParametro_NF.FieldByName('GERAR_CREDITO').AsString = 'T') then
  MessageDlg('Cadastrar Aliquota para Crédito de ICM em parâmetros', mtWarning,
    [mbOK], 0)
 else
 begin
  TbPrincipal.FieldByName('ICM_CREDITO').Value :=
    TbPrincipal.FieldByName('TOTAL_NF').AsVariant *
    (Dados.qryParametro_NF.FieldByName('ALIQUOTA_CREDITO').Value / 100);

  observacao := Dados.qryParametro_NF.FieldByName('INFORMACAO_CREDITO')
    .AsString;

  observacao := StringReplace(observacao, '<ICM_CREDITO>',
    Trim(Padr(FormatFloat('#0.00', TbPrincipal.FieldByName('ICM_CREDITO')
    .Value), 12)), [rfReplaceAll]);
  observacao := StringReplace(observacao, '<ALIQUOTA_CREDITO>',
    Trim(Padr(FormatFloat('#0.00', Dados.qryParametro_NF.FieldByName
    ('ALIQUOTA_CREDITO').Value), 5)), [rfReplaceAll]);
  observacao := StringReplace(observacao, '<TOTAL_NF>',
    Trim(Padr(FormatFloat('#0.00', TbPrincipal.FieldByName('TOTAL_NF')
    .AsVariant), 12)), [rfReplaceAll]);

  if ((Copy(TbPrincipal.FieldByName('OBSERVACAO').AsString, 1,
    26) = ' - PERMITE CRÉDITO ICMS R$') or
    (Copy(TbPrincipal.FieldByName('OBSERVACAO').AsString, 1,
    23) = 'PERMITE CRÉDITO ICMS R$')) then
  begin
   if (MessageDlg('Observação já existe! Apagar?', mtConfirmation,
     [mbYes, mbNo], 0) = mrYes) then
    TbPrincipal.FieldByName('OBSERVACAO').AsString := ' - ' + observacao
   else
    TbPrincipal.FieldByName('OBSERVACAO').Value :=
      TbPrincipal.FieldByName('OBSERVACAO').AsString + ' - ' + observacao;
  end
  else
   TbPrincipal.FieldByName('OBSERVACAO').Value :=
     TbPrincipal.FieldByName('OBSERVACAO').AsString + ' - ' + observacao;
 end;
end;

procedure TfrmNF.Distribuir_Frete_Itens;
var
 Vamos: String;
 ValorRateio: Real;
begin
 While NOT qryItens.Eof do
 begin
  qryItens.Edit;
  ValorRateio := (qryItens.FieldByName('VALOR_TOTAL').AsFloat /
    TbPrincipal.FieldByName('TOTAL_PRODUTOS').AsFloat) * TbPrincipal.FieldByName
    ('VALOR_FRETE').AsFloat;
  Vamos := FormatFloat('0.00000000000', ValorRateio);
  qryItens.FieldByName('VALOR_FRETE').Value := Vamos;
  qryItens.Post;
  qryItens.Next;
 end;
end;

procedure TfrmNF.Gerar;
begin
 lblVerificarprotocolo.Caption := 'Gerando. Aguarde...';
 Application.ProcessMessages;
 DMNFE.NFe_GerarXml(TbPrincipal.FieldByName('NUMERO').AsInteger);
 lblVerificarprotocolo.Caption := '';
 TbPrincipal.RefreshRows;
end;

procedure TfrmNF.Assinar;
begin
 lblVerificarprotocolo.Caption := 'Assinando. Aguarde...';
 Application.ProcessMessages;
 DMNFE.NFe_Assinar;
 lblVerificarprotocolo.Caption := '';
end;

procedure TfrmNF.Validar;
begin
 lblVerificarprotocolo.Caption := 'Validando. Aguarde...';
 Application.ProcessMessages;
 DMNFE.NFe_ValidarXml;
 lblVerificarprotocolo.Caption := '';

end;

function TfrmNF.ValidarRegrasNegocio: Boolean;
var
 Msg: String;
 Inicio: TDateTime;
 Ok: Boolean;
 Tempo: String;
begin

 lblVerificarprotocolo.Caption := 'Validando Regras de negócio. Aguarde...';
 Application.ProcessMessages;

 Inicio := Now;
 Ok := DMNFE.NFe.NotasFiscais.ValidarRegrasdeNegocios(Msg);
 Tempo := FormatDateTime('hh:nn:ss:zzz', Now - Inicio);

 if not Ok then
 begin
  MemoDados.Lines.Add('Erro: ' + Msg);
  MemoDados.Visible := True;
  MemoDados.left := 4;
  MemoDados.Width := 814;
  ShowMessage('Erros encontrados' + sLineBreak + 'Tempo: ' + Tempo);
 end;
 lblVerificarprotocolo.Caption := '';

 MemoDados.Visible := False;
 MemoDados.left := 755;

 Result := Ok;
end;

procedure TfrmNF.Transmitir;
begin
 lblVerificarprotocolo.Caption := 'Transmitindo. Aguarde...';
 Application.ProcessMessages;
 DMNFE.NFe_Transmitir(TbPrincipal.FieldByName('NUMERO').AsInteger);
 lblVerificarprotocolo.Caption := '';
end;

function TfrmNF.GeraCartaCorrecao: Boolean;
var
 AlterouAlgumCampo: Boolean;
 SequencialDescritivo: integer;
 i: integer;
 CondicaoChave: string;

 XML_GRUPO, XML_CAMPO: string;
begin
 { ============================================
   Caso a nf ja tenha sido emitida verifica os itens
   que sofreram alteracao e gera a carta de correcao
   ============================================ }

 Result := True;

 if Trim(TbPrincipal.FieldByName('PROTOCOLO_AUTORIZACAO').AsString) = '' then
 begin
  Result := False;
  Exit;
 end;

 if TbPrincipal.Modified then
 begin
  if TbPrincipal.State in [dssInsert] then
  begin
   Result := False;
   Exit;
  end
 end;

 if (not TbPrincipal.Modified) and (cdsAlteracaoINF.IsEmpty) then
 begin
  Result := False;
  Exit;
 end;

 AlterouAlgumCampo := False;

 // ==================== Verifica se algum dado da tabela principal foi alterado =============
 for i := 0 to (TbPrincipal.FieldCount - 1) do
 begin
  if TbPrincipal.Fields[i].IsModified then
  begin
   if TbPrincipal.Fields[i].AsString <> TbPrincipal.Fields[i].OldAsString then
   begin
    if TbPrincipal.FieldsReadOnly.Values[TbPrincipal.Fields[i].FieldName] = ''
    then
     AlterouAlgumCampo := True;
   end;
  end;
 end;

 // ==================== se a tabela cdsAlteracaoINF nao estiver vazia existiu alteracao nas notas fiscis  =============
 if AlterouAlgumCampo = False then
 begin
  if cdsAlteracaoINF.IsEmpty then
  begin
   Result := False;
   Exit;
  end
 end;

 qryPesquisa.Close;
 qryPesquisa.SQL.Clear;
 qryPesquisa.SQL.Add
   (' SELECT MAX(CARTA_CORRECAO.COD_CARTA_CORRECAO) AS MAIOR ');
 qryPesquisa.SQL.Add(' FROM CARTA_CORRECAO ');
 qryPesquisa.SQL.Add
   (' WHERE CARTA_CORRECAO.COD_FILIAL_GERACAO = :COD_FILIAL_CARTA ');
 qryPesquisa.ParamByName('COD_FILIAL_CARTA').Value :=
   Dados.tbConfig.FieldByName('cod_filial').Value;
 qryPesquisa.Open;

 qrCartaCorrecao.Open;
 qrCartaCorrecao.Insert;

 qrCartaCorrecao.FieldByName('COD_CARTA_CORRECAO').Value :=
   qryPesquisa.FieldByName('MAIOR').AsInteger + 1;
 qrCartaCorrecao.FieldByName('COD_FILIAL_GERACAO').Value :=
   Dados.tbConfig.FieldByName('cod_filial').Value;

 qrCartaCorrecao.FieldByName('COD_CLIENTE').Value :=
   TbPrincipal.FieldByName('COD_CLIENTE').Value;
 qrCartaCorrecao.FieldByName('NOME_CLIENTE').Value :=
   TbPrincipal.FieldByName('CLIENTE_RAZAO_SOCIAL').AsString;
 qrCartaCorrecao.FieldByName('ENDERECO_CLIENTE').Value :=
   TbPrincipal.FieldByName('CLIENTE_ENDERECO_LOGRADOURO').AsString + ' ' +
   TbPrincipal.FieldByName('CLIENTE_ENDERECO_NUMERO').AsString + ' ' +
   TbPrincipal.FieldByName('CLIENTE_ENDERECO_COMPLEMENTO').AsString + '-' +
   TbPrincipal.FieldByName('CLIENTE_ENDERECO_BAIRRO').AsString;

 qrCartaCorrecao.FieldByName('DATA_LANCAMENTO').Value := Date;
 qrCartaCorrecao.FieldByName('HORA_LANCAMENTO').Value := Time;
 qrCartaCorrecao.FieldByName('COD_USUARIO').Value :=
   Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
 qrCartaCorrecao.FieldByName('TABELA_CORRIGIDA').Value := 'NF';
 qrCartaCorrecao.FieldByName('COD_TABELA_CORRIGIDA').Value :=
   TbPrincipal.FieldByName('NUMERO').Value;
 qrCartaCorrecao.FieldByName('COD_FILIAL_TABELA_CORIGIDA').Value :=
   TbPrincipal.FieldByName('COD_FILIAL').Value;
 qrCartaCorrecao.FieldByName('SERIE_TABELA_CORRIGIDA').Value :=
   TbPrincipal.FieldByName('SERIE').Value;

 qrCartaCorrecao.Post;

 qryPesquisa.Close;
 qryPesquisa.SQL.Clear;
 qryPesquisa.SQL.Add
   (' SELECT MAX(CARTA_CORRECAO_ITENS.SEQUENCIA_DESCRITIVA) AS MAIOR ');
 qryPesquisa.SQL.Add(' FROM CARTA_CORRECAO_ITENS ');
 qryPesquisa.SQL.Add
   (' WHERE CARTA_CORRECAO_ITENS.CODIGO_CARTA_CORRECAO = :COD_CARTA ');
 qryPesquisa.SQL.Add
   ('    AND CARTA_CORRECAO_ITENS.COD_FILIAL_CARTA_CORRECAO = :COD_FILIAL_CARTA ');
 qryPesquisa.ParamByName('COD_CARTA').Value := qrCartaCorrecao.FieldByName
   ('COD_CARTA_CORRECAO').Value;
 qryPesquisa.ParamByName('COD_FILIAL_CARTA').Value :=
   qrCartaCorrecao.FieldByName('COD_FILIAL_GERACAO').Value;
 qryPesquisa.Open;

 SequencialDescritivo := qryPesquisa.FieldByName('MAIOR').AsInteger;
 qryPesquisa.Close;
 { ============================================
   Insere o itens q foram modificados.
   Repare que os a descricao de cada campo é o que vai sair impresso na carta de cobranca e
   deve ser infornado na query no DISPLAY LABEL de cada campo
   ============================================ }

 // ==================== Lanca os dados da tabela de Dados impressos =============
 qrItemCartaCorrecao.Open;
 for i := 0 to (TbPrincipal.FieldCount - 1) do
 begin
  if TbPrincipal.Fields[i].IsModified then
  begin
   if TbPrincipal.Fields[i].AsString <> TbPrincipal.Fields[i].OldAsString then
   begin
    { ==================================
      Somente seleciona os campos que nao estiverem marcados como NOSEARCH
      Se um campo for  modificado e nao quiser que ele apareça na carta de correcao
      va na propriedade ( Field Properities) do campo dentro da query e marque a opçcao NOSEARCH
      Os campos marcados com esse flag nao entram  nos itens da carta de correcao.
      essa verificacao é feira na linha abaixo
      =================================== }
    if TbPrincipal.FieldsReadOnly.Values[TbPrincipal.Fields[i].FieldName] = ''
    then
    begin
     CondicaoChave := ' where CARTA_CORRECAO_ITENS.COD_FILIAL = ' +
       Dados.tbConfig.FieldByName('cod_filial').AsString;
     inc(SequencialDescritivo);
     qrItemCartaCorrecao.Insert;
     qrItemCartaCorrecao.FieldByName('CODIGO').Value :=
       ProximoCodigoChave('CARTA_CORRECAO_ITENS', 'CODIGO', CondicaoChave);
     qrItemCartaCorrecao.FieldByName('COD_FILIAL').Value :=
       Dados.tbConfig.FieldByName('cod_filial').Value;
     qrItemCartaCorrecao.FieldByName('CODIGO_CARTA_CORRECAO').Value :=
       qrCartaCorrecao.FieldByName('COD_CARTA_CORRECAO').Value;
     qrItemCartaCorrecao.FieldByName('COD_FILIAL_CARTA_CORRECAO').Value :=
       qrCartaCorrecao.FieldByName('COD_FILIAL_GERACAO').Value;
     qrItemCartaCorrecao.FieldByName('ORIGINAL').Value := TbPrincipal.Fields[i]
       .OldAsString;

     qrItemCartaCorrecao.FieldByName('ALTERADO_PARA').Value :=
       TbPrincipal.Fields[i].AsString;

     qrItemCartaCorrecao.FieldByName('NOME_CAMPO').Value :=
       TbPrincipal.Fields[i].FieldName;
     qrItemCartaCorrecao.FieldByName('DESCRICAO_CAMPO').Value :=
       TbPrincipal.Fields[i].DisplayLabel;
     qrItemCartaCorrecao.FieldByName('SEQUENCIA_DESCRITIVA').Value :=
       SequencialDescritivo;

     // ======================= Busca as informacoes da tag do xml ======================

     BuscaTag_DoXml_Carta_Correcao(TbPrincipal.Fields[i].FieldName, XML_GRUPO,
       XML_CAMPO);
     qrItemCartaCorrecao.FieldByName('XML_GRUPO').Value := XML_GRUPO;
     qrItemCartaCorrecao.FieldByName('XML_CAMPO').Value := XML_CAMPO;

     qrItemCartaCorrecao.Post;
    end;
   end;
  end;
 end;

 cdsAlteracaoINF.First;
 while not cdsAlteracaoINF.Eof do
 begin
  inc(SequencialDescritivo);
  qrItemCartaCorrecao.Insert;
  qrItemCartaCorrecao.FieldByName('CODIGO').Value :=
    ProximoCodigoChave('CARTA_CORRECAO_ITENS', 'CODIGO', CondicaoChave);
  qrItemCartaCorrecao.FieldByName('COD_FILIAL').Value :=
    Dados.qrFilial.FieldByName('COD_FILIAL').Value;
  qrItemCartaCorrecao.FieldByName('CODIGO_CARTA_CORRECAO').Value :=
    qrCartaCorrecao.FieldByName('COD_CARTA_CORRECAO').Value;
  qrItemCartaCorrecao.FieldByName('COD_FILIAL_CARTA_CORRECAO').Value :=
    qrCartaCorrecao.FieldByName('COD_FILIAL_GERACAO').Value;
  qrItemCartaCorrecao.FieldByName('ORIGINAL').Value :=
    cdsAlteracaoINF.FieldByName('ORIGINAL').Value;
  qrItemCartaCorrecao.FieldByName('ALTERADO_PARA').Value :=
    cdsAlteracaoINF.FieldByName('ALTERADO_PARA').Value;
  qrItemCartaCorrecao.FieldByName('NOME_CAMPO').Value :=
    cdsAlteracaoINF.FieldByName('NOME_CAMPO').Value;
  qrItemCartaCorrecao.FieldByName('DESCRICAO_CAMPO').Value :=
    cdsAlteracaoINF.FieldByName('DESCRICAO_CAMPO').Value;
  qrItemCartaCorrecao.FieldByName('SEQUENCIA_DESCRITIVA').Value :=
    SequencialDescritivo;

  BuscaTag_DoXml_Carta_Correcao(cdsAlteracaoINF.FieldByName('NOME_CAMPO')
    .AsString, XML_GRUPO, XML_CAMPO);
  qrItemCartaCorrecao.FieldByName('XML_GRUPO').Value := XML_GRUPO;
  qrItemCartaCorrecao.FieldByName('XML_CAMPO').Value := XML_CAMPO;

  qrItemCartaCorrecao.Post;
  cdsAlteracaoINF.Next;
 end;

 cdsAlteracaoINF.EmptyDataSet;
end;

procedure TfrmNF.BuscaTag_DoXml_Carta_Correcao(CampoBD_Alterado: string;
  var XML_GRUPO, XML_CAMPO: string);
begin
 { ==================================
   Para gerar a carta de correcao é necessario informar quais as tags do xml estao sendo alteradas

   =================================== }

 // ======================= Tag IDE "Dados principais"======================

 XML_GRUPO := 'ide';

 if CampoBD_Alterado = 'COD_CFOP' then
 begin
  XML_CAMPO := 'CFOP';
  Exit;
 end;

 if CampoBD_Alterado = 'DESCRICAO_CFOP' then
 begin
  XML_CAMPO := 'natOp';
  Exit;
 end;

 if CampoBD_Alterado = 'CIF_FOB' then
 begin
  XML_CAMPO := 'forPag';
  Exit;
 end;

 if CampoBD_Alterado = 'DATA_EMISSAO' then
 begin
  XML_CAMPO := 'dhEmi';
  Exit;
 end;

 if CampoBD_Alterado = 'COD_IBGE_CIDADE_COLETA' then
 begin
  XML_CAMPO := 'cMunIni';
  Exit;
 end;

 if CampoBD_Alterado = 'CIDADE_COLETA' then
 begin
  XML_CAMPO := 'xMunIni';
  Exit;
 end;

 if CampoBD_Alterado = 'UF_COLETA' then
 begin
  XML_CAMPO := 'UFIni';
  Exit;
 end;

 if CampoBD_Alterado = 'COD_IBGE_CIDADE_ENTREGA' then
 begin
  XML_CAMPO := 'cMunFim';
  Exit;
 end;

 if CampoBD_Alterado = 'CIDADE_ENTREGA' then
 begin
  XML_CAMPO := 'xMunFim';
  Exit;
 end;

 if CampoBD_Alterado = 'UF_ENTREGA' then
 begin
  XML_CAMPO := 'UFFim';
  Exit;
 end;

 // ======================= Tomador de servico ======================
 XML_GRUPO := 'toma03';
 if CampoBD_Alterado = 'TOMADOR_SERVICO' then
 begin
  XML_CAMPO := 'toma';
  Exit;
 end;

 // ======================= Tag rem "Dados do rementente"======================
 XML_GRUPO := 'rem';

 if CampoBD_Alterado = 'REMETENTE_NOME' then
 begin
  XML_CAMPO := 'xNome';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_INSCR_ESTADUAL' then
 begin
  XML_CAMPO := 'IE';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_FONE' then
 begin
  XML_CAMPO := 'fone';
  Exit;
 end;
 // ======================= Tag enderReme "Endereco do Remetente" ======================
 XML_GRUPO := 'enderReme';

 if CampoBD_Alterado = 'REMETENTE_ENDERECO' then
 begin
  XML_CAMPO := 'xLgr';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_END_NUMERO' then
 begin
  XML_CAMPO := 'nro';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_END_COMPLEMENTO' then
 begin
  XML_CAMPO := 'xCpl';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_BAIRRO' then
 begin
  XML_CAMPO := 'xBairro';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_COD_MUNICIPIO' then
 begin
  XML_CAMPO := 'cMun';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_MUNICIPIO' then
 begin
  XML_CAMPO := 'xMun';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_CEP' then
 begin
  XML_CAMPO := 'CEP';
  Exit;
 end;

 if CampoBD_Alterado = 'REMETENTE_UF' then
 begin
  XML_CAMPO := 'UF';
  Exit;
 end;

 // ======================= Tag dest " Informacao do destinatario"======================
 XML_GRUPO := 'dest';

 if CampoBD_Alterado = 'DESTINATARIO_NOME' then
 begin
  XML_CAMPO := 'xNome';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_INSCR_ESTADUAL' then
 begin
  XML_CAMPO := 'IE';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_FONE' then
 begin
  XML_CAMPO := 'fone';
  Exit;
 end;

 // ======================= Tag enderDest "endereco destinatario"  ======================
 XML_GRUPO := 'enderDest';

 if CampoBD_Alterado = 'DESTINATARIO_ENDERECO' then
 begin
  XML_CAMPO := 'xLgr';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_END_NUMERO' then
 begin
  XML_CAMPO := 'nro';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_END_COMPLEMENTO' then
 begin
  XML_CAMPO := 'xCpl';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_BAIRRO' then
 begin
  XML_CAMPO := 'xBairro';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_COD_MUNICIPIO' then
 begin
  XML_CAMPO := 'cMun';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_MUNICIPIO' then
 begin
  XML_CAMPO := 'xMun';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_CEP' then
 begin
  XML_CAMPO := 'CEP';
  Exit;
 end;

 if CampoBD_Alterado = 'DESTINATARIO_UF' then
 begin
  XML_CAMPO := 'UF';
  Exit;
 end;

 // ======================= tag receb  'Alteracao no redespacho'======================
 XML_GRUPO := 'receb';

 if CampoBD_Alterado = 'REDESPACHO_EMPRESA' then
 begin
  XML_CAMPO := 'xNome';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_INCRICAO_ESTADUAL' then
 begin
  XML_CAMPO := 'IE';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_FONE' then
 begin
  XML_CAMPO := 'fone';
  Exit;
 end;

 // ======================= Tag enderReceb "endereco Redespacho"  ======================
 XML_GRUPO := 'enderReceb';

 if CampoBD_Alterado = 'REDESPACHO_ENDERECO' then
 begin
  XML_CAMPO := 'xLgr';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_END_NUMERO' then
 begin
  XML_CAMPO := 'nro';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_END_COMPLEMENTO' then
 begin
  XML_CAMPO := 'xCpl';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_BAIRRO' then
 begin
  XML_CAMPO := 'xBairro';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_COD_MUNICIPIO' then
 begin
  XML_CAMPO := 'cMun';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_MUNICIPIO' then
 begin
  XML_CAMPO := 'xMun';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_CEP' then
 begin
  XML_CAMPO := 'CEP';
  Exit;
 end;

 if CampoBD_Alterado = 'REDESPACHO_UF' then
 begin
  XML_CAMPO := 'UF';
  Exit;
 end;

 XML_GRUPO := 'ICMS45';
 if CampoBD_Alterado = 'COD_ICMS' then
 begin
  XML_CAMPO := 'CST';
  Exit;
 end;

 XML_GRUPO := 'infQ';
 if CampoBD_Alterado = 'PESO' then
 begin
  XML_CAMPO := 'cUnid';
  Exit;
 end;

 if CampoBD_Alterado = 'QUANTIDADE' then
 begin
  XML_CAMPO := 'cUnid';
  Exit;
 end;

 // ======================= informacao da nfe do cliente ======================
 XML_GRUPO := 'infNFe';
 if CampoBD_Alterado = 'NOTA_CHAVE_NFE' then
 begin
  XML_CAMPO := 'chave';
  Exit;
 end;

 if CampoBD_Alterado = 'VALOR_MERCADORIA' then
 begin
  XML_CAMPO := 'vNF';
  Exit;
 end;

 XML_CAMPO := '';
 XML_GRUPO := '';
end;

procedure TfrmNF.AjustaCamposAptosAlteracao;
begin

 { ============================================
   Somente se a NF ja e estiver sido Emitido
   Verifica se os campos estao na tabela de
   NF_CAMPOS_APTOS_CORRECAO. Os que nao estiverem na lista
   ficam ReadOnly
   ============================================ }
 {
   edtCFOP.ReadOnly           := False;
   edtCNPJ.ReadOnly           := False;


   edtEspecieMercadoria.ReadOnly        := False;
   edtEspecieMercadoria.ShowButton      := True;
   btnPesquisaEspecieMercadoria.Enabled := True;

   dbCodigoTransportador.ReadOnly    := False;
   dbNomeTransportador.ReadOnly    := False;
   btnPesquisaTransportador.Enabled := True;


   btnIncluirProdutos.Enabled   := True;


   if not (TbPrincipal.State in [dssEdit] ) then
   Exit;

   if TbPrincipal.FieldByName('DATA_EMISSAO').IsNull then
   Exit;

   qryPesquisa.Close;
   qryPesquisa.SQL.Clear;
   qryPesquisa.SQL.Add(' SELECT RDB$RELATION_FIELDS.RDB$FIELD_NAME as NomeCampo ');
   qryPesquisa.SQL.Add(' FROM RDB$RELATION_FIELDS ');
   qryPesquisa.SQL.Add(' WHERE RDB$RELATION_NAME =' +  QuotedStr('NF') );
   qryPesquisa.SQL.Add(' AND RDB$RELATION_FIELDS.RDB$FIELD_NAME not in');
   qryPesquisa.SQL.Add(' ( ');
   qryPesquisa.SQL.Add('    SELECT NF_CAMPOS_APTOS_CORRECAO.NOME_CAMPO');
   qryPesquisa.SQL.Add('    from NF_CAMPOS_APTOS_CORRECAO');
   qryPesquisa.SQL.Add(' )');
   qryPesquisa.Open;

   //=============== Trata os componentes que estao ligado na query principal ================
   for i := 0 to ComponentCount -1 do
   begin
   if (Components[i] is TIB_Edit) then
   begin
   NomeCampo := TIB_Edit(Components[i]).DataField;
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   TIB_Edit(Components[i]).ReadOnly := True
   else
   TIB_Edit(Components[i]).ReadOnly := False;
   end;

   if (Components[i] is TIB_RadioGroup) then
   begin
   NomeCampo := TIB_RadioGroup(Components[i]).DataField;
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   TIB_RadioGroup(Components[i]).ReadOnly := True
   else
   TIB_RadioGroup(Components[i]).ReadOnly := False;
   end;

   if (Components[i] is TIB_Currency) then
   begin
   NomeCampo := TIB_Currency(Components[i]).DataField;
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   TIB_Currency(Components[i]).ReadOnly := True
   else
   TIB_Currency(Components[i]).ReadOnly := False;
   end;
   end;

   //=============== Trata os campos relacionados a outras tabelas ================

   NomeCampo :='COD_CFOP';
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   begin
   edtCFOP.ReadOnly   := True;
   end;

   NomeCampo := 'COD_ESPECIE_MERCADORIA';
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   begin
   edtEspecieMercadoria.ReadOnly        := True;
   edtEspecieMercadoria.ShowButton      := False;
   btnPesquisaEspecieMercadoria.Enabled := False;
   end;

   NomeCampo := 'COD_TRANSPORTADOR';
   if qryPesquisa.Locate('NomeCampo',NomeCampo , []) then
   begin
   dbCodigoTransportador.ReadOnly       := True;
   dbNomeTransportador.ReadOnly        := True;
   btnPesquisaTransportador.Enabled := False;
   end;

   qryPesquisa.Close;
 }
end;

end.
