/// <summary> /// Subtotaliza o cupom fiscal /// </summary> /// <param name="venda">Instancia corrente da venda </param> public void SubTotaliza(IMovimento venda) { double totalVenda = Math.Round(venda.ValorTotalLiquido, 2); string line = string.Empty; double totalDescontoItem = 0.0; double totalAcrescimoItem = 0.0; double totalDescontoAcresc = 0.0; if (Unimake.Convert.ToBoolean(Settings.Setting.EmissaoConsumidorFinalNFCe) && (StatusImpressao == BobinaStatusImpressao.Subtotaliza || StatusImpressao == BobinaStatusImpressao.FormaPagamento)) return; //Se possuir desconto ou acréscimo temos que subtotalizá-lo if (venda.ValorTotalAcrescimo > 0 || venda.ValorTotalDesconto > 0) { //Separar o valor dos descontos dos acréscimos foreach (Model.Faturamento.Lancamento.Movimento.Item.IItem item in venda.Itens) { if (venda.ValorTotalDesconto > 0) totalDescontoItem += item.ValorTotalDesconto * item.Quantidade; else if (venda.ValorTotalAcrescimo > 0) totalAcrescimoItem += item.ValorTotalAcrescimo * item.Quantidade; } //Cálculo para determinar se irá ser aplicado o desconto ou acréscimo no subtotal totalDescontoAcresc = (venda.ValorTotalAcrescimo - totalAcrescimoItem) - (venda.ValorTotalDesconto - totalDescontoItem); line = "SUBTOTAL R${0}{1:N2}"; WriteLine(line, "".PadLeft((MaxLengthLine - 18 - totalVenda.ToString().Length)), totalDescontoAcresc); if (totalDescontoAcresc > 0) { line = "(+) ACRESCIMO R${0}{1:N2}"; WriteLine(line, "".PadLeft((MaxLengthLine - 18 - totalVenda.ToString().Length)), totalDescontoAcresc); } else if (totalDescontoAcresc < 0) { line = "(-) DESCONTO R${0}{1:N2}"; WriteLine(line, "".PadLeft((MaxLengthLine - 18 - totalVenda.ToString().Length)), totalDescontoAcresc); } } line = "TOTAL R${0}{1:N2}"; WriteLine(line, "".PadLeft(MaxLengthLine - 11 - totalVenda.ToString().Length), totalVenda - totalDescontoAcresc); StatusImpressao = BobinaStatusImpressao.Subtotaliza; }
/// <summary> /// Método para impressão dos pagamentos no cupom fiscal e atualização na bobina /// </summary> /// <param name="venda">Instancia da venda </param> /// <param name="totalDinheiro">Total do pagamento </param> /// <param name="forma">Forma de pagamento com os dados da impressora como índice, etc. /// Observação: se não for informado nenhuma forma é utilizado a forma de pagamento DINHEIRO /// </param> public void ImprimePagamento(IMovimento venda, double totalDinheiro, IFormaPagamento forma = null) { string line = string.Empty; double troco = Math.Round(venda.Baixa.Formas.Where(k => k.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.Dinheiro || k.FormaPagamento.TipoForma == Enuns.Cadastro.TipoForma.Voucher) .Sum(k => k.ValorLiquido) - venda.ValorTotalLiquido, 2); double totalVenda = Math.Round(venda.ValorTotalLiquido, 2); if (StatusImpressao != BobinaStatusImpressao.Subtotaliza) return; if (forma == null) line = "DINHEIRO R${0}{1:N2}"; else { switch (forma.TipoForma) { case Enuns.Cadastro.TipoForma.CartaoCredito: case Enuns.Cadastro.TipoForma.CartaoDebito: case Enuns.Cadastro.TipoForma.CartaoPrivateLabel: line = "CARTÃO R${0}{1:N2}"; break; case Enuns.Cadastro.TipoForma.Cheque: line = "CHEQUE R${0}{1:N2}"; break; case Enuns.Cadastro.TipoForma.ConfirmacaoPreAutorizacao: case Enuns.Cadastro.TipoForma.CreditoConsumidor: line = "CDC R${0}{1:N2}"; break; case Enuns.Cadastro.TipoForma.Dinheiro: line = "DINHEIRO R${0}{1:N2}"; break; case Enuns.Cadastro.TipoForma.Voucher: line = "VOUCHER R${0}{1:N2}"; break; case Enuns.Cadastro.TipoForma.Parcelado: line = "PARCELADO R${0}{1:N2}"; break; } } if (troco > 0 && !ImpressoTroco) { WriteLine(line, "".PadLeft(MaxLengthLine - 14 - totalDinheiro.ToString().Length), totalDinheiro); line = "TROCO R${0}{1:N2}"; WriteLine(line, "".PadLeft(MaxLengthLine - 11 - troco.ToString().Length), troco); ImpressoTroco = true; } else { WriteLine(line, "".PadLeft(MaxLengthLine - 14 - totalDinheiro.ToString().Length), totalDinheiro); } StatusImpressao = BobinaStatusImpressao.FormaPagamento; }
/// <summary> /// Imprime o item na impressora e na tela /// </summary> /// <param name="item">item do movimento</param> /// <param name="itemNumero">número do item</param> public void ImprimirItem(IItem item, int itemNumero, bool imprimeItemECF = true) { #region buffer if (!fromBuffer) { buffer.Add(new BufferItem { VendeItem = new VendeItemArgs { Item = item, ItemNumero = itemNumero, ImprimeItemECF = imprimeItemECF } }); } #endregion LastIndex = itemNumero - 1; string line = String.Format("{0} {1} {2}", itemNumero.ToString().PadLeft(3, '0'), item.ItemMovimentado.EGUID, item.ItemMovimentado.Descricao); WriteLine(line); string subtotal = (item.Quantidade * item.ValorUnitarioBruto).ToString("N2"); line = String.Format(" {0:N2}{1} X {2:N2} F1", item.Quantidade, "UN", item.ValorUnitarioBruto); line = line.PadRight(MaxLengthLine - subtotal.Length, '_') + subtotal; if ((fromBuffer || Settings.ECF.Concomitante) && imprimeItemECF) { using (ICupomFiscal c = new CupomFiscal(Unimake.Convert.ToEnum<ModeloECF>(Settings.ECF.ECFAtual.ModeloACBR), Settings.ECF.ECFAtual.Porta)) { IVendaCF venda = item.Parent as IVendaCF; if (venda != null) { 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; } Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem i = (Model.Faturamento.Lancamento.Movimento.Item.VendaCF.IItem)item; i.COO = c.COO; i.Ordem = itemNumero; c.VendeItem(item.ItemMovimentado.EGUID, item.ItemMovimentado.Descricao, i.SituacaoTributaria.ToString(), Unimake.Convert.ToDecimal(item.Quantidade), Unimake.Convert.ToDecimal(item.ValorUnitarioBruto), 0.0M, item.Unidade.Descricao, "%", "D", -1); WriteLine(line); //Descontos nos itens dos movimentos vinculados, tais como, DAV, DAV-OS, Pré-Venda, etc. if (item.ValorTotalDesconto > 0 || item.ValorTotalAcrescimo > 0) { decimal vlrDescAcresc = item.ValorTotalDesconto > 0 ? Unimake.Convert.ToDecimal(item.ValorTotalDesconto * item.Quantidade) : Unimake.Convert.ToDecimal(item.ValorTotalAcrescimo * item.Quantidade); string descAcresc = item.ValorTotalDesconto > 0 ? "D" : "A"; int numeroItem = item.Ordem; using (ICupomFiscal cf = new CupomFiscal(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta)) cf.DescontoAcrescimoItemAnterior(vlrDescAcresc, descAcresc, "$", numeroItem); if (descAcresc.Equals("D")) line = "(-) DESCONTO ITEM {0} R${1}{2:N2}"; else line = "(+) ACRÉSCIMO ITEM {0} R${1}{2:N2}"; WriteLine(line, (venda.Itens.Count).ToString("D3"), "".PadLeft((MaxLengthLine - 27 - venda.ValorTotalLiquido.ToString().Length)), vlrDescAcresc); } } } StatusImpressao = BobinaStatusImpressao.ItemImpresso; }
public void ImprimeItem(IItem item) { IMovimento movimento = item.Parent; LastIndex = movimento.Itens .Where(k => k.Status == 0) .Count(); string line = String.Format("{0} {1} {2}", LastIndex.ToString().PadLeft(3, '0'), item.ItemMovimentado.EGUID, item.ItemMovimentado.Descricao); WriteLine(line); string subtotal = (item.Quantidade * item.ValorUnitarioBruto).ToString("N2"); line = String.Format(" {0:N2}{1} X {2:N2} F1", item.Quantidade, "UN", item.ValorUnitarioBruto); line = line.PadRight(MaxLengthLine - subtotal.Length, '_') + subtotal; WriteLine(line); if (item.ValorTotalDesconto > 0 || item.ValorTotalAcrescimo > 0) { decimal vlrDescAcresc = item.ValorTotalDesconto > 0 ? Unimake.Convert.ToDecimal(item.ValorTotalDesconto * item.Quantidade) : Unimake.Convert.ToDecimal(item.ValorTotalAcrescimo * item.Quantidade); string descAcresc = item.ValorTotalDesconto > 0 ? "D" : "A"; int numeroItem = item.Ordem; if (descAcresc.Equals("D")) line = "(-) DESCONTO ITEM {0} R${1}{2:N2}"; else line = "(+) ACRÉSCIMO ITEM {0} R${1}{2:N2}"; WriteLine(line, (movimento.Itens.Count).ToString("D3"), "".PadLeft((MaxLengthLine - 27 - movimento.ValorTotalLiquido.ToString().Length)), vlrDescAcresc); } StatusImpressao = BobinaStatusImpressao.ItemImpresso; }
public void FechaCupom() { MD5 md = new MD5("Bobina OpenPOS", Unimake.Convert.ToInt(Settings.Setting.PasswordMD5Loop), Unimake.Convert.ToBoolean(Settings.Setting.PasswordMD5UseKey) ? "123" : ""); DrawLine(); WriteLine("MD-5:{0}", md.Hash); WriteLine("OpenPOS"); WriteLine("VERSÃO {0}", Application.ProductVersion); WriteLine("QQQQQQQQQQQWQQQQQTEI {0}", DateTime.Now); WriteLine("BR".PadLeft(MaxLengthLine)); StatusImpressao = BobinaStatusImpressao.CupomFechado; DrawLine(); WriteLine("{0} ", " Obrigado - Volte sempre!"); }
/// <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> /// Faz a impressão do cancelamento na bobina /// </summary> public void CancelarCupom() { string ECFRodapePersonalizado = ""; MD5 md = new MD5("Bobina OpenPOS", Unimake.Convert.ToInt(Settings.Setting.PasswordMD5Loop), Unimake.Convert.ToBoolean(Settings.Setting.PasswordMD5UseKey) ? "123" : ""); WriteLine("----------------- CANCELADO -----------------"); DrawLine(); WriteLine("MD-5:{0}", md.Hash); if (Settings.PAF.UsaInformacoesRodapeMD5) { ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha1) ? "" : Settings.ECF.ConfiguracaoRodape.Linha1 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha2) ? "" : Settings.ECF.ConfiguracaoRodape.Linha2 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha3) ? "" : Settings.ECF.ConfiguracaoRodape.Linha3 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha4) ? "" : Settings.ECF.ConfiguracaoRodape.Linha4 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha5) ? "" : Settings.ECF.ConfiguracaoRodape.Linha5 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha6) ? "" : Settings.ECF.ConfiguracaoRodape.Linha6 + "\n"; ECFRodapePersonalizado += String.IsNullOrEmpty(Settings.ECF.ConfiguracaoRodape.Linha7) ? "" : Settings.ECF.ConfiguracaoRodape.Linha7 + "\n"; WriteLine(Settings.ECF.ConfiguracaoRodape.Linha1); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha2); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha3); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha4); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha5); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha6); WriteLine(Settings.ECF.ConfiguracaoRodape.Linha7); } WriteLine("OpenPOS"); WriteLine("VERSÃO {0}", Application.ProductVersion); WriteLine("QQQQQQQQQQQWQQQQQTEI {0}", DateTime.Now); WriteLine("BR".PadLeft(MaxLengthLine)); StatusImpressao = BobinaStatusImpressao.CupomCancelado; }
/// <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 }