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.web.workingtime; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import org.apache.commons.lang3.StringUtils; import org.primefaces.model.LazyDataModel; import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.launch.JobLauncher; import com.inkubator.exception.BussinessException; import com.inkubator.hrm.HRMConstant; import com.inkubator.hrm.entity.ApprovalActivity; import com.inkubator.hrm.service.ApprovalActivityService; import com.inkubator.hrm.service.EmpDataService; import com.inkubator.hrm.service.FingerSwapCapturedService; import com.inkubator.hrm.service.LogWtAttendanceRealizationService; import com.inkubator.hrm.service.TempAttendanceRealizationService; import com.inkubator.hrm.service.TempProcessReadFingerService; import com.inkubator.hrm.service.WtPeriodeService; import com.inkubator.hrm.web.lazymodel.LogWtAttendanceRealizationVmLazyDataModel; import com.inkubator.hrm.web.lazymodel.TempAttendanceRealizationVmLazyDataModel; import com.inkubator.hrm.web.model.TempAttendanceRealizationViewModel; import com.inkubator.hrm.web.model.WtPeriodEmpViewModel; import com.inkubator.hrm.web.search.WtAttendanceCalculationSearchParameter; import com.inkubator.securitycore.util.UserInfoUtil; import com.inkubator.webcore.controller.BaseController; import com.inkubator.webcore.util.FacesUtil; import com.inkubator.webcore.util.MessagesResourceUtil; /** * * @author Ahmad Mudzakkir Amal */ @ManagedBean(name = "wtPeriodEmpDetailController") @ViewScoped public class WtPeriodEmpDetailController extends BaseController { @ManagedProperty(value = "#{tempAttendanceRealizationService}") private TempAttendanceRealizationService tempAttendanceRealizationService; @ManagedProperty(value = "#{logWtAttendanceRealizationService}") private LogWtAttendanceRealizationService logWtAttendanceRealizationService; @ManagedProperty(value = "#{fingerSwapCapturedService}") private FingerSwapCapturedService fingerSwapCapturedService; @ManagedProperty(value = "#{tempProcessReadFingerService}") private TempProcessReadFingerService tempProcessReadFingerService; @ManagedProperty(value = "#{jobLauncherAsync}") private JobLauncher jobLauncherAsync; @ManagedProperty(value = "#{jobTempAttendanceRealizationCalculation}") private Job jobTempAttendanceRealizationCalculation; @ManagedProperty(value = "#{wtPeriodeService}") private WtPeriodeService wtPeriodeService; @ManagedProperty(value = "#{empDataService}") private EmpDataService empDataService; @ManagedProperty(value = "#{approvalActivityService}") private ApprovalActivityService approvalActivityService; private LazyDataModel<TempAttendanceRealizationViewModel> lazyDataModel; private TempAttendanceRealizationViewModel selected; private WtPeriodEmpViewModel model; private Integer progress; private Date payrollCalculationDate; private JobExecution jobExecution; private WtAttendanceCalculationSearchParameter searchParameter; @PostConstruct @Override public void initialization() { super.initialization(); progress = null; try { //Get selected periodeId Long periodeId = Long.valueOf(FacesUtil.getRequestParameter("execution").substring(1)); model = wtPeriodeService.getWtPeriodEmpByWtPeriodId(periodeId); SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM yyyy"); searchParameter = new WtAttendanceCalculationSearchParameter(); } catch (Exception ex) { Logger.getLogger(WtPeriodEmpDetailController.class.getName()).log(Level.SEVERE, null, ex); } } @PreDestroy public void cleanAndExit() { selected = null; lazyDataModel = null; model = null; tempAttendanceRealizationService = null; wtPeriodeService = null; fingerSwapCapturedService = null; payrollCalculationDate = null; jobLauncherAsync = null; jobExecution = null; /* wtPeriodePayroll = null; wtPeriodeAbsen = null;*/ } public void doSearch() { lazyDataModel = null; } public void doCalculateAttendanceRealization() { /** to cater prevent multiple click, that will make batch execute multiple time. * please see onComplete method that will set jobExecution == null */ if (jobExecution == null) { try { long sleepVariable = tempAttendanceRealizationService .getTotalListTempAttendanceRealizationViewModelByWtPeriodId(searchParameter, model.getWtPeriodId().longValue()) * 3; JobParameters jobParameters = new JobParametersBuilder() .addDate("periodUntillDate", model.getUntilPeriode()) .addString("createdBy", UserInfoUtil.getUserName()).addDate("createdOn", new Date()) .addLong("wtPeriodId", model.getWtPeriodId().longValue()).toJobParameters(); jobExecution = jobLauncherAsync.run(jobTempAttendanceRealizationCalculation, jobParameters); int i = 0; while (true) { if (jobExecution.getStatus() == BatchStatus.STARTED || jobExecution.getStatus() == BatchStatus.STARTING) { if (i <= 85) { setProgress(i++); } try { Thread.sleep(sleepVariable); } catch (InterruptedException e) { } } else { setProgress(100); break; } } } catch (BussinessException ex) { jobExecution.setExitStatus(ExitStatus.FAILED); jobExecution.setStatus(BatchStatus.FAILED); jobExecution.addFailureException(ex); MessagesResourceUtil.setMessages(FacesMessage.SEVERITY_ERROR, "global.error", ex.getErrorKeyMessage(), FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); } catch (Exception ex) { LOGGER.error("Error ", ex); } } } public void onCompleteCalculateAttendanceRealization() { if (jobExecution != null) { setProgress(0); if (jobExecution.getStatus() == BatchStatus.COMPLETED) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_INFO, "global.information", "workingTime.attendance_realization_calc_process_succesfully", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); } else { final List<Throwable> exceptions = jobExecution.getAllFailureExceptions(); for (final Throwable throwable : exceptions) { if (throwable instanceof BussinessException) { BussinessException bussinessException = (BussinessException) throwable; MessagesResourceUtil.setMessages(FacesMessage.SEVERITY_ERROR, "global.error", bussinessException.getErrorKeyMessage(), FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); } if (throwable.getCause() instanceof BussinessException) { BussinessException bussinessException = (BussinessException) throwable.getCause(); MessagesResourceUtil.setMessages(FacesMessage.SEVERITY_ERROR, "global.error", bussinessException.getErrorKeyMessage(), FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); } } MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_process_failed", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } jobExecution = null; } } public void doInitCalculateAttendanceRealization() { try { if (empDataService.isEmpDataWithNullWtGroupWorkingExist()) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_emp_with_null_wt_group_working_found", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } if (fingerSwapCapturedService.isDataSwapOnPeriodDateStillEmpty(model.getFromPeriode(), model.getUntilPeriode())) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_finger_swap_captured_still_empty", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } if (tempProcessReadFingerService.isDataTempProcessReadFingerOnPeriodDateStillEmpty( model.getFromPeriode(), model.getUntilPeriode())) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_temp_process_read_finger_still_empty", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } //Cek jika masih ada pengajuan cuti yang masih pending pada periode berjalan, show error message List<ApprovalActivity> listPendingLeaveApproval = approvalActivityService .getListLeavePendingWithImplDateBetweenRange(model.getFromPeriode(), model.getUntilPeriode()); if (!listPendingLeaveApproval.isEmpty()) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_leave_approval_pending_exist", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } //Cek jika masih ada pengajuan perjalanan dinas yang masih pending pada periode berjalan, show error message List<ApprovalActivity> listPendingBusinessTravelApproval = approvalActivityService .getListBusinessTravelPendingWithImplDateBetweenRange(model.getFromPeriode(), model.getUntilPeriode()); if (!listPendingBusinessTravelApproval.isEmpty()) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_business_travel_approval_pending_exist", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } //Cek jika masih ada pengajuan izin yang masih pending pada periode berjalan, show error message List<ApprovalActivity> listPendingPermitApproval = approvalActivityService .getListPermitPendingWithImplDateBetweenRange(model.getFromPeriode(), model.getUntilPeriode()); if (!listPendingPermitApproval.isEmpty()) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_permit_approval_pending_exist", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } //Cek jika masih ada pengajuan lembur yang masih pending pada periode berjalan, show error message List<ApprovalActivity> listPendingOvertimeApproval = approvalActivityService .getListOvertimePendingWithImplDateBetweenRange(model.getFromPeriode(), model.getUntilPeriode()); if (!listPendingOvertimeApproval.isEmpty()) { MessagesResourceUtil.setMessagesFlas(FacesMessage.SEVERITY_ERROR, "global.error", "workingTime.attendance_realization_calc_error_overtime_approval_pending_exist", FacesUtil.getSessionAttribute(HRMConstant.BAHASA_ACTIVE).toString()); FacesContext.getCurrentInstance().validationFailed(); } progress = 0; } catch (Exception e) { LOGGER.error("Error ", e); } } public String doBack() { return "/protected/working_time/wt_period_emp_view.htm?faces-redirect=true"; } public LazyDataModel<TempAttendanceRealizationViewModel> getLazyDataModel() { if (lazyDataModel == null) { //if period absen status is Active, get from TempAttendanceRealization, otherwise get from LogAttendanceRealization if (StringUtils.equals(model.getStatus(), HRMConstant.WT_PERIOD_STATUS_ACTIVE)) { lazyDataModel = new TempAttendanceRealizationVmLazyDataModel(searchParameter, tempAttendanceRealizationService, model.getWtPeriodId().longValue()); } else if (StringUtils.equals(model.getStatus(), HRMConstant.WT_PERIOD_STATUS_VOID)) { lazyDataModel = new LogWtAttendanceRealizationVmLazyDataModel(searchParameter, logWtAttendanceRealizationService, model.getWtPeriodId().longValue()); } } return lazyDataModel; } public void setLazyDataModel(LazyDataModel<TempAttendanceRealizationViewModel> lazyDataModel) { this.lazyDataModel = lazyDataModel; } public TempAttendanceRealizationViewModel getSelected() { return selected; } public void setSelected(TempAttendanceRealizationViewModel selected) { this.selected = selected; } public void setTempAttendanceRealizationService( TempAttendanceRealizationService tempAttendanceRealizationService) { this.tempAttendanceRealizationService = tempAttendanceRealizationService; } public JobLauncher getJobLauncherAsync() { return jobLauncherAsync; } public void setJobLauncherAsync(JobLauncher jobLauncherAsync) { this.jobLauncherAsync = jobLauncherAsync; } public JobExecution getJobExecution() { return jobExecution; } public void setJobExecution(JobExecution jobExecution) { this.jobExecution = jobExecution; } public Job getJobTempAttendanceRealizationCalculation() { return jobTempAttendanceRealizationCalculation; } public void setJobTempAttendanceRealizationCalculation(Job jobTempAttendanceRealizationCalculation) { this.jobTempAttendanceRealizationCalculation = jobTempAttendanceRealizationCalculation; } public WtPeriodeService getWtPeriodeService() { return wtPeriodeService; } public void setWtPeriodeService(WtPeriodeService wtPeriodeService) { this.wtPeriodeService = wtPeriodeService; } public Date getPayrollCalculationDate() { return payrollCalculationDate; } public void setPayrollCalculationDate(Date payrollCalculationDate) { this.payrollCalculationDate = payrollCalculationDate; } public Integer getProgress() { return progress; } public void setProgress(Integer progress) { this.progress = progress; } public WtPeriodEmpViewModel getModel() { return model; } public void setModel(WtPeriodEmpViewModel model) { this.model = model; } public void setEmpDataService(EmpDataService empDataService) { this.empDataService = empDataService; } public void setLogWtAttendanceRealizationService( LogWtAttendanceRealizationService logWtAttendanceRealizationService) { this.logWtAttendanceRealizationService = logWtAttendanceRealizationService; } public void setFingerSwapCapturedService(FingerSwapCapturedService fingerSwapCapturedService) { this.fingerSwapCapturedService = fingerSwapCapturedService; } public void setTempProcessReadFingerService(TempProcessReadFingerService tempProcessReadFingerService) { this.tempProcessReadFingerService = tempProcessReadFingerService; } public WtAttendanceCalculationSearchParameter getSearchParameter() { return searchParameter; } public void setSearchParameter(WtAttendanceCalculationSearchParameter searchParameter) { this.searchParameter = searchParameter; } public void setApprovalActivityService(ApprovalActivityService approvalActivityService) { this.approvalActivityService = approvalActivityService; } }