/// <summary> /// Inicia um novo cupom /// </summary> private void NovoCupom() { this.ClearControls(); frmNovoCupom f = new frmNovoCupom(); f.ShowDialog(); Bobina.AbreCupom(f.CPF_CNPJ); venda = new Data.Faturamento.Lancamento.Movimento.VendaCF.VendaCF(); f.Close(); f.Dispose(); }
public Pagamento(IECF ecf, IVendaCF venda) : base(ecf) { CurrentVendaCF = venda; }
/// <summary> /// Imprime desconto item na bobina /// </summary> /// <param name="venda">Venda corrente</param> /// <param name="vlrDescAcresc">Valor a ser impresso como desconto</param> public void ImprimeDescontoItem(IVendaCF venda, double vlrDescAcresc) { double totalVenda = Math.Round(venda.ValorTotalLiquido, 2); string line = "(-) DESCONTO ITEM {0} R${1}{2:N2}"; WriteLine(line, (venda.Itens.Count).ToString("D3"), "".PadLeft((MaxLengthLine - 27 - totalVenda.ToString().Length)), vlrDescAcresc); }
/// <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> /// Imprime as parcelas do faturamento /// </summary> /// <param name="venda">Venda que contem as parcelas</param> private void ImprimeParcela(IVendaCF venda, string mensagem = "") { using (IRelatorioGerencial rel = new OpenPOS.ECF.RelatorioGerencial(Settings.ECF.ECFAtual.ModeloACBR, Settings.ECF.ECFAtual.Porta)) { string modeloecf = rel.SubModeloECF.ToString(); string marcaecf = rel.Modelo.ToString(); string versaoecf = rel.NumeroVersao; string numecf = rel.NumeroECF; rel.AbreRelatorioGerencial(); WriteLine(string.Empty); WriteLine(string.Empty); WriteLine("{0} {1}", marcaecf, modeloecf); WriteLine(Settings.EmpresaAtual.NomeFantasia); WriteLine(string.Format("{0}, {1}", Settings.EmpresaAtual.Enderecos[0].Endereco.Logradouro, Settings.EmpresaAtual.Enderecos[0].Numero)); WriteLine("CEP: {0} {1} {2}", Settings.EmpresaAtual.Enderecos[0].Endereco.CEP, Settings.EmpresaAtual.Enderecos[0].Endereco.Cidade, Settings.EmpresaAtual.Enderecos[0].Endereco.Estado); WriteLine("CNPJ: {0}", Settings.EmpresaAtual.Juridica.CNPJ); WriteLine("IE: {0}", Settings.EmpresaAtual.Juridica.IE); DrawLine(); WriteLine("{0:dd/mm/yyyy} {0:hh:mm:ss} GNF: {1} COO: {2}", rel.DataHora, rel.GNF.ToString().PadLeft(6, '0'), rel.COO.ToString().PadLeft(6, '0')); WriteLine(" NÃO É UM DOCUMENTO FISCAL"); WriteLine(" RELATÓRIO GERENCIAL"); rel.LinhaRelatorioGerencial(string.Format("REFERENTE AO CUPOM FISCAL NÚMERO: {0}", venda.COO.ToString().PadLeft(6, '0'))); WriteLine(string.Format("REFERENTE AO CUPOM FISCAL NÚMERO: {0}", venda.COO.ToString().PadLeft(6, '0'))); rel.LinhaRelatorioGerencial(string.Format("{0}", venda.DadoPessoa.Cliente.NomeFantasia)); WriteLine(string.Format("{0}", venda.DadoPessoa.Cliente.NomeFantasia)); rel.LinhaRelatorioGerencial(string.Format("DT EMI: {0:dd/MM/yyyy} DT COMPRA: {1:dd/MM/yyyy}", venda.DataEmissao, venda.DataHoraMovimento)); WriteLine(string.Format("DT EMI: {0:dd/MM/yyyy} DT COMPRA: {1:dd/MM/yyyy}", venda.DataEmissao, venda.DataHoraMovimento)); rel.LinhaRelatorioGerencial(string.Format("VALOR DA COMPRA: R$ {0:N2}", venda.ValorTotalLiquido)); WriteLine(string.Format("VALOR DA COMPRA: R$ {0:N2}", venda.ValorTotalLiquido)); rel.LinhaRelatorioGerencial(string.Format("+--------------------------------------+")); WriteLine(string.Format("+--------------------------------------+")); rel.LinhaRelatorioGerencial(string.Format(" PARCELAS ")); WriteLine(string.Format(" PARCELAS ")); rel.LinhaRelatorioGerencial(string.Format("+--------------------------------------+")); WriteLine(string.Format("+--------------------------------------+")); rel.LinhaRelatorioGerencial(string.Format("PARCELA DT DO VECTO VALOR")); WriteLine(string.Format("PARCELA DT DO VECTO VALOR")); rel.LinhaRelatorioGerencial(string.Format("+--------------------------------------+")); WriteLine(string.Format("+--------------------------------------+")); foreach (Model.Financeiro.Lancamento.IParcela item in venda.Parcelas) { rel.LinhaRelatorioGerencial(string.Format("{0} {1:dd/MM/yyyy} {2,14:0.00}", item.Parcela.ToString().PadLeft(2, '0').PadRight(14), item.DataVencimento, Unimake.Format.Currency(item.Valor))); WriteLine(string.Format("{0} {1:dd/MM/yyyy} {2,14:0.00}", item.Parcela.ToString().PadLeft(2, '0').PadRight(14), item.DataVencimento, Unimake.Format.Currency(item.Valor))); rel.LinhaRelatorioGerencial(string.Format("+--------------------------------------+")); WriteLine(string.Format("+--------------------------------------+")); } rel.LinhaRelatorioGerencial(""); WriteLine(""); rel.LinhaRelatorioGerencial("________________________________________"); WriteLine("________________________________________"); rel.LinhaRelatorioGerencial(" Assinatura "); WriteLine(" Assinatura "); if (!String.IsNullOrEmpty(mensagem)) { rel.LinhaRelatorioGerencial(mensagem); WriteLine(mensagem); } rel.FechaRelatorio(Enuns.ECF.TipoOutrosDocumentos.RG); 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)); } }
/// <summary> /// Ajusta as Linhas do Rodapé para serem impressas no cupom fiscal /// </summary> /// <param name="vlrImpostoAprox">Valor do imposto aproximado</param> /// <param name="vlrPercImpostoAprox">Valor do percentual do imposto aproximado</param> /// <param name="numeroDocumento">Número do documento(DAV-OS ou Nota Fiscal Manual(Bloquinho))</param> public string[] PreparaRodapeCupom(IVendaCF cupomFiscal, MD5 md5) { string[] result = new string[7]; string[] newtext = new string[7]; string tipoMovimento = string.Empty; string fonte = string.Empty; string mascara = string.Empty; fonte = String.Format("IBPT/{0}", Settings.EmpresaAtual.Enderecos.First(f => f.Principal == true).Endereco.Estado.UF.Sigla); double vlrImpostoImport = cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoImportado); double vlrImpostoFederal = cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoFederal); double vlrImpostoEstadual = cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoEstadual); double vlrImpostoMunicipal = cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoMunicipio); //Identifica o tipo do movimento vinculado ao cupom fiscal if (cupomFiscal.MovimentosVinculados.FirstOrDefault() != null) { switch (cupomFiscal.MovimentosVinculados.FirstOrDefault().Tipo) { case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.DAVOS: tipoMovimento = "DAV-OS"; break; case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.NotaFiscalManual: tipoMovimento = "NF"; break; case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.PreVenda: tipoMovimento = "PV"; break; case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.DAV: tipoMovimento = "DAV"; break; case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.NotaFiscalEletronica: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.CupomFiscal: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.NotaFiscalConsumidorEletronica: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.Sangria: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.Suprimento: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.Recebimento: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.LancamentoGeral: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.ContasPagar: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.ContasReceber: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.ValeTransporte: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.AdiantamentoFuncionario: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.PagamentoAoFornecedor: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.DevolucaoMercadoria: case OpenPOS.Enuns.Faturamento.Lancamento.Tipo.Voucher: default: tipoMovimento = string.Empty; break; } } //Atribuir os valores nas variáveis pré-definidas do rodapé do cupom fiscal foreach (Enuns.Configuracao.VariaveisRodapeECF item in Enum.GetValues(typeof(VariaveisRodapeECF)).Cast<VariaveisRodapeECF>()) { switch (item) { case VariaveisRodapeECF.TipoMovimento: newtext[0] = String.Format("{0}:{1}", tipoMovimento == string.Empty ? "" : tipoMovimento, tipoMovimento == string.Empty ? "" : cupomFiscal.MovimentosVinculados.FirstOrDefault().EGUID.ToString()); break; case VariaveisRodapeECF.Tributos: newtext[1] = String.Format("Importado: R$ {0:0.00} - Federal: R$ {1:0.00} - Estadual: R$ {2:0.00} - Municipal: R$ {3:0.00} - Fonte: {4}", cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoImportado), cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoFederal), cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoEstadual), cupomFiscal.Itens.Sum(s => s.ValorImpostoAproximadoMunicipio), fonte); break; case VariaveisRodapeECF.Vendedor: newtext[2] = Settings.UsuarioAtual.NomeFantasia; break; case VariaveisRodapeECF.Sistema: newtext[3] = String.Format("Sistema: {0}", Settings.SoftwareHouse.NomeApp); break; case VariaveisRodapeECF.Versao: newtext[4] = String.Format("Versão: {0}", Settings.SoftwareHouse.VersaoER); break; } } //Ajustes nas linhas do rodapé do cupom fiscal if (!String.IsNullOrEmpty(tipoMovimento)) { result[0] = ConfiguracaoRodape.Linha1 = ConfiguracaoRodape.Linha1.Replace("$TipoMovimento", newtext[0]); result[0] = result[0].Trim(); result[1] = ConfiguracaoRodape.Linha2 = ConfiguracaoRodape.Linha2.Replace("$Tributos", newtext[1]); result[1] = result[1].Trim(); result[2] = ConfiguracaoRodape.Linha3 = ConfiguracaoRodape.Linha3.Replace("$Vendedor", newtext[2]); result[2] = result[2].Trim(); result[3] = ConfiguracaoRodape.Linha4 = ConfiguracaoRodape.Linha4.Replace("$Sistema", newtext[3]).Replace("$Versão", newtext[4]); result[3] = result[3].Trim(); result[4] = ConfiguracaoRodape.Linha5; result[4] = result[4].Trim(); } else { result[0] = ConfiguracaoRodape.Linha1 = string.Empty; result[0] = ConfiguracaoRodape.Linha1 = ConfiguracaoRodape.Linha2.Replace("$Tributos", newtext[1]); result[0] = result[0].Trim(); result[1] = ConfiguracaoRodape.Linha2 = string.Empty; result[1] = ConfiguracaoRodape.Linha2 = ConfiguracaoRodape.Linha3.Replace("$Vendedor", newtext[2]); result[1] = result[1].Trim(); result[2] = ConfiguracaoRodape.Linha3 = string.Empty; result[2] = ConfiguracaoRodape.Linha3 = ConfiguracaoRodape.Linha4.Replace("$Sistema", newtext[3]).Replace("$Versão", newtext[4]); result[2] = result[2].Trim(); result[3] = ConfiguracaoRodape.Linha4 = string.Empty; result[3] = ConfiguracaoRodape.Linha4 = ConfiguracaoRodape.Linha5; result[3] = result[3].Trim(); result[4] = string.Empty; } result[5] = ConfiguracaoRodape.Linha6; result[5] = result[5].Trim(); result[6] = ConfiguracaoRodape.Linha7; result[6] = result[6].Trim(); return result; }