/mini-asaas

Projeto em duplas(trio) para a criação do mini-asaas.

Primary LanguageGroovy

🪽 Mini Asaas

⏳️ Status

Em andamento.

💻 Sobre o Mini Asaas

O "Mini Asaas" se trata de uma aplicação para controlar os recebíveis de uma empresa. Nela, estão contidas as seguintes funcionalidades:

  1. Cadastro de pagadores;
  2. Geração de cobranças;
  3. Confirmação de pagamento;
  4. Vencimento de cobranças;
  5. Esteira de exibição de notificações via e-mail;
  6. Gestão multi usuários.

Para cumprimento das especificações propostas, os Services foram implementados de maneira explícita, foi utilizado Spring Security para controle de contas do sistema, em todos os domínios foi salva a data de criação e nenhum registro foi deletado explicitamente, abordamos a técnica de soft delete.

O backend foi elaborado em 4 domínios, sendo eles: Customer, User, Payer e Payment e dois mecanismos: um para vencer cobranças e outro para notificar eventos via e-mail. A estrutura de manipulação foi composta por Domain, Service e Controller. Além disso, cada domínio salva informações pertinentes a sua funcionalidade.

A interface foi construída na plataforma Figma seguindo as boas práticas regidas pelo design UX/UI, composta principalmente pelas telas de cadastro, login, operações CRUD em pagador e cobrança, aba de notificações. Na etapa de implementação do frontend, utilizamos a biblioteca Atlas que nos foi disponibilizada.

🚧 Tecnologias Utilizadas

  • Grails 5.0.0
  • Java JVM 11.0.17
  • MySQL Database

🛠️ Clonando e executando o repositório

git clone https://github.com/TrioParadaDuraa/mini-asaas.git

cd [your-path]-mini-asaas

grails run-app
Setup do Banco de Dados
CREATE USER 'app'@'localhost' IDENTIFIED BY '/Jv*n4ipEr';
GRANT ALL ON `mini\_asaas`.* TO 'app'@'localhost';
REVOKE DROP ON `mini\_asaas`.* FROM 'app'@'localhost';

CREATE TABLE QRTZ_JOB_DETAILS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    JOB_CLASS_NAME   VARCHAR(250) NOT NULL,
    IS_DURABLE VARCHAR(1) NOT NULL,
    IS_NONCONCURRENT VARCHAR(1) NOT NULL,
    IS_UPDATE_DATA VARCHAR(1) NOT NULL,
    REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    JOB_NAME  VARCHAR(200) NOT NULL,
    JOB_GROUP VARCHAR(200) NOT NULL,
    DESCRIPTION VARCHAR(250) NULL,
    NEXT_FIRE_TIME BIGINT NULL,
    PREV_FIRE_TIME BIGINT NULL,
    PRIORITY INTEGER NULL,
    TRIGGER_STATE VARCHAR(16) NOT NULL,
    TRIGGER_TYPE VARCHAR(8) NOT NULL,
    START_TIME BIGINT NOT NULL,
    END_TIME BIGINT NULL,
    CALENDAR_NAME VARCHAR(200) NULL,
    MISFIRE_INSTR SMALLINT NULL,
    JOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
        REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);

CREATE TABLE QRTZ_SIMPLE_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    REPEAT_COUNT BIGINT NOT NULL,
    REPEAT_INTERVAL BIGINT NOT NULL,
    TIMES_TRIGGERED BIGINT NOT NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CRON_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    CRON_EXPRESSION VARCHAR(200) NOT NULL,
    TIME_ZONE_ID VARCHAR(80),
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  (          
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    STR_PROP_1 VARCHAR(512) NULL,
    STR_PROP_2 VARCHAR(512) NULL,
    STR_PROP_3 VARCHAR(512) NULL,
    INT_PROP_1 INT NULL,
    INT_PROP_2 INT NULL,
    LONG_PROP_1 BIGINT NULL,
    LONG_PROP_2 BIGINT NULL,
    DEC_PROP_1 NUMERIC(13,4) NULL,
    DEC_PROP_2 NUMERIC(13,4) NULL,
    BOOL_PROP_1 VARCHAR(1) NULL,
    BOOL_PROP_2 VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_BLOB_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    BLOB_DATA BLOB NULL,
    PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
    FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
        REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_CALENDARS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    CALENDAR_NAME  VARCHAR(200) NOT NULL,
    CALENDAR BLOB NOT NULL,
    PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);

CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_GROUP  VARCHAR(200) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);

CREATE TABLE QRTZ_FIRED_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    ENTRY_ID VARCHAR(95) NOT NULL,
    TRIGGER_NAME VARCHAR(200) NOT NULL,
    TRIGGER_GROUP VARCHAR(200) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    FIRED_TIME BIGINT NOT NULL,
    SCHED_TIME BIGINT NOT NULL,
    PRIORITY INTEGER NOT NULL,
    STATE VARCHAR(16) NOT NULL,
    JOB_NAME VARCHAR(200) NULL,
    JOB_GROUP VARCHAR(200) NULL,
    IS_NONCONCURRENT VARCHAR(1) NULL,
    REQUESTS_RECOVERY VARCHAR(1) NULL,
    PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);

CREATE TABLE QRTZ_SCHEDULER_STATE
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    INSTANCE_NAME VARCHAR(200) NOT NULL,
    LAST_CHECKIN_TIME BIGINT NOT NULL,
    CHECKIN_INTERVAL BIGINT NOT NULL,
    PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);

CREATE TABLE QRTZ_LOCKS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    LOCK_NAME  VARCHAR(40) NOT NULL, 
    PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);
Configuração para envio de email
  1. Navegue para o gerenciamento de conta do Google
  2. Na aba "Segurança", na seção "Como você faz login no Google", clique em "Verificação em duas etapas" e realize a autenticação solicitada
    • Se a verificação em duas etapas ainda não estiver ativada, você deve ativá-la para prosseguir
  3. Em "Senhas de app", digite um nome para identificar o MiniAsaas e guarde a senha que será gerada
  4. No arquivo application.groovy, adicione o código a seguir, substituindo os valores de username pelo seu email e password pela senha gerada no passo 3
grails.mail.host = "smtp.gmail.com"
grails.mail.port = 587
grails.mail.username = "seuemail@asaas.com.br"
grails.mail.password = "senha_gerada_etapa_6"
grails.mail.props = ["mail.smtp.ssl.trust": "smtp.gmail.com",
                    "mail.smtp.starttls.enable": "true",
                    "mail.smtp.ssl.protocols": "TLSv1.2",
                    "mail.smtp.protocol": "smtps",
                    "mail.smtp.channel": "plain",
                    "mail.smtp.auth": "true"]

Prontinho!
Agora é possível acessar a aplicação através da rota http://localhost:8080/

🗣 Informações Adicionais

Este projeto foi desenvolvido pelos estagiários do time de Talentos 2024 do Asaas, composto pelo trio João Victor Cardozo, Nayane Batista e Pedro da Silva. ♥