
Introdução
Neste Screencast, dividido em 5 partes, nós vamos criar um sistema administrativo completo usando Rails Admin, neste exemplo vamos criar uma plataforma para que uma empresa possa gerenciar as vendas do seus representantes comerciais com dois tipos de usuário: gerente e vendedor. O vendedor poderá entrar com novas vendas, clientes e ver as suas comissões, o gerente poderá criar produtos, descontos e outros usuários.
Também vamos aprender a implementar uma série de features úteis e comuns à maioria dos APPs como autenticação usando Devise, autorização usando CanCanCan, filtro de registros baseado em quem é o dono deles, upload de fotos, customização da aparência e exportação de dados para PDF usando gráficos.
Este é o primeiro tutorial do OneBitCode dividido em vários episódios em vídeos para aumentar o detalhamento e simplificar a explicação, então se você gostar desse formato deixa um feedback ainda em baixo para eu saber e produzir mais conteúdo como este.
Episódios
-
- Criando a estrutura do nosso Projeto + Seed (assistir)
- Autenticação + Autorização + Filtrando os resultados (assistir)
- Incluindo fotos + Atribuição automática de comissão (assistir)
- Configurando o Rails Admin + Customizando a aparência (assistir)
- Exportando para PDF com gráficos + Testando tudo isto (disponível)
O que vamos Aprender?
-
- Como criar um sistema administrativo
- Como implementar a autenticação
- Como implementar a autorização
- Como filtrar para que os vendedores vejam apenas seus próprios clientes, vendas e comissões
- Adicionando comissão automaticamente
- Como receber fotos no nosso sistema administrativo
- Como customizar a aparência do nosso sistema administrativo
- Como exportar para PDF e gerar gráficos (Neste episódio)
Ingredientes
-
- Ruby on Rails
- Sqlite3 (Mas você pode usar outro Database :))
- Gem: Rails Admin
- Gem: Rails Admin Rollincode
- Gem: Devise
- Gem: CanCanCan
- Gem: Carrierwave
Lista de comandos utilizados no Screencast parte 5
-
- Crie o arquivo “rails_admin_pdf.rb” no seguinte path “/lib/rails_admin” e coloque este conteúdo:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155module RailsAdminPdfendrequire 'rails_admin/config/actions'require 'prawn'require 'gruff'module RailsAdminmodule Configmodule Actionsclass Pdf < Base RailsAdmin::Config::Actions.register(self) register_instance_option :member do true end register_instance_option :pjax? do false end register_instance_option :controller do Proc.new do # Configurando PDF PDF_OPTIONS = { :page_size => "A4",:page_layout => :portrait,:margin => [40, 75]}# Configurando Retornoramdom_file_name = (0...8).map { (65 + rand(26)).chr }.joinPrawn::Document.new(PDF_OPTIONS) do |pdf|pdf.fill_color "666666"pdf.text "Relatório do Representante", :size => 32, :style => :bold, :align => :centerpdf.move_down 80pdf.text "Dados Pessoais", :size => 14, :align => :justify, :inline_format => true, :style => :boldpdf.move_down 14if @object.namepdf.text "Nome: #{@object.name}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 8endif @object.documentpdf.text "Documento: #{@object.document}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 8endif @object.kindpdf.text "Tipo: #{@object.kind}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 8endif @object.statuspdf.text "Status: #{@object.status}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 8endif @object.emailpdf.text "Email: #{@object.email}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 8endpdf.move_down 20if @object.comissions.where(status: :pending).count > 0pdf.text "Comissões Pendentes", :size => 14, :align => :justify, :inline_format => true, :style => :boldpdf.move_down 14total = 0@object.comissions.where(status: :pending).each do |c|pdf.text "Id #{c.id}, valor R$#{c.value}, gerada em #{c.created_at.strftime("%d/%m/%y as %H:%M")}",:size => 12, :align => :justify, :inline_format => truepdf.move_down 8total += c.valueendpdf.move_down 10pdf.text "Total: R$#{total}", :size => 12, :align => :justify, :inline_format => truepdf.move_down 20endif @object.clients.count > 0pdf.text "Clientes Ativos", :size => 14, :align => :justify, :inline_format => true, :style => :boldpdf.move_down 14total = 0@object.clients.each do |c|pdf.text "#{c.name}",:size = 12, :align = :justify, :inline_format = true, :style = :boldpdf.move_down 8pdf.text "Da empresa: #{c.company_name}",:size = 12, :align = :justify, :inline_format = truepdf.move_down 8pdf.text "Cliente desde #{c.created_at.strftime("%d/%m/%y as %H:%M")}",:size = 12, :align = :justify, :inline_format = truepdf.move_down 8total += 1endpdf.move_down 10pdf.text "Total: #{total}", :size = 12, :align = :justify, :inline_format = truepdf.move_down 20endif @object.sales.count 0# Cria o objeto Gruffg = Gruff::Pie.new 900g.theme = Gruff::Themes::PASTEL# Aqui ele formata nossos dadossales_values = {}@object.sales.each do |sale|calc = 0sale.product_quantities.each {|p| calc += p.product.price * p.quantity}sales_values[sale.client.name] = (sales_values[sale.client.name])? sales_values[sale.client.name] + calc : calcendsales_values.each {|key, value| g.data(key, value)}# Gera a imagem no diretório público (você pode escolher onde gerar)g.write('public/graph.jpg')pdf.start_new_pagepdf.text "Gráfico de Vendas", :size = 20, :style = :bold, :align = :center# Incluir o gráfico numero 2pdf.image "public/graph.jpg", :scale = 0.50end# Muda de font para Helveticapdf.font "Helvetica"# Inclui um texto com um link clicável (usando a tag link) no bottom da folha do lado esquerdo e coloca uma cor especifica nessa parte (usando a tag color)pdf.text "Link Para o Manul do Prawn clicável", :size = 10, :inline_format = true, :valign = :bottom, :align = :left# Inclui em baixo da folha do lado direito a data e o némero da página usando a tag pagepdf.number_pages "Gerado: #{(Time.now).strftime("%d/%m/%y as %H:%M")} - Página ", :start_count_at = 0, :page_filter = :all, :at = [pdf.bounds.right - 140, 7], :align = :right, :size = 8# Gera no nosso PDF e coloca na pasta public com o nome agreement.pdfpdf.render_file("public/#{ramdom_file_name}.pdf")endFile.open("public/#{ramdom_file_name}.pdf", 'r') do |f|send_data f.read.force_encoding('BINARY'), :filename = 'pdf', :type = "application/pdf", :disposition = "attachment"endFile.delete("public/#{ramdom_file_name}.pdf")File.delete("public/graph.jpg") if @object.sales.count 0endendregister_instance_option :link_icon do'fa fa-file-pdf-o'endendendendend - Agora no seu Gemfile adicione:
1234# Gem para gerar os pdfsgem 'prawn-rails'# Gem para gerar os gráficosgem 'gruff' - Para instalar as dependencias da Gem Gruff caso você esteja no Ubuntu rode no console:
1sudo apt-get install imagemagick libmagickcore-dev libmagickwand-dev - Caso você esteja no Mac, rode:
1brew install imagemagick - Para instalar as Gems, rode no console:
1bundle - Agora coloque no seu arquivo de configuração do Rails Admin “/config/initializers/rails_admin.rb” o seguinte conteúdo:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176RailsAdmin.config do |config|require Rails.root.join('lib', 'rails_admin', 'rails_admin_pdf.rb')RailsAdmin::Config::Actions.register(RailsAdmin::Config::Actions::Pdf)### Popular gems integration## == Devise ==config.authenticate_with dowarden.authenticate! scope: :userendconfig.current_user_method(&¤t_user)## == Cancan ==config.authorize_with :cancan## == Pundit ==# config.authorize_with :pundit## == PaperTrail ==# config.audit_with :paper_trail, 'User', 'PaperTrail::Version' # PaperTrail = 3.0.0### More at https://github.com/sferik/rails_admin/wiki/Base-configuration## == Gravatar integration ==## To disable Gravatar integration in Navigation Bar set to false# config.show_gravatar trueconfig.navigation_static_links = {'OneBitCode' = 'https://onebitcode.com'}config.navigation_static_label = "Lins Úteis"config.main_app_name = ["Representantes Comerciais", ""]config.model Sale donavigation_icon 'fa fa-money'create dofield :clientfield :sale_datefield :discountfield :notesfield :product_quantitiesfield :user_id, :hidden dodefault_value dobindings[:view]._current_user.idendendendedit dofield :clientfield :sale_datefield :discountfield :notesfield :product_quantitiesfield :user_id, :hidden dodefault_value dobindings[:view]._current_user.idendendendendconfig.model Client docreate dofield :namefield :company_namefield :documentfield :emailfield :phonefield :notesfield :statusfield :addressfield :user_id, :hidden dodefault_value dobindings[:view]._current_user.idendendendedit dofield :namefield :company_namefield :documentfield :emailfield :phonefield :notesfield :statusfield :addressfield :user_id, :hidden dodefault_value dobindings[:view]._current_user.idendendendlist dofield :namefield :company_namefield :documentfield :emailfield :phonefield :notesfield :statusfield :addressendendconfig.model Discount doparent Productendconfig.model Sale doparent Userweight -2endconfig.model Comission doparent Userweight -1endconfig.model Client doparent Userendconfig.model ProductQuantity dovisible falseendconfig.model Address dovisible falseendconfig.model ProductQuantity doedit dofield :productfield :quantityfield :user_id, :hidden dodefault_value dobindings[:view]._current_user.idendendendendconfig.actions dodashboard # mandatoryindex # mandatorynewexportbulk_deleteshoweditdeleteshow_in_apppdf doonly Userend## With an audit adapter, you can add:# history_index# history_showendend - Pronto \o/
- Crie o arquivo “rails_admin_pdf.rb” no seguinte path “/lib/rails_admin” e coloque este conteúdo:

Não perca nenhum conteúdo
Receba nosso resumo semanal com os novos posts, cursos, talks e vagas o/
Conclusão – Parte 5
Nesta parte nós aprendemos como criar uma custom action capaz de exportar em PDF um resumo sobre os vendedores com um gráfico. Este foi o último vídeo desta parte da nossa série (Pode ser que tenhamos uma segundo parte onde vamos colocar o site no ar permitindo que as empresas usem o sistema), então se você quer uma segunda parte comente ai em báixo :).
Obrigado por acompanhar nossa primeira série, logo teremos mais como esta para trazer ainda mais conteúdos para você \o/
Veja as partes anteriores da série:
Você pode ver o código completo acessando o projeto no Github dating agencies preston lancashire e escolhendo a branch “Part5”, aproveita e me segue lá também 🙂
Muito Obrigado por acompanhar este Blog!
Sua presença aqui é uma honra para mim,
Abraço,
Leonardo Scorza.
Primeira vez no OneBitCode? Curtiu esse conteúdo?
O OneBitCode tem muito mais para você!
O OneBitCode traz conteúdos de qualidade, e em português, sobre programação com foco em Ruby on Rails e também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!
Fique por dentro de todos os conteúdos o/
Nossas redes sociais:
📹 • https://onebitcode.com/dating-sites-pakistani/ [Live todas as terças-feiras às 19h)
💻 • https://onebitcode.com/ex-girlfriend-dating-your-friend/
🙂 • https://facebook.com/onebitcode
📱 • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode
Nossos cursos:
🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
⚙ • Minicurso: API Rails 5 Completo
🐞 • Minicurso de Testes para Ruby on Rails com RSpec
Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
Estamos aqui para você 🙂
Bem-vindo à família OneBitCode o/