Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue #28: Ruta za glavnu knjigu #67

Merged
merged 9 commits into from
Apr 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion src/main/java/rs/raf/demo/bootstrap/BootstrapData.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import rs.raf.demo.repositories.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

Expand All @@ -24,14 +25,27 @@ public class BootstrapData implements CommandLineRunner {
private final FakturaRepository fakturaRepository;
private final PreduzeceRepository preduzeceRepository;
private final PasswordEncoder passwordEncoder;
private final KontnaGrupaRepository kontnaGrupaRepository;
private final KontoRepository kontoRepository;
private final KnjizenjeRepository knjizenjeRepository;

@Autowired
public BootstrapData(UserRepository userRepository,FakturaRepository fakturaRepository, PreduzeceRepository preduzeceRepository, PermissionRepository permissionRepository, PasswordEncoder passwordEncoder) {
public BootstrapData(UserRepository userRepository,
FakturaRepository fakturaRepository,
PermissionRepository permissionRepository,
PasswordEncoder passwordEncoder,
KontoRepository kontoRepository,
KontnaGrupaRepository kontnaGrupaRepository,
KnjizenjeRepository knjizenjeRepository,
PreduzeceRepository preduzeceRepository) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
this.permissionRepository = permissionRepository;
this.fakturaRepository = fakturaRepository;
this.preduzeceRepository = preduzeceRepository;
this.kontoRepository = kontoRepository;
this.kontnaGrupaRepository = kontnaGrupaRepository;
this.knjizenjeRepository = knjizenjeRepository;
}

private Preduzece getDefaultPreduzece(){
Expand Down Expand Up @@ -123,11 +137,51 @@ public void run(String... args) throws Exception {
Faktura f4 = getDefaultFaktura();
f4.setIznos(4000.00);


this.fakturaRepository.save(f1);
this.fakturaRepository.save(f2);
this.fakturaRepository.save(f3);
this.fakturaRepository.save(f4);

KontnaGrupa kg1 = new KontnaGrupa();
kg1.setBrojKonta("0");
kg1.setNazivKonta("Naziv kontne grupe 0");
KontnaGrupa kg2 = new KontnaGrupa();
kg2.setBrojKonta("1");
kg2.setNazivKonta("Naziv kontne grupe 1");
this.kontnaGrupaRepository.save(kg1);
this.kontnaGrupaRepository.save(kg2);

Knjizenje knj1 = new Knjizenje();
knj1.setDatumKnjizenja(new Date());
Knjizenje knj2 = new Knjizenje();
knj2.setDatumKnjizenja(new Date());
this.knjizenjeRepository.save(knj1);
this.knjizenjeRepository.save(knj2);

Konto k1 = new Konto();
k1.setDuguje(200.0);
k1.setPotrazuje(300.0);
k1.setKontnaGrupa(kg1);
k1.setKnjizenje(knj1);
Konto k2 = new Konto();
k2.setDuguje(800.0);
k2.setPotrazuje(1300.0);
k2.setKontnaGrupa(kg2);
k2.setKnjizenje(knj1);
Konto k3 = new Konto();
k3.setDuguje(500.0);
k3.setPotrazuje(300.0);
k3.setKontnaGrupa(kg1);
k3.setKnjizenje(knj2);
Konto k4 = new Konto();
k4.setDuguje(1200.0);
k4.setPotrazuje(300.0);
k4.setKontnaGrupa(kg2);
k4.setKnjizenje(knj2);

this.kontoRepository.saveAll(Arrays.asList(k1, k2, k3, k4));

log.info("Data loaded!");
}
}
46 changes: 46 additions & 0 deletions src/main/java/rs/raf/demo/controllers/GlavnaKnjigaController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package rs.raf.demo.controllers;

import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import rs.raf.demo.model.Konto;
import rs.raf.demo.services.impl.KontoService;
import rs.raf.demo.utils.ApiUtil;
import rs.raf.demo.utils.SearchUtil;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;


@CrossOrigin
@RestController
@SecurityRequirement(name = "bearerAuth")
@RequestMapping("/api/glavna-knjiga")
public class GlavnaKnjigaController {
gojkovicmatija99 marked this conversation as resolved.
Show resolved Hide resolved

private final KontoService kontoService;
private final SearchUtil<Konto> searchUtil;

public GlavnaKnjigaController(KontoService kontoService) {
this.kontoService = kontoService;
this.searchUtil = new SearchUtil<>();
}

@GetMapping(value = "/{kontnaGrupa}",
produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<?> getPreduzeceById(
@PathVariable("kontnaGrupa") String kontnaGrupa,
@RequestParam(name = "search", required = false, defaultValue = "") String search,
@RequestParam(defaultValue = ApiUtil.DEFAULT_PAGE) @Min(ApiUtil.MIN_PAGE) Integer page,
@RequestParam(defaultValue = ApiUtil.DEFAULT_SIZE) @Min(ApiUtil.MIN_SIZE) @Max(ApiUtil.MAX_SIZE) Integer size,
@RequestParam(defaultValue = "kontoId") String[] sort
) {
Pageable pageSort = ApiUtil.resolveSortingAndPagination(page, size, sort);
if (search.length() > 0) search += ",";
Specification<Konto> spec = this.searchUtil.getSpec(search + "kontnaGrupa:" + kontnaGrupa + ",");
return ResponseEntity.ok(this.kontoService.findAllGlavnaKnjigaResponse(spec, pageSort));
}
}
27 changes: 27 additions & 0 deletions src/main/java/rs/raf/demo/converter/KontoConverter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package rs.raf.demo.converter;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.stereotype.Component;
import rs.raf.demo.model.Konto;
import rs.raf.demo.responses.GlavnaKnjigaResponse;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class KontoConverter {

public Page<GlavnaKnjigaResponse> convert(List<Konto> kontoList) {
return new PageImpl<>(kontoList.stream().map(
konto -> new GlavnaKnjigaResponse(
konto.getKnjizenje().getKnjizenjeId(),
konto.getKnjizenje().getDatumKnjizenja(),
konto.getPotrazuje(),
konto.getDuguje(),
konto.getDuguje() - konto.getPotrazuje(),
konto.getKontnaGrupa().getNazivKonta(),
konto.getKontnaGrupa().getBrojKonta())
).collect(Collectors.toList()));
}
}
2 changes: 0 additions & 2 deletions src/main/java/rs/raf/demo/model/Konto.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import lombok.Setter;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;

@Entity
@Getter
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/rs/raf/demo/relations/KontnaGrupaRelations.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package rs.raf.demo.relations;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Root;

public class KontnaGrupaRelations<T> extends ForeignKeyRelations<T> {
public KontnaGrupaRelations(Root<T> root, CriteriaBuilder builder, String key, String val) {
super(root, builder, key, val);
idExpression = root.get(key).get("brojKonta").as(Long.class);
}
}
14 changes: 14 additions & 0 deletions src/main/java/rs/raf/demo/repositories/KontoRepository.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
package rs.raf.demo.repositories;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import rs.raf.demo.model.Konto;

import java.util.List;

@Repository
public interface KontoRepository extends JpaRepository<Konto, Long> {

public List<Konto> findAll();

List<Konto> findKontoByKontnaGrupaBrojKonta(String kontnaGrupaId);

List<Konto> findAll(Specification<Konto> spec);

Page<Konto> findAll(Specification<Konto> spec, Pageable pageSort);

}
18 changes: 18 additions & 0 deletions src/main/java/rs/raf/demo/responses/GlavnaKnjigaResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package rs.raf.demo.responses;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Date;

@Data
@AllArgsConstructor
public class GlavnaKnjigaResponse {
Long brojNaloga;
Date datum;
Double potrazuje;
Double duguje;
Double saldo;
String nazivKonta;
String konto;
}
23 changes: 23 additions & 0 deletions src/main/java/rs/raf/demo/services/impl/KontoService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package rs.raf.demo.services.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import rs.raf.demo.converter.KontoConverter;
import rs.raf.demo.model.Konto;
import rs.raf.demo.repositories.KontoRepository;
import rs.raf.demo.responses.GlavnaKnjigaResponse;
import rs.raf.demo.services.IService;

import java.util.*;

@Service
public class KontoService implements IService<Konto, Long> {

@Lazy
@Autowired
private KontoConverter kontoConverter;

private final KontoRepository kontoRepository;

@Autowired
Expand Down Expand Up @@ -40,4 +51,16 @@ public List<Konto> findAll() {
public void deleteById(Long id) {
kontoRepository.deleteById(id);
}

public List<Konto> findByKontnaGrupa(String kontnaGrupa) {
return this.kontoRepository.findKontoByKontnaGrupaBrojKonta(kontnaGrupa);
}

public List<Konto> findAll(Specification<Konto> spec) {
return this.kontoRepository.findAll(spec);
}

public Page<GlavnaKnjigaResponse> findAllGlavnaKnjigaResponse(Specification<Konto> spec, Pageable pageSort) {
return this.kontoConverter.convert(this.kontoRepository.findAll(spec, pageSort).getContent());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.springframework.data.jpa.domain.Specification;
import rs.raf.demo.exceptions.OperationNotSupportedException;
import rs.raf.demo.model.Dokument;
import rs.raf.demo.model.KontnaGrupa;
import rs.raf.demo.model.Preduzece;
import rs.raf.demo.model.enums.TipFakture;
import rs.raf.demo.relations.*;
Expand Down Expand Up @@ -42,6 +43,9 @@ private RacunRelations<T> getRelations(Root<T> root, CriteriaBuilder builder, Cl
if (TipFakture.class == keyType) {
return new TipFaktureRelations<>(root, builder, key, val);
}
if (KontnaGrupa.class == keyType) {
return new KontnaGrupaRelations<>(root, builder, key, val);
}

throw new OperationNotSupportedException(String.format("Josuvek nije podrzano filtriranje po tipu %s(%s)", key, keyType));
}
Expand Down