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.
=================
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>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 cEm 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.
- 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
Para rodar todos os testes utilize o comando
rspecTambé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/As seguintes ferramentas foram usadas na construção do projeto:
gem's utilizadas:
Autenticação:
Testes:
POST /api/v1/end_userO 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.
POST /api/v1/end_userA 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"
} 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"
POST /api/v1/chargesEsse 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.
{
"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
{
"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
{
"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
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
{
}Nesse exemplo é a requisição retorna com o status 412, dado que os parâmetros estão inválidos
GET /api/v1/chargesÉ possivel consultar cobranças usando o tipo de pagamento(payment_category) ou data de vencimento(billing_due_date)
{
"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"
}
] {
"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
}
] {
"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"
} {
"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