Skip to content

Repository files navigation

Projeto final: Paynow - Treinadev 6

Sobre

Uma escola de programação, a CodePlay, decidiu lançar uma plataforma de cursos online de programação. Você já está trabalhando nesse projeto e agora vamos começar uma nova etapa: uma ferramenta de pagamentos capaz de configurar os meios de pagamentos e registrar as cobranças referentes a cada venda de curso na CodePlay. O objetivo deste projeto é construir o mínimo produto viável (MVP) dessa plataforma de pagamentos. Na plataforma de pagamentos temos dois perfis de usuários: os administradores da plataforma e os donos de negócios que querem vender seus produtos por meio da plataforma, como as pessoas da CodePlay, por exemplo. Os administradores devem cadastrar os meios de pagamento disponíveis, como boletos bancários, cartões de crédito, PIX etc, especificando detalhes de cada formato. Administradores também podem consultar os clientes da plataforma, consultar e avaliar solicitações de reembolso, bloquear compras por suspeita de fraudes etc. Já os donos de negócios devem ser capazes de cadastrar suas empresas e ativar uma conta escolhendo quais meios de pagamento serão utilizados. Devem ser cadastrados também os planos disponíveis para venda, incluindo seus valores e condições de desconto de acordo com o meio de pagamento. E a cada nova venda realizada, devem ser armazenados dados do cliente, do produto selecionado e do meio de pagamento escolhido. Um recibo deve ser emitido para cada pagamento e esse recibo deve ser acessível para os clientes finais, alunos da CodePlay no nosso contexto. A seguir, estão detalhadas as funcionalidades básicas para o funcionamento da plataforma. Logo depois, são apresentadas funcionalidades extras que você pode codificar, caso tenha tempo ou até mesmo após o fim do prazo estabelecido para entrega do projeto, como forma de desafio.

Conteudo

=================

Instalação

Pré-requisitos

Antes de começar, você vai precisar ter instalado em sua máquina as seguintes ferramentas: Git, Ruby 3.0.1, Rails 6.1.3.2, Yarn.

Além disto é bom ter um editor para trabalhar com o código como VSCode

# Clone este repositório
$ git clone <https://github.com/ventopreto/paynow.git>
 
# Acesse a pasta do projeto no terminal/cmd
$ cd paynow
 
# Instale as dependências
$ bin/setup
 
# Criação do Banco de dados
$ rails db:migrate
 
# Execute a aplicação em modo de desenvolvimento
$ rails s
 
# O servidor iniciará na porta:3000 - acesse <http://localhost:3000>

Como usar

Com o servidor rodando visite http://localhost:3000/ No sistema podemos criar 2 tipos de usuário: Administradores e Clientes, o primeiro é criado via console, para acessar o console use o comando abaixo.

rails c

Em seguida crie o administrador utilizando

Admin.create(email: 'teste@paynow.com.br', password:'123456')

O 'teste' pode ser substituído por qualquer outra palavra, mas o que vem depois de @ obrigatoriamente precisa ser paynow.com.br, do contrário não será possível fazer login. Para fazer login como administrador visite http://localhost:3000/admins/sign_in utilize o email e senha criados acima.

A criação de um cliente pode ser feita acessando http://localhost:3000/ e clicando em 'Cadastre-se', preencha o formulário, emails com domínio @gmail, @yahoo, @hotmail, não são emails validos. Uma vez logado, o usuário pode cadastrar sua empresa.

Features

  • Acesso de Administradores
  • Cadastro de Meios de Pagamento
  • Acesso de Clientes
  • Token de Integração
  • Administração de Clientes
  • Gestão de Meios de Pagamento (Cliente)
  • Cadastro de Produtos (Cliente)
  • Endpoint de Criação de Token de Cliente Final (Cliente do cliente)
  • Endpoint para emissão de cobrança
  • Confirmação Manual de Pagamentos
  • Emissão de Recibos
  • API para consulta de cobranças
  • Cliente consulta cobranças

Testes

Para rodar todos os testes utilize o comando

rspec

Também é possível rodar os testes em grupos específicos, basta passar o caminho do grupo de testes desejado. Exemplo: para rodar todos os teste referentes ao usuário basta utilizar

rspec ./spec/system/user/

🛠Tecnologias

As seguintes ferramentas foram usadas na construção do projeto:

gem's utilizadas:

Autenticação:

Testes:

API

Criando um Usuário Final

  POST /api/v1/end_user

O nosso endpoint acima espera receber uma requisição com os seguintes parâmetros

{
"cpf": "12345678910",
"fullname": "Test2e",
"company_token": "vdjTMxzbOSmn/UWcU4ii"
}

Se os parâmetros estão corretos e válidos, o usuário final é criando e a requisição retorna o status 201.

Erros Comuns

Ausencia de parâmetro

  POST /api/v1/end_user

A mesma requisição do exemplo anterior, sem o fullname

{
"cpf": "12345678910",
"company_token": "vdjTMxzbOSmn/UWcU4ii"
}

Nesse caso como um dos parâmetros estão faltando, a requisição retorna com status 422 e uma mensagem informando que fullname não pode ficar em branco.

{
"cpf": "12345678910",
"fullname": "Fulano Sicrano"
}

Json Vazio

  POST /api/v1/end_user
{
 
}

No caso de uma requisição vazia a requisição retorna com o status 412 e a mensagem "Parâmetros inválidos"

Criando uma cobrança

POST /api/v1/charges

Esse endpoint aceita 3 tipos de pagamento(Boleto, Pix e Cartão de Crédito), cada um desses precisa de payment_category, que nada mais é do que o tipo de pagamento, o token da empresa, o token do produto , o token do usuário final e o payment que é o id da forma de pagamento, alguns pagamentos precisam de dados específicos no caso do boleto, precisamos passar o endereço.

Exemplo Cobrança com Boleto

{
   "charge":{
      "end_user_token":"ClfFnjd2JaZZ5xkohwKQ",
      "product_token":"UcLLU/ECpEnqHQsPjyd7Zu8nWew=",
      "company_token":"xGUHEgfprzTl7w4xOiZF",
		 	"payment":"1",
      "address":"Rua tal 42",
			"payment_category":"Boleto"}
}

A cobrança via boleto é criada e retorna com um status 201

Exemplo Cobrança com Pix

{
   "charge":{
      "end_user_token":"ClfFnjd2JaZZ5xkohwKQ",
      "product_token":"UcLLU/ECpEnqHQsPjyd7Zu8nWew=",
      "company_token":"xGUHEgfprzTl7w4xOiZF",
		 	"payment":"1",
			"payment_category":"Pix"}
}

A cobrança via pix é criada e retorna com um status 201

No caso do pix nenhum parâmetro adicional precisa ser passado

Exemplo requisição com Cartão de Crédito

{
   "charge":{
      "end_user_token":"ClfFnjd2JaZZ5xkohwKQ",
      "product_token":"UcLLU/ECpEnqHQsPjyd7Zu8nWew=",
      "company_token":"xGUHEgfprzTl7w4xOiZF",
		 	"payment":"1",
		 	"cardholder_name": "Fulano Sicrano",
		 	"cvv": "123",
		 	"credit_card_number": "1234567890123456",
			"payment_category":"Cartão"}
}

No caso da cobrança via cartão são necessários 3 parâmetros: cvv, nome impresso no cartão e número do cartão

Erros Comuns

Ausência de parâmetro

Nesse exemplo faço a mesma requisição para o cartão de Crédito sem passar o cvv

{
    "charge":{
        "end_user_token":"PPBGLaVLaueRh57i4TUcx24x",
        "product_token":"Si5u0LtQivzI83JgqYDVxhqeuiE=",
        "company_token":"gsVXGugQDyuzfY4dfEIGx5Vod4g=",
        "payment":"1",
        "payment_category": "Cartão",
        "cardholder_name": "Fulano Sicrano",
        "credit_card_number": "1234567890123456",
                }
}

Como um dos parâmetros está faltando a requisição vai retornar com o status 422

Json Vazio

{
 
}

Nesse exemplo é a requisição retorna com o status 412, dado que os parâmetros estão inválidos

Consultando cobranças

GET /api/v1/charges

É possivel consultar cobranças usando o tipo de pagamento(payment_category) ou data de vencimento(billing_due_date)

Exemplo de consulta de cobrança por data de vencimento

		{
        "charge":{
				  "billing_due_date": "26/06/2021"
         }
     }

A requisição é feita com sucesso e retorna uma lista de cobranças em json e status 200

[
  {
    "end_user_id": 1,
    "company_id": 1,
    "product_id": 1,
    "token": "ii3IM7dAtSY97s9p1Mlf",
    "status": "pendente",
    "original_value": "450.0",
    "value_with_discount": "405.0",
    "boleto_id": 1,
    "pix_id": null,
    "credit_card_id": null,
    "payment_method_id": 2,
    "credit_card_number": null,
    "cardholder_name": null,
    "cvv": null,
    "payment_category": "Boleto",
    "address": "Rua tal 42",
    "effective_payment_date": null,
    "payment_attempt_date": null,
    "last_status": null,
    "billing_due_date": "26/06/2021"
  }
]

Exemplo de consulta de cobrança por tipo de pagamento

		{
        "charge":{
					"payment_category": "1"
         }
     }

A requisição é feita com sucesso e retorna uma lista de cobranças em json e status 200

    [
  {
    "end_user_id": 1,
    "company_id": 1,
    "product_id": 1,
    "token": "beeEycu/roFK+aXGHPNI",
    "status": "pendente",
    "original_value": "450.0",
    "value_with_discount": "405.0",
    "boleto_id": 1,
    "pix_id": null,
    "credit_card_id": null,
    "payment_method_id": 2,
    "credit_card_number": null,
    "cardholder_name": null,
    "cvv": null,
    "payment_category": "Boleto",
    "address": "Rua tal 42",
    "effective_payment_date": "2021-06-20",
    "payment_attempt_date": "2021-06-22",
    "last_status": "01 Pendente de cobrança",
    "billing_due_date": null
  },
  {
    "end_user_id": 1,
    "company_id": 1,
    "product_id": 1,
    "token": "Hl6uVCpfLx3fJuND4m5H",
    "status": "aprovada",
    "original_value": "450.0",
    "value_with_discount": "405.0",
    "boleto_id": 1,
    "pix_id": null,
    "credit_card_id": null,
    "payment_method_id": 2,
    "credit_card_number": null,
    "cardholder_name": null,
    "cvv": null,
    "payment_category": "Boleto",
    "address": "Rua tal 42",
    "effective_payment_date": "2021-06-22",
    "payment_attempt_date": "2021-06-22",
    "last_status": "05 Cobrança efetivada com sucesso",
    "billing_due_date": null
  }
     ]

Exemplo de consulta de cobrança com parametros invalidos

		{
        "charge":{
					"payment_category": ""
         }
     }

A requisição falha e retorna um json com o erro e mensagem "Parâmetros inválidos" e status 412

{
  "errors": "Parâmetros inválidos"
}

Exemplo de consulta de cobrança com dados que não existem

		{
        "charge":{
					"billing_due_date": "26/06/2042"
         }
     }

Como não existem cobranças com essa data de vencimento a requisição falha e retorna o status 404

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages