unit ConsultaCnpj;

interface

uses
  Windows, system.UItypes, IB_Access, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, MSHTML ,
  StdCtrls, ExtCtrls, Buttons, OleCtrls, SHDocVw, Variants,Rotinas, jpeg,
  cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters,
  cxContainer, cxEdit, dxGDIPlusClasses, cxImage, dxSkinsCore, dxSkinOffice2010Blue;

type
  TfrmConsultaCnpj = class(TForm)
    memo_Dados: TMemo;
    cxImage1: TcxImage;
    edtCnpj: TEdit;
    lbl7: TLabel;
    lbllblAguarde: TLabel;
    pnl_Cadastro: TPanel;
    shp1: TShape;
    shp2: TShape;
    lbl3: TLabel;
    lbl5: TLabel;
    shp3: TShape;
    shp4: TShape;
    shp5: TShape;
    shp6: TShape;
    shp7: TShape;
    shp8: TShape;
    Edit_nome: TEdit;
    edt_Inscricao: TEdit;
    Edit_Logradouro: TEdit;
    Edit_Numero: TEdit;
    Edit_Complemento: TEdit;
    Edit_Cep: TEdit;
    Edit_Bairro: TEdit;
    Edit_Municipio: TEdit;
    Edit_UF: TEdit;
    Edit_InicioAtividade: TEdit;
    Edit_NomeFantasia: TEdit;
    Edit_CNAE: TEdit;
    chkCNAE: TCheckBox;
    chkCEP: TCheckBox;
    chkComplemento: TCheckBox;
    chkLogradouro: TCheckBox;
    chkNome: TCheckBox;
    chkAbertura: TCheckBox;
    chkNomeFantasia: TCheckBox;
    chkBairro: TCheckBox;
    chkNumero: TCheckBox;
    chkUF: TCheckBox;
    chkMunicipio: TCheckBox;
    chkCNAE2: TCheckBox;
    Edit_CNAE2: TEdit;
    chkStatus: TCheckBox;
    Edit_Status: TEdit;
    Edit_DataSituacao: TEdit;
    chkDataSituacao: TCheckBox;
    GroupBox1: TGroupBox;
    chkDivergentes: TCheckBox;
    chkTodos: TCheckBox;
    GroupBox2: TGroupBox;
    cbxEnderecoCobranca: TCheckBox;
    cbxEnderecoEntrega: TCheckBox;
    btnTransfereDados: TBitBtn;
    webPagina: TWebBrowser;
    procedure webPaginaDocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure webPaginaDownloadBegin(Sender: TObject);
    procedure webPaginaDownloadComplete(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure WebBrowser1DocumentComplete(Sender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1DownloadBegin(Sender: TObject);
    procedure WebBrowser1DownloadComplete(Sender: TObject);
    procedure edtCnpjChange(Sender: TObject);
    procedure btnTransfereDadosClick(Sender: TObject);
    procedure chkTodosClick(Sender: TObject);
    procedure chkDivergentesClick(Sender: TObject);
    procedure TransfereDados(MostrarDados, VerificaDivergencias, CadastroNovo: boolean; var Empresa: TCliente);
    procedure FormShow(Sender: TObject);
    procedure webPagina2CommandStateChange(Sender: TObject;
      Command: Integer; Enable: WordBool);

  private
    procedure LimpaCampos;
    procedure NovaConsulta;
    procedure SalvarPagina;
    function TrataTexto(Palavra: string): string;
    procedure PreencheCnpj(cnpj : string);
    function VerificaAsteriscos(Valor: string): Boolean;
    procedure VerificarDivergencias;

    { Private declarations }
  public
    { Public declarations }
    DadosCliente : TCliente;
  end;

var
  frmConsultaCnpj: TfrmConsultaCnpj;
  CadastroNovo_buscacnpj:Boolean;
  MostrarDados_buscacnpj:Boolean;
  VerificaDivergencias_buscacnpj:Boolean;
  Divergencias:integer;



implementation



{$R *.DFM}

procedure TfrmConsultaCnpj.NovaConsulta;
begin
   webPagina.Silent := True;
   webPagina.Navigate('http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/Cnpjreva_Solicitacao2.asp');
   Memo_Dados.Lines.Clear;


end;


procedure TfrmConsultaCnpj.LimpaCampos;
var Y : Integer;
begin
   //============== limpa os campos ======================
   For y := 0 To ComponentCount - 1 Do
      If Components[y] is TEdit Then
         If (Trim((Components[y] as TEdit).Hint)<>'') then
            (Components[y] as TEdit).Text := '';
end;

procedure TfrmConsultaCnpj.SalvarPagina;
var i,y : Integer;
begin
   Memo_Dados.lines.Text := webPagina.OleObject.Document. documentElement.innerText;

   For i := 0 To Memo_Dados.lines.Count-1 Do
   Begin
      For y := 0 To ComponentCount - 1 Do
         If Components[y] is TEdit Then
            If (Trim((Components[y] as TEdit).Hint)<>'') And ((Components[y] as TEdit).Hint = Trim(Memo_Dados.Lines[i])) Then
            begin
              (Components[y] as TEdit).Text := Trim(Memo_Dados.Lines[i+1]);
              (Components[y] as TEdit).Text := TrataTexto( (Components[y] as TEdit).Text ) ;
            end
   End;

   if VerificaDivergencias_buscacnpj then
      VerificarDivergencias;

   NovaConsulta;
end;

procedure TfrmConsultaCnpj.webPaginaDocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  inherited;
  If pos('Cnpjreva_Comprovante.asp',url) > 0 Then
  begin
     SalvarPagina;
  end
  else
  If pos('Cnpjreva_Erro.asp?erro=',url) > 0 Then
  begin
    MessageDlg('Este número '+edtcnpj.Text+' passa pela Fórmula de validação de CNPJ'+#13+#10+'no entanto não existe na base de dados da Receita Federal, '+#13+#10+'possivelmente não é um CNPJ válido.', mtError, [mbOK], 0);
    NovaConsulta;
  end
  else
  if pos('Cnpjreva_Solicitacao2.asp?cnpj=', url) > 0 then
  begin
     NovaConsulta;
     LimpaCampos;
  end;

end;

procedure TfrmConsultaCnpj.webPaginaDownloadBegin(Sender: TObject);
begin
  inherited;
   lbllblAguarde.Visible := True;
end;

procedure TfrmConsultaCnpj.webPaginaDownloadComplete(Sender: TObject);
var
  ParentW: OLEVariant;
  cnpj : string;
begin
   cnpj := LimpaTexto(edtCnpj.Text);

   ParentW := webPagina.OleObject.Document.ParentWindow;
   ParentW.ScrollTo(0, ParentW.Screen.Height);
   lbllblAguarde.Visible := False;
   PreencheCnpj( cnpj);

end;

procedure TfrmConsultaCnpj.FormActivate(Sender: TObject);
begin
  inherited;
   NovaConsulta;
end;

function TfrmConsultaCnpj.TrataTexto(Palavra : string) : string;
begin
   Result := Palavra;
   if Palavra = '' then
       Exit;

   if Palavra[1] = ':' then
      Palavra := Copy(Palavra , 2 , Length(Palavra));

   if Palavra[Length(Palavra)] = ';' then
      Palavra := Copy(Palavra , 1 , Length(Palavra)-1);

   Result := Palavra;
end;

procedure TfrmConsultaCnpj.PreencheCnpj(cnpj : string);
var
  i, j: Integer;
  FormItem: Variant;
begin
  if cnpj = '' then
     Exit;
     
  for i := 0 to webPagina.OleObject.Document.Forms.Length -1 do
  begin
    FormItem := webPagina.OleObject.Document.Forms.Item(I);
    for j := 0 to FormItem.Length-1 do
    begin
      if (FormItem.Item(j).Name = 'cnpj') then
        FormItem.Item(j).Value := cnpj;
    end;
  end;

end;


procedure TfrmConsultaCnpj.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  inherited;
   webPagina.OleObject.Document.body.Scroll:= 'no';

  If pos('Cnpjreva_Comprovante.asp',url) > 0 Then
  begin
     SalvarPagina;
  end
  else
  If pos('Cnpjreva_Erro.asp?erro=',url) > 0 Then
  begin
    MessageDlg('Este número '+edtcnpj.Text+' passa pela Fórmula de validação de CNPJ'+#13+#10+'no entanto não existe na base de dados da Receita Federal, '+#13+#10+'possivelmente não é um CNPJ válido.', mtError, [mbOK], 0);
    NovaConsulta;
  end
  else
  if pos('Cnpjreva_Solicitacao2.asp?cnpj=', url) > 0 then
  begin
     NovaConsulta;
     LimpaCampos;
  end;

end;

procedure TfrmConsultaCnpj.WebBrowser1DownloadBegin(Sender: TObject);
begin
  inherited;
   lbllblAguarde.Visible := True;

end;

procedure TfrmConsultaCnpj.WebBrowser1DownloadComplete(Sender: TObject);
var
  ParentW: OLEVariant;
  cnpj : string;
begin
   cnpj := LimpaTexto(edtCnpj.Text);

   ParentW := webPagina.OleObject.Document.ParentWindow;
   ParentW.ScrollTo(0, ParentW.Screen.Height);
   lbllblAguarde.Visible := False;
   PreencheCnpj( cnpj);

end;


procedure TfrmConsultaCnpj.edtCnpjChange(Sender: TObject);
var cnpj : string;
begin
  inherited;

   cnpj := LimpaTexto(edtCnpj.Text);

   if Length(cnpj) = 14 then
   begin
      if  webPagina.Document <> nil then
         PreencheCnpj(cnpj);
   end


end;                               

function TfrmConsultaCnpj.VerificaAsteriscos(Valor : string ) : Boolean;
var temp : string;
begin
  //==================== qdo o campo nao é preenchdo no site da receita eles colocam asteriscos =============

  Result := False;

  if Trim(valor) = '' then
     Exit;

  if Length(Valor) < 5 then
     Exit;

  temp := Copy(Valor, 1 , 5 );

  if temp = '*****' then
     Result := True


end;

procedure TfrmConsultaCnpj.btnTransfereDadosClick(Sender: TObject);
var
  Itens: Integer;
begin
  Itens:=0;
  if chkStatus.Checked then
  begin
    if VerificaAsteriscos(Edit_Status.Text) = False then
      DadosCliente.situacao:=Edit_Status.Text;

    inc(itens);
  end;

  if chkDataSituacao.Checked then
  begin
    if VerificaAsteriscos(Edit_DataSituacao.Text) = False then
       DadosCliente.data_situacao:=Edit_DataSituacao.Text;
    inc(itens);
  end;

  if chkAbertura.Checked then
  begin
    if VerificaAsteriscos(Edit_InicioAtividade.Text) = False then
       DadosCliente.InicioAtividade := Edit_InicioAtividade.Text;
    inc(itens);
  end;

  if chkNome.Checked then
  begin
    if VerificaAsteriscos(Edit_nome.Text) = False then
    DadosCliente.Nome:=Edit_nome.Text;
    inc(itens);
  end;

  if chkNomeFantasia.Checked then
  begin
    if VerificaAsteriscos(Edit_NomeFantasia.Text) = False then
    DadosCliente.NomeFantasia:=Edit_NomeFantasia.Text;
    inc(itens);
  end;

  if chkCNAE.Checked then
  begin
    if VerificaAsteriscos(Edit_CNAE.Text) = False then
    DadosCliente.CNAE1:=Copy(LimpaTexto(Edit_CNAE.Text),1,7);
    inc(itens);
  end;

  if chkCNAE2.Checked then
  begin
    if VerificaAsteriscos(Edit_CNAE2.Text) = False then
    DadosCliente.CNAE2:=Copy(LimpaTexto(Edit_CNAE2.Text),1,7);
    inc(itens);
  end;

  if chkLogradouro.Checked then
  begin
    if VerificaAsteriscos(Edit_Logradouro.Text) = False then
    DadosCliente.logradouro:=Edit_Logradouro.Text;
    inc(itens);
  end;

  if chkNumero.Checked then
  begin
    if VerificaAsteriscos(Edit_Numero.Text) = False then
    DadosCliente.numero:=Edit_Numero.Text;
    inc(itens);
  end;

  if chkComplemento.Checked then
  begin
    if VerificaAsteriscos(Edit_Complemento.Text) = False then
    DadosCliente.complemento:=Edit_Complemento.Text;
    inc(itens);
  end;

  if chkCEP.Checked then
  begin
    if VerificaAsteriscos(Edit_Cep.Text) = False then
    DadosCliente.cep:=LimpaTexto(Edit_Cep.Text);
    inc(itens);
  end;

  if chkBairro.Checked then
  begin
    if VerificaAsteriscos(Edit_Bairro.Text) = False then
    DadosCliente.bairro:=Edit_Bairro.Text;
    inc(itens);
  end;

  if chkMunicipio.Checked then
  begin
    if VerificaAsteriscos(Edit_Municipio.Text) = False then
    DadosCliente.municipio:=Edit_Municipio.Text;
    inc(itens);
  end;

  if chkUF.Checked then
  begin
    if VerificaAsteriscos(Edit_UF.Text) = False then
    DadosCliente.uf:=Edit_UF.Text;
    inc(itens);
  end;

  if chkCEP.Checked or chkMunicipio.Checked then
  begin
    if DadosCliente.cod_cidade_IBGE = '' then
      DadosCliente.cod_cidade_IBGE := BuscaCodigoIBGEPorCidade(DadosCliente.municipio,DadosCliente.uf);
  end;

  if Itens = 0 then
  begin
  if (MessageDlg('Nenhum item foi selecionado para atualizar o cadastro.'+#13+#10+'Deseja selecionar algum item?', mtWarning, [mbYes, mbNo], 0) = mrYes) then
     exit;
  end;

end;

procedure TfrmConsultaCnpj.chkTodosClick(Sender: TObject);
var i:integer;
begin
  For i := 0 To ComponentCount - 1 Do
   Begin
     If Components[i] is TCheckBox Then
     begin
        (Components[i] as TCheckBox).Checked :=chkTodos.Checked;
     end;
   End;
end;

procedure TfrmConsultaCnpj.chkDivergentesClick(Sender: TObject);
begin
  if Edit_InicioAtividade.Font.Color =clRed then
    chkAbertura.Checked:=chkDivergentes.Checked;

  if Edit_nome.Font.Color =clRed then
    chkNome.Checked:=chkDivergentes.Checked;

  if Edit_NomeFantasia.Font.Color =clRed then
    chkNomeFantasia.Checked:=chkDivergentes.Checked;

  if Edit_CNAE.Font.Color =clRed then
    chkCNAE.Checked:=chkDivergentes.Checked;

  if Edit_CNAE2.Font.Color =clRed then
    chkCNAE2.Checked:=chkDivergentes.Checked;

  if Edit_Logradouro.Font.Color =clRed then
    chkLogradouro.Checked:=chkDivergentes.Checked;

  if Edit_Numero.Font.Color =clRed then
    chkNumero.Checked:=chkDivergentes.Checked;

  if Edit_Complemento.Font.Color =clRed then
    chkComplemento.Checked:=chkDivergentes.Checked;

  if Edit_Cep.Font.Color =clRed then
    chkCEP.Checked:=chkDivergentes.Checked;

  if Edit_Bairro.Font.Color =clRed then
    chkBairro.Checked:=chkDivergentes.Checked;

  if Edit_Municipio.Font.Color =clRed then
    chkMunicipio.Checked:=chkDivergentes.Checked;

  if Edit_UF.Font.Color =clRed then
    chkUF.Checked:=chkDivergentes.Checked;

end;

procedure TfrmConsultaCnpj.TransfereDados(MostrarDados,VerificaDivergencias,CadastroNovo:boolean; var Empresa:TCliente);
begin
  MostrarDados_buscacnpj:=MostrarDados;
  CadastroNovo_buscacnpj:=CadastroNovo;
  VerificaDivergencias_buscacnpj:=VerificaDivergencias;
  DadosCliente:=Empresa;
end;

procedure TfrmConsultaCnpj.FormShow(Sender: TObject);
begin
   edtCnpj.Text := DadosCliente.CNPJ;
end;

procedure TfrmConsultaCnpj.VerificarDivergencias;
begin
 Divergencias:=0;
  if RemoveAcento(Edit_Status.Text) <> RemoveAcento(DadosCliente.situacao) then
  begin
    Edit_Status.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_DataSituacao.Text) <> RemoveAcento(DadosCliente.data_situacao) then
  begin
    Edit_DataSituacao.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_InicioAtividade.Text) <> RemoveAcento(DadosCliente.InicioAtividade) then
  begin
    Edit_InicioAtividade.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_nome.Text) <> RemoveAcento(DadosCliente.Nome) then
  begin
    Edit_nome.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_NomeFantasia.Text) <> RemoveAcento(DadosCliente.NomeFantasia) then
  begin
    Edit_NomeFantasia.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if Copy(LimpaTexto(Edit_CNAE.Text),1,7) <> DadosCliente.CNAE1 then
  begin
    Edit_CNAE.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_Logradouro.Text) <> RemoveAcento(DadosCliente.logradouro) then
  begin
    Edit_Logradouro.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_Numero.Text) <> RemoveAcento(DadosCliente.numero) then
  begin
    Edit_Numero.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_Complemento.Text) <> RemoveAcento(DadosCliente.complemento) then
  begin
    Edit_Complemento.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if LimpaTexto(Edit_Cep.Text) <> DadosCliente.cep then
  begin
    Edit_Cep.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_Bairro.Text) <> RemoveAcento(DadosCliente.bairro) then
  begin
    Edit_Bairro.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_Municipio.Text) <> RemoveAcento(DadosCliente.municipio) then
  begin
    Edit_Municipio.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if RemoveAcento(Edit_UF.Text) <> RemoveAcento(DadosCliente.uf) then
  begin
    Edit_UF.Font.Color:=clRed;
    inc(Divergencias);
  end;

  if Divergencias > 0 then
    chkDivergentes.Visible:=True
  else
    chkDivergentes.Visible:=False;
end;

procedure TfrmConsultaCnpj.webPagina2CommandStateChange(Sender: TObject;
  Command: Integer; Enable: WordBool);

var
  Doc: IHTMLDocument2;        // document object
  Sel: IHTMLSelectionObject;  // current selection

begin
// Check we have a valid web browser triggering this event
  if not Assigned(Sender) or not (Sender is TWebBrowser) then
    Exit;
  // Check we have required command
  if TOleEnum(Command) <> CSC_UPDATECOMMANDS then
    Exit;
  // Get ref to document object and check not nil
  Doc := webPagina.Document as IHTMLDocument2;
  if not Assigned(Doc) then
    Exit;

   Sel := Doc.selection as IHTMLSelectionObject;
  // If selection is of correct type then we have a mouse click
  if Assigned(Sel) and (Sel.type_ = 'None') then
    PreencheCnpj(edtCnpj.Text);


end;

end.
