diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/controller/PtoAjusteController.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/controller/PtoAjusteController.java new file mode 100644 index 0000000..67efcf4 --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/controller/PtoAjusteController.java @@ -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 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 lastNsr = new AtomicReference<>(0); + HashMap 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 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 ptoEventoModels) { + AtomicReference 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 obterRelogios(Boolean inativo) { + // pega todos os relogios ativos de PtoEquipamentoModel + return equipamentoService.findByInativo(inativo); + } + + public List obterPontosPorRelogio(HashMap 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 eventos = new ArrayList<>(); + forObject.getContent().forEach(x -> eventos.add(new PtoEventoModel(x))); + return eventos; + } +} diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/PtoAjusteDTO.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/PtoAjusteDTO.java new file mode 100644 index 0000000..372ce10 --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/PtoAjusteDTO.java @@ -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; + +} diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultAdjustDTO.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultAdjustDTO.java new file mode 100644 index 0000000..e88a152 --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultAdjustDTO.java @@ -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 content; + private Boolean last; + private Integer totalPages; + private Integer totalElements; + private Boolean first; + private Integer numberOfElements; + private Integer size; + private Integer number; +} diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultDTO.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultEventDTO.java similarity index 100% rename from src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultDTO.java rename to src/main/java/br/com/ae3tecnologia/ms/tangerino/dto/ResultEventDTO.java diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModel.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModel.java new file mode 100644 index 0000000..1c81165 --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModel.java @@ -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); + } +} diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/repository/PtoAjusteRepository.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/repository/PtoAjusteRepository.java new file mode 100644 index 0000000..7584e5b --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/repository/PtoAjusteRepository.java @@ -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 { + +} diff --git a/src/main/java/br/com/ae3tecnologia/ms/tangerino/service/PtoAjusteService.java b/src/main/java/br/com/ae3tecnologia/ms/tangerino/service/PtoAjusteService.java new file mode 100644 index 0000000..92d36ec --- /dev/null +++ b/src/main/java/br/com/ae3tecnologia/ms/tangerino/service/PtoAjusteService.java @@ -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); + } + +} diff --git a/src/test/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModelTest.java b/src/test/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModelTest.java new file mode 100644 index 0000000..589bf1c --- /dev/null +++ b/src/test/java/br/com/ae3tecnologia/ms/tangerino/model/PtoAjusteModelTest.java @@ -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 \ No newline at end of file