Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.inkubator.hrm.service.impl; import ch.lambdaj.Lambda; import com.inkubator.common.CommonUtilConstant; import com.inkubator.common.util.DateTimeUtil; import com.inkubator.common.util.RandomNumberUtil; import com.inkubator.datacore.service.impl.IServiceImpl; import com.inkubator.hrm.HRMConstant; import com.inkubator.hrm.dao.ApprovalActivityDao; import com.inkubator.hrm.dao.EmpDataDao; import com.inkubator.hrm.dao.WtGroupWorkingDao; import com.inkubator.hrm.dao.WtHolidayDao; import com.inkubator.hrm.dao.WtScheduleShiftDao; import com.inkubator.hrm.dao.WtWorkingHourDao; import com.inkubator.hrm.entity.ApprovalActivity; import com.inkubator.hrm.entity.EmpData; import com.inkubator.hrm.entity.TempJadwalKaryawan; import com.inkubator.hrm.entity.WtGroupWorking; import com.inkubator.hrm.entity.WtHoliday; import com.inkubator.hrm.entity.WtScheduleShift; import com.inkubator.hrm.service.WtScheduleShiftService; import com.inkubator.securitycore.util.UserInfoUtil; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.time.DateUtils; import org.hamcrest.Matchers; import org.hibernate.criterion.Order; import org.primefaces.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * * @author Deni Husni FR */ @Service(value = "wtScheduleShiftService") @Lazy public class WtScheduleShiftServiceImpl extends IServiceImpl implements WtScheduleShiftService { @Autowired private WtScheduleShiftDao wtScheduleShiftDao; @Autowired private ApprovalActivityDao approvalActivityDao; @Autowired private WtGroupWorkingDao wtGroupWorkingDao; @Autowired private WtHolidayDao wtHolidayDao; @Autowired private WtWorkingHourDao wtWorkingHourDao; @Autowired private EmpDataDao empDataDao; @Override public WtScheduleShift getEntiyByPK(String id) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntiyByPK(Integer id) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntiyByPK(Long id) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void save(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void update(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void saveOrUpdate(WtScheduleShift enntity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift saveData(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift updateData(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift saveOrUpdateData(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(String id, Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(String id, Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(String id, Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Integer id, Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Integer id, Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Integer id, Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Long id, Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Long id, Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public WtScheduleShift getEntityByPkIsActive(Long id, Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void delete(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public void softDelete(WtScheduleShift entity) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Long getTotalData() throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Long getTotalDataIsActive(Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Long getTotalDataIsActive(Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public Long getTotalDataIsActive(Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllData() throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllData(Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllData(Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllData(Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllDataPageAble(int firstResult, int maxResults, Order order) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllDataPageAbleIsActive(int firstResult, int maxResults, Order order, Boolean isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllDataPageAbleIsActive(int firstResult, int maxResults, Order order, Integer isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public List<WtScheduleShift> getAllDataPageAbleIsActive(int firstResult, int maxResults, Order order, Byte isActive) throws Exception { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public List<WtScheduleShift> getByParam(Long workingGroupId, int firstResult, int maxResults, Order order) throws Exception { return this.wtScheduleShiftDao.getByParam(workingGroupId, firstResult, maxResults, order); } @Override @Transactional(readOnly = true, isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, timeout = 30) public Long getTotalWtScheduleShiftByParam(Long workingGroupId) throws Exception { return this.wtScheduleShiftDao.getTotalWtScheduleShiftByParam(workingGroupId); } @Override @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public List<WtScheduleShift> getAllByWorkingGroupId(long workingGroupId) throws Exception { return wtScheduleShiftDao.getAllByWorkingGroupId(workingGroupId); } @Override @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public List<TempJadwalKaryawan> getAllScheduleForView(long approvalActivityId) throws Exception { ApprovalActivity selectedApprovalActivity = approvalActivityDao.getEntiyByPK(approvalActivityId); JSONObject jSONObject = new JSONObject(selectedApprovalActivity.getPendingData()); long workingGroupId = Long.parseLong(jSONObject.getString("groupWorkingId")); Date createDate = new SimpleDateFormat("dd-MM-yyyy").parse(jSONObject.getString("createDate")); return this.getAllScheduleForView(workingGroupId, createDate, UserInfoUtil.getUserName()); } @Override @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public List<TempJadwalKaryawan> getAllScheduleForView(Long workingGroupId, Date createDate, String createdBy) throws Exception { List<TempJadwalKaryawan> dataToShow = new ArrayList<>(); WtGroupWorking selectedWtGroupWorking = wtGroupWorkingDao.getEntiyByPK(workingGroupId); Date startDate = selectedWtGroupWorking.getBeginTime(); Date endDate = selectedWtGroupWorking.getEndTime(); int numberOfDay = DateTimeUtil.getTotalDayDifference(startDate, endDate); int totalDateDif = DateTimeUtil.getTotalDayDifference(startDate, createDate) + 1; int num = numberOfDay + 1; int hasilBagi = (totalDateDif) / (num); Date beginScheduleDate; Date tanggalAkhirJadwal = DateTimeUtil.getDateFrom(startDate, (hasilBagi * num) - 1, CommonUtilConstant.DATE_FORMAT_DAY); if (new SimpleDateFormat("ddMMyyyy").format(tanggalAkhirJadwal) .equals(new SimpleDateFormat("ddMMyyyy").format(createDate))) { beginScheduleDate = DateTimeUtil.getDateFrom(startDate, (hasilBagi * num) - num, CommonUtilConstant.DATE_FORMAT_DAY); } else { beginScheduleDate = DateTimeUtil.getDateFrom(startDate, (hasilBagi * num), CommonUtilConstant.DATE_FORMAT_DAY); } int i = 0; List<WtScheduleShift> list = new ArrayList<>(selectedWtGroupWorking.getWtScheduleShifts()); Collections.sort(list, shortByDate1); for (WtScheduleShift list1 : list) { TempJadwalKaryawan jadwalKaryawan = new TempJadwalKaryawan(); jadwalKaryawan.setEmpData(new EmpData()); jadwalKaryawan.setTanggalWaktuKerja( DateTimeUtil.getDateFrom(beginScheduleDate, i, CommonUtilConstant.DATE_FORMAT_DAY)); WtHoliday holiday = wtHolidayDao.getWtHolidayByDate(jadwalKaryawan.getTanggalWaktuKerja()); if (holiday != null && selectedWtGroupWorking.getTypeSequeace().equals(HRMConstant.NORMAL_SCHEDULE)) { jadwalKaryawan.setWtWorkingHour(wtWorkingHourDao.getByCode("OFF")); } else { jadwalKaryawan.setWtWorkingHour(list1.getWtWorkingHour()); } jadwalKaryawan.setIsCollectiveLeave(Boolean.FALSE); jadwalKaryawan.setCreatedBy(createdBy); jadwalKaryawan.setCreatedOn(new Date()); jadwalKaryawan.setId(Long.parseLong(RandomNumberUtil.getRandomNumber(12))); jadwalKaryawan.getWtWorkingHour(); jadwalKaryawan.getWtWorkingHour().getAttendanceStatus().getStatusKehadrian(); dataToShow.add(jadwalKaryawan); i++; } return dataToShow; } private final Comparator<WtScheduleShift> shortByDate1 = new Comparator<WtScheduleShift>() { @Override public int compare(WtScheduleShift o1, WtScheduleShift o2) { return o1.getScheduleDate().compareTo(o2.getScheduleDate()); } }; @Override @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public List<Date> getAllWorkingDaysBetween(Long empDataId, Date startDate, Date endDate) throws Exception { EmpData empData = empDataDao.getEntiyByPK(empDataId); List<Date> workingDays = new ArrayList<Date>(); List<TempJadwalKaryawan> tempJadwalKaryawans = new ArrayList<TempJadwalKaryawan>(); //loop date-nya, check jadwal berdasarkan kelompok kerja for (Date loop = startDate; loop.before(endDate) || DateUtils.isSameDay(loop, endDate); loop = DateUtils.addDays(loop, 1)) { TempJadwalKaryawan jadwal = Lambda.selectFirst(tempJadwalKaryawans, Lambda.having(Lambda.on(TempJadwalKaryawan.class).getTanggalWaktuKerja().getTime(), Matchers.equalTo(loop.getTime()))); if (jadwal == null) { //jika tidak terdapat jadwal kerja di date tersebut, maka generate jadwal kerja temporary-nya, lalu check kembali jadwal kerja-nya List<TempJadwalKaryawan> jadwalKaryawans = this .getAllScheduleForView(empData.getWtGroupWorking().getId(), loop, null); tempJadwalKaryawans.addAll(jadwalKaryawans); jadwal = Lambda.selectFirst(tempJadwalKaryawans, Lambda.having(Lambda.on(TempJadwalKaryawan.class).getTanggalWaktuKerja().getTime(), Matchers.equalTo(loop.getTime()))); } //selain "OFF"(hari libur) berarti termasuk jam kerja if (jadwal != null) { if (!StringUtils.equals(jadwal.getWtWorkingHour().getCode(), "OFF")) { workingDays.add(jadwal.getTanggalWaktuKerja()); } } } return workingDays; } @Override @Cacheable(value = "allRegulerOffDaysBetween") @Transactional(readOnly = true, isolation = Isolation.REPEATABLE_READ, propagation = Propagation.SUPPORTS, timeout = 50) public Set<Date> getAllRegulerOffDaysBetween(Date startDate, Date endDate) throws Exception { Set<Date> offDays = new HashSet<Date>(); List<TempJadwalKaryawan> tempJadwalKaryawans = new ArrayList<TempJadwalKaryawan>(); WtGroupWorking workingGroup = wtGroupWorkingDao.getByCode(HRMConstant.WORKING_GROUP_CODE_DEFAULT); //loop date-nya, check jadwal berdasarkan kelompok kerja if (workingGroup != null) { for (Date loop = startDate; loop.before(endDate) || DateUtils.isSameDay(loop, endDate); loop = DateUtils.addDays(loop, 1)) { TempJadwalKaryawan jadwal = Lambda.selectFirst(tempJadwalKaryawans, Lambda.having(Lambda.on(TempJadwalKaryawan.class).getTanggalWaktuKerja().getTime(), Matchers.equalTo(loop.getTime()))); if (jadwal == null) { //jika tidak terdapat jadwal kerja di date tersebut, maka generate jadwal kerja temporary-nya, lalu check kembali jadwal kerja-nya List<TempJadwalKaryawan> jadwalKaryawans = this.getAllScheduleForView(workingGroup.getId(), loop, null); tempJadwalKaryawans.addAll(jadwalKaryawans); jadwal = Lambda.selectFirst(tempJadwalKaryawans, Lambda.having(Lambda.on(TempJadwalKaryawan.class).getTanggalWaktuKerja().getTime(), Matchers.equalTo(loop.getTime()))); } //hanya yg "OFF"(hari libur) saja if (jadwal != null) { if (StringUtils.equals(jadwal.getWtWorkingHour().getCode(), "OFF")) { offDays.add(jadwal.getTanggalWaktuKerja()); } } } } //loop holiday nya List<WtHoliday> listHoliday = wtHolidayDao.getBetweenDate(startDate, endDate); for (WtHoliday holiday : listHoliday) { offDays.add(holiday.getHolidayDate()); } return offDays; } }