Example #1
0
        public Domain.EstadoCFOP CarregarEstadoCFOP(string estadoOrigem, string estadoDestino)
        {
            using (SqlCommand cmd = new SqlCommand())
            {
                EstadoRepository     estadoRepository = new Data.EstadoRepository();
                List <Domain.Estado> estados          = estadoRepository.CarregarEstados();

                Domain.EstadoCFOP estadoCfop = null;

                Connection.Open();
                cmd.Connection  = Connection;
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.CommandText = "P_ESTADOCFOP_CARREGAR";
                cmd.Parameters.Add(new SqlParameter("@pEstadoOrigem", estadoOrigem));
                cmd.Parameters.Add(new SqlParameter("@pEstadoDestino", estadoDestino));

                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.Read())
                {
                    Domain.Estado estOrigem  = estados.Find(x => x.Sigla.Equals((string)reader["EstadoOrigem"]));
                    Domain.Estado estDestino = estados.Find(x => x.Sigla.Equals((string)reader["EstadoDestino"]));
                    string        codigoCfop = (string)reader["CodigoCFOP"];
                    string        descricao  = "";
                    if (System.Convert.IsDBNull(reader["Descricao"]))
                    {
                        descricao = (string)reader["Descricao"];
                    }

                    double      fatorBase = double.Parse(reader["FatorBase"].ToString());
                    Domain.CFOP cfop      = new Domain.CFOP(codigoCfop, descricao, fatorBase);

                    estadoCfop = new Domain.EstadoCFOP(estOrigem, estDestino, cfop);
                }

                Connection.Close();

                return(estadoCfop);
            }
        }
        public Domain.NotaFiscal GerarNotaFiscal(Domain.Pedido pedido)
        {
            // Geração da Nota Fiscal com base no pedido
            // Alteração do local do código por interpretação da responsabilidade das classes
            // A nova codificação exige uma consulta no banco e forçaria uma depencia
            if (pedido.NomeCliente.Trim().Length == 0)
            {
                throw new ServiceException("Nome do cliente não informado");
            }
            if (pedido.ItensDoPedido.Count == 0)
            {
                throw new ServiceException("Nenhum item adicionado ao pedido");
            }

            Domain.NotaFiscal notaFiscal = new NotaFiscal();

            notaFiscal.NumeroNotaFiscal = notaFiscalRepository.MaxNumeroNotaFiscal() + 1;
            notaFiscal.Serie            = new Random().Next(Int32.MaxValue);
            notaFiscal.NomeCliente      = pedido.NomeCliente;

            notaFiscal.EstadoOrigem  = pedido.EstadoOrigem.Sigla;
            notaFiscal.EstadoDestino = pedido.EstadoDestino.Sigla;

            Data.EstadoCFOPRepository estadoCFOPRepository = new Data.EstadoCFOPRepository();
            Domain.EstadoCFOP         estadoCfop           = estadoCFOPRepository.CarregarEstadoCFOP(notaFiscal.EstadoOrigem, notaFiscal.EstadoDestino);

            if (estadoCfop == null)
            {
                throw new ServiceException("Os estados de origem e destino selecionados não são permitidos");
            }

            foreach (PedidoItem itemPedido in pedido.ItensDoPedido)
            {
                NotaFiscalItem notaFiscalItem = new NotaFiscalItem();
                notaFiscalItem.Cfop = estadoCfop.CFOP.Codigo;

                if (notaFiscal.EstadoDestino == notaFiscal.EstadoOrigem)
                {
                    notaFiscalItem.TipoIcms     = "60";
                    notaFiscalItem.AliquotaIcms = 0.18;
                }
                else
                {
                    notaFiscalItem.TipoIcms     = "10";
                    notaFiscalItem.AliquotaIcms = 0.17;
                }

                notaFiscalItem.BaseIcms    = itemPedido.ValorItemPedido * estadoCfop.CFOP.FatorBase;
                notaFiscalItem.BaseIpi     = itemPedido.ValorItemPedido;
                notaFiscalItem.AliquotaIpi = 0.1;

                if (itemPedido.Brinde)
                {
                    notaFiscalItem.TipoIcms     = "60";
                    notaFiscalItem.AliquotaIcms = 0.18;
                    notaFiscalItem.AliquotaIpi  = 0;
                }


                notaFiscalItem.ValorIcms = notaFiscalItem.BaseIcms * notaFiscalItem.AliquotaIcms;
                notaFiscalItem.ValorIpi  = notaFiscalItem.BaseIpi * notaFiscalItem.AliquotaIpi;

                notaFiscalItem.Desconto = itemPedido.Desconto;

                notaFiscalItem.NomeProduto   = itemPedido.NomeProduto;
                notaFiscalItem.CodigoProduto = itemPedido.CodigoProduto;

                notaFiscal.ItensDaNotaFiscal.Add(notaFiscalItem);
            }


            // Geração do arquivo XML
            try
            {
                if (!Directory.Exists(DirXMLNotaFiscal))
                {
                    Directory.CreateDirectory(DirXMLNotaFiscal);
                }

                string        fileName             = String.Format("{0}{1}.xml", DirXMLNotaFiscal, notaFiscal.NumeroNotaFiscal);
                FileStream    notaFiscalStream     = File.Open(fileName, FileMode.Create);
                XmlSerializer notaFiscalSerializer = new XmlSerializer(notaFiscal.GetType());
                notaFiscalSerializer.Serialize(notaFiscalStream, notaFiscal);
                notaFiscalStream.Close();
            }
            catch (Exception e)
            {
                throw new ServiceException("Falha ao gerar arquivo XML", e);
            }

            // Gravar Nota Fiscal no banco de dados
            try
            {
                notaFiscalRepository.Salvar(notaFiscal);
            }
            catch (Exception e)
            {
                throw new ServiceException("Falha ao gravar no banco de dados", e);
            }

            return(notaFiscal);
        }