[FEAT] alterações para novo endpoint

master
Kleber Cardoso 2 years ago
parent eabeff02eb
commit d8cdfbd81b

@ -0,0 +1,125 @@
package br.com.ae3tecnologia.ms.tangerino.controller;
import br.com.ae3tecnologia.ms.tangerino.dto.ResultDTO;
import br.com.ae3tecnologia.ms.tangerino.model.PtoEquipamentoModel;
import br.com.ae3tecnologia.ms.tangerino.model.PtoEventoModel;
import br.com.ae3tecnologia.ms.tangerino.service.PtoEquipamentoService;
import br.com.ae3tecnologia.ms.tangerino.service.PtoEventoService;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import static br.com.ae3tecnologia.ms.tangerino.utils.Constants.API_ROUTE;
import static br.com.ae3tecnologia.ms.tangerino.utils.Constants.TANGERINO_API_PUNCH;
@RestController
@CrossOrigin(maxAge = 3600, origins = "*")
@RequestMapping(API_ROUTE + "/${app.version}/run")
public class PtoAjusteController {
@Value("${app.token}")
private String token;
@Value("${app.url.apis}")
private String urlApis;
private final PtoEventoService eventoService;
private final PtoEquipamentoService equipamentoService;
@Autowired
private PtoAjusteController(PtoEquipamentoService equipamentoService, PtoEventoService eventoService) {
this.eventoService = eventoService;
this.equipamentoService = equipamentoService;
}
@GetMapping(
produces = MediaType.APPLICATION_JSON_VALUE
)
public void extrairPontos() {
List<PtoEquipamentoModel> equipamentoList = obterRelogios(false);
equipamentoList.forEach(eq -> {
// percorre cada relogio, passando o ultimo nsr do relogio ou a ulima data/hora, tratando para nao duplicar os nsr
AtomicReference<Integer> lastNsr = new AtomicReference<>(0);
HashMap<String, Object> map = new HashMap<>();
map.put("serialNumber", eq.getCodigo());
map.put("nsr", eq.getUltimoNsr()); //precisa pegar o ultimo NSR do relogio para passar como parametro
try {
// requisita da API do tangerino os pontos disponiveis, salvando eles na tabela ptoEvento
List<PtoEventoModel> ptoEventoModels = obterPontosPorRelogio(map);
lastNsr.set(extrairEventos(lastNsr.get(), ptoEventoModels));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
// ao final, atualiza a ptoEquipamento com o ultimoNSR salvo
eq.setUltimoNsr(lastNsr.get());
equipamentoService.saveOrUpdate(eq);
});
}
private Integer extrairEventos(Integer lastNsr, List<PtoEventoModel> ptoEventoModels) {
AtomicReference<Integer> nsr = new AtomicReference<>(0);
ptoEventoModels.stream().sorted(Comparator.comparing(PtoEventoModel::getNsr)).forEach(x -> {
if (x.getNsr() > lastNsr) {
eventoService.saveOrUpdate(x);
nsr.set(x.getNsr());
}
});
return nsr.get();
}
public List<PtoEquipamentoModel> obterRelogios(Boolean inativo) {
// pega todos os relogios ativos de PtoEquipamentoModel
return equipamentoService.findByInativo(inativo);
}
public List<PtoEventoModel> obterPontosPorRelogio(HashMap<String, Object> filtros) throws JsonProcessingException {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.setBasicAuth(token);
String url = urlApis + TANGERINO_API_PUNCH;
final String[] filter = {""};
filtros.forEach((k, v) -> {
if (filter[0].isEmpty()) {
filter[0] = filter[0].concat(k).concat("=").concat(v.toString());
} else {
filter[0] = filter[0].concat("&").concat(k).concat("=").concat(v.toString());
}
});
if (!filter[0].isEmpty()) {
url = url.concat("?").concat(filter[0]);
}
String jsonStr = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(headers), String.class).getBody();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
ResultDTO forObject = objectMapper.readValue(jsonStr, ResultDTO.class);
List<PtoEventoModel> eventos = new ArrayList<>();
forObject.getContent().forEach(x -> eventos.add(new PtoEventoModel(x)));
return eventos;
}
}

@ -0,0 +1,27 @@
package br.com.ae3tecnologia.ms.tangerino.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class PtoEventoDTO {
private Integer id;
private String hashStart;
private String date;
private Long dateIn;
private Long dateInFull;
private Integer nsrIn;
private Integer type;
private String devicedId;
private Boolean adjust;
private String status;
private Long lastModifiedDate;
private EmployeeDTO employee;
}

@ -0,0 +1,25 @@
package br.com.ae3tecnologia.ms.tangerino.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResultEventDTO {
private List<PtoEventoDTO> content;
private Boolean last;
private Integer totalPages;
private Integer totalElements;
private Boolean first;
private Integer numberOfElements;
private Integer size;
private Integer number;
}

@ -0,0 +1,67 @@
package br.com.ae3tecnologia.ms.tangerino.model;
import br.com.ae3tecnologia.ms.tangerino.dto.PtoAjusteDTO;
import br.com.ae3tecnologia.ms.tangerino.dto.PtoEventoDTO;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import java.time.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "pto_ajustes", schema = "rh")
public class PtoAjustesModel {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "nsr")
private Integer nsr;
@Column(name = "tipo")
private Integer tipo;
@Column(name = "data_anterior")
private LocalDate dataAnterior;
@Column(name = "data_atual")
private LocalDate dataAtual;
@Column(name = "hora_anterior")
private LocalTime horaAnterior;
@Column(name = "hora_atual")
private LocalTime horaAtual;
// @JoinColumn(name = "equipamento")
// @ManyToOne(cascade = CascadeType.REFRESH)
// private PtoEquipamentoModel equipamento;
@Column(name = "equipamento")
private Integer equipamento;
@Column(name = "periodo")
private String periodo;
@Transient
private LocalDateTime lastModifiedDate;
public PtoAjustesModel(PtoAjusteDTO dto) {
this.setNsr(dto.getNsr());
LocalDate localDate = Instant.ofEpochMilli(dto.getDateTimeBeforeAdjustment()).atZone(ZoneId.systemDefault()).toLocalDate();
this.setDataAnterior(localDate);
this.setHoraAnterior(Instant.ofEpochMilli(dto.getDateTimeBeforeAdjustment()).atZone(ZoneId.systemDefault()).toLocalTime());
this.setDataAtual(Instant.ofEpochMilli(dto.getDateTimeAfterAdjustment()).atZone(ZoneId.systemDefault()).toLocalDate());
this.setHoraAtual(Instant.ofEpochMilli(dto.getDateTimeAfterAdjustment()).atZone(ZoneId.systemDefault()).toLocalTime());
String periodo = localDate.getYear() + StringUtils.leftPad("0",2, String.valueOf(localDate.getMonthValue()));
this.setPeriodo(periodo);
this.setTipo(4);
}
}

@ -0,0 +1,10 @@
package br.com.ae3tecnologia.ms.tangerino.repository;
import br.com.ae3tecnologia.ms.tangerino.model.PtoEventoModel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface PtoEventoRepository extends JpaRepository<PtoEventoModel, Integer> {
}

@ -0,0 +1,18 @@
package br.com.ae3tecnologia.ms.tangerino.service;
import br.com.ae3tecnologia.ms.tangerino.model.PtoEventoModel;
import br.com.ae3tecnologia.ms.tangerino.repository.PtoEventoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PtoAjusteService {
@Autowired
private PtoEventoRepository repository;
public PtoEventoModel saveOrUpdate(PtoEventoModel eventoModel){
return repository.save(eventoModel);
}
}

@ -0,0 +1,119 @@
package br.com.ae3tecnologia.ms.tangerino.model;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.MockitoAnnotations;
import java.time.LocalDate;
import java.time.LocalTime;
class PtoEventoModelTest {
@InjectMocks
PtoEventoModel ptoEventoModel;
PtoEventoModel other = new PtoEventoModel(
123,
123,
1,
LocalDate.now(),
LocalTime.now(),
"default",
123,
123,
false,
1,
"202304"
);
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void testSetId() {
ptoEventoModel.setId(Integer.valueOf(0));
}
@Test
void testSetNsr() {
ptoEventoModel.setNsr(Integer.valueOf(0));
}
@Test
void testSetTipo() {
ptoEventoModel.setTipo(Integer.valueOf(0));
}
@Test
void testSetDataEvento() {
ptoEventoModel.setDataEvento(LocalDate.now());
}
@Test
void testSetHoraEvento() {
ptoEventoModel.setHoraEvento(LocalTime.now());
}
@Test
void testSetPis() {
ptoEventoModel.setPis("pis");
}
@Test
void testSetPessoa() {
ptoEventoModel.setPessoa(Integer.valueOf(0));
}
@Test
void testSetArquivo() {
ptoEventoModel.setArquivo(Integer.valueOf(0));
}
@Test
void testSetProcessado() {
ptoEventoModel.setProcessado(Boolean.TRUE);
}
@Test
void testSetEquipamento() {
ptoEventoModel.setEquipamento(Integer.valueOf(0));
}
@Test
void testSetPeriodo() {
ptoEventoModel.setPeriodo("periodo");
}
@Test
void testEquals() {
ptoEventoModel = other;
boolean result = ptoEventoModel.equals(other);
Assertions.assertTrue(result);
}
@Test
void testCanEqual() {
ptoEventoModel = other;
boolean result = ptoEventoModel.canEqual(other);
Assertions.assertTrue(result);
}
@Test
void testHashCode() {
ptoEventoModel = other;
Assertions.assertEquals(other.hashCode(), ptoEventoModel.hashCode());
}
@Test
void testToString() {
ptoEventoModel = other;
String result = ptoEventoModel.toString();
Assertions.assertEquals(other.toString(), result);
}
}
//Generated with love by TestMe :) Please report issues and submit feature requests at: http://weirddev.com/forum#!/testme
Loading…
Cancel
Save