Na minha API tenho entidades 'Receita' e 'Despesa' com controllers, repository, services e records e suas respectivas tabelas no DB.
Nesses controllers tenho o CRUD completo de cada uma delas, e uma requisição mais específica que é para buscar receitas/despesas com base no ano e mês.
@GetMapping("/{ano}/{mes}") public List findByData(@PathVariable("ano") String ano, @PathVariable("mes") String mes) {
List<Receita> date = receitasService.findByData(ano, mes);
return date;
}
Agora preciso criar um novo endpoint para /resumo/{ano}/{mes}. que retorna:
Valor total das receitas no mês
Valor total das despesas no mês
Saldo final no mês
Valor total gasto no mês em cada uma das categorias
Mas o que pensei foi que não pode estar em um dos meus dois controllers pois está relacionado as duas entidades e não só a uma. Sendo assim eu teria que criar outro controller, certo? Isso quer dizer outra entidade com repositórios, services e etc também?
Pensando nisso criei a entidade ResumoMensal, criei os controlllers e etc mas recebo ** Column 'id' not found** como erro.
Estou no caminho certo? Devo criar mesmo uma entidade e fazer esses relacionamentos OneToOne como fiz ? Ou devo criar uma classe DAO e usar jpql, entity manager etc?
Já tenho ideia da minha query:
```
@Query(value = "SELECT SUM(r.valor) AS total_receitas, SUM(d.valor) AS total_despesas, SUM(r.valor) - SUM(d.valor) AS saldo_final" +
" FROM receitas r, despesas d WHERE d.ano = :ano and d.mes = :mes GROUP BY d.categoria", nativeQuery = true)
```
mas implementando ela num repository assim recebo erro.. não sei se deveria ir para o caminho de JPQL.
Devo mesmo ter uma terceira entidade relacionada as outras duas?
Como posso prosseguir??
package br.com.rfapi.rendafamiliarapi.model;
import br.com.rfapi.rendafamiliarapi.controller.ReceitasController;
import br.com.rfapi.rendafamiliarapi.service.DadosCadastraisReceitas;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import javax.validation.valueextraction.ExtractedValue;
import java.time.LocalDate;
import java.time.Month;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@Table(name = "receitas")
@Entity(name = "Receita")
@Setter
@Getter
@NoArgsConstructor
@EqualsAndHashCode(of = "receita_id")
public class Receita {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long receita_id;
private String descricao;
private String valor;
@JsonFormat(pattern = "dd/MM/yyyy")
private LocalDate data;
@JsonIgnore
private String ano;
@JsonIgnore
private String mes;
@OneToOne
@JoinColumn(name = "resumo_mensal_id")
private ResumoMensal resumoMensal;
public Receita(DadosCadastraisReceitas dados) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
this.descricao = dados.descricao();
this.valor = dados.valor();
this.data = dados.data();
this.ano = dados.ano();
this.mes = dados.mes();
}
public Receita(Receita receita) {
}
}
```package br.com.rfapi.rendafamiliarapi.model;
import br.com.rfapi.rendafamiliarapi.controller.ReceitasController; import br.com.rfapi.rendafamiliarapi.infra.Categoria; import br.com.rfapi.rendafamiliarapi.service.DadosCadastraisDespesas; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.*;
import javax.persistence.*; import java.time.LocalDate;
@Table(name = "despesas") @Getter @Setter @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(of = "despesa_id") @Entity(name = "Despesa") public class Despesa {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long despesa_id;
private String descricao;
private String valor;
@JsonFormat(pattern = "dd/MM/yyyy")
private LocalDate data;
@Enumerated(EnumType.STRING)
private Categoria categoria;
@JsonIgnore
private String ano;
@JsonIgnore
private String mes;
@ManyToOne
@JoinColumn(name = "resumo_mensal_id")
private ResumoMensal resumoMensal;
public Despesa(DadosCadastraisDespesas dados) {
this.descricao = dados.descricao();
this.valor = dados.valor();
this.data = dados.data();
this.categoria = dados.categoria();
this.ano = dados.ano();
this.mes = dados.mes();
}
}
`