From 402fe4d0248f7bcd3650af300f5fd38ceb467087 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Wed, 6 Nov 2024 20:49:41 +0700 Subject: [PATCH 1/2] Add pencarian by specification Pembuatan specification pencarian log catatan kinerja --- .../dao/LogbookKinerjaDetailLogDao.java | 3 +- jasamedika-core/pom.xml | 7 ++ .../medifirst2000/search/SearchCriteria.java | 30 +++++++ .../medifirst2000/search/SearchDto.java | 21 +++++ .../medifirst2000/search/SearchOperation.java | 57 ++++++++++++ .../spec/LogbookKinerjaDetailLogSpec.java | 90 +++++++++++++++++++ .../LogbookKinerjaDetailLogSpecBuilder.java | 46 ++++++++++ 7 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java create mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java create mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java create mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java create mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java index 881f78b6..6922e6f4 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java @@ -2,11 +2,12 @@ package com.jasamedika.medifirst2000.dao; import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; /** * @author salmanoe * @version 1.0.0 * @since 31/10/2024 */ -public interface LogbookKinerjaDetailLogDao extends JpaRepository { +public interface LogbookKinerjaDetailLogDao extends JpaRepository, JpaSpecificationExecutor { } diff --git a/jasamedika-core/pom.xml b/jasamedika-core/pom.xml index e60cfec5..050e7ac3 100644 --- a/jasamedika-core/pom.xml +++ b/jasamedika-core/pom.xml @@ -76,6 +76,13 @@ itextpdf 5.5.9 + + + org.projectlombok + lombok + ${project.lombok.version} + provided + Jasa Medika diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java new file mode 100644 index 00000000..c09ea6ec --- /dev/null +++ b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java @@ -0,0 +1,30 @@ +package com.jasamedika.medifirst2000.search; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 06/11/2024 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SearchCriteria { + private String filterKey; + + private Object value; + + private String operation; + + private String dataOption; + + public SearchCriteria(String filterKey, String operation, Object value) { + super(); + this.filterKey = filterKey; + this.operation = operation; + this.value = value; + } +} diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java new file mode 100644 index 00000000..1e0bb473 --- /dev/null +++ b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java @@ -0,0 +1,21 @@ +package com.jasamedika.medifirst2000.search; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 06/11/2024 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SearchDto { + private List searchCriteria; + + private String dataOption; +} diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java new file mode 100644 index 00000000..3d5f2a8f --- /dev/null +++ b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java @@ -0,0 +1,57 @@ +package com.jasamedika.medifirst2000.search; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 06/11/2024 + */ +public enum SearchOperation { + CONTAINS, DOES_NOT_CONTAIN, EQUAL, NOT_EQUAL, BEGINS_WITH, DOES_NOT_BEGIN_WITH, ENDS_WITH, DOES_NOT_END_WITH, + NULL, NOT_NULL, GREATER_THAN, GREATER_THAN_EQUAL, LESS_THAN, LESS_THAN_EQUAL, ANY, ALL; + + public static SearchOperation getDataOption(final String dataOption) { + switch (dataOption) { + case "all": + return ALL; + case "any": + return ANY; + default: + return null; + } + } + + public static SearchOperation getSimpleOperation(final String input) { + switch (input) { + case "cn": + return CONTAINS; + case "nc": + return DOES_NOT_CONTAIN; + case "eq": + return EQUAL; + case "ne": + return NOT_EQUAL; + case "bw": + return BEGINS_WITH; + case "bn": + return DOES_NOT_BEGIN_WITH; + case "ew": + return ENDS_WITH; + case "en": + return DOES_NOT_END_WITH; + case "nu": + return NULL; + case "nn": + return NOT_NULL; + case "gt": + return GREATER_THAN; + case "ge": + return GREATER_THAN_EQUAL; + case "lt": + return LESS_THAN; + case "le": + return LESS_THAN_EQUAL; + default: + return null; + } + } +} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java new file mode 100644 index 00000000..940df4df --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java @@ -0,0 +1,90 @@ +package com.jasamedika.medifirst2000.entities.spec; + +import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; +import com.jasamedika.medifirst2000.search.SearchCriteria; +import com.jasamedika.medifirst2000.search.SearchOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.Objects; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 06/11/2024 + */ +@RequiredArgsConstructor +public class LogbookKinerjaDetailLogSpec implements Specification { + + @Autowired + private SearchCriteria searchCriteria; + + @Override + public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { + String strToSearch = searchCriteria.getValue().toString().toLowerCase(); + switch (Objects.requireNonNull(SearchOperation.getSimpleOperation(searchCriteria.getOperation()))) { + case CONTAINS: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); + case DOES_NOT_CONTAIN: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); + case BEGINS_WITH: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); + case DOES_NOT_BEGIN_WITH: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); + case ENDS_WITH: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); + case DOES_NOT_END_WITH: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); + case EQUAL: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.equal(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.equal(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); + case NOT_EQUAL: + if (searchCriteria.getFilterKey().equals("unitCode")) + return cb.notEqual(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); + if (searchCriteria.getFilterKey().equals("unitName")) + return cb.notEqual(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); + case NULL: + return cb.isNull(root.get(searchCriteria.getFilterKey())); + case NOT_NULL: + return cb.isNotNull(root.get(searchCriteria.getFilterKey())); + case GREATER_THAN: + return cb.greaterThan(root + .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); + case GREATER_THAN_EQUAL: + return cb.greaterThanOrEqualTo(root + .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); + case LESS_THAN: + return cb.lessThan(root + .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); + case LESS_THAN_EQUAL: + return cb.lessThanOrEqualTo(root + .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); + } + return null; + } +} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java new file mode 100644 index 00000000..d58772aa --- /dev/null +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java @@ -0,0 +1,46 @@ +package com.jasamedika.medifirst2000.entities.spec; + +import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; +import com.jasamedika.medifirst2000.search.SearchCriteria; +import com.jasamedika.medifirst2000.search.SearchOperation; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.domain.Specifications; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author salmanoe + * @version 1.0.0 + * @since 06/11/2024 + */ +public class LogbookKinerjaDetailLogSpecBuilder { + private final List params; + + public LogbookKinerjaDetailLogSpecBuilder() { + this.params = new ArrayList<>(); + } + + public final LogbookKinerjaDetailLogSpecBuilder with(String key, String operation, Object value) { + params.add(new SearchCriteria(key, operation, value)); + return this; + } + + public final LogbookKinerjaDetailLogSpecBuilder with(SearchCriteria searchCriteria) { + params.add(searchCriteria); + return this; + } + + public Specifications build() { + if (params.isEmpty()) + return null; + Specification result = new LogbookKinerjaDetailLogSpec(params.get(0)); + for (int idx = 1; idx < params.size(); idx++) { + SearchCriteria criteria = params.get(idx); + result = SearchOperation.getDataOption(criteria.getDataOption()) == SearchOperation.ALL + ? Specification.where(result).and(new LogbookKinerjaDetailLogSpec(criteria)) + : Specification.where(result).or(new LogbookKinerjaDetailLogSpec(criteria)); + } + return result; + } +} From 471164c649045c3c3231249997616701391cd350 Mon Sep 17 00:00:00 2001 From: Salman Manoe Date: Thu, 7 Nov 2024 13:23:09 +0700 Subject: [PATCH 2/2] Update service log catatan kinerja harian Perbaikan update rekap capaian logbook setelah hapus catatan kinerja sudah verifikasi --- .../medifirst2000/dao/LogbookKinerjaDao.java | 3 + .../dao/LogbookKinerjaDetailLogDao.java | 3 +- .../impl/LogbookKinerjaDetailServiceImpl.java | 59 ++++++++---- jasamedika-core/pom.xml | 7 -- .../medifirst2000/search/SearchCriteria.java | 30 ------- .../medifirst2000/search/SearchDto.java | 21 ----- .../medifirst2000/search/SearchOperation.java | 57 ------------ .../entities/LogbookKinerja.java | 8 +- .../entities/LogbookKinerjaDetail.java | 4 +- .../spec/LogbookKinerjaDetailLogSpec.java | 90 ------------------- .../LogbookKinerjaDetailLogSpecBuilder.java | 46 ---------- 11 files changed, 51 insertions(+), 277 deletions(-) delete mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java delete mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java delete mode 100644 jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java delete mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java delete mode 100644 jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java index 97a0f4f2..8bf5f51e 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDao.java @@ -9,10 +9,13 @@ import org.springframework.stereotype.Repository; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Optional; @Repository("logbookKinerjaDao") public interface LogbookKinerjaDao extends JpaRepository { + Optional findByNoRec(String noRec); + @Query("select new Map(lk.noRec as noRec," + "pg.id as pegawaiId,pg.namaLengkap as namaPegawai," + "jb.id as jabatanId,jb.namaJabatan as namaJabatan," + "ik.id as indikatorId,ik.namaIndikator as namaIndikator," diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java index 6922e6f4..881f78b6 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/dao/LogbookKinerjaDetailLogDao.java @@ -2,12 +2,11 @@ package com.jasamedika.medifirst2000.dao; import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.JpaSpecificationExecutor; /** * @author salmanoe * @version 1.0.0 * @since 31/10/2024 */ -public interface LogbookKinerjaDetailLogDao extends JpaRepository, JpaSpecificationExecutor { +public interface LogbookKinerjaDetailLogDao extends JpaRepository { } diff --git a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java index 88748653..3381080e 100644 --- a/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java +++ b/jasamedika-business/src/main/java/com/jasamedika/medifirst2000/service/impl/LogbookKinerjaDetailServiceImpl.java @@ -27,6 +27,7 @@ import java.time.LocalTime; import java.time.ZoneId; import java.util.*; +import static com.jasamedika.medifirst2000.constants.Master.SatuanIndikator.PERCENTAGE; import static com.jasamedika.medifirst2000.enums.JenisLog.HAPUS; @Service("LogbookKinerjaDetailService") @@ -61,8 +62,8 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement * menghitung capaian indikator satuan yang harus dihitung secara * akumulatif */ - List> dataSatuanJumlah = logbookKinerjaDetailDao.findSumCapaianByKontrak( - vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.PERCENTAGE)); + List> dataSatuanJumlah = logbookKinerjaDetailDao + .findSumCapaianByKontrak(vo.getLogbookKinerja().getNoRec(), Arrays.asList(PERCENTAGE)); if (CommonUtil.isNotNullOrEmpty(dataSatuanJumlah)) { List models = new ArrayList<>(); for (Map map : dataSatuanJumlah) { @@ -76,8 +77,8 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement * menghitung capaian indikator satuan yang harus dihitung secara * rata-rata */ - List> dataSatuanRatarata = logbookKinerjaDetailDao.findAvgCapaianByKontrak( - vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.PERCENTAGE)); + List> dataSatuanRatarata = logbookKinerjaDetailDao + .findAvgCapaianByKontrak(vo.getLogbookKinerja().getNoRec(), Arrays.asList(PERCENTAGE)); if (CommonUtil.isNotNullOrEmpty(dataSatuanRatarata)) { List models = new ArrayList<>(); for (Map map : dataSatuanRatarata) { @@ -106,8 +107,8 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement * menghitung capaian indikator satuan yang harus dihitung secara * akumulatif */ - List> dataSatuanJumlah = logbookKinerjaDetailDao.findSumCapaianByKontrak( - vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.PERCENTAGE)); + List> dataSatuanJumlah = logbookKinerjaDetailDao + .findSumCapaianByKontrak(vo.getLogbookKinerja().getNoRec(), Arrays.asList(PERCENTAGE)); if (CommonUtil.isNotNullOrEmpty(dataSatuanJumlah)) { List models = new ArrayList<>(); for (Map map : dataSatuanJumlah) { @@ -121,8 +122,8 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement * menghitung capaian indikator satuan yang harus dihitung secara * rata-rata */ - List> dataSatuanRatarata = logbookKinerjaDetailDao.findAvgCapaianByKontrak( - vo.getLogbookKinerja().getNoRec(), Arrays.asList(Master.SatuanIndikator.PERCENTAGE)); + List> dataSatuanRatarata = logbookKinerjaDetailDao + .findAvgCapaianByKontrak(vo.getLogbookKinerja().getNoRec(), Arrays.asList(PERCENTAGE)); if (CommonUtil.isNotNullOrEmpty(dataSatuanRatarata)) { List models = new ArrayList<>(); for (Map map : dataSatuanRatarata) { @@ -303,14 +304,40 @@ public class LogbookKinerjaDetailServiceImpl extends BaseVoServiceImpl implement @Override public void hapusCatatanKinerja(String norec) { Optional byNoRec = logbookKinerjaDetailDao.findByNoRec(norec); - byNoRec.ifPresent(d -> { - d.setStatusVerifikasi(false); - d.setStatusEnabled(false); - LogbookKinerjaDetailLogReqDto.LogbookKinerjaDetailLogReqDtoBuilder dtoBuilder = LogbookKinerjaDetailLogReqDto - .builder(); - LogbookKinerjaDetailLogReqDto reqDto = dtoBuilder.catatanKinerjaId(norec).jenisLog(HAPUS).build(); - logbookKinerjaDetailDao.save(d); - logCatatanKinerjaService.save(reqDto); + byNoRec.ifPresent(catatanKinerja -> { + { + catatanKinerja.setStatusVerifikasi(false); + catatanKinerja.setStatusEnabled(false); + logbookKinerjaDetailDao.save(catatanKinerja); + } + { + Optional byIdLogbook = logbookKinerjaDao + .findByNoRec(catatanKinerja.getLogbookKinerjaId()); + byIdLogbook.ifPresent(logbookKinerja -> { + if (Arrays.asList(PERCENTAGE) + .contains(logbookKinerja.getIndikatorKinerja().getSatuanIndikatorId())) { + List> listCatatan = logbookKinerjaDetailDao + .findAvgCapaianByKontrak(logbookKinerja.getNoRec(), Arrays.asList(PERCENTAGE)); + Optional> catatan = listCatatan.stream() + .filter(c -> logbookKinerja.getNoRec().equals(c.get("logbookId"))).findFirst(); + catatan.ifPresent( + c -> logbookKinerja.setCapaian(Double.parseDouble(c.get("avgCapaian").toString()))); + } else { + List> listCatatan = logbookKinerjaDetailDao + .findSumCapaianByKontrak(logbookKinerja.getNoRec(), Arrays.asList(PERCENTAGE)); + Optional> catatan = listCatatan.stream() + .filter(c -> logbookKinerja.getNoRec().equals(c.get("logbookId"))).findFirst(); + catatan.ifPresent( + c -> logbookKinerja.setCapaian(Double.parseDouble(c.get("sumCapaian").toString()))); + } + logbookKinerjaDao.save(logbookKinerja); + }); + } + { + LogbookKinerjaDetailLogReqDto reqDto = LogbookKinerjaDetailLogReqDto.builder().catatanKinerjaId(norec) + .jenisLog(HAPUS).build(); + logCatatanKinerjaService.save(reqDto); + } }); } diff --git a/jasamedika-core/pom.xml b/jasamedika-core/pom.xml index 050e7ac3..e60cfec5 100644 --- a/jasamedika-core/pom.xml +++ b/jasamedika-core/pom.xml @@ -76,13 +76,6 @@ itextpdf 5.5.9 - - - org.projectlombok - lombok - ${project.lombok.version} - provided - Jasa Medika diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java deleted file mode 100644 index c09ea6ec..00000000 --- a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchCriteria.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.jasamedika.medifirst2000.search; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author salmanoe - * @version 1.0.0 - * @since 06/11/2024 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SearchCriteria { - private String filterKey; - - private Object value; - - private String operation; - - private String dataOption; - - public SearchCriteria(String filterKey, String operation, Object value) { - super(); - this.filterKey = filterKey; - this.operation = operation; - this.value = value; - } -} diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java deleted file mode 100644 index 1e0bb473..00000000 --- a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchDto.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.jasamedika.medifirst2000.search; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @author salmanoe - * @version 1.0.0 - * @since 06/11/2024 - */ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class SearchDto { - private List searchCriteria; - - private String dataOption; -} diff --git a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java b/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java deleted file mode 100644 index 3d5f2a8f..00000000 --- a/jasamedika-core/src/main/java/com/jasamedika/medifirst2000/search/SearchOperation.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.jasamedika.medifirst2000.search; - -/** - * @author salmanoe - * @version 1.0.0 - * @since 06/11/2024 - */ -public enum SearchOperation { - CONTAINS, DOES_NOT_CONTAIN, EQUAL, NOT_EQUAL, BEGINS_WITH, DOES_NOT_BEGIN_WITH, ENDS_WITH, DOES_NOT_END_WITH, - NULL, NOT_NULL, GREATER_THAN, GREATER_THAN_EQUAL, LESS_THAN, LESS_THAN_EQUAL, ANY, ALL; - - public static SearchOperation getDataOption(final String dataOption) { - switch (dataOption) { - case "all": - return ALL; - case "any": - return ANY; - default: - return null; - } - } - - public static SearchOperation getSimpleOperation(final String input) { - switch (input) { - case "cn": - return CONTAINS; - case "nc": - return DOES_NOT_CONTAIN; - case "eq": - return EQUAL; - case "ne": - return NOT_EQUAL; - case "bw": - return BEGINS_WITH; - case "bn": - return DOES_NOT_BEGIN_WITH; - case "ew": - return ENDS_WITH; - case "en": - return DOES_NOT_END_WITH; - case "nu": - return NULL; - case "nn": - return NOT_NULL; - case "gt": - return GREATER_THAN; - case "ge": - return GREATER_THAN_EQUAL; - case "lt": - return LESS_THAN; - case "le": - return LESS_THAN_EQUAL; - default: - return null; - } - } -} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerja.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerja.java index 30eeb594..260e6138 100644 --- a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerja.java +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerja.java @@ -9,8 +9,6 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; import java.util.Date; -import static javax.persistence.FetchType.LAZY; - @Getter @Setter @Entity @@ -40,7 +38,7 @@ public class LogbookKinerja extends BaseTransaction { @Caption(value = "Status Verifikasi") private Boolean statusVerifikasi; - @ManyToOne(fetch = LAZY) + @ManyToOne @NotNull(message = "Pegawai tidak boleh kosong") @JoinColumn(name = "objectpegawaifk") @Caption(value = "Pegawai") @@ -49,7 +47,7 @@ public class LogbookKinerja extends BaseTransaction { @Column(name = "objectpegawaifk", insertable = false, updatable = false) private Integer pegawaiId; - @ManyToOne(fetch = LAZY) + @ManyToOne @NotNull(message = "Jabatan tidak boleh kosong") @JoinColumn(name = "objectjabatanfk") @Caption(value = "Jabatan") @@ -58,7 +56,7 @@ public class LogbookKinerja extends BaseTransaction { @Column(name = "objectjabatanfk", insertable = false, updatable = false) private Integer jabatanId; - @ManyToOne(fetch = LAZY) + @ManyToOne @NotNull(message = "Indikator kinerja tidak boleh kosong") @JoinColumn(name = "objectindikatorkinerjafk") @Caption(value = "Indikator Kinerja") diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerjaDetail.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerjaDetail.java index 239e3e73..93caf64a 100644 --- a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerjaDetail.java +++ b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/LogbookKinerjaDetail.java @@ -9,8 +9,6 @@ import javax.persistence.*; import javax.validation.constraints.NotNull; import java.util.Date; -import static javax.persistence.FetchType.LAZY; - @Getter @Setter @Entity @@ -40,7 +38,7 @@ public class LogbookKinerjaDetail extends BaseTransaction { @Caption(value = "Status Verifikasi") private Boolean statusVerifikasi; - @ManyToOne(fetch = LAZY) + @ManyToOne @NotNull(message = "Indikator kinerja tidak boleh kosong") @JoinColumn(name = "objectlogbookkinerjafk") @Caption(value = "Logbook Kinerja") diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java deleted file mode 100644 index 940df4df..00000000 --- a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpec.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.jasamedika.medifirst2000.entities.spec; - -import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; -import com.jasamedika.medifirst2000.search.SearchCriteria; -import com.jasamedika.medifirst2000.search.SearchOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.domain.Specification; - -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import java.util.Objects; - -/** - * @author salmanoe - * @version 1.0.0 - * @since 06/11/2024 - */ -@RequiredArgsConstructor -public class LogbookKinerjaDetailLogSpec implements Specification { - - @Autowired - private SearchCriteria searchCriteria; - - @Override - public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { - String strToSearch = searchCriteria.getValue().toString().toLowerCase(); - switch (Objects.requireNonNull(SearchOperation.getSimpleOperation(searchCriteria.getOperation()))) { - case CONTAINS: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); - case DOES_NOT_CONTAIN: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch + "%"); - case BEGINS_WITH: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); - case DOES_NOT_BEGIN_WITH: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), strToSearch + "%"); - case ENDS_WITH: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.like(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); - case DOES_NOT_END_WITH: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.notLike(cb.lower(root.get(searchCriteria.getFilterKey())), "%" + strToSearch); - case EQUAL: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.equal(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.equal(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); - case NOT_EQUAL: - if (searchCriteria.getFilterKey().equals("unitCode")) - return cb.notEqual(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); - if (searchCriteria.getFilterKey().equals("unitName")) - return cb.notEqual(cb.lower(root.get(searchCriteria.getFilterKey())), searchCriteria.getValue()); - case NULL: - return cb.isNull(root.get(searchCriteria.getFilterKey())); - case NOT_NULL: - return cb.isNotNull(root.get(searchCriteria.getFilterKey())); - case GREATER_THAN: - return cb.greaterThan(root - .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); - case GREATER_THAN_EQUAL: - return cb.greaterThanOrEqualTo(root - .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); - case LESS_THAN: - return cb.lessThan(root - .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); - case LESS_THAN_EQUAL: - return cb.lessThanOrEqualTo(root - .get(searchCriteria.getFilterKey()), searchCriteria.getValue().toString()); - } - return null; - } -} diff --git a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java b/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java deleted file mode 100644 index d58772aa..00000000 --- a/jasamedika-domain/src/main/java/com/jasamedika/medifirst2000/entities/spec/LogbookKinerjaDetailLogSpecBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.jasamedika.medifirst2000.entities.spec; - -import com.jasamedika.medifirst2000.entities.LogbookKinerjaDetailLog; -import com.jasamedika.medifirst2000.search.SearchCriteria; -import com.jasamedika.medifirst2000.search.SearchOperation; -import org.springframework.data.jpa.domain.Specification; -import org.springframework.data.jpa.domain.Specifications; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author salmanoe - * @version 1.0.0 - * @since 06/11/2024 - */ -public class LogbookKinerjaDetailLogSpecBuilder { - private final List params; - - public LogbookKinerjaDetailLogSpecBuilder() { - this.params = new ArrayList<>(); - } - - public final LogbookKinerjaDetailLogSpecBuilder with(String key, String operation, Object value) { - params.add(new SearchCriteria(key, operation, value)); - return this; - } - - public final LogbookKinerjaDetailLogSpecBuilder with(SearchCriteria searchCriteria) { - params.add(searchCriteria); - return this; - } - - public Specifications build() { - if (params.isEmpty()) - return null; - Specification result = new LogbookKinerjaDetailLogSpec(params.get(0)); - for (int idx = 1; idx < params.size(); idx++) { - SearchCriteria criteria = params.get(idx); - result = SearchOperation.getDataOption(criteria.getDataOption()) == SearchOperation.ALL - ? Specification.where(result).and(new LogbookKinerjaDetailLogSpec(criteria)) - : Specification.where(result).or(new LogbookKinerjaDetailLogSpec(criteria)); - } - return result; - } -}