unit CancelaNF;

interface

uses
  Windows, system.UItypes, IB_Access,  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TelaComum, ImgList, ExtCtrls, StdCtrls, Buttons, IB_Grid, Mask,
  IB_Controls, IB_Components,Rotinas, ComCtrls, OleCtrls, SHDocVw,pcnConversao,
  cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, Menus, cxButtons,ShellApi,
   IB_EditButton, System.ImageList, dxSkinsCore, dxSkinOffice2010Blue;

type
  TfrmCancelamento_NF = class(TfrmTelaComum)
    qryNF: TIB_Query;
    dtNF: TIB_DataSource;
    qryHistorico: TIB_Query;
    OpenDialog1: TOpenDialog;
    Seleciona: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel6: TPanel;
    PageControl7: TPageControl;
    TabSheet24: TTabSheet;
    MemoResp: TMemo;
    TabSheet25: TTabSheet;
    WBResposta: TWebBrowser;
    TabSheet26: TTabSheet;
    memoLog: TMemo;
    TabSheet27: TTabSheet;
    trvwNFe: TTreeView;
    GroupBox3: TGroupBox;
    dbNF: TIB_Edit;
    btnPesquisaNF: TBitBtn;
    IB_Edit1: TIB_Edit;
    IB_Edit3: TIB_Edit;
    GroupBox7: TGroupBox;
    edtCidadeTransporte: TIB_Edit;
    dbNomeFantasia: TIB_Edit;
    dbInscricao: TIB_Edit;
    edtUF: TIB_LookupCombo;
    IB_Edit2: TIB_Edit;
    GroupBox1: TGroupBox;
    dbProtocoloCancelamento: TIB_Edit;
    btnVerificaWebService: TcxButton;
    IB_Edit4: TIB_Edit;
    btnTiraCancelado: TBitBtn;
    edtProtocolo: TIB_Edit;
    btnVerificaTransmissao: TcxButton;
    lblVerificarprotocolo: TLabel;
    procedure BtGravarClick(Sender: TObject);
    procedure btnPesquisaNFClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure dbNFExit(Sender: TObject);
    procedure btnVerificaWebServiceClick(Sender: TObject);
    procedure btnVerificaTransmissaoClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnTiraCanceladoClick(Sender: TObject);
  private
    procedure GeraValidaXML;
    procedure CancelaNF;
    function MudaNomeArquivo(NomeArquivo: String):String;
    procedure LoadXML(MyMemo: TMemo; MyWebBrowser: TWebBrowser);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmCancelamento_NF: TfrmCancelamento_NF;
  NomeArquivo_Cancelar:String;
implementation

uses Justificativa, DataModulo, ModeloPesquisa, cadNF, ConfigacaoSistema,
  DataModulo_NFe, TeladeEspera;

{$R *.dfm}

procedure TfrmCancelamento_NF.BtGravarClick(Sender: TObject);
begin
  inherited;

   if qryNF.FieldByName('PROTOCOLO_AUTORIZACAO').IsNull then
   begin
     MessageDlg('Esta NF não parece ter sido transmitida pelo sistema,'+#13+#10+'porque não possui o protocolo de transmissão.'+#13+#10+'Sem o protocolo não é possível realizar o cancelamento.',  mtWarning, [mbOK], 0);
     Exit;
   end;

   frmJustificativa := TfrmJustificativa.Create(Application);
   if frmJustificativa.ShowModal = mrOk then
   begin


      if DMNFE.NFe_Cancelar( qryNF.FieldByName('numero').AsInteger , qryNF.FieldByName('cod_filial').AsInteger, frmJustificativa.mmJustificativa.Lines.Text ) = False then
      begin
        MemoResp.Lines.Text :=  UTF8Encode(DMNFE.NFe.WebServices.EnvEvento.RetWS);
        memoLog.Lines.Text :=  UTF8Encode(DMNFE.NFe.WebServices.EnvEvento.RetornoWS);
        LoadXML(MemoResp, WBResposta);

        MessageDlg('Erro no cancelamento da Nota Fiscal', mtError, [mbOK], 0);


        frmJustificativa.Destroy;
        Exit;
      end
      else
      begin
        qryNF.Edit;
        qryNF.FieldByName('STATUS').Value               := 'C';
        qryNF.FieldByName('cancelado').Value            := 'T';
        qryNF.FieldByName('DATA_CANCELADO').Value       := Date;
        qryNF.FieldByName('COD_USUARIO_CANCELADO').Value:= Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
        qryNF.FieldByName('MOTIVO_CANCELADO').Value     := frmJustificativa.mmJustificativa.Lines.Text;
        qryNF.Post;

        qryHistorico.Insert;
        qryHistorico.FieldByName('DATA_HISTORICO').Value:=Date;
        qryHistorico.FieldByName('COD_USUARIO').Value:= Dados.qrUsuario.FieldByName('COD_USUARIO').Value;
        qryHistorico.FieldByName('COD_FILIAL_NF').Value:= dados.qrFilial.FieldByName('COD_FILIAL').Value;
        qryHistorico.FieldByName('COD_NF').Value:=qryNF.FieldByName('NUMERO').Value;
        qryHistorico.FieldByName('HORA_HISTORICO').Value:= Time;
        qryHistorico.FieldByName('DESCRICAO').Value:= 'Cancelou a NF: ' + qryNF.FieldByName('NUMERO').AsString + ' da filial ' + qryNF.FieldByName('cod_filial').AsString;
        qryHistorico.Post;

        descricao_auditoria :=qryHistorico.FieldByName('DESCRICAO').AsString;
        GravaAuditoria(False,qryNF);
      end;  

   end;
   frmJustificativa.Destroy;
   qryNF.Refresh;
   
//   GeraValidaXML;
//   MudaNomeArquivo(NomeArquivoXML);
//   CancelaNF;
end;

procedure TfrmCancelamento_NF.btnPesquisaNFClick(Sender: TObject);
begin
  inherited;
   frmModeloPesquisa                    := TfrmModeloPesquisa.Create(Application);
   frmModeloPesquisa.Tabela             := qryNF;
   frmModeloPesquisa.lblTitulo.Caption  := 'Pesquisa NF';

   if frmModeloPesquisa.ShowModal = mrOk then
   begin
       qryNF.Locate('NUMERO',frmModeloPesquisa.TbPrincipal.FieldByName('NUMERO').AsString,[]);

{
    qryNF.Filtered:=False;
    qryNF.Filter:= ('NUMERO='+QuotedStr(frmModeloPesquisa.TbPrincipal.FieldByName('NUMERO').AsString));
    qryNF.Filtered:=True;}
   end;
   frmModeloPesquisa.Destroy;

   Screen.OnActiveControlChange         := TrocaCor;

end;

procedure TfrmCancelamento_NF.FormCreate(Sender: TObject);
begin
  inherited;
  DMNFE := TDMNFE.Create(Self);

  qryNF.Open;
  if not qryNF.Bof then
  begin
     qryNF.First;
     qryNF.Prior;
  end;
end;

procedure TfrmCancelamento_NF.GeraValidaXML;
begin
   frmNF := TfrmNF.Create(Application);
   frmNF.TbPrincipal.Filtered:=False;
   frmNF.TbPrincipal.Filter:='NUMERO='+QUotedStr(qryNF.FIeldbyName('NUMERO').AsString);
   frmNF.TbPrincipal.Filtered:=True;
   frmNF.AtualizaTela;
   frmNF.btnGerarXMLClick(self);
   frmNF.btnValidarClick(self);
   frmNF.Destroy;

end;

procedure TfrmCancelamento_NF.CancelaNF;
var
  idLote,vAux : String;
begin

     DMNFE.NFe.NotasFiscais.Clear;
     DMNFE.NFe.NotasFiscais.LoadFromFile(NomeArquivo_Cancelar);

    idLote := '1';
    vAux:=qryNF.FieldByName('MOTIVO_CANCELADO').AsString;

    DMNFE.NFe.EventoNFe.Evento.Clear;
    DMNFE.NFe.EventoNFe.idLote := StrToInt(idLote) ;
    with DMNFE.NFe.EventoNFe.Evento.Add do
    begin
{
    `infEvento.chNFe            := ChaveNFE;
     infEvento.CNPJ             := Cnpj;
}
     infEvento.dhEvento         := now;
     infEvento.tpEvento         := teCancelamento;
//     infEvento.detEvento.nProt  := Protocolo;
     infEvento.detEvento.xJust  := vAux;
    end;

// Enviar o evento de cancelamento
  if DMNFE.NFe.EnviarEvento(StrToInt(idLote)) then
  begin
    with DMNFE.NFe.WebServices.EnvEvento do
    begin
      if EventoRetorno.retEvento.Items[0].RetInfEvento.cStat <> 135 then
      begin
        raise Exception.CreateFmt(
          'Ocorreu o seguinte erro ao cancelar a nota fiscal eletrônica:'  + sLineBreak +
          'Código:%d' + sLineBreak +
          'Motivo: %s', [
            EventoRetorno.retEvento.Items[0].RetInfEvento.cStat,
            EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo
        ]);
      end;

  // retornos
{      DataHoraEvento  := EventoRetorno.retEvento.Items[0].RetInfEvento.dhRegEvento;
      NumeroProtocolo := EventoRetorno.retEvento.Items[0].RetInfEvento.nProt;
      XMLCancelamento := EventoRetorno.retEvento.Items[0].RetInfEvento.XML;
      CodigoStatus    := EventoRetorno.retEvento.Items[0].RetInfEvento.cStat;
      MotivoStatus    := EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo;}
    end;
  end
  else
  begin
    with DMNFE.NFe.WebServices.EnvEvento do
    begin
      raise Exception.Create(
        'Ocorreram erros ao tentar efetuar o cancelamento:' + sLineBreak +
        'Lote: '     + IntToStr(EventoRetorno.idLote) + sLineBreak +
        'Ambiente: ' + TpAmbToStr(EventoRetorno.tpAmb) + sLineBreak +
        'Orgao: '    + IntToStr(EventoRetorno.cOrgao) + sLineBreak +
        sLineBreak +
        'Status: '   + IntToStr(EventoRetorno.cStat) + sLineBreak +
        'Motivo: '   + EventoRetorno.xMotivo
      );
    end;
  end;

    //************************

    MemoResp.Lines.Text :=  UTF8Encode(DMNFE.NFe.WebServices.EnvEvento.RetWS);
//    memoRespWS.Lines.Text :=  UTF8Encode(DMNFE.NFe.WebServices.EnvEvento.RetornoWS);
    LoadXML(MemoResp, WBResposta);
    ShowMessage(IntToStr(DMNFE.NFe.WebServices.EnvEvento.cStat));
    ShowMessage(DMNFE.NFe.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.nProt);
end;


function TfrmCancelamento_NF.MudaNomeArquivo(NomeArquivo:String):String;
var caminho,arquivo:string;
begin
   qryNF.RefreshAll;
   arquivo:=PegaNomeArquivoNoCaminho(NomeArquivo);
   NomeArquivo_Cancelar:=PegaCaminhodoArquivo(NomeArquivo)+'CAN-'+Arquivo;
   RenameFile(NomeArquivo,NomeArquivo_Cancelar);
   Result:=NomeArquivo_Cancelar;
end;


procedure TfrmCancelamento_NF.LoadXML(MyMemo: TMemo; MyWebBrowser: TWebBrowser);
begin
  MyMemo.Lines.SaveToFile(ExtractFileDir(application.ExeName)+'\temp.xml');
  MyWebBrowser.Navigate(ExtractFileDir(application.ExeName)+'\temp.xml');
end;

procedure TfrmCancelamento_NF.dbNFExit(Sender: TObject);
begin
  inherited;
  qryNF.Filtered:=False;
  qryNF.Filter:= 'NUMERO='+QuotedStr(dbNF.Text);
  qryNF.Filtered:=True;
end;

procedure TfrmCancelamento_NF.btnVerificaWebServiceClick(Sender: TObject);
var Url : string;
begin
   Url := 'http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=resumo&tipoConteudo=d09fwabTnLk=';
   ShellExecute(0, 'open', PChar(Url), '', '', 1);
end;

procedure TfrmCancelamento_NF.btnVerificaTransmissaoClick(Sender: TObject);
var protocolo:string;
begin
  inherited;
   lblVerificarprotocolo.Caption := 'Verificando. Aguarde...';
   Application.ProcessMessages;
   DMNFE.NFe_Consulta_Protocolo(qryNF.FieldByName('NUMERO').AsInteger,protocolo);
   lblVerificarprotocolo.Caption := '';
   qryNF.RefreshRows;

end;

procedure TfrmCancelamento_NF.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  inherited;
  DMNFE.Destroy;
end;

procedure TfrmCancelamento_NF.btnTiraCanceladoClick(Sender: TObject);
begin
  inherited;
  if qryNF.FieldByName('PROTOCOLO_CANCELAMENTO').AsString <> '' then
    MessageDlg('Esta NF está cancelada.... consulte na internet', mtInformation, [mbOK], 0)
  else
  begin
    qryNF.Edit;
    qryNF.FieldByName('STATUS').Value               := 'A';
    qryNF.FieldByName('cancelado').Value            := null;
    qryNF.FieldByName('DATA_CANCELADO').Value       := null;
    qryNF.FieldByName('COD_USUARIO_CANCELADO').Value:= null;
    qryNF.FieldByName('MOTIVO_CANCELADO').Value     := null;
    qryNF.Post;
  end;  
end;

end.
