/// <summary> /// Método que persiste a nota fiscal no banco de dados e gera seu xml. Contém toda a regra de negócio da nota fiscal. /// </summary> /// <param name="pedido">Classe pedido com as informações da nota fiscal.</param> public void EmitirNotaFiscal(Pedido pedido) { var notaFiscal = new NotaFiscal(); notaFiscal.NumeroNotaFiscal = new Random().Next(Int32.MaxValue); notaFiscal.Serie = new Random().Next(Int32.MaxValue); notaFiscal.NomeCliente = pedido.NomeCliente; notaFiscal.EstadoOrigem = pedido.EstadoOrigem; notaFiscal.EstadoDestino = pedido.EstadoDestino; foreach (PedidoItem itemPedido in pedido.ItensDoPedido) { NotaFiscalItem notaFiscalItem = new NotaFiscalItem(); /* Aplicação do Cfop */ var notaFiscalCfop = new NotaFiscalCfop(); notaFiscalItem.Cfop = notaFiscalCfop.AplicarCfop(pedido.EstadoOrigem, pedido.EstadoDestino); /* ICMS */ if (notaFiscal.EstadoDestino == notaFiscal.EstadoOrigem) { notaFiscalItem.TipoIcms = "60"; notaFiscalItem.AliquotaIcms = 0.18; } else { notaFiscalItem.TipoIcms = "10"; notaFiscalItem.AliquotaIcms = 0.17; } /* Redução de base */ if (notaFiscalItem.Cfop == "6.009") { notaFiscalItem.BaseIcms = itemPedido.ValorItemPedido * 0.90; } else { notaFiscalItem.BaseIcms = itemPedido.ValorItemPedido; } notaFiscalItem.ValorIcms = notaFiscalItem.BaseIcms * notaFiscalItem.AliquotaIcms; notaFiscalItem.BaseIpi = itemPedido.ValorItemPedido; if (itemPedido.Brinde) { notaFiscalItem.TipoIcms = "60"; notaFiscalItem.AliquotaIcms = 0.18; notaFiscalItem.ValorIcms = notaFiscalItem.BaseIcms * notaFiscalItem.AliquotaIcms; notaFiscalItem.AliquotaIpi = 0; } else { notaFiscalItem.AliquotaIpi = 0.1; } notaFiscalItem.ValorIpi = notaFiscalItem.BaseIpi * notaFiscalItem.AliquotaIpi; notaFiscalItem.NomeProduto = itemPedido.NomeProduto; notaFiscalItem.CodigoProduto = itemPedido.CodigoProduto; /* Aplicação da regra de negócio do Desconto */ var desconto = new NotaFiscalDesconto(); notaFiscalItem.Desconto = desconto.AplicarDesconto(notaFiscal.EstadoDestino); notaFiscal.ItensDaNotaFiscal.Add(notaFiscalItem); } try { /* Persistência no XML */ if (NotaFiscalToXml.SaveNotaFiscalXml(notaFiscal)) { /* Persistência no Banco de Dados */ int idNota = _INotaFiscalRepository.GravarNotaFiscal(notaFiscal); foreach (var item in notaFiscal.ItensDaNotaFiscal) { item.IdNotaFiscal = idNota; _INotaFiscalRepository.GravarItemNotaFiscal(item); } } } catch (Exception ex) { throw ex; } }