[FEAT] alterações para novo endpoint
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…
Reference in New Issue