public void GerarArquivoAuxiliar() { using (OpenPOS.ECF.Interface.ICupomFiscal cf = new OpenPOS.ECF.CupomFiscal(ACBrFramework.ECF.ModeloECF.Bematech, "COM4")) { IArquivoAuxiliar arqAux = new ArquivoAuxiliar(); arqAux.GrandeTotal = cf.GrandeTotal.ToString(); arqAux.NumeroSerie = cf.NumeroSerie.ToString(); arqAux.Gerar(); } }
/// <summary> /// Ao carregar o formulário /// </summary> /// <param name="sender">Objeto que disparou o evento</param> /// <param name="e">Argumento do evento gerado</param> private void Inicial_Load(object sender, EventArgs e) { splash.Show(); splash.SetMessage("Verificando ECF"); if(Settings.ECF.ECFAtual != null) { ICupomFiscal cf = null; #if IsPAF IArquivoAuxiliar aux = null; #endif try { cf = new CupomFiscal(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta); #if IsPAF aux = new ArquivoAuxiliar(); if(!System.IO.File.Exists(aux.ArquivoAuxiliarPath)) { aux.GrandeTotal = cf.GrandeTotal.ToString(); aux.NumeroSerie = cf.NumeroSerie; aux.Gerar(); } aux.Carregar(); #endif } catch { } #if IsPAF if((cf.Estado != EstadoECF.Livre) || !aux.PermiteFaturamento(cf.GrandeTotal)) { //TODO André: Essa parte do código só vai ser executado quando por algum motivo ocorreu a perda //acidentalmente dos dados do //arquivo auxiliar criptografado, onde será reconstituído o valor do Grande Total e Número de Série do Equipamento Emissor de Cupom Fiscal conectado //Requisito XXIV - item 8 try { using(IInformacao info = new Informacao(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta)) { DadosReducaoZClass dadosReducao = info.DadosReducaoZ; if(aux.RecomporTotalizadorGeral(info.CRZ, info.CRO, dadosReducao.ValorVendaBruta, dadosReducao.DataHoraEmissao)) aux.CorrigeDados(cf.GrandeTotal); else { MessageBox.ShowWarning("Não é permitido o faturamento na impressora fiscal, pois os dados do Grande Total ou Número de série, diferem dos que estão no arquivo auxiliar criptografado!"); return; } } } catch { } } #endif splash.SetMessage("Preparando Caixa"); IVendaCF venda = new VendaCF().HasTemp(Settings.ECF.ECFAtual) as IVendaCF; if(venda != null) { if(venda.Status == Enuns.Faturamento.Lancamento.Status.ImpressoCupom) new Pagamento(cf, venda).Confirmacao(); else new Pagamento(cf, venda).CancelarTransacoesPendentes(); try { cf = new CupomFiscal(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta); if(cf.Estado == EstadoECF.Pagamento) { if(cf.TotalPago > 0) { cf.CancelaCupom(); if(cf.Estado == EstadoECF.Livre) venda.Cancelar("Venda cancelada pelo Usuário"); } } else if(cf.Estado == EstadoECF.Venda) { } else if(cf.Estado == EstadoECF.Livre) { venda.Cancelar("Venda cancelada pelo Sistema"); } else if(cf.Estado == EstadoECF.Relatorio) { new OpenPOS.ECF.RelatorioGerencial(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta).FechaRelatorio(Enuns.ECF.TipoOutrosDocumentos.RG, false); } else if(cf.Estado == EstadoECF.NaoInicializada) { throw new Exception(); } } catch { if(MessageBox.AskYesNo("Impressora não responde.\r\tContinuar?", "Erro") == DialogResult.No) Application.Exit(); } } splash.SetMessage("Finalizando Incialização"); } optbCaixa.Visible = optBarVenda.Visible = optbConsulta.Visible = optBarDAV.Visible = optBarOutros.Visible = false; //Configurações na barra de acordo com o terminal, ou seja PDV ou não if(isPDV) { labelOperador.Text = Settings.UsuarioAtual.NomeLogin; labelTerminal.Text = Settings.MachineName; IAbreFechaCaixa abreCx = new AbreCaixa().PermiteAbrir(Settings.MachineName, DateTime.Now); labelStatus.Text = abreCx == null ? Convert.ToString(Enuns.FrenteCaixa.Cadastro.Caixa.Status.Fechado) : Convert.ToString(abreCx.Status); } else { labelOperador.Text = Settings.UsuarioAtual.NomeLogin; labelOperador.Location = new Point(202, 540); labelTerminal.Text = ""; labelStatus.Text = ""; } splash.Close(); }
/// <summary> /// Finaliza o cupom na bobina /// </summary> /// <param name="venda">Venda efetuada</param> /// <param name="totalDinheiro">total de dinheiro informado</param> public void FechaCupom(IVendaCF venda, double totalDinheiro) { #region Variáveis locais string ECFRodapePersonalizado = ""; double troco = Math.Round(totalDinheiro - venda.ValorTotalLiquido, 2); double totalVenda = Math.Round(venda.ValorTotalLiquido, 2); totalDinheiro = Math.Round(totalDinheiro, 2); IsErrorFechamentoCupom = false; string modeloecf = string.Empty; string marcaecf = string.Empty; string versaoecf = string.Empty; string numecf = string.Empty; double impostoAprox = 0; double percImpostoAprox = 0; string[] linhasRodape = new string[7]; string tipoMovimento = string.Empty; string codigoMovimento = string.Empty; #endregion ImpressoTroco = false; impostoAprox = venda.ValorTotalImpostoAproximado; percImpostoAprox = venda.PercentualTotalImpostoAproximado; #if IsPAF //TODO André: Comentado as linhas referente ao manejo do arquivo auxiliar. Para o pessoal do suporte poder testar o OpenPOS sem travar. IArquivoAuxiliar arqAux = new ArquivoAuxiliar(); #endif #region Fechamento do Cupom Fiscal using (ICupomFiscal c = new CupomFiscal(Unimake.Convert.ToEnum<ModeloECF>(Settings.ECF.ECFAtual.ModeloACBR), Settings.ECF.ECFAtual.Porta)) { venda.NumeroSerieECF = c.NumeroSerie; venda.NumeroOrdemECF = Unimake.Convert.ToInt(c.NumeroECF); venda.COO = c.COO; venda.COOFinal = 0; // Todo: o valor do coo final será atualizado posteriormente pela emissão da redução z venda.CRO = c.CRO; venda.CCF = c.CCF; venda.CRZ = c.CRZ; venda.ValorGrandeTotalECF = c.GrandeTotal; #if IsPAF //Atualizar o valor do grande total do ECF no arquivo auxiliar arqAux.GrandeTotal = c.GrandeTotal.ToString(); arqAux.NumeroSerie = c.NumeroSerie.ToString(); arqAux.Gerar(); #endif //Faz a impressão do rodapé do cupom fiscal de maneira personalizada if (Settings.PAF.UsaInformacoesRodapeMD5) { Model.Cadastro.Pessoa.IEndereco endereco = Settings.EmpresaAtual.Enderecos.First(i => i.Principal); c.Rodape.MD5 = OpenPOS.Cryptography.Files.MD5.GetMD5Hash(OpenPOS.Cryptography.Files.MD5.FromExe()); #if IsPAF if (endereco != null) switch (Settings.EmpresaAtual.Enderecos.First(i => i.Principal).Endereco.Estado.UF.Sigla.ToString()) { case "PB": c.Rodape.ParaibaLegal = true; break; case "DF": c.Rodape.NotaLegalDF.Imprimir = true; //Todo Luciano: Quando desenvolvido a parte tributaria informar o valor dos tributos dos itens c.Rodape.NotaLegalDF.ValorICMS = 0.0M; c.Rodape.NotaLegalDF.ValorISS = 0.0M; break; case "MG": c.Rodape.MinasLegal = true; break; case "RJ": c.Rodape.CupomMania = true; break; } #endif //De acordo com o movimento vinculado, sabemos qual é o tipo: Pré-venda, DAV, DAVO-OS if (venda.MovimentosVinculados.FirstOrDefault() != null) { switch (venda.MovimentosVinculados.FirstOrDefault().Tipo) { case Tipo.DAV: tipoMovimento = "DAV"; codigoMovimento = venda.MovimentosVinculados.FirstOrDefault().EGUID.ToString(); break; case Tipo.DAVOS: tipoMovimento = "DAV-OS"; codigoMovimento = venda.MovimentosVinculados.FirstOrDefault().EGUID.ToString(); break; case Tipo.PreVenda: tipoMovimento = "PV"; codigoMovimento = venda.MovimentosVinculados.FirstOrDefault().EGUID.ToString(); break; case Tipo.NotaFiscalManual: tipoMovimento = "NF"; codigoMovimento = venda.MovimentosVinculados.FirstOrDefault().EGUID; break; case Tipo.NotaFiscalEletronica: case Tipo.CupomFiscal: case Tipo.Sangria: case Tipo.Suprimento: case Tipo.Recebimento: case Tipo.LancamentoGeral: case Tipo.ContasPagar: case Tipo.ContasReceber: default: tipoMovimento = string.Empty; break; } } MD5 md = new MD5("Bobina OpenPOS", Unimake.Convert.ToInt(Settings.Setting.PasswordMD5Loop), Unimake.Convert.ToBoolean(Settings.Setting.PasswordMD5UseKey) ? "123" : ""); // Prepara as informações antes de imprimir as linhas linhasRodape = Settings.ECF.PreparaRodapeCupom(venda, md); //Conteúdo que será impresso no rodapé do cupom fiscal do ECF ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha1.Trim()) ? "" : linhasRodape[0].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha2.Trim()) ? "" : linhasRodape[1].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha3.Trim()) ? "" : linhasRodape[2].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha4.Trim()) ? "" : linhasRodape[3].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha5.Trim()) ? "" : linhasRodape[4].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha6.Trim()) ? "" : linhasRodape[5].Trim() + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha7.Trim()) ? "" : linhasRodape[6].Trim(); //Conteúdo que será impresso no rodapé do cupom fiscal na Bobina WriteLine("MD-5:{0}", md.Hash); for (int i = 0; i < linhasRodape.Length; i++) { linhasRodape[i] = linhasRodape[i].Trim(); if (!String.IsNullOrEmpty(linhasRodape[i])) WriteLine("{0}", linhasRodape[i]); } Settings.ECF.PopulateECFRodape(); } else WriteLine("Obrigado! Volte Sempre."); modeloecf = c.SubModeloECF.ToString(); marcaecf = c.Modelo.ToString(); versaoecf = c.NumeroVersao; numecf = c.NumeroECF; DrawLine(); WriteLine("{0} {1}", marcaecf, modeloecf); WriteLine("VERSÃO:{0} ECF:{1} LJ:{2}", versaoecf, numecf, venda.Empresa.EGUID); string serieECF = String.Format("FAB:{0}", venda.NumeroSerieECF); WriteLine(serieECF + " BR".PadLeft(25)); if (!Settings.PAF.UsaInformacoesRodapeMD5) ECFRodapePersonalizado = string.Empty; c.FechaCupom(ECFRodapePersonalizado); venda.Status = Status.ImpressoCupom; venda.SaveTemp(); } #endregion #region Impressão das parcelas if (venda.Parcelas.Count > 0) { if (Unimake.Convert.ToBoolean(Settings.Setting.ImprimirViasParcelamento)) { //------------------------------------------------------------------------- // Imprimir a primeira via, esta via é do estabelecimento //------------------------------------------------------------------------- ImprimeParcela(venda, "--- VIA DO ESTABELECIMENTO ---"); //------------------------------------------------------------------------- // Imprimir a segunda via, esta via é do cliente //------------------------------------------------------------------------- ImprimeParcela(venda, "--- VIA DO CLIENTE ---"); } else if (Unimake.Convert.ToBoolean(Settings.Setting.ImprimirViaClienteParcelamento)) { //------------------------------------------------------------------------- // Imprimir a segunda via, esta via é do cliente //------------------------------------------------------------------------- ImprimeParcela(venda, "--- VIA DO CLIENTE ---"); } else if (Unimake.Convert.ToBoolean(Settings.Setting.ImprimirViaEstabelecimentoParcelamento)) { //------------------------------------------------------------------------- // Imprimir a primeira via, esta via é do estabelecimento //------------------------------------------------------------------------- ImprimeParcela(venda, "--- VIA DO ESTABELECIMENTO ---"); } } #endregion StatusImpressao = BobinaStatusImpressao.CupomFechado; buffer.Clear(); }
/// <summary> /// Simula a impressão de uma abertura de cupom. /// </summary> /// <param name="cpf_cnpj">Número de CPF e CNPJ do cliente</param> /// <param name="abreCupomECF">se true, abre o cupom na ECF</param> /// ´<param name="pessoa">Pessoa relacionada ao cupom, pode ser informado apenas o CPF/CNPJ no parâmetro cpf_cnpj</param> public virtual void AbreVenda(string cpf_cnpj = "", IDadoPessoa pessoa = null, bool abreCupomECF = true) { ICupomFiscal cf = null; #region Buffer if (!fromBuffer) { buffer = new List<BufferItem>(); buffer.Add(new BufferItem { AbreCupom = new AbreCupomArgs { AbreCupomECF = abreCupomECF, CPF_CNPJ = cpf_cnpj, Pessoa = pessoa } }); } #endregion #if IsPAF //TODO André: Comentado as linhas referente ao manejo do arquivo auxiliar. Para o pessoal do suporte poder testar o OpenPOS sem travar. IArquivoAuxiliar arqAux = new ArquivoAuxiliar(); #endif OpenPOS.Model.Cadastro.Endereco.IEndereco endereco = null; endereco = Settings.EmpresaAtual.Enderecos[0].Endereco; string numero = Settings.EmpresaAtual.Enderecos[0].Numero; ICanalComunicacao canalcomunicacao = null; canalcomunicacao = Settings.EmpresaAtual.CanaisComunicacao[0]; string nome = string.Empty; string ccf = string.Empty; string coo = string.Empty; string enderecoPessoa = string.Empty; //Todo: Implementar os dados do cliente no cupom if (pessoa != null) { nome = pessoa.NomeFantasia; enderecoPessoa = pessoa.Cliente.Enderecos.Count == 0 ? "" : pessoa.Cliente.Enderecos.FirstOrDefault().Endereco.Endereco; if (pessoa.Cliente.FisicaJuridica == Enuns.Cadastro.Pessoa.FisicaJuridica.Fisica) cpf_cnpj = Unimake.Format.CPF(cpf_cnpj); else if (pessoa.Cliente.FisicaJuridica == Enuns.Cadastro.Pessoa.FisicaJuridica.Juridica) cpf_cnpj = Unimake.Format.CNPJ(cpf_cnpj); if (String.IsNullOrEmpty(cpf_cnpj)) cpf_cnpj = pessoa.Cliente.GetCPFCNPJ(); } #region impressora if (abreCupomECF) { cf = new CupomFiscal(Unimake.Convert.ToEnum<ModeloECF>(Settings.ECF.ECFAtual.ModeloACBR), Settings.ECF.ECFAtual.Porta); if ((fromBuffer || Settings.ECF.Concomitante) && abreCupomECF) { using (cf) { #if IsPAF arqAux.Carregar(); if (!arqAux.NumeroFabricacaoEquals()) { throw new OpenPOS.Exceptions.Faturamento.Lancamento.Movimento.ArquivoAuxiliarInvalido(); } ////Comparar o valor do grande total do ECF com o valor do grande total do arquivo auxiliar, se estiverem iguais permitir o faturamento de um cupom fiscal. ////É feito o mesmo tratamento para o número de fabricação do ECF if ((cf.Estado != EstadoECF.Livre) || !arqAux.PermiteFaturamento(cf.GrandeTotal)) { //TODO André: Essa parte do código só vai ser executado quando por algum motivo ocorreu a perda //acidentalmente dos dados do //arquivo auxiliar criptografado, onde será reconstituído o valor do Grande Total e Número de Série do Equipamento Emissor de Cupom Fiscal conectado //Requisito XXIV - item 8 using (IInformacao info = new Informacao(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta)) { DadosReducaoZClass dadosReducao = info.DadosReducaoZ; if (arqAux.RecomporTotalizadorGeral(info.CRZ,info.CRO,dadosReducao.ValorVendaBruta,dadosReducao.DataHoraEmissao)) arqAux.CorrigeDados(cf.GrandeTotal); else { MessageBox.ShowWarning("Não é permitido o faturamento na impressora fiscal, pois os dados do Grande Total ou Número de série, diferem dos que estão no arquivo auxiliar criptografado!"); BloquearVenda = true; return; } } } #else if ((cf.Estado != EstadoECF.Livre)) { MessageBox.ShowWarning("Não é permitido o faturamento na impressora!"); return; } #endif cf.AbreCupom(cpf_cnpj, nome, endereco.Logradouro.ToString(), false); BloquearVenda = false; ccf = Unimake.Convert.ToString(cf.CCF); coo = Unimake.Convert.ToString(cf.COO); } } } #endregion #region bobina Clear(); WriteLine("{0} {1}-{2}", Settings.EmpresaAtual.NomeFantasia.ToUpper(), Unimake.Convert.ToString(endereco.Cidade).ToUpper(), endereco.Estado.UF.Sigla.ToUpper()); WriteLine("{0} {1}, {2} FONE:{3} ", Unimake.Convert.ToString(endereco.Endereco).ToUpper(), numero.ToString(), Unimake.Convert.ToString(endereco.Bairro).ToUpper(), (Telefone)canalcomunicacao.IdentificadorCanal.ToString()); WriteLine("CNPJ: {0}", Unimake.Format.CNPJ(Settings.EmpresaAtual.Juridica.CNPJ)); WriteLine("IE: {0}", Settings.EmpresaAtual.Juridica.IE); WriteLine("IM: {0}", Settings.EmpresaAtual.Juridica.IM); DrawLine(); if (abreCupomECF) WriteLine("{0} CCF: {1} COO: {2}", cf.DataHora, ccf.Trim().PadLeft(6, '0'), coo.Trim().PadLeft(6, '0')); WriteLine("CNPJ/CPF consumidor:{0}", cpf_cnpj); WriteLine("NOME: {0}", nome); WriteLine("END: {0}", Unimake.Convert.ToString(enderecoPessoa).ToUpper()); WriteLine(Unimake.Convert.ToBoolean(Settings.Setting.EmissaoConsumidorFinalNFCe) ? " NOTA FISCAL AO CONSUMIDOR ELETRÔNICA" : " CUPOM FISCAL"); DrawLine(); WriteLine("ITEM CÓDIGO DESCRIÇÃO QTD.UN.VL UNIT(R$) ST VL ITEM(R$)"); DrawLine(); StatusImpressao = BobinaStatusImpressao.CupomAberto; #endregion }