/PAF-ECF/UEfetuaPagamento.pas

http://t2ti-erp-delphi.googlecode.com/ · Pascal · 886 lines · 688 code · 106 blank · 92 comment · 51 complexity · 76999e18c699a188e3db96a73860350c MD5 · raw file

  1. {*******************************************************************************
  2. Title: T2Ti ERP
  3. Description: Ao finalizar a venda, deve-se informar os meios de pagamento
  4. utilizados.
  5. The MIT License
  6. Copyright: Copyright (C) 2010 T2Ti.COM
  7. Permission is hereby granted, free of charge, to any person
  8. obtaining a copy of this software and associated documentation
  9. files (the "Software"), to deal in the Software without
  10. restriction, including without limitation the rights to use,
  11. copy, modify, merge, publish, distribute, sublicense, and/or sell
  12. copies of the Software, and to permit persons to whom the
  13. Software is furnished to do so, subject to the following
  14. conditions:
  15. The above copyright notice and this permission notice shall be
  16. included in all copies or substantial portions of the Software.
  17. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. OTHER DEALINGS IN THE SOFTWARE.
  25. The author may be contacted at:
  26. t2ti.com@gmail.com</p>
  27. @author Albert Eije (T2Ti.COM)
  28. @version 1.0
  29. *******************************************************************************}
  30. {*******************************************************************************
  31. Opera??es TEF Discado:
  32. ATV Verifica se o Gerenciador Padr?o est? ativo
  33. ADM Permite o acionamento da Solu??o TEF Discado para execu??o das fun??es administrativas
  34. CHQ Pedido de autoriza??o para transa??o por meio de cheque
  35. CRT Pedido de autoriza??o para transa??o por meio de cart?o
  36. CNC Cancelamento de venda efetuada por qualquer meio de pagamento
  37. CNF Confirma??o da venda e impress?o de cupom
  38. NCN N?o confirma??o da venda e/ou da impress?o.
  39. *******************************************************************************}
  40. unit UEfetuaPagamento;
  41. interface
  42. uses
  43. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  44. Dialogs, Grids, DBGrids, JvExDBGrids, JvDBGrid, StdCtrls, JvExStdCtrls,
  45. JvButton, JvCtrls, Buttons, JvExButtons, JvBitBtn, pngimage, ExtCtrls, Mask,
  46. JvEdit, JvValidateEdit, JvExForms, JvScrollBox, Generics.Collections, Biblioteca,
  47. JvExControls, JvEnterTab, DB, DBClient, UECF, ACBrTEFD, ACBrTEFDClass,
  48. TotalTipoPagamentoVO, TipoPagamentoVO, JvCombobox, JvExMask, JvToolEdit, Constantes,
  49. ACBrDevice, ACBrBase, ACBrECF, ACBrUtil, dateutils;
  50. type
  51. TFEfetuaPagamento = class(TForm)
  52. Image1: TImage;
  53. GroupBox1: TGroupBox;
  54. JvScrollBox1: TJvScrollBox;
  55. botaoConfirma: TJvBitBtn;
  56. GroupBox2: TGroupBox;
  57. labelDescricaoTotalVenda: TLabel;
  58. labelTotalVenda: TLabel;
  59. Bevel1: TBevel;
  60. labelDescricaoDesconto: TLabel;
  61. Bevel2: TBevel;
  62. labelDesconto: TLabel;
  63. labelDescricaoAcrescimo: TLabel;
  64. Bevel3: TBevel;
  65. labelAcrescimo: TLabel;
  66. labelTotalReceber: TLabel;
  67. Bevel4: TBevel;
  68. labelDescricaoTotalReceber: TLabel;
  69. labelTotalRecebido: TLabel;
  70. Bevel5: TBevel;
  71. labelDescricaoTotalRecebido: TLabel;
  72. labelTroco: TLabel;
  73. Bevel6: TBevel;
  74. labelDescricaoTroco: TLabel;
  75. PanelConfirmaValores: TPanel;
  76. LabelConfirmaValores: TLabel;
  77. botaoNao: TBitBtn;
  78. botaoSim: TBitBtn;
  79. JvEnterAsTab1: TJvEnterAsTab;
  80. GridValores: TJvDBGrid;
  81. CDSValores: TClientDataSet;
  82. DSValores: TDataSource;
  83. GroupBox3: TGroupBox;
  84. ComboTipoPagamento: TComboBox;
  85. EditValorPago: TJvValidateEdit;
  86. BotaoCancela: TJvBitBtn;
  87. labelDescricaoAindaFalta: TLabel;
  88. labelAindaFalta: TLabel;
  89. Bevel7: TBevel;
  90. Label1: TLabel;
  91. ACBrTEFD: TACBrTEFD;
  92. Label2: TLabel;
  93. procedure FechamentoRapido;
  94. procedure TelaPadrao;
  95. procedure FechaVendaComProblemas;
  96. procedure OrdenaLista;
  97. procedure GravaR06;
  98. procedure SubTotalizaCupom;
  99. procedure FormActivate(Sender: TObject);
  100. procedure botaoConfirmaClick(Sender: TObject);
  101. procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  102. procedure botaoSimClick(Sender: TObject);
  103. procedure botaoNaoClick(Sender: TObject);
  104. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  105. procedure EditValorPagoExit(Sender: TObject);
  106. procedure VerificaSaldoRestante;
  107. procedure FinalizaVenda;
  108. procedure AtualizaLabelsValores;
  109. procedure CancelaOperacao;
  110. procedure BotaoCancelaClick(Sender: TObject);
  111. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  112. procedure GridValoresKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  113. procedure ACBrTEFDAguardaResp(Arquivo: string; SegundosTimeOut: Integer; var Interromper: Boolean);
  114. procedure ACBrTEFDAntesCancelarTransacao(RespostaPendente: TACBrTEFDResp);
  115. procedure ACBrTEFDAntesFinalizarRequisicao(Req: TACBrTEFDReq);
  116. procedure ACBrTEFDBloqueiaMouseTeclado(Bloqueia: Boolean; var Tratado: Boolean);
  117. procedure ACBrTEFDComandaECF(Operacao: TACBrTEFDOperacaoECF; Resp: TACBrTEFDResp; var RetornoECF: Integer);
  118. procedure ACBrTEFDComandaECFAbreVinculado(COO, IndiceECF: string; Valor: Double; var RetornoECF: Integer);
  119. procedure ACBrTEFDComandaECFImprimeVia(TipoRelatorio: TACBrTEFDTipoRelatorio; Via: Integer; ImagemComprovante: TStringList; var RetornoECF: Integer);
  120. procedure ACBrTEFDComandaECFPagamento(IndiceECF: string; Valor: Double; var RetornoECF: Integer);
  121. procedure ACBrTEFDExibeMsg(Operacao: TACBrTEFDOperacaoMensagem; Mensagem: string; var AModalResult: TModalResult);
  122. procedure ACBrTEFDInfoECF(Operacao: TACBrTEFDInfoECF; var RetornoECF: string);
  123. procedure ACBrTEFDRestauraFocoAplicacao(var Tratado: Boolean);
  124. private
  125. { Private declarations }
  126. public
  127. IdVenda: Integer;
  128. { Public declarations }
  129. end;
  130. var
  131. FEfetuaPagamento: TFEfetuaPagamento;
  132. ListaTipoPagamento: TObjectList<TTipoPagamentoVO>;
  133. ListaTotalTipoPagamento: TObjectList<TTotalTipoPagamentoVO>;
  134. SaldoRestante, TotalVenda, Desconto, Acrescimo, TotalReceber, TotalRecebido, ValorDinheiro, Troco: Extended;
  135. StatusPagamento: Integer; // 0-em andamento | 1-finalizado
  136. TransacaoComTef, ImpressaoOK, CupomCancelado, PodeFechar, StatusTransacao: Boolean;
  137. IndiceTransacaoTef: Integer;
  138. implementation
  139. uses UDataModule, TipoPagamentoController, UCaixa, TotalTipoPagamentoController, R06VO, RegistroRController;
  140. {$R *.dfm}
  141. procedure TFEfetuaPagamento.FormActivate(Sender: TObject);
  142. begin
  143. TotalVenda := 0;
  144. Desconto := 0;
  145. Acrescimo := 0;
  146. TotalReceber := 0;
  147. TotalRecebido := 0;
  148. ValorDinheiro := 0;
  149. Troco := 0;
  150. StatusPagamento := 0;
  151. Color := StringToColor(UCaixa.Configuracao.CorJanelasInternas);
  152. if UCaixa.VendaCabecalho.TaxaAcrescimo > 0 then
  153. UCaixa.VendaCabecalho.Acrescimo := TruncaValor(UCaixa.VendaCabecalho.TaxaAcrescimo/100*UCaixa.VendaCabecalho.ValorVenda,Constantes.TConstantes.DECIMAIS_VALOR);
  154. if UCaixa.VendaCabecalho.TaxaDesconto > 0 then
  155. UCaixa.VendaCabecalho.Desconto := TruncaValor(UCaixa.VendaCabecalho.TaxaDesconto/100*UCaixa.VendaCabecalho.ValorVenda,Constantes.TConstantes.DECIMAIS_VALOR);
  156. //preenche valores nas variaveis
  157. TotalVenda := UCaixa.VendaCabecalho.ValorVenda;
  158. Acrescimo := UCaixa.VendaCabecalho.Acrescimo;
  159. Desconto := UCaixa.VendaCabecalho.Desconto;
  160. TotalReceber := TruncaValor(TotalVenda + Acrescimo - Desconto,Constantes.TConstantes.DECIMAIS_VALOR);
  161. SaldoRestante := TotalReceber;
  162. TransacaoComTef := False;
  163. CupomCancelado := False;
  164. PodeFechar := True;
  165. IndiceTransacaoTef := -1;
  166. AtualizaLabelsValores;
  167. EditValorPago.Text := FormatFloat('0.00',SaldoRestante);
  168. IdVenda := UCaixa.VendaCabecalho.Id;
  169. ComboTipoPagamento.SetFocus;
  170. //lista que vai acumular os meios de pagamento
  171. ListaTotalTipoPagamento := TObjectList<TTotalTipoPagamentoVO>.Create(True);
  172. //tela padr?o
  173. TelaPadrao;
  174. end;
  175. procedure TFEfetuaPagamento.AtualizaLabelsValores;
  176. begin
  177. labelTotalVenda.Caption := FormatFloat('#,###,###,##0.00', TotalVenda);
  178. labelAcrescimo.Caption := FormatFloat('#,###,###,##0.00', Acrescimo);
  179. labelDesconto.Caption := FormatFloat('#,###,###,##0.00', Desconto);
  180. labelTotalReceber.Caption := FormatFloat('#,###,###,##0.00', TotalReceber);
  181. labelTotalRecebido.Caption := FormatFloat('#,###,###,##0.00', TotalRecebido);
  182. if SaldoRestante > 0 then
  183. labelAindaFalta.Caption := FormatFloat('#,###,###,##0.00', SaldoRestante)
  184. else
  185. labelAindaFalta.Caption := FormatFloat('#,###,###,##0.00', 0);
  186. labelTroco.Caption := FormatFloat('#,###,###,##0.00', Troco);
  187. end;
  188. procedure TFEfetuaPagamento.FormClose(Sender: TObject; var Action: TCloseAction);
  189. begin
  190. CDSValores.Close;
  191. Action := caFree;
  192. end;
  193. procedure TFEfetuaPagamento.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  194. begin
  195. CanClose := PodeFechar;
  196. end;
  197. procedure TFEfetuaPagamento.TelaPadrao;
  198. var
  199. i: Integer;
  200. begin
  201. ListaTipoPagamento := TTipoPagamentoController.TabelaTipoPagamento;
  202. for i := 0 to ListaTipoPagamento.Count - 1 do
  203. ComboTipoPagamento.Items.Add(TTipoPagamentoVO(ListaTipoPagamento.Items[i]).Descricao);
  204. ComboTipoPagamento.ItemIndex := 0;
  205. //configura ClientDataset
  206. CDSValores.Close;
  207. CDSValores.FieldDefs.Clear;
  208. CDSValores.FieldDefs.add('DESCRICAO', ftString, 20);
  209. CDSValores.FieldDefs.add('VALOR', ftFloat);
  210. CDSValores.FieldDefs.add('ID', ftInteger);
  211. //os campos abaixo ser?o utilizados caso seja necessario cancelar uma transacao TEF
  212. CDSValores.FieldDefs.add('TEF', ftString, 1);
  213. CDSValores.FieldDefs.add('NSU', ftString, 50);
  214. CDSValores.FieldDefs.add('REDE', ftString, 50);
  215. CDSValores.FieldDefs.add('DATA_HORA_TRANSACAO', ftString, 50);
  216. CDSValores.FieldDefs.add('INDICE_TRANSACAO', ftInteger);
  217. CDSValores.FieldDefs.add('INDICE_LISTA', ftInteger);
  218. CDSValores.FieldDefs.add('FINALIZACAO', ftString, 30);
  219. CDSValores.CreateDataSet;
  220. TFloatField(CDSValores.FieldByName('VALOR')).displayFormat:='#,###,###,##0.00';
  221. //definimos os cabe?alhos da Grid
  222. GridValores.Columns[0].Title.Caption := 'Descri??o';
  223. GridValores.Columns[0].Width := 130;
  224. GridValores.Columns[1].Title.Caption := 'Valor';
  225. //nao exibe as colunas abaixo
  226. GridValores.Columns.Items[2].Visible := False;
  227. GridValores.Columns.Items[3].Visible := False;
  228. GridValores.Columns.Items[4].Visible := False;
  229. GridValores.Columns.Items[5].Visible := False;
  230. GridValores.Columns.Items[6].Visible := False;
  231. GridValores.Columns.Items[7].Visible := False;
  232. GridValores.Columns.Items[8].Visible := False;
  233. GridValores.Columns.Items[9].Visible := False;
  234. end;
  235. procedure TFEfetuaPagamento.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  236. begin
  237. if key = 113 then
  238. begin
  239. if CDSValores.RecordCount = 0 then
  240. begin
  241. if Application.MessageBox('Confirma valores e encerra venda por fechamento r?pido?', 'Finalizar venda', Mb_YesNo + Mb_IconQuestion) = IdYes then
  242. begin
  243. FechamentoRapido;
  244. end;
  245. end
  246. else
  247. begin
  248. Application.MessageBox('J? existem valores informados. Imposs?vel utilizar Fechamento R?pido.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  249. ComboTipoPagamento.SetFocus;
  250. end;
  251. end;
  252. if key = 123 then
  253. botaoConfirma.Click;
  254. if key = 27 then
  255. BotaoCancela.Click;
  256. if key = 116 then
  257. begin
  258. if CDSValores.RecordCount > 0 then
  259. GridValores.SetFocus
  260. else
  261. begin
  262. Application.MessageBox('N?o existem valores informados para serem removidos.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  263. ComboTipoPagamento.SetFocus;
  264. end;
  265. end;
  266. end;
  267. procedure TFEfetuaPagamento.FechamentoRapido;
  268. begin
  269. StatusTransacao := True;
  270. botaoSim.Click;
  271. if StatusTransacao then
  272. FinalizaVenda;
  273. end;
  274. //controle das teclas digitadas na Grid
  275. procedure TFEfetuaPagamento.GridValoresKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  276. begin
  277. if key = VK_DELETE then
  278. begin
  279. if CDSValores.FieldByName('TEF').AsString = 'S' then
  280. Application.MessageBox('Opera??o n?o permitida.', 'Informa??o do Sistema', Mb_OK + MB_ICONINFORMATION)
  281. else
  282. begin
  283. if Application.MessageBox('Deseja remover o valor selecionado?', 'Remover ', Mb_YesNo + Mb_IconQuestion) = IdYes then
  284. begin
  285. TotalRecebido := TruncaValor(TotalRecebido - CDSValores.FieldByName('VALOR').AsFloat,Constantes.TConstantes.DECIMAIS_VALOR);
  286. Troco := TruncaValor(TotalRecebido - TotalReceber,Constantes.TConstantes.DECIMAIS_VALOR);
  287. if Troco < 0 then
  288. Troco := 0;
  289. ListaTotalTipoPagamento.Delete(CDSValores.FieldByName('INDICE_LISTA').AsInteger);
  290. CDSValores.Delete;
  291. VerificaSaldoRestante;
  292. EditValorPago.Text := FormatFloat('0.00',SaldoRestante);
  293. end;
  294. ComboTipoPagamento.SetFocus;
  295. end;
  296. end;
  297. if key = 13 then
  298. ComboTipoPagamento.SetFocus;
  299. end;
  300. procedure TFEfetuaPagamento.BotaoCancelaClick(Sender: TObject);
  301. begin
  302. CancelaOperacao;
  303. end;
  304. procedure TFEfetuaPagamento.botaoConfirmaClick(Sender: TObject);
  305. begin
  306. VerificaSaldoRestante;
  307. //se n?o houver mais saldo no ECF ? porque j? devemos finalizar a venda
  308. if SaldoRestante <= 0 then
  309. begin
  310. if Application.MessageBox('Deseja finalizar a venda?', 'Finalizar venda', Mb_YesNo + Mb_IconQuestion) = IdYes then
  311. begin
  312. FinalizaVenda;
  313. end
  314. end
  315. else
  316. begin
  317. Application.MessageBox('Valores informados n?o s?o suficientes para finalizar a venda.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  318. ComboTipoPagamento.SetFocus;
  319. end;
  320. end;
  321. procedure TFEfetuaPagamento.EditValorPagoExit(Sender: TObject);
  322. begin
  323. if EditValorPago.Value > 0 then
  324. begin
  325. VerificaSaldoRestante;
  326. //se ainda tem saldo no ECF para pagamento
  327. if SaldoRestante > 0 then
  328. begin
  329. PanelConfirmaValores.Visible := True;
  330. PanelConfirmaValores.BringToFront;
  331. LabelConfirmaValores.Caption := 'Confirma forma de pagamento e valor?';
  332. BotaoSim.SetFocus;
  333. end
  334. else
  335. Application.MessageBox('Todos os valores j? foram recebidos. Finalize a venda.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  336. end
  337. else
  338. begin
  339. Application.MessageBox('Valor n?o pode ser menor ou igual a zero.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  340. ComboTipoPagamento.SetFocus;
  341. end;
  342. end;
  343. procedure TFEfetuaPagamento.VerificaSaldoRestante;
  344. var
  345. RecebidoAteAgora: Extended;
  346. begin
  347. RecebidoAteAgora := 0;
  348. CDSValores.DisableControls;
  349. CDSValores.First;
  350. while Not CDSValores.Eof do
  351. begin
  352. RecebidoAteAgora := TruncaValor(RecebidoAteAgora + CDSValores.FieldByName('VALOR').AsFloat, Constantes.TConstantes.DECIMAIS_VALOR);
  353. CDSValores.Next;
  354. end;
  355. CDSValores.EnableControls;
  356. SaldoRestante := TruncaValor(TotalReceber - RecebidoAteAgora, Constantes.TConstantes.DECIMAIS_VALOR);
  357. AtualizaLabelsValores;
  358. end;
  359. procedure TFEfetuaPagamento.botaoNaoClick(Sender: TObject);
  360. var
  361. i:integer;
  362. begin
  363. PanelConfirmaValores.Visible := False;
  364. ComboTipoPagamento.SetFocus;
  365. end;
  366. procedure TFEfetuaPagamento.botaoSimClick(Sender: TObject);
  367. Var
  368. TipoPagamento : TTipoPagamentoVO;
  369. TotalTipoPagamento: TTotalTipoPagamentoVO;
  370. TotalTipoPagamentoControl: TTotalTipoPagamentoController;
  371. ValorInformado: Extended;
  372. begin
  373. TipoPagamento := TTipoPagamentoVO(ListaTipoPagamento.Items[ComboTipoPagamento.ItemIndex]);
  374. ValorInformado := TruncaValor(EditValorPago.Value,Constantes.TConstantes.DECIMAIS_VALOR);
  375. TotalTipoPagamento := TTotalTipoPagamentoVO.Create;
  376. if ((TipoPagamento.TEF = 'S') or (TipoPagamento.PermiteTroco = 'N')) and (ValorInformado > SaldoRestante) then
  377. begin
  378. Application.MessageBox('Forma de pagamento selecionada n?o permite troco.', 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  379. ComboTipoPagamento.SetFocus;
  380. end
  381. else
  382. begin
  383. StatusTransacao := True;
  384. if TipoPagamento.TEF = 'S' then
  385. begin
  386. try
  387. ACBrTEFD.Inicializar(TACBrTEFDTipo(1));
  388. StatusTransacao := ACBrTEFD.CRT( ValorInformado, TipoPagamento.Codigo, FDataModule.ACBrECF.NumCOO);
  389. if StatusTransacao then
  390. begin
  391. Inc(IndiceTransacaoTef);
  392. TotalTipoPagamento.NSU := ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].NSU;
  393. TotalTipoPagamento.Rede := ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].Rede;
  394. TotalTipoPagamento.DataHoraTransacao := DateTimeToStr(ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].DataHoraTransacaoHost);
  395. TotalTipoPagamento.Finalizacao := ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].Finalizacao;
  396. if (ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].TipoTransacao >= 10)
  397. and (ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].TipoTransacao <= 12) then
  398. TotalTipoPagamento.CartaoDebitoOuCredito := 'C';
  399. if (ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].TipoTransacao >= 20)
  400. and (ACBrTEFD.RespostasPendentes[IndiceTransacaoTef].TipoTransacao <= 25) then
  401. TotalTipoPagamento.CartaoDebitoOuCredito := 'D';
  402. TransacaoComTef := True;
  403. PodeFechar := False;
  404. end;
  405. except
  406. end;
  407. end;
  408. if StatusTransacao then
  409. begin
  410. CDSValores.Append;
  411. CDSValores.Fields[0].AsString := ComboTipoPagamento.Text;
  412. CDSValores.Fields[1].AsString := EditValorPago.Text;
  413. if TipoPagamento.TEF = 'S' then
  414. begin
  415. CDSValores.Fields[3].AsString := 'S';
  416. CDSValores.Fields[4].AsString := TotalTipoPagamento.NSU;
  417. CDSValores.Fields[5].AsString := TotalTipoPagamento.Rede;
  418. CDSValores.Fields[6].AsString := TotalTipoPagamento.DataHoraTransacao;
  419. CDSValores.Fields[7].AsInteger := IndiceTransacaoTef;
  420. CDSValores.Fields[9].AsString := TotalTipoPagamento.Finalizacao;
  421. end;
  422. CDSValores.Post;
  423. TotalRecebido := TruncaValor(TotalRecebido + StrToFloat(EditValorPago.Value),Constantes.TConstantes.DECIMAIS_VALOR);
  424. Troco := TruncaValor(TotalRecebido - TotalReceber,Constantes.TConstantes.DECIMAIS_VALOR);
  425. if Troco < 0 then
  426. Troco := 0;
  427. VerificaSaldoRestante;
  428. TotalTipoPagamento.IdVenda := IdVenda;
  429. TotalTipoPagamento.IdTipoPagamento := TipoPagamento.Id;
  430. TotalTipoPagamento.Valor := TruncaValor(StrToFloat(EditValorPago.Text),Constantes.TConstantes.DECIMAIS_VALOR);
  431. TotalTipoPagamento.CodigoPagamento := TipoPagamento.Codigo;
  432. TotalTipoPagamento.Estorno := 'N';
  433. TotalTipoPagamento.TemTEF := TipoPagamento.TEF;
  434. ListaTotalTipoPagamento.Add(TotalTipoPagamento);
  435. //guarda o ?ndice da lista
  436. CDSValores.Edit;
  437. CDSValores.Fields[8].AsInteger := ListaTotalTipoPagamento.Count-1;
  438. CDSValores.Post;
  439. end;
  440. PanelConfirmaValores.Visible := False;
  441. PanelConfirmaValores.SendToBack;
  442. ComboTipoPagamento.SetFocus;
  443. EditValorPago.Text := FormatFloat('0.00',SaldoRestante);
  444. end;
  445. end;
  446. procedure TFEfetuaPagamento.FinalizaVenda;
  447. var
  448. i:Integer;
  449. TotalTipoPagamento:TTotalTipoPagamentoVO;
  450. begin
  451. ImpressaoOK := True;
  452. //subtotaliza o cupom
  453. SubTotalizaCupom;
  454. //manda os pagamentos para o ECF
  455. if TransacaoComTef then
  456. OrdenaLista;
  457. TotalTipoPagamento := TTotalTipoPagamentoVO.Create;
  458. for i := 0 to ListaTotalTipoPagamento.Count - 1 do
  459. begin
  460. TotalTipoPagamento := ListaTotalTipoPagamento.Items[i];
  461. FDataModule.ACBrECF.EfetuaPagamento(TotalTipoPagamento.CodigoPagamento, TotalTipoPagamento.Valor);
  462. end;
  463. //finaliza o cupom
  464. ACBrTEFD.FinalizarCupom;
  465. //imprime as transacoes pendentes - comprovantes nao fiscais vinculados
  466. ACBrTEFD.ImprimirTransacoesPendentes;
  467. if ImpressaoOK then
  468. begin
  469. //grava os pagamentos no banco de dados
  470. TTotalTipoPagamentoController.GravaTotaisVenda(ListaTotalTipoPagamento);
  471. //conclui o encerramento da venda - grava dados de cabecalho no banco
  472. UCaixa.VendaCabecalho.ValorFinal := TotalReceber;
  473. UCaixa.VendaCabecalho.ValorRecebido := TotalRecebido;
  474. UCaixa.VendaCabecalho.Troco := Troco;
  475. UCaixa.VendaCabecalho.StatusVenda := 'F';
  476. UCaixa.StatusCaixa := 0;
  477. FCaixa.ConcluiEncerramentoVenda;
  478. StatusPagamento := 1;
  479. FDataModule.ACBrECF.AbreGaveta;
  480. PodeFechar := True;
  481. Close;
  482. end
  483. else
  484. begin
  485. Application.MessageBox('Problemas no ECF. Pagamentos cancelados.', 'Informa??o do Sistema', Mb_OK + MB_ICONINFORMATION);
  486. if CupomCancelado then
  487. {
  488. ocorreu problema na impressao do comprovante do TEF. ECF Desligado.
  489. Sistema pergunta ao usu?rio se o mesmo quer tentar novamente. Usu?rio responde N?o.
  490. ECF agora est? ligado e o sistema consegue cancelar o cupom.
  491. }
  492. begin
  493. Application.MessageBox('Cupom fiscal cancelado. Ser? aberto novo cupom e deve-se informar novamente os pagamentos.', 'Informa??o do Sistema', Mb_OK + MB_ICONINFORMATION);
  494. UCaixa.ProblemaNoPagamento := True;
  495. UCaixa.VendaCabecalho.CupomFoiCancelado := 'S';
  496. UCaixa.StatusCaixa := 0;
  497. FechaVendaComProblemas;
  498. PodeFechar := True;
  499. Close;
  500. end
  501. else
  502. {
  503. ocorreu problema na impressao do comprovante do TEF. ECF Desligado.
  504. Sistema pergunta ao usu?rio se o mesmo quer tentar novamente. Usu?rio responde N?o.
  505. ECF continua desligado e o sistema n?o consegue cancelar o cupom.
  506. }
  507. begin
  508. Application.MessageBox('Problemas no ECF. Aplica??o funcionar? apenas para consulta com uma venda pendente.', 'Informa??o do Sistema', Mb_OK + MB_ICONINFORMATION);
  509. UCaixa.StatusCaixa := 3;
  510. FechaVendaComProblemas;
  511. PodeFechar := True;
  512. Close;
  513. end;
  514. end;
  515. end;
  516. procedure TFEfetuaPagamento.FechaVendaComProblemas;
  517. var
  518. i:Integer;
  519. begin
  520. //altera o status da venda para P e fecha a aplica??o
  521. UCaixa.VendaCabecalho.StatusVenda := 'P';
  522. FCaixa.ConcluiEncerramentoVenda;
  523. //grava os pagamentos no banco de dados com o indicador de estorno
  524. for i := 0 to ListaTotalTipoPagamento.Count - 1 do
  525. TTotalTipoPagamentoVO(ListaTotalTipoPagamento.Items[i]).Estorno := 'S';
  526. TTotalTipoPagamentoController.GravaTotaisVenda(ListaTotalTipoPagamento);
  527. end;
  528. procedure TFEfetuaPagamento.CancelaOperacao;
  529. begin
  530. if TransacaoComTef then
  531. begin
  532. Application.MessageBox('Pagamento com cart?o j? confirmado.'+#13+#13+'N?o ? poss?vel adicionar mais itens.', 'Informa??o do Sistema', Mb_OK + MB_ICONINFORMATION);
  533. ComboTipoPagamento.SetFocus;
  534. end
  535. else
  536. Close;
  537. end;
  538. procedure TFEfetuaPagamento.SubTotalizaCupom;
  539. begin
  540. if VendaCabecalho.Desconto > 0 then
  541. UECF.SubTotalizaCupom(VendaCabecalho.Desconto * -1)
  542. else if VendaCabecalho.Acrescimo > 0 then
  543. UECF.SubTotalizaCupom(VendaCabecalho.Acrescimo)
  544. else
  545. UECF.SubTotalizaCupom(0);
  546. end;
  547. procedure TFEfetuaPagamento.GravaR06;
  548. var
  549. R06: TR06VO;
  550. begin
  551. R06 := TR06VO.Create;
  552. R06.IdCaixa := UCaixa.Movimento.IdCaixa;
  553. R06.IdOperador := UCaixa.Movimento.IdOperador;
  554. R06.IdImpressora := UCaixa.Movimento.IdImpressora;
  555. R06.COO := StrToInt(FDataModule.ACBrECF.NumCOO);
  556. R06.GNF := StrToInt(FDataModule.ACBrECF.NumGNF);
  557. R06.CDC := StrToInt(FDataModule.ACBrECF.NumCDC);
  558. R06.Denominacao := 'CC';
  559. R06.DataEmissao := FormatDateTime('yyyy-mm-dd', FDataModule.ACBrECF.DataHora);
  560. R06.HoraEmissao := FormatDateTime('hh:nn:ss', FDataModule.ACBrECF.DataHora);
  561. TRegistroRController.GravaR06(R06);
  562. end;
  563. //pode ser muito melhorado
  564. //verificar o m?todo Sort de Generics.Collections juntamente com utiliza??o de TComparer
  565. procedure TFEfetuaPagamento.OrdenaLista;
  566. var
  567. i:Integer;
  568. ListaTotalTipoPagamentoLocal: TObjectList<TTotalTipoPagamentoVO>;
  569. begin
  570. ListaTotalTipoPagamentoLocal := ListaTotalTipoPagamento;
  571. ListaTotalTipoPagamento := TObjectList<TTotalTipoPagamentoVO>.Create(True);
  572. //no primeiro la?o insere na lista s? quem nao tem TEF
  573. for i := 0 to ListaTotalTipoPagamentoLocal.Count - 1 do
  574. begin
  575. if TTotalTipoPagamentoVO(ListaTotalTipoPagamentoLocal.Items[i]).TemTEF = 'N' then
  576. ListaTotalTipoPagamento.Add(TTotalTipoPagamentoVO(ListaTotalTipoPagamentoLocal.Items[i]));
  577. end;
  578. //no segundo la?o insere os pagamentos que tem tef
  579. for i := 0 to ListaTotalTipoPagamentoLocal.Count - 1 do
  580. if TTotalTipoPagamentoVO(ListaTotalTipoPagamentoLocal.Items[i]).TemTEF = 'S' then
  581. ListaTotalTipoPagamento.Add(TTotalTipoPagamentoVO(ListaTotalTipoPagamentoLocal.Items[i]));
  582. end;
  583. ////////////////////////////////////////////////////////////////////////////////
  584. /// M?todos do Componente ACBrTEFD
  585. ////////////////////////////////////////////////////////////////////////////////
  586. procedure TFEfetuaPagamento.ACBrTEFDAguardaResp(Arquivo: string; SegundosTimeOut: Integer; var Interromper: Boolean);
  587. var
  588. Msg : String ;
  589. begin
  590. Msg := '' ;
  591. if (ACBrTEFD.GPAtual in [gpCliSiTef, gpVeSPague]) then //? TEF dedicado?
  592. begin
  593. if Arquivo = '23' then //Est? aguardando Pin-Pad ?
  594. begin
  595. if ACBrTEFD.TecladoBloqueado then
  596. begin
  597. ACBrTEFD.BloquearMouseTeclado(False); //Desbloqueia o Teclado
  598. end ;
  599. Msg := 'Tecle "ESC" para cancelar.';
  600. end;
  601. end
  602. else
  603. Msg := 'Aguardando: '+Arquivo+' '+IntToStr(SegundosTimeOut) ;
  604. if Msg <> '' then
  605. FCaixa.labelMensagens.Caption := Msg;
  606. Application.ProcessMessages;
  607. end;
  608. procedure TFEfetuaPagamento.ACBrTEFDAntesCancelarTransacao(RespostaPendente: TACBrTEFDResp);
  609. var
  610. Est: TACBrECFEstado;
  611. begin
  612. Est := FDataModule.ACBrECF.Estado;
  613. case Est of
  614. estVenda, estPagamento :
  615. UECF.CancelaCupom;
  616. estRelatorio: FDataModule.ACBrECF.FechaRelatorio;
  617. else
  618. if not (Est in [estLivre, estDesconhecido, estNaoInicializada] ) then
  619. FDataModule.ACBrECF.CorrigeEstadoErro(False);
  620. end;
  621. end;
  622. procedure TFEfetuaPagamento.ACBrTEFDAntesFinalizarRequisicao(Req: TACBrTEFDReq);
  623. begin
  624. if Req.Header = 'CRT' then
  625. Req.GravaInformacao(777,777,'REDECARD');
  626. end;
  627. procedure TFEfetuaPagamento.ACBrTEFDBloqueiaMouseTeclado(Bloqueia: Boolean; var Tratado: Boolean);
  628. begin
  629. FCaixa.Enabled := not Bloqueia;
  630. Tratado := False ; { Se "False" --> Deixa executar o c?digo de Bloqueio do ACBrTEFD }
  631. end;
  632. procedure TFEfetuaPagamento.ACBrTEFDComandaECF(Operacao: TACBrTEFDOperacaoECF; Resp: TACBrTEFDResp; var RetornoECF: Integer);
  633. var
  634. Mensagem: String;
  635. begin
  636. Mensagem := '';
  637. try
  638. case Operacao of
  639. opeAbreGerencial:
  640. FDataModule.ACBrECF.AbreRelatorioGerencial ;
  641. opeCancelaCupom:
  642. begin
  643. ImpressaoOK := False;
  644. try
  645. UECF.CancelaCupom;
  646. CupomCancelado := True;
  647. except
  648. CupomCancelado := False;
  649. end;
  650. end;
  651. opeFechaCupom:
  652. begin
  653. if UCaixa.VendaCabecalho.IdPreVenda > 0 then
  654. Mensagem := 'PV' + StringOfChar('0',10-Length(IntToStr(UCaixa.VendaCabecalho.IdPreVenda))) + IntToStr(UCaixa.VendaCabecalho.IdPreVenda);
  655. if UCaixa.VendaCabecalho.IdDAV > 0 then
  656. Mensagem := Mensagem + 'DAV' + StringOfChar('0',10-Length(IntToStr(UCaixa.VendaCabecalho.IdDAV))) + IntToStr(UCaixa.VendaCabecalho.IdDAV);
  657. Mensagem := Mensagem + #13 + #10 + UCaixa.MD5 + #13 + #10;
  658. UECF.FechaCupom(Mensagem + UCaixa.Configuracao.MensagemCupom);
  659. end;
  660. opeSubTotalizaCupom:
  661. FDataModule.ACBrECF.SubtotalizaCupom(0);
  662. opeFechaGerencial, opeFechaVinculado:
  663. begin
  664. FDataModule.ACBrECF.FechaRelatorio;
  665. GravaR06;
  666. end;
  667. opePulaLinhas:
  668. begin
  669. FDataModule.ACBrECF.PulaLinhas(FDataModule.ACBrECF.LinhasEntreCupons);
  670. FDataModule.ACBrECF.CortaPapel(True);
  671. Sleep(200);
  672. end;
  673. end;
  674. RetornoECF := 1 ;
  675. except
  676. RetornoECF := 0 ;
  677. end;
  678. end;
  679. procedure TFEfetuaPagamento.ACBrTEFDComandaECFAbreVinculado(COO, IndiceECF: string; Valor: Double; var RetornoECF: Integer);
  680. begin
  681. try
  682. FDataModule.ACBrECF.AbreCupomVinculado(COO, IndiceECF, Valor);
  683. RetornoECF := 1 ;
  684. except
  685. RetornoECF := 0 ;
  686. end;
  687. end;
  688. procedure TFEfetuaPagamento.ACBrTEFDComandaECFImprimeVia(TipoRelatorio: TACBrTEFDTipoRelatorio; Via: Integer;ImagemComprovante: TStringList; var RetornoECF: Integer);
  689. begin
  690. { *** Se estiver usando ACBrECF... Lembre-se de configurar ***
  691. ACBrECF1.MaxLinhasBuffer := 3; // Os homologadores permitem no m?ximo
  692. // Impressao de 3 em 3 linhas
  693. ACBrECF1.LinhasEntreCupons := 7; // (ajuste conforme o seu ECF)
  694. NOTA: ACBrECF nao possui comando para imprimir a 2a via do CCD }
  695. try
  696. case TipoRelatorio of
  697. trGerencial :
  698. FDataModule.ACBrECF.LinhaRelatorioGerencial(ImagemComprovante.Text) ;
  699. trVinculado :
  700. FDataModule.ACBrECF.LinhaCupomVinculado(ImagemComprovante.Text)
  701. end;
  702. RetornoECF := 1 ;
  703. except
  704. RetornoECF := 0 ;
  705. end;
  706. end;
  707. procedure TFEfetuaPagamento.ACBrTEFDComandaECFPagamento(IndiceECF: string; Valor: Double; var RetornoECF: Integer);
  708. begin
  709. try
  710. FDataModule.ACBrECF.EfetuaPagamento(IndiceECF, Valor);
  711. RetornoECF := 1 ;
  712. except
  713. RetornoECF := 0 ;
  714. end;
  715. end;
  716. procedure TFEfetuaPagamento.ACBrTEFDExibeMsg(Operacao: TACBrTEFDOperacaoMensagem; Mensagem: string; var AModalResult: TModalResult);
  717. var
  718. Fim : TDateTime;
  719. OldMensagem : String;
  720. begin
  721. case Operacao of
  722. opmOK :
  723. AModalResult := Application.MessageBox(PChar(Mensagem), 'Informa??o do Sistema', MB_OK + MB_ICONINFORMATION);
  724. opmYesNo :
  725. AModalResult := Application.MessageBox(PChar(Mensagem), 'Pergunta do Sistema', Mb_YesNo + Mb_IconQuestion);
  726. opmExibirMsgOperador, opmRemoverMsgOperador :
  727. FCaixa.labelMensagens.Caption := Mensagem;
  728. opmExibirMsgCliente, opmRemoverMsgCliente :
  729. FCaixa.labelMensagens.Caption := Mensagem;
  730. opmDestaqueVia :
  731. begin
  732. OldMensagem := FCaixa.labelMensagens.Caption;
  733. try
  734. FCaixa.labelMensagens.Caption := Mensagem ;
  735. { Aguardando 3 segundos }
  736. Fim := IncSecond( now, 3) ;
  737. repeat
  738. sleep(200) ;
  739. FCaixa.labelMensagens.Caption := Mensagem + ' ' + IntToStr(SecondsBetween(Fim,now));
  740. Application.ProcessMessages;
  741. until (now > Fim) ;
  742. finally
  743. FCaixa.labelMensagens.Caption := OldMensagem ;
  744. end;
  745. end;
  746. end;
  747. Application.ProcessMessages;
  748. end;
  749. procedure TFEfetuaPagamento.ACBrTEFDInfoECF(Operacao: TACBrTEFDInfoECF; var RetornoECF: string);
  750. begin
  751. case Operacao of
  752. ineSubTotal:
  753. RetornoECF := FormatFloat('0.00',FDataModule.ACBrECF.Subtotal-FDataModule.ACBrECF.TotalPago);
  754. ineEstadoECF :
  755. begin
  756. Case FDataModule.ACBrECF.Estado of
  757. estLivre : RetornoECF := 'L' ;
  758. estVenda : RetornoECF := 'V' ;
  759. estPagamento : RetornoECF := 'P' ;
  760. estRelatorio : RetornoECF := 'R' ;
  761. else
  762. RetornoECF := 'O' ;
  763. end;
  764. end;
  765. end;
  766. end;
  767. procedure TFEfetuaPagamento.ACBrTEFDRestauraFocoAplicacao(var Tratado: Boolean);
  768. begin
  769. Application.BringToFront;
  770. Tratado := False ; { Deixa executar o c?digo de Foco do ACBrTEFD }
  771. end;
  772. end.