Update schedule tasks

Hapus schedule pelayanan dan perbaikan injeksi bean lebih dari 1 di schedule sdm
This commit is contained in:
Salman Manoe 2023-10-11 19:43:33 +07:00
parent a71b25f989
commit fb92535629
2 changed files with 342 additions and 67 deletions

View File

@ -1,56 +0,0 @@
package com.jasamedika.medifirst2000.task.schedule;
import com.jasamedika.medifirst2000.service.KalenderService;
import com.jasamedika.medifirst2000.service.PegawaiJadwalKerjaService;
import com.jasamedika.medifirst2000.service.SlipGajiService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* @author Salman
* @since 12 Jul 2023
*/
@Component
public class ScheduleTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class);
@Autowired
private KalenderService kalenderService;
@Autowired
private PegawaiJadwalKerjaService pegawaiJadwalKerjaService;
@Autowired
private SlipGajiService slipGajiService;
@Scheduled(cron = "0 0 23 30 6 ?")
public void generateKalender() {
LOGGER.info("Generate kalender tahun {}",
LocalDate.now().plusYears(1).format(DateTimeFormatter.ofPattern("yyyy")));
kalenderService.generateAndSaveKalender();
}
@Scheduled(cron = "0 0 0 1 * ?")
public void genarateJadwalPegawaiNonShift() {
LOGGER.info("Generate jadwal pegawai bulan {}", LocalDate.now().format(DateTimeFormatter.ofPattern("MM-yyyy")));
pegawaiJadwalKerjaService.autoSaveJadwalKerjaNonShift();
}
@Scheduled(cron = "0 0 0 1 * ?")
public void initiateSlipGaji() {
LOGGER.info("Initiate template slip gaji bulan {}",
LocalDate.now().format(DateTimeFormatter.ofPattern("MM-yyyy")));
slipGajiService.init();
}
}

View File

@ -1,16 +1,29 @@
package com.jasamedika.medifirst2000.task.schedule;
import com.jasamedika.medifirst2000.service.KalenderService;
import com.jasamedika.medifirst2000.service.PegawaiJadwalKerjaService;
import com.jasamedika.medifirst2000.service.SlipGajiService;
import com.jasamedika.medifirst2000.constants.Master;
import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.*;
import com.jasamedika.medifirst2000.dao.custom.PegawaiDaoCustom;
import com.jasamedika.medifirst2000.entities.*;
import com.jasamedika.medifirst2000.exception.ServiceVOException;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.vo.*;
import org.joda.time.Chronology;
import org.joda.time.chrono.ISOChronology;
import org.joda.time.chrono.IslamicChronology;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Salman
@ -18,39 +31,357 @@ import java.time.format.DateTimeFormatter;
*/
@Component
public class ScheduleTask {
private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTask.class);
@Autowired
private KalenderService kalenderService;
private KalenderDao kalenderDao;
@Autowired
private PegawaiJadwalKerjaService pegawaiJadwalKerjaService;
private PegawaiDao pegawaiDao;
@Autowired
private SlipGajiService slipGajiService;
private PegawaiDaoCustom pegawaiDaoCustom;
@Autowired
private PegawaiJadwalKerjaDao pegawaiJadwalKerjaDao;
@Autowired
private ShiftKerjaDao shiftKerjaDao;
@Autowired
private SlipGajiDao slipGajiDao;
@Autowired
private MapPegawaiJabatanToUnitKerjaDao mappingJabatanDao;
@Autowired
private SlipGajiDetailDao slipGajiDetailDao;
@Autowired
private BaseConverterImpl<PegawaiJadwalKerjaVO, PegawaiJadwalKerja> pegawaiJadwalKerjaConverter;
@Autowired
private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;
@Autowired
private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
@Autowired
private BaseConverterImpl<ShiftKerjaVO, ShiftKerja> shiftKerjaConverter;
@Autowired
private BaseConverterImpl<KalenderVO, Kalender> kalenderConverter;
@Scheduled(cron = "0 0 23 30 6 ?")
public void generateKalender() {
LOGGER.info("Generate kalender tahun {}",
LocalDate.now().plusYears(1).format(DateTimeFormatter.ofPattern("yyyy")));
kalenderService.generateAndSaveKalender();
saveKalender();
}
@Transactional
private void saveKalender() {
List<Kalender> kals = new ArrayList<>();
Calendar ct = Calendar.getInstance();
ct.set(Calendar.MONTH, 0);
ct.set(Calendar.DAY_OF_MONTH, 1);
ct.set(Calendar.HOUR, 0);
ct.set(Calendar.MINUTE, 0);
ct.set(Calendar.SECOND, 0);
ct.set(Calendar.MILLISECOND, 0);
ct.add(Calendar.YEAR, 1);
Calendar c = Calendar.getInstance();
Date lastDate = kalenderDao.getLastDateData();
c.setTime(lastDate);
c.add(Calendar.DATE, 1);
if (ct.getTime().compareTo(c.getTime()) == 0) {
int daysInYear = c.getActualMaximum(Calendar.DAY_OF_YEAR);
for (int i = 1; i <= daysInYear; i++) {
c.set(Calendar.DAY_OF_YEAR, i);
Kalender kal = new Kalender();
kal.setKdProfile((short) 0);
kal.setStatusEnabled(Master.STATUS_ENABLE_TRUE);
kal.setBulanKeDlmTahun((byte) (c.get(Calendar.MONTH) + 1));
kal.setHariKeDlmBulan((byte) c.get(Calendar.DAY_OF_MONTH));
kal.setHariKeDlmMinggu((byte) c.get(Calendar.WEEK_OF_MONTH));
kal.setHariKeDlmTahun((short) c.get(Calendar.DAY_OF_YEAR));
kal.setKdTanggal(c.get(Calendar.DAY_OF_YEAR));
kal.setNamaBulan(new SimpleDateFormat("MMMM", new java.util.Locale("id")).format(c.getTime()));
kal.setNamaHari(new SimpleDateFormat("EEEE", new java.util.Locale("id")).format(c.getTime()));
kal.setqTanggal(c.get(Calendar.DAY_OF_YEAR));
kal.setTahunKalender((short) c.get(Calendar.YEAR));
kal.setTanggal(c.getTime());
kals.add(kal);
}
kalenderDao.save(kals);
}
}
@Scheduled(cron = "0 0 0 1 * ?")
public void genarateJadwalPegawaiNonShift() {
LOGGER.info("Generate jadwal pegawai bulan {}", LocalDate.now().format(DateTimeFormatter.ofPattern("MM-yyyy")));
pegawaiJadwalKerjaService.autoSaveJadwalKerjaNonShift();
saveJadwalKerjaNonShift();
}
private void saveJadwalKerjaNonShift() {
/*
* Perbaikan Method ini mohon untuk diikutsertakan juga memperbaiki
* Map<String, Object> findPegawaiByRuanganRev2(Integer ruangan, Integer
* tahun, Integer bulan, Integer idPegawai) Map<String, Object>
* findPegawaiByRuanganRev2(Integer subUnitKerja, Integer tahun, Integer
* bulan)
*/
// set auto save untuk bulan ini
Calendar c = Calendar.getInstance();
c.setTime(new Date());
Integer tahun = c.get(Calendar.YEAR);
Integer bulan = c.get(Calendar.MONTH) + 1;
// get list pegawai non shift by subunitkerja
List<Integer> listPegawai = pegawaiDao.getPegawaiNonshift();
List<PegawaiJadwalKerjaVO> vos = new ArrayList<>();
if (CommonUtil.isNotNullOrEmpty(listPegawai)) {
for (Integer idPegawai : listPegawai) {
// generate jadwal hanya untuk yang belum buat jadwal
List<PegawaiJadwalKerja> jadwal = pegawaiJadwalKerjaDao.findJadwalByBulan(tahun, bulan, idPegawai);
if (CommonUtil.isNullOrEmpty(jadwal)) {
Pegawai pegawai = pegawaiDao.findOne(idPegawai);
List<Map<String, Object>> mapListHariLibur = pegawaiDaoCustom.findHariLiburPegawaiNonShift(tahun,
bulan);
// clear false data
if (CommonUtil.isNotNullOrEmpty(mapListHariLibur))
for (Map<String, Object> mh : mapListHariLibur)
if (CommonUtil.isNotNullOrEmpty(mh.get("statusEnabled"))
&& mh.get("statusEnabled").equals(Master.STATUS_ENABLE_FALSE))
mh.put("namaHariLibur", null);
// Setting Bulan Ramadhan
Chronology iso = ISOChronology.getInstance();
Chronology hijri = IslamicChronology.getInstance();
int bulanHijri;
try {
Integer idShift = pegawai.getShiftKerjaId();
List<Map<String, Object>> listShiftKerja = shiftKerjaDao.findByKelompokShiftId(idShift);
// Non Shift +
if (idShift == 2)
listShiftKerja.addAll(shiftKerjaDao.findByKelompokShiftId(1));
List<PegawaiJadwalKerja> resultPegawaiJadwalKerja = pegawaiDaoCustom.findJadwalByTanggal(tahun,
bulan, idPegawai);
if (resultPegawaiJadwalKerja.isEmpty()) { // Apabila_jadwal_kosong
if (idShift == 1 || idShift == 2) { // apabila_pegawai_nonshift
for (Map<String, Object> hariLibur : mapListHariLibur) {
PegawaiJadwalKerjaVO vo = new PegawaiJadwalKerjaVO();
ShiftKerjaVO shiftKerjaPegawai = new ShiftKerjaVO();
if (!CommonUtil.isNotNullOrEmpty(hariLibur.get("namaHariLibur"))) {
// cek apakah nama harinya adalah jumat,
// senin-kamis atau sabtu minggu
if (hariLibur.get("namaHari").toString().equals("Minggu")
|| hariLibur.get("namaHari").toString().equals("Sabtu")) {
shiftKerjaPegawai.setId(8);
} else if (hariLibur.get("namaHari").toString().equals("Jumat")) {
org.joda.time.LocalDate tglIso = new org.joda.time.LocalDate(tahun, bulan,
Integer.parseInt(hariLibur.get("tgl").toString()), iso);
org.joda.time.LocalDate tglHijri = new org.joda.time.LocalDate(
tglIso.toDateTimeAtStartOfDay(), hijri);
bulanHijri = tglHijri.getMonthOfYear();
if (bulanHijri == 9) {
shiftKerjaPegawai.setId(57); // RMJ
} else {
shiftKerjaPegawai.setId(19);
}
} else {
org.joda.time.LocalDate tglIso = new org.joda.time.LocalDate(tahun, bulan,
Integer.parseInt(hariLibur.get("tgl").toString()), iso);
org.joda.time.LocalDate tglHijri = new org.joda.time.LocalDate(
tglIso.toDateTimeAtStartOfDay(), hijri);
bulanHijri = tglHijri.getMonthOfYear();
if (bulanHijri == 9) {
shiftKerjaPegawai.setId(56); // RM
} else {
shiftKerjaPegawai.setId(18);
}
}
} else {
shiftKerjaPegawai.setId(8);
}
PegawaiVO peg = new PegawaiVO();
peg.setId(idPegawai);
KalenderVO kalendar = new KalenderVO();
kalendar.setId(Integer.parseInt(hariLibur.get("idKalendar").toString()));
vo.setPegawai(peg);
vo.setShift(shiftKerjaPegawai);
vo.setTanggal(kalendar);
vos.add(vo);
}
} // end if shift 1
else {// Selain shift 1
for (Map<String, Object> hariLibur : mapListHariLibur) {
PegawaiJadwalKerjaVO vo = new PegawaiJadwalKerjaVO();
PegawaiVO peg = new PegawaiVO();
peg.setId(idPegawai);
ShiftKerjaVO shiftKerjaPegawai = new ShiftKerjaVO();
shiftKerjaPegawai.setId(0);
KalenderVO kalendar = new KalenderVO();
kalendar.setId(Integer.parseInt(hariLibur.get("idKalendar").toString()));
vo.setPegawai(peg);
vo.setShift(shiftKerjaPegawai);
vo.setTanggal(kalendar);
vos.add(vo);
}
}
} else {// Jadwal tidak kosong
Integer idLooping = 0;
for (Map<String, Object> map2 : mapListHariLibur) {
for (PegawaiJadwalKerja mapPegawaiJadwalKerja : resultPegawaiJadwalKerja) {
if (mapPegawaiJadwalKerja.getPegawaiId().equals(idPegawai) && (Integer
.parseInt(map2.get("idKalendar").toString()) == mapPegawaiJadwalKerja
.getTanggalId())) {
mapListHariLibur.remove(idLooping);
break;
}
}
idLooping++;
}
// Untuk tanggal yang kosong diisi disini
for (Map<String, Object> map2 : mapListHariLibur) {
PegawaiJadwalKerjaVO vo = new PegawaiJadwalKerjaVO();
PegawaiVO peg = new PegawaiVO();
peg.setId(idPegawai);
ShiftKerjaVO shiftKerjaPegawai = new ShiftKerjaVO();
shiftKerjaPegawai.setId(0);
KalenderVO kalendar = new KalenderVO();
kalendar.setId(Integer.parseInt(map2.get("idKalendar").toString()));
vo.setPegawai(peg);
vo.setShift(shiftKerjaPegawai);
vo.setTanggal(kalendar);
vos.add(vo);
}
} // end else
} catch (IllegalArgumentException e) {
throw new ServiceVOException(e.getMessage());
}
} // kondisi tidak ada data di pegawai jadwal kerja
} // looping pegawai
if (CommonUtil.isNotNullOrEmpty(vos))
saveListJadwalPegawai(vos, false, false);
}
}
@Transactional
public void saveListJadwalPegawai(List<PegawaiJadwalKerjaVO> vos, boolean isUnggah, boolean isPenangguhan) {
for (PegawaiJadwalKerjaVO vo : vos) {
boolean editKetidakhadiran = false;
if (CommonUtil.isNotNullOrEmpty(vo)) {
PegawaiJadwalKerja model = pegawaiJadwalKerjaConverter.transferVOToModel(vo, new PegawaiJadwalKerja());
if (CommonUtil.isNotNullOrEmpty(vo.getPegawai()))
model.setPegawai(pegawaiConverter.transferVOToModel(vo.getPegawai(), new Pegawai()));
if (CommonUtil.isNotNullOrEmpty(vo.getPegawaiGanti()))
model.setPegawaiGanti(pegawaiConverter.transferVOToModel(vo.getPegawaiGanti(), new Pegawai()));
if (CommonUtil.isNotNullOrEmpty(vo.getRuangan()))
model.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(), new Ruangan()));
if (isPenangguhan && CommonUtil.isNotNullOrEmpty(vo.getShift())
&& CommonUtil.isNotNullOrEmpty(vo.getShift().getId()) && vo.getShift().getId().equals(0)) {
if (CommonUtil.isNotNullOrEmpty(vo.getTanggal())) {
Date tanggal = pegawaiJadwalKerjaDao.getTanggal(vo.getTanggal().getId());
Map<String, Object> map = pegawaiJadwalKerjaDao.getJadwal(vo.getPegawai().getId(),
new SimpleDateFormat("yyyy-MM-dd").format(tanggal));
if (CommonUtil.isNotNullOrEmpty(map) && CommonUtil.isNotNullOrEmpty(map.get("id"))) {
pegawaiJadwalKerjaDao.delete(Integer.parseInt(map.get("id").toString()));
}
}
} else {
if (CommonUtil.isNotNullOrEmpty(vo.getShift())) {
model.setShift(shiftKerjaConverter.transferVOToModel(vo.getShift(), new ShiftKerja()));
if (CommonUtil.isNotNullOrEmpty(vo.getTanggal())) {
Date tanggal = pegawaiJadwalKerjaDao.getTanggal(vo.getTanggal().getId());
Map<String, Object> map = pegawaiJadwalKerjaDao.getJadwal(vo.getPegawai().getId(),
new SimpleDateFormat("yyyy-MM-dd").format(tanggal));
model.setTanggal(kalenderConverter.transferVOToModel(vo.getTanggal(), new Kalender()));
if (CommonUtil.isNotNullOrEmpty(map) && CommonUtil.isNotNullOrEmpty(map.get("id"))) {
model.setId(Integer.parseInt(map.get("id").toString()));
if (CommonUtil.isNotNullOrEmpty(map.get("flagKetidakhadiran"))
&& Boolean.parseBoolean(map.get("flagKetidakhadiran").toString())) {
editKetidakhadiran = true;
} else if (isUnggah && vo.getShift().getFlagKetidakhadiran()) {
editKetidakhadiran = true;
}
}
}
if (CommonUtil.isNotNullOrEmpty(model) && (isPenangguhan || !editKetidakhadiran))
pegawaiJadwalKerjaDao.save(model);
}
}
}
}
}
@Scheduled(cron = "0 0 0 1 * ?")
public void initiateSlipGaji() {
public void templateSlipGajiTask() {
LOGGER.info("Initiate template slip gaji bulan {}",
LocalDate.now().format(DateTimeFormatter.ofPattern("MM-yyyy")));
slipGajiService.init();
initiateDataSlipGaji();
}
@Transactional
public void initiateDataSlipGaji() {
Date now = new Date();
Date startMonth = DateUtil.startMonth(now);
Date endMonth = DateUtil.endMonth(now);
List<Integer> listIdPegawaiSlip = slipGajiDao.findPegawaiByBulan(startMonth, endMonth);
List<MapPegawaiJabatanToUnitKerja> listJabatan = mappingJabatanDao.getAll();
listJabatan = listJabatan.stream().filter(j -> !listIdPegawaiSlip.contains(j.getPegawaiId()))
.sorted(Comparator.comparingInt(MapPegawaiJabatanToUnitKerja::getPegawaiId))
.collect(Collectors.toList());
List<Integer> listIdPegawai = new ArrayList<>();
listJabatan.forEach(j -> {
if (!listIdPegawai.contains(j.getPegawaiId()))
listIdPegawai.add(j.getPegawaiId());
});
List<SlipGaji> listSlipGaji = new ArrayList<>();
List<SlipGajiDetail> listSlipGajiDetail = new ArrayList<>();
for (Integer idPegawai : listIdPegawai) {
SlipGaji.SlipGajiBuilder b = SlipGaji.builder();
for (MapPegawaiJabatanToUnitKerja j : listJabatan)
if (idPegawai.equals(j.getPegawaiId())) {
Pegawai pegawai = new Pegawai();
pegawai.setId(j.getPegawaiId());
b.pegawai(pegawai);
b.bulan(now);
break;
}
SlipGaji slipGaji = b.build();
listSlipGaji.add(slipGaji);
if (CommonUtil.isNotNullOrEmpty(slipGaji))
for (MapPegawaiJabatanToUnitKerja j : listJabatan)
if (idPegawai.equals(j.getPegawaiId())) {
SlipGajiDetail.SlipGajiDetailBuilder detail = SlipGajiDetail.builder();
detail.slipGaji(slipGaji);
if (CommonUtil.isNotNullOrEmpty(j.getJabatanId())) {
Jabatan jabatan = new Jabatan();
jabatan.setId(j.getJabatanId());
detail.jabatan(jabatan);
}
if (CommonUtil.isNotNullOrEmpty(j.getUnitKerjaPegawaiId())) {
UnitKerjaPegawai unitKerja = new UnitKerjaPegawai();
unitKerja.setId(j.getUnitKerjaPegawaiId());
detail.unitKerja(unitKerja);
}
if (CommonUtil.isNotNullOrEmpty(j.getSubUnitKerjaPegawaiId())) {
SubUnitKerjaPegawai subunitKerja = new SubUnitKerjaPegawai();
subunitKerja.setId(j.getSubUnitKerjaPegawaiId());
detail.subUnitKerja(subunitKerja);
}
if (CommonUtil.isNotNullOrEmpty(j.getGradeId())) {
NilaiKelompokJabatan grade = new NilaiKelompokJabatan();
grade.setId(j.getGradeId());
detail.grade(grade);
}
listSlipGajiDetail.add(detail.build());
}
slipGajiDao.save(listSlipGaji);
slipGajiDetailDao.save(listSlipGajiDetail);
}
}
}