208 lines
7.6 KiB
Plaintext
Executable File
208 lines
7.6 KiB
Plaintext
Executable File
package com.fp.viaticos.rules.save.solicitud;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.sql.Date;
|
|
import java.text.SimpleDateFormat;
|
|
import java.util.Calendar;
|
|
import java.util.List;
|
|
import java.util.Locale;
|
|
|
|
import javax.persistence.Query;
|
|
|
|
import com.fp.common.helper.Constant;
|
|
import com.fp.dto.rules.TransactionRule;
|
|
import com.fp.dto.save.SaveRequest;
|
|
import com.fp.persistence.commondb.PersistenceHelper;
|
|
import com.fp.persistence.pviaticos.param.ViaParametros;
|
|
import com.fp.persistence.pviaticos.solicitud.ViaSolicitud;
|
|
import com.fp.viaticos.rules.enums.EnumCodigos;
|
|
import com.fp.viaticos.rules.exception.ViaticosException;
|
|
/**
|
|
* Clase que valida las fechas de la solicitud
|
|
* @author BPTWPA
|
|
* @version 2.1
|
|
*/
|
|
public class ValidaFeriados extends TransactionRule {
|
|
|
|
private static final long serialVersionUID = 1L;
|
|
|
|
/**
|
|
* Milisegundos
|
|
*/
|
|
private static final long MILISEGUNDOS = 24 * 60 * 60 * 1000;
|
|
|
|
/**
|
|
* Método que ejecuta el proceso de mantenimiento/control
|
|
*/
|
|
@Override
|
|
public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
|
|
|
|
if (Constant.ifYes((String) pSaveRequest.get("isnew")) || pSaveRequest.get("csolicitud") != null) {
|
|
return pSaveRequest;
|
|
}
|
|
|
|
String csolicitud = (String)pSaveRequest.get("csolicitud");
|
|
|
|
ViaSolicitud viasolicitud = (ViaSolicitud) pSaveRequest.getSaveBeanModifiedObject("SOLICITUD");
|
|
if (viasolicitud == null) {
|
|
return pSaveRequest;
|
|
}
|
|
if(csolicitud!=null && viasolicitud.equals(csolicitud)){
|
|
return pSaveRequest;
|
|
}
|
|
this.validateDates(viasolicitud);
|
|
this.validateViatico(viasolicitud);
|
|
this.validateSolicitude(viasolicitud);
|
|
return pSaveRequest;
|
|
}
|
|
|
|
/**
|
|
* Validaci´n de fechas de la solicitud
|
|
* @param solicitud
|
|
*/
|
|
public void validateSolicitude(ViaSolicitud solicitud) throws Exception{
|
|
|
|
String firstYear = this.getYear(solicitud.getFec_ini_viatico());
|
|
String secondYear = this.getYear(solicitud.getFec_fin_viatico());
|
|
String firstDate = this.getDate(solicitud.getFec_ini_viatico());
|
|
String secondDate = this.getDate(solicitud.getFec_fin_viatico());
|
|
|
|
Query qry = PersistenceHelper.getEntityManager().createNativeQuery(ValidaFeriados.SQL);
|
|
qry.setParameter("firstYear", firstYear);
|
|
qry.setParameter("secondYear", secondYear);
|
|
qry.setParameter("firstDate", firstDate);
|
|
qry.setParameter("secondDate", secondDate);
|
|
|
|
List feriados = qry.getResultList();
|
|
|
|
if(!feriados.isEmpty()){
|
|
throw new ViaticosException("VIA-0003", "EXISTEN D\u00cdAS FERIADOS PARA EL PERIODO: {0} / {1}", this.getDate(solicitud.getFec_ini_viatico()), this.getDate(solicitud.getFec_fin_viatico()));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Validaci´n de fechas de la solicitud
|
|
* @param solicitud
|
|
*/
|
|
public void validateViatico(ViaSolicitud solicitud) throws Exception{
|
|
|
|
String firstDate = this.getDate(solicitud.getFec_ini_viatico());
|
|
|
|
Query qry = PersistenceHelper.getEntityManager().createNativeQuery(ValidaFeriados.SQL_SOL);
|
|
qry.setParameter("firstDate", firstDate);
|
|
qry.setParameter("initTime", solicitud.getFec_hora_inicio());
|
|
qry.setParameter("codEmployee", solicitud.getCod_empleado());
|
|
|
|
List solicitudes = qry.getResultList();
|
|
|
|
if(!solicitudes.isEmpty()){
|
|
throw new ViaticosException("VIA-0004", "YA EXISTE UNA SOLICITUD INGRESADA PARA EL PERIODO: {0} / {1}", this.getDate(solicitud.getFec_ini_viatico()), this.getDate(solicitud.getFec_fin_viatico()));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Valída las fechas de comisión
|
|
* @param solicitud ViaSolicitud
|
|
* @throws Exception
|
|
*/
|
|
private void validateDates(ViaSolicitud solicitud) throws Exception{
|
|
|
|
long dias = (solicitud.getFec_fin_viatico().getTime() - solicitud.getFec_ini_viatico().getTime()) / ValidaFeriados.MILISEGUNDOS;
|
|
|
|
ViaParametros parametroDias = ViaParametros.find(PersistenceHelper.getEntityManager(), EnumCodigos.VIA_03.getCodigo());
|
|
|
|
if(parametroDias==null){
|
|
throw new ViaticosException("VIA-0005", "PAR\u00c1METRO DE N\u00daMERO M\u00c1XIMO DE D\u00CDAS NO ENCONTRADO");
|
|
}
|
|
|
|
if(parametroDias.getNum_valor().compareTo(new BigDecimal(dias)) < 0){
|
|
throw new ViaticosException("VIA-0006", "HA EXCEDIDO EL N\u00daMERO DE D\u00cdAS PERMITIDOS PARA EL VI\u00cdTICO");
|
|
}
|
|
|
|
if(this.obtieneDia(solicitud.getFec_ini_viatico())==1 || this.obtieneDia(solicitud.getFec_ini_viatico())==7){
|
|
ViaParametros param = ViaParametros.find(PersistenceHelper.getEntityManager(), EnumCodigos.VIA_04.getCodigo());
|
|
if(param.getTex_valor().equals("N")){
|
|
throw new ViaticosException("VIA-0008", "NO PUEDE REGISTRAR UN FIN DE SEMANA COMO SALIDA DEL VI\u00cdTICO {0}",this.getDate(solicitud.getFec_ini_viatico()));
|
|
}
|
|
}
|
|
|
|
if(this.obtieneDia(solicitud.getFec_fin_viatico())==7){
|
|
ViaParametros param = ViaParametros.find(PersistenceHelper.getEntityManager(), EnumCodigos.VIA_05.getCodigo());
|
|
if(param.getTex_valor().equals("N")){
|
|
throw new ViaticosException("VIA-0009", "NO PUEDE REGISTRAR UN FIN DE SEMANA COMO LLEGADA DEL VI\u00cdTICO {0}",this.getDate(solicitud.getFec_fin_viatico()));
|
|
}
|
|
}
|
|
|
|
for(int i=0; i <= dias;i++){
|
|
Date fecha = this.agregarDias(solicitud.getFec_ini_viatico(), i);
|
|
int dia = this.obtieneDia(fecha);
|
|
if(i == 0 && ( dia == 1 || dia == 7)){
|
|
continue;
|
|
}
|
|
if(i == dias && dia == 1){
|
|
throw new ViaticosException("VIA-0009", "NO PUEDE REGISTRAR UN FIN DE SEMANA COMO LLEGADA DEL VI\u00cdTICO {0}",this.getDate(solicitud.getFec_fin_viatico()));
|
|
}
|
|
if(dia == 1 || dia == 7){
|
|
throw new ViaticosException("VIA-0007", "EXISTEn FINES DE SEMANA EN EN EL PERIODO SELECIONADO {0} / {1}",this.getDate(solicitud.getFec_ini_viatico()), this.getDate(solicitud.getFec_fin_viatico()));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
|
|
// TODO Auto-generated method stub
|
|
return pSaveRequest;
|
|
}
|
|
|
|
/**
|
|
* Entrega el anio
|
|
* @param date Fecha
|
|
* @return year
|
|
*/
|
|
private String getYear(Date date){
|
|
Calendar calendar = Calendar.getInstance();
|
|
calendar.setTime(date);
|
|
return String.valueOf(calendar.get(Calendar.YEAR));
|
|
}
|
|
|
|
/**
|
|
* Obtiene la fecha en string
|
|
* @param date
|
|
* @return
|
|
*/
|
|
private String getDate(Date date){
|
|
SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy", new Locale("es", "ES"));
|
|
return formato.format(date);
|
|
}
|
|
/**
|
|
* Agrega dias a una fecha
|
|
*/
|
|
private Date agregarDias(Date fecha, int dias) {
|
|
Calendar calendario = Calendar.getInstance();
|
|
calendario.setTime(fecha);
|
|
calendario.add(Calendar.DATE, dias);
|
|
return new Date(calendario.getTime().getTime());
|
|
}
|
|
/**
|
|
* obriene el dia de la semana
|
|
*/
|
|
private Integer obtieneDia(Date fecha) {
|
|
Calendar cal = Calendar.getInstance();
|
|
cal.setTime(fecha);
|
|
return cal.get(Calendar.DAY_OF_WEEK);
|
|
}
|
|
/**
|
|
* Sql del esquema SRM para los dias feriados
|
|
*/
|
|
private static String SQL = "select FEC_DIA from SRM.SRM_DIAS_FERIADOS "
|
|
+ "where (to_char(FEC_DIA, 'yyyy') = :firstYear or to_char(FEC_DIA, 'yyyy') = :secondYear) "
|
|
+ "AND FEC_DIA BETWEEN TO_DATE(:firstDate, 'dd-MM-yyyy') AND TO_DATE(:secondDate, 'dd-MM-yyyy')";
|
|
|
|
/**
|
|
* Sql para obtener las solicitudes ingresadas
|
|
*/
|
|
private static String SQL_SOL = "SELECT DISTINCT(SOL.COD_SOLICITUD) FROM VIA.VIA_SOLICITUD SOL "
|
|
+ "WHERE SOL.COD_ESTADO NOT IN ('SAN') AND SOL.COD_EMPLEADO = :codEmployee "
|
|
+ "AND SOL.FEC_FIN_VIATICO >= TO_DATE( :firstDate, 'dd-MM-yyyy') and SOL.FEC_HORA_FIN >= :initTime ";
|
|
}
|