unit uView.Principal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, uClasse.Json.confirmacao,
  uClasse.Json.Recuperacao, ufuncional.gateway.sales, Vcl.Imaging.pngimage, Vcl.Menus, Vcl.AppEvnts;

type
  TForm1 = class(TForm)
    pbmFuncionalGatewaySales1: TpbmFuncionalGatewaySales;
    tmrAguardaRetorno: TTimer;
    editEnvio: TLabeledEdit;
    editResposta: TLabeledEdit;
    editIntervalo: TLabeledEdit;
    btnparar: TButton;
    btnIniciar: TButton;
    imgLogoTipo: TImage;
    Image1: TImage;
    TrayIcon1: TTrayIcon;
    ApplicationEvents1: TApplicationEvents;
    TimerTryIcon: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure editEnvioExit(Sender: TObject);
    procedure editRespostaExit(Sender: TObject);
    procedure editIntervaloExit(Sender: TObject);
    procedure btnIniciarClick(Sender: TObject);
    procedure btnpararClick(Sender: TObject);
    procedure tmrAguardaRetornoTimer(Sender: TObject);
    procedure pbmFuncionalGatewaySales1Resposta(pMensagemOperador: AnsiString; Funcao: TFuncionalTipoOperacao; RetornoOK: Boolean);
    procedure TrayIcon1DblClick(Sender: TObject);
    procedure ApplicationEvents1Minimize(Sender: TObject);
    procedure TimerTryIconTimer(Sender: TObject);
  private
    F_pCartao:      string;
    F_pData:        TDate;
    F_pAutorizacao: string;
    procedure Set_pAutorizacao(const Value: string);
    procedure Set_pCartao(const Value: string);
    procedure Set_pData(const Value: TDate);
    { Private declarations }
    property _pCartao: string read F_pCartao write Set_pCartao;
    property _pAutorizacao: string read F_pAutorizacao write Set_pAutorizacao;
    property _pData: TDate read F_pData write Set_pData;

    procedure GravarINI(aArquivo, aTexto, aSessao, aTag: string);
    function LerINI(aArquivo, aSessao, aTag: string): string;
    function getRecuperaAutorizacao(): Boolean;
    function getConfirmaAutorizacao(): Boolean;
    procedure setConfiguraComponente(sTipo:String);
    procedure setGeraArquivoErro(sResposta: TStringList; sTipo: string; pMensagemOperador: AnsiString);
    procedure setGeraArquivoResposta(sResposta: TStringList);

  public
    { Public declarations }
  end;

var
  Form1:   TForm1;
  aConfig: string;
  bAbortar:boolean;

implementation

uses System.IniFiles;

{$R *.dfm}

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
  Self.Hide();
  Self.WindowState := wsMinimized;
  TrayIcon1.Visible := True;
  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;
end;

procedure TForm1.btnIniciarClick(Sender: TObject);
begin
  btnIniciar.Enabled         := False;
  btnparar.Enabled           := False;
  tmrAguardaRetorno.Interval := StrToIntDef(editIntervalo.Text, 300);
  tmrAguardaRetorno.Enabled  := True;
end;

procedure TForm1.btnpararClick(Sender: TObject);
begin
  btnparar.Enabled          := False;
  tmrAguardaRetorno.Enabled := False;
  btnIniciar.Enabled        := True;
end;

procedure TForm1.editEnvioExit(Sender: TObject);
begin
  GravarINI(aConfig, editEnvio.Text, 'AMBIENTE', 'ArqEnvio');
end;

procedure TForm1.editIntervaloExit(Sender: TObject);
begin
  GravarINI(aConfig, editIntervalo.Text, 'AMBIENTE', 'Intervalo');
end;

procedure TForm1.editRespostaExit(Sender: TObject);
begin
  GravarINI(aConfig, editResposta.Text, 'AMBIENTE', 'ArqResposta');
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  GravarINI(aConfig, editEnvio.Text, 'AMBIENTE', 'ArqEnvio');
  GravarINI(aConfig, editResposta.Text, 'AMBIENTE', 'ArqResposta');
  GravarINI(aConfig, editIntervalo.Text, 'AMBIENTE', 'Intervalo');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bAbortar := False;
  aConfig := ChangeFileExt(ParamStr(0), '.ini');

  if not FileExists(aConfig) then
  begin

    editEnvio.Text     := GetCurrentDir + '\funcEnvio.txt';
    editResposta.Text  := GetCurrentDir + '\funcResposta.txt';
    editIntervalo.Text := '300';

    GravarINI(aConfig, editEnvio.Text, 'AMBIENTE', 'ArqEnvio');
    GravarINI(aConfig, editResposta.Text, 'AMBIENTE', 'ArqResposta');
    GravarINI(aConfig, editIntervalo.Text, 'AMBIENTE', 'Intervalo');
    GravarINI(aConfig, '', 'TOKEN', 'Token');
    GravarINI(aConfig, DateTimeToStr(now - 1), 'TOKEN', 'Expira');
  end;

  editEnvio.Text             := LerINI(aConfig, 'AMBIENTE', 'ArqEnvio');
  editResposta.Text          := LerINI(aConfig, 'AMBIENTE', 'ArqResposta');
  editIntervalo.Text         := LerINI(aConfig, 'AMBIENTE', 'Intervalo');
  tmrAguardaRetorno.Interval := StrToIntDef(editIntervalo.Text, 300);

  pbmFuncionalGatewaySales1.Identificacao.Token := LerINI(aConfig, 'TOKEN', 'Token');

  btnIniciar.Enabled := False;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  tmrAguardaRetorno.Enabled := True;
end;

procedure TForm1.setConfiguraComponente(sTipo:String);
begin
    pbmFuncionalGatewaySales1.Identificacao.loja_CNPJ   := LerINI(editEnvio.Text, sTipo, 'CNPJ');
    pbmFuncionalGatewaySales1.Identificacao.login_Nome  := LerINI(editEnvio.Text, sTipo, 'LOGIN');
    pbmFuncionalGatewaySales1.Identificacao.login_Senha := LerINI(editEnvio.Text, sTipo, 'SENHA');
    if LerINI(editEnvio.Text, sTipo, 'AMBIENTE') = '0' then
      pbmFuncionalGatewaySales1.Identificacao.Ambiente := ambHomologacao
    else
      pbmFuncionalGatewaySales1.Identificacao.Ambiente := ambProducao;

    // Token expirou pego um novo
    
    if now > StrToDateTimeDef(LerINI(aConfig, 'TOKEN', 'Expira'), now - 1) then
    begin
      try
        pbmFuncionalGatewaySales1.Autenticacao;
      except
       //raise Exception.Create('Error Message');
      end;

      while not bAbortar do
      begin
        Sleep(500);
      end;
      bAbortar := False;
    end;

    pbmFuncionalGatewaySales1.Identificacao.Token := LerINI(aConfig, 'TOKEN', 'Token');

end;

procedure TForm1.setGeraArquivoErro(sResposta: TStringList; sTipo: string; pMensagemOperador: AnsiString);
begin
  bAbortar := True;
  sResposta.Add('[' + sTipo + ']');
  sResposta.Add('CNPJ=' + pbmFuncionalGatewaySales1.Identificacao.loja_CNPJ);
  sResposta.Add('LOGIN=' + pbmFuncionalGatewaySales1.Identificacao.login_Nome);
  sResposta.Add('SENHA=' + pbmFuncionalGatewaySales1.Identificacao.login_Senha);
  sResposta.Add('CARTAO=' + F_pCartao);
  sResposta.Add('AUTORIZACAOID=' + F_pAutorizacao);
  sResposta.Add('DATA=' + DateToStr(F_pData));
  sResposta.Add('MENSAGEMOPERADOR=' + pMensagemOperador);
  sResposta.SaveToFile('.\temp.txt');
  CopyFile('.\temp.txt', pWideChar(editResposta.Text), False);
  DeleteFile('.\temp.txt');
end;

procedure TForm1.setGeraArquivoResposta(sResposta: TStringList);
begin
  sResposta.SaveToFile('.\temp.txt');
  CopyFile('.\temp.txt', pWideChar(editResposta.Text), True);
  DeleteFile('.\temp.txt');
end;

procedure TForm1.Set_pAutorizacao(const Value: string);
begin
  F_pAutorizacao := Value;
end;

procedure TForm1.Set_pCartao(const Value: string);
begin
  F_pCartao := Value;
end;

procedure TForm1.Set_pData(const Value: TDate);
begin
  F_pData := Value;
end;

procedure TForm1.TimerTryIconTimer(Sender: TObject);
begin
   TimerTryIcon.Enabled := False;
   ApplicationEvents1Minimize(Self);
end;

function TForm1.getRecuperaAutorizacao: Boolean;
begin

  pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Clear;

  tmrAguardaRetorno.Enabled := False;
  F_pCartao      := LerINI(editEnvio.Text, 'RECUPERACAO', 'CARTAO');
  F_pAutorizacao := LerINI(editEnvio.Text, 'RECUPERACAO', 'AUTORIZACAOID');
  F_pData        := strToDate(LerINI(editEnvio.Text, 'RECUPERACAO', 'DATA'));

  tmrAguardaRetorno.Enabled := False;
  setConfiguraComponente('RECUPERACAO');
  DeleteFile(editEnvio.Text);
  pbmFuncionalGatewaySales1.RecuperaAutorizacao(F_pCartao, F_pAutorizacao, F_pData);

end;

function TForm1.getConfirmaAutorizacao: Boolean;
  var
  sArq:TStringList;
begin
  tmrAguardaRetorno.Enabled := False;
  F_pCartao      := LerINI(editEnvio.Text, 'CONFIRMACAO', 'CARTAO');
  F_pAutorizacao := LerINI(editEnvio.Text, 'CONFIRMACAO', 'AUTORIZACAOID');
  F_pData        := strToDate(LerINI(editEnvio.Text, 'CONFIRMACAO', 'DATA'));

  tmrAguardaRetorno.Enabled := False;
  setConfiguraComponente('CONFIRMACAO');
  DeleteFile(editEnvio.Text);
  if pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Count <= 0 then
  begin
    sArq := TStringList.Create;
    setGeraArquivoErro(sArq, 'CONFIRMACAO','Não há produtos para serem confirmados, faça nova recuperação!');
    tmrAguardaRetorno.Enabled := True;
    Exit;
  end;

  pbmFuncionalGatewaySales1.ConfirmaAutorizacao(F_pCartao, F_pAutorizacao, F_pData);
end;

procedure TForm1.GravarINI(aArquivo, aTexto, aSessao, aTag: string);
var
  ArqIni: TIniFile;
begin

  ArqIni := TIniFile.Create(aArquivo);
  try
    ArqIni.WriteString(aSessao, aTag, aTexto);
  finally
    ArqIni.Free;

  end;
end;

function TForm1.LerINI(aArquivo, aSessao, aTag: string): string;
var
  ArqIni: TIniFile;
begin

  ArqIni := TIniFile.Create(aArquivo);
  try
    Result := ArqIni.ReadString(aSessao, aTag, '');
  finally
    ArqIni.Free;
  end;

end;

procedure TForm1.pbmFuncionalGatewaySales1Resposta(pMensagemOperador: AnsiString; Funcao: TFuncionalTipoOperacao; RetornoOK: Boolean);
var
  i, iReceitas, iReceita: integer;
  sTipo:        string;
  sResposta:    TStringList;
begin

  try
    sResposta := TStringList.Create;
    case Funcao of
      fncAutenticacao:
        sTipo := 'AUTENTICACAO';
      fncRecuperacao:
        sTipo := 'RECUPERACAO';
      fncConfirmacao:
        sTipo := 'CONFIRMACAO';
    end;

    if pMensagemOperador <> '' then
    begin
      setGeraArquivoErro(sResposta, sTipo, pMensagemOperador);
      tmrAguardaRetorno.Enabled := True;
      DeleteFile(editEnvio.Text);
      sResposta.Free;
      Exit;
    end;

    if Funcao = fncAutenticacao then
    begin
      bAbortar := True;
      GravarINI(aConfig, pbmFuncionalGatewaySales1.Identificacao.Token, 'TOKEN', 'Token');
      GravarINI(aConfig, DateTimeToStr(now + 1), 'TOKEN', 'Expira');
    end;

    if Funcao = fncRecuperacao then
    begin

      try
        sResposta.Add('[AUTORIZACAO]');
        sResposta.Add('CNPJ=' + pbmFuncionalGatewaySales1.Identificacao.loja_CNPJ);
        sResposta.Add('LOGIN=' + pbmFuncionalGatewaySales1.Identificacao.login_Nome);
        sResposta.Add('SENHA=' + pbmFuncionalGatewaySales1.Identificacao.login_Senha);
        sResposta.Add('DATA=' + FormatDateTime('dd/mm/yyyy hh:mm:ss', pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.CreatedAt));
        sResposta.Add('AUTORIZACAOID=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.AuthorizationID.ToString());
        sResposta.Add('VALORTOTAL=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.TotalValue.ToString);
        sResposta.Add('PAGAMENTOAVISTA=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.MoneyPaidValue.ToString);
        sResposta.Add('PAGAMENTOCARTAOOUTRO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.CardPaidValue.ToString);
        sResposta.Add('TOTALPRODUTOS='+IntToStr(pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Count) );
        sResposta.Add('TOTALRECEITAS=0');

        // percorrendo os prodrutos

        iReceitas := 0;
        iReceita  := -1;
        for i     := 0 to pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Count - 1 do
        begin
          sResposta.Add('[PRODUTO'+IntToStr(I)+']');
          sResposta.Add('EAN=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].Ean);
          sResposta.Add('DESCRICAO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].Description);
          sResposta.Add('PMC=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MaxConsumerPrice.ToString);
          sResposta.Add('PRECOUNITARIO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].UnitPrice.ToString);
          sResposta.Add('QUANTIDADE=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].Quantity.ToString);


          try
            if pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Quantity>0 then
              inc(iReceitas);
          except
          end;

        end;

        if iReceitas > 0 then
        begin
          //iReceita := iReceitas;
          for i := 0 to pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Count - 1 do
          begin
            try
              if pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Quantity > 0 then
              begin
                inc(iReceita);
                sResposta.Add('[RECEITA'+IntToStr(iReceita)+']');
                sResposta.Add('DATA=' + DateToStr(pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Date));
                sResposta.Add('QUANTIDADE=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Quantity.ToString);
                sResposta.Add('CONSELHO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Prescriber.Council);
                sResposta.Add('REGISTRO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Prescriber.RegisterNumber.ToString);
                sResposta.Add('UFCONSELHO=' + pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Items[i].MedicalPrescription.Prescriber.StateAbbr);
              end;
            except

            end;
          end;
        end;


      finally
        DeleteFile(editEnvio.Text);
        sResposta.SaveToFile('.\temp.txt');
        Sleep(500);
        GravarINI('.\temp.txt', IntToStr(iReceitas), 'AUTORIZACAO', 'TOTALRECEITAS');
        Sleep(500);
        CopyFile('.\temp.txt', pWideChar(editResposta.Text), True);
        while not FileExists(editResposta.Text) do
          Sleep(1000);

        DeleteFile('.\temp.txt');
        sResposta.Free;

        tmrAguardaRetorno.Enabled := True;
      end;

    end;

    if Funcao = fncConfirmacao then
    begin

      try
        sResposta.Add('[CONFIRMACAO]');
        sResposta.Add('CNPJ=' + pbmFuncionalGatewaySales1.Identificacao.loja_CNPJ);
        sResposta.Add('LOGIN=' + pbmFuncionalGatewaySales1.Identificacao.login_Nome);
        sResposta.Add('SENHA=' + pbmFuncionalGatewaySales1.Identificacao.login_Senha);
        sResposta.Add('AUTORIZACAOID=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.AuthorizationID.ToString);
        sResposta.Add('CARDBALANCE=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.CardBalance.ToString);
        sResposta.Add('CARDPAIDVALUE=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.CardPaidValue.ToString);
        sResposta.Add('PAGAMENTOAVISTA=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.MoneyPaidValue.ToString);
        sResposta.Add('DATAVENDA=' + FormatDateTime('dd/mm/yy hh:mm:ss',pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.CreatedAt));
        sResposta.Add('VALORTOTAL=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.TotalValue.ToString);
        sResposta.Add('STATUS=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Status);
        sResposta.Add('STATUSCODE=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.StatusCode.ToString);
        sResposta.Add('STATUSMENSAGEM=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.StatusMessage);
        sResposta.Add('TOTALPRODUTOS='+IntToStr(pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Products.Count) );
        sResposta.Add('RECIBO='+pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Receipt);

        // percorrendo os prodrutos
        for i := 0 to pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Products.Count - 1 do
        begin
          sResposta.Add('[PRODUTO'+IntToStr(I)+']');
          sResposta.Add('EAN=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Products.Items[i].Ean);
          sResposta.Add('DESCRICAO=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Products.Items[i].Description);
          sResposta.Add('QUANTIDADE=' + pbmFuncionalGatewaySales1.confirmacao.Data.Sales_ConfirmPreAuthorizedSale.Products.Items[i].Quantity.ToString);
        end;

      finally
        DeleteFile(editEnvio.Text);
        sResposta.SaveToFile('.\temp.txt');
        CopyFile('.\temp.txt', pWideChar(editResposta.Text), True);
        while not FileExists(editResposta.Text) do
          Sleep(1000);

        DeleteFile('.\temp.txt');
        sResposta.Free;
        pbmFuncionalGatewaySales1.Autorizacao.Data.Sales_Transaction.Products.Clear;
        tmrAguardaRetorno.Enabled := True;
      end;

    end;

  Except
    sResposta.Free;
    if not tmrAguardaRetorno.Enabled then
      tmrAguardaRetorno.Enabled := True;

  end;
end;

procedure TForm1.tmrAguardaRetornoTimer(Sender: TObject);
begin
  if FileExists(editEnvio.Text) then
  begin
    if LerINI(editEnvio.Text, 'RECUPERACAO', 'CNPJ') <> '' then
      getRecuperaAutorizacao;

    if LerINI(editEnvio.Text, 'CONFIRMACAO', 'CNPJ') <> '' then
      getConfirmaAutorizacao;

  end;
end;

procedure TForm1.TrayIcon1DblClick(Sender: TObject);
begin
  TrayIcon1.Visible := False;
  Show();
  WindowState := wsNormal;
  Application.BringToFront();
end;

end.
