protected override void submit(ELeaveBalance balanceItem, ELeaveBalanceEntitle balanceEntitle) { if (!skipALRoundingRule) { base.submit(balanceItem, balanceEntitle); } }
protected override ELeaveBalance CreateLeaveBalanceItem() { if (leaveTypeDisabledSLCat2 == false) { currentSLCat2balanceItem = CreateLeaveBalanceItemForCat2(); } return(base.CreateLeaveBalanceItem()); }
protected override double LoadProrata(ELeaveBalance balanceItem, DateTime AsOfDate) { base.LoadProrata(balanceItem, AsOfDate); if (!skipALRoundingRule) { balanceItem.LeaveBalanceEntitled = ALRounding(EmpID, AsOfDate, balanceItem); } return(balanceItem.LeaveBalanceEntitled); }
protected override double LoadAdjust(ELeaveBalance balanceItem, DateTime AsOfDate) { // if CAT2 is enabled and balanceItem is not null if (leaveTypeDisabledSLCat2 == false && currentSLCat2balanceItem != null) { base.LoadAdjust(currentSLCat2balanceItem, AsOfDate); } return(base.LoadAdjust(balanceItem, AsOfDate)); }
protected override void LoadBalance(ELeaveBalance balanceItem, DateTime AsOfDate) { base.LoadBalance(balanceItem, AsOfDate); // if CAT2 is enabled if (leaveTypeDisabledSLCat2 == false && currentSLCat2balanceItem != null) { currentSLCat2balanceItem.BalanceUnit = m_BalanceUnit; //currentSLCat2balanceItem.Balance = currentSLCat2balanceItem.getBalance(); } }
protected override ELeaveBalance CreateNextLeaveBalanceItem(ELeaveBalance lastLeaveBalanceItem) { if (leaveTypeDisabledSLCat2 == false) { ELeaveBalance lastSLCat2balanceItem = currentSLCat2balanceItem; ELeaveBalance SLCat1balanceItem = base.CreateNextLeaveBalanceItem(lastLeaveBalanceItem); ELeaveBalanceEntitle leaveBalanceEntitleSL2 = null; if (lastSLCat2balanceItem != null && lastLeaveBalanceItem != null) { currentSLCat2balanceItem.LeaveBalanceBF = lastSLCat2balanceItem.getBalance(); if (SLCat1balanceItem.LeaveBalanceForfeiture > 0) { SLCat1balanceItem.LeaveBalanceBF -= SLCat1balanceItem.LeaveBalanceForfeiture; currentSLCat2balanceItem.LeaveBalanceBF += SLCat1balanceItem.LeaveBalanceForfeiture; SLCat1balanceItem.LeaveBalanceForfeiture = 0; } if (lastSLCat2balanceItem.LeaveBalanceEntitled > 0) { leaveBalanceEntitleSL2 = new ELeaveBalanceEntitle(); leaveBalanceEntitleSL2.LeaveBalanceEntitleEffectiveDate = currentSLCat2balanceItem.LeaveBalanceEffectiveDate; leaveBalanceEntitleSL2.LeaveBalanceEntitleGrantPeriodFrom = lastSLCat2balanceItem.LeaveBalanceEffectiveDate; leaveBalanceEntitleSL2.LeaveBalanceEntitleGrantPeriodTo = lastSLCat2balanceItem.LeaveBalanceEffectiveEndDate; leaveBalanceEntitleSL2.EmpID = currentSLCat2balanceItem.EmpID; leaveBalanceEntitleSL2.LeaveTypeID = currentSLCat2balanceItem.LeaveTypeID; leaveBalanceEntitleSL2.LeaveBalanceEntitleDays = lastSLCat2balanceItem.LeaveBalanceEntitled; } // Initial Forfeiture currentSLCat2balanceItem.LeaveBalanceForfeiture = 0; int MaxBF = MaximumBroughtForwardForSLCat2(currentSLCat2balanceItem.LeaveBalanceEffectiveDate); if (MaxBF >= 0) { currentSLCat2balanceItem.LeaveBalanceForfeiture = currentSLCat2balanceItem.LeaveBalanceBF - MaxBF; if (currentSLCat2balanceItem.LeaveBalanceForfeiture < 0) { currentSLCat2balanceItem.LeaveBalanceForfeiture = 0; } } } balanceItemListSLCat2.Insert(0, currentSLCat2balanceItem); submit(currentSLCat2balanceItem, leaveBalanceEntitleSL2); return(SLCat1balanceItem); } else { return(base.CreateNextLeaveBalanceItem(lastLeaveBalanceItem)); } }
//public void RecalculateAfter(DateTime DateAfter) //{ // foreach (LeaveBalanceProcess balanceProcess in leaveBalanceProcessList) // { // balanceProcess.RecalculateAfter(DateAfter); // } //} //public void RecalculateAfter(DateTime DateAfter, int LeaveTypeID) //{ // foreach (LeaveBalanceProcess balanceProcess in leaveBalanceProcessList) // { // if (balanceProcess.LeaveTypeID.Equals(LeaveTypeID)) // balanceProcess.RecalculateAfter(DateAfter); // } //} private void LoadLeaveTypeAndRounding(ELeaveBalance b) { if (b != null) { ELeaveType type = new ELeaveType(); type.LeaveTypeID = b.LeaveTypeID; if (ELeaveType.db.select(dbConn, type)) { b.Name = type.LeaveType; b.Description = type.LeaveTypeDesc; b.StringFormat = "0." + string.Empty.PadRight(type.LeaveDecimalPlace, '0'); } } }
protected ELeaveBalance CreateLeaveBalanceItemForCat2() { if (leaveTypeDisabledSLCat2 == false) { currentSLCat2balanceItem = new ELeaveBalance(); currentSLCat2balanceItem.LeaveBalanceEffectiveDate = NextStartDate(); currentSLCat2balanceItem.LeaveBalanceEffectiveEndDate = NextStartDate(currentSLCat2balanceItem.LeaveBalanceEffectiveDate).AddDays(-1); currentSLCat2balanceItem.EmpID = EmpID; currentSLCat2balanceItem.LeaveTypeID = leaveTypeIDSLCat2; return(currentSLCat2balanceItem); } else { return(null); } }
protected ELeaveBalance GetAvailableBalance(ELeaveApplication leaveApplicatoin, DateTime periodEndDate) { ELeaveBalance m_balance = new ELeaveBalance(); // ******** remove expired entitlement foreach (DataRow row in m_earned.Rows) { if (row["EXPIRY_DATE"] != null && System.Convert.ToDateTime(row["EXPIRY_DATE"]) < leaveApplicatoin.LeaveAppDateFrom) { //m_balance.LeaveBalanceEntitled += System.Convert.ToDouble(row["UNUSED_HOURS"]); m_balance.ExpiryForfeit += System.Convert.ToDouble(row["UNUSED_HOURS"]); row["UNUSED_HOURS"] = 0; //row.Delete(); } } // ******* calculate entitled from entitledList and processedList foreach (DataRow row in m_earned.Rows) { if (leaveApplicatoin != null && leaveApplicatoin.LeaveAppHours > 0) { if (leaveApplicatoin.LeaveAppHours >= System.Convert.ToDouble(row["UNUSED_HOURS"])) { leaveApplicatoin.LeaveAppHours -= System.Convert.ToDouble(row["UNUSED_HOURS"]); row["UNUSED_HOURS"] = 0; //row.Delete(); } else { row["UNUSED_HOURS"] = System.Convert.ToDouble(row["UNUSED_HOURS"]) - leaveApplicatoin.LeaveAppHours; leaveApplicatoin.LeaveAppHours = 0; } } else { break; } } m_earned.DefaultView.RowFilter = "UNUSED_HOURS > 0"; m_earned = m_earned.DefaultView.ToTable(); return(m_balance); }
protected override double LoadProrata(ELeaveBalance balanceItem, DateTime AsOfDate) { double prorata = base.LoadProrata(balanceItem, AsOfDate); // if CAT2 is enabled... if (leaveTypeDisabledSLCat2 == false && balanceItem.LeaveTypeID != leaveTypeIDSLCat2 && currentSLCat2balanceItem != null) { double maxBF = MaximumBroughtForward(balanceItem.LeaveBalanceEffectiveDate); if (balanceItem.getBalance() > maxBF && maxBF >= 0) { double difference = balanceItem.getBalance() - maxBF; balanceItem.LeaveBalanceEntitled -= difference; currentSLCat2balanceItem.LeaveBalanceEntitled += difference; } } return(prorata); }
protected override void LoadServerData(DateTime AsOfDate) { base.LoadServerData(AsOfDate); DBFilter filter = new DBFilter(); filter.add(new Match("EmpID", EmpID)); filter.add(new Match("LeaveBalanceEffectiveDate", "<=", AsOfDate)); filter.add(new Match("LeaveTypeID", leaveTypeIDSLCat2)); filter.add("LeaveBalanceEffectiveDate", false); balanceItemListSLCat2 = ELeaveBalance.db.select(dbConn, filter); if (balanceItemListSLCat2.Count > 0) { currentSLCat2balanceItem = (ELeaveBalance)balanceItemListSLCat2[0]; } //CAT2Process = new SickLeaveCat2BalanceProcess(EmpID, balanceItemList); //CAT2Process.LoadData(AsOfDate); }
protected double ALRounding(int EmpID, DateTime AsOfDate, ELeaveBalance balanceItem) { double originalProrata = balanceItem.LeaveBalanceEntitled; EEmpPositionInfo empPos = AppUtils.GetLastPositionInfo(dbConn, balanceItem.LeaveBalanceEffectiveEndDate, EmpID); if (empPos != null) { ELeavePlan leavePlan = new ELeavePlan(); leavePlan.LeavePlanID = empPos.LeavePlanID; if (ELeavePlan.db.select(dbConn, leavePlan)) { if (!leavePlan.LeavePlanALRoundingRuleIsApplyFirstYearBroughtForwardOnly || leavePlan.LeavePlanALRoundingRuleIsApplyFirstYearBroughtForwardOnly && AsOfDate > balanceItem.LeaveBalanceEffectiveEndDate && balanceItem.LeaveBalanceEffectiveDate <= DefaultServiceStartDate) { EALProrataRoundingRule roundingRule = new EALProrataRoundingRule(); roundingRule.ALProrataRoundingRuleID = leavePlan.ALProrataRoundingRuleID; if (EALProrataRoundingRule.db.select(dbConn, roundingRule)) { return(roundingRule.Rounding(dbConn, originalProrata)); } } } } return(originalProrata); }
public ArrayList getCurrentBalanceList(bool forESSOnly) { ArrayList balanceList = new ArrayList(); foreach (LeaveBalanceProcess balanceProcess in leaveBalanceProcessList.Values) { ELeaveBalance leaveBalance = balanceProcess.getLatestLeaveBalance(); if (leaveBalance != null) { //bool addToList = true; if (forESSOnly) { ELeaveType leaveType = new ELeaveType(); leaveType.LeaveTypeID = leaveBalance.LeaveTypeID; if (!ELeaveType.db.select(dbConn, leaveType)) { continue; } if (leaveType.LeaveTypeIsESSHideLeaveBalance) { continue; } DBFilter countESSLeaveCodeFilter = new DBFilter(); countESSLeaveCodeFilter.add(new Match("LeaveTypeID", leaveBalance.LeaveTypeID)); countESSLeaveCodeFilter.add(new Match("LeaveCodeHideInESS", false)); if (ELeaveCode.db.count(dbConn, countESSLeaveCodeFilter) <= 0) { continue; } //addToList = false; } //if (addToList) { LoadLeaveTypeAndRounding(leaveBalance); if (leaveBalance.LeaveBalanceEntitled != 0 || leaveBalance.getBalance() != 0 || leaveBalance.Taken != 0 || leaveBalance.Reserved != 0) { balanceList.Add(leaveBalance); } } } // Start 2013-12-02, Ricky So, Avoid showing CAT2 Sick Leave entry if ((ELeaveType.SLCAT2_LEAVE_TYPE(dbConn)).LeaveTypeIsDisabled == false) { if (balanceProcess is SickLeaveBalanceProcess) { leaveBalance = ((SickLeaveBalanceProcess)balanceProcess).getLatestCAT2LeaveBalance(); if (leaveBalance != null) { bool addToList = true; if (forESSOnly) { DBFilter countESSLeaveCodeFilter = new DBFilter(); countESSLeaveCodeFilter.add(new Match("LeaveTypeID", leaveBalance.LeaveTypeID)); countESSLeaveCodeFilter.add(new Match("LeaveCodeHideInESS", false)); if (ELeaveCode.db.count(dbConn, countESSLeaveCodeFilter) <= 0) { addToList = false; } } if (addToList) { LoadLeaveTypeAndRounding(leaveBalance); if (leaveBalance.LeaveBalanceEntitled != 0 || leaveBalance.getBalance() != 0 || leaveBalance.Taken != 0 || leaveBalance.Reserved != 0) { balanceList.Add(leaveBalance); } } } } } //if (balanceProcess is SickLeaveBalanceProcess) //{ // leaveBalance = ((SickLeaveBalanceProcess)balanceProcess).getLatestCAT2LeaveBalance(); // if (leaveBalance != null) // { // bool addToList = true; // if (forESSOnly) // { // DBFilter countESSLeaveCodeFilter = new DBFilter(); // countESSLeaveCodeFilter.add(new Match("LeaveTypeID", leaveBalance.LeaveTypeID)); // countESSLeaveCodeFilter.add(new Match("LeaveCodeHideInESS", false)); // if (ELeaveCode.db.count(dbConn, countESSLeaveCodeFilter) <= 0) // addToList = false; // } // if (addToList) // { // LoadLeaveTypeAndRounding(leaveBalance); // if (leaveBalance.LeaveBalanceEntitled != 0 || leaveBalance.getBalance() != 0 || leaveBalance.Taken != 0 || leaveBalance.Reserved != 0) // balanceList.Add(leaveBalance); // } // } //} // End 2013-12-02, Ricky So, Avoid showing CAT2 Sick Leave entry } return(balanceList); }
// End 0000008, Ricky So, 2014-11-21 protected void Save_Click(object sender, EventArgs e) { // speciailzed for TakYue only double m; try { m = Convert.ToDouble(RequestLeaveDays.Text); } catch { PageErrors invalideInputError = PageErrors.getErrors(db, Page); invalideInputError.clear(); invalideInputError.addError("Invalid Days Taken value."); return; } if (!applicableDays.Value.Equals("") && !applicableDays.Value.Contains(m.ToString("0.00"))) { PageErrors invalideInputError = PageErrors.getErrors(db, Page); invalideInputError.clear(); invalideInputError.addError("Days Taken must be in this range : " + applicableDays.Value); return; } // end specializations ERequestLeaveApplication c = new ERequestLeaveApplication(); if (!RequestLeaveAppUnit.SelectedValue.Equals("D")) { RequestLeaveAppDateTo.Value = RequestLeaveAppDateFrom.Value; } Hashtable values = new Hashtable(); binding.toValues(values); PageErrors errors = PageErrors.getErrors(db, Page); errors.clear(); db.validate(errors, values); if (!errors.isEmpty()) { return; } db.parse(values, c); if (c.RequestLeaveAppUnit.Equals("D")) { // the following 2 fields are not bind to controls c.RequestLeaveAppDateFromAM = this.RequestLeaveAppDateFromAM.SelectedValue; c.RequestLeaveAppDateToAM = this.RequestLeaveAppDateToAM.SelectedValue; } if (!c.RequestLeaveAppUnit.Equals("D")) { //c.RequestLeaveAppDateTo = c.RequestLeaveAppDateFrom; if (c.RequestLeaveAppTimeTo < c.RequestLeaveAppTimeFrom) { errors.addError("RequestLeaveAppTimeFrom", "Invald hours"); } } else { if (c.RequestLeaveAppDateTo < c.RequestLeaveAppDateFrom) { errors.addError("RequestLeaveAppDateFrom", "Date To cannot be earlier than Date From"); } // Start 0000201, Ricky So, 2015-05-29 else if (c.RequestLeaveAppDateTo == c.RequestLeaveAppDateFrom) { if (c.RequestLeaveAppDateFromAM.CompareTo(c.RequestLeaveAppDateToAM) > 0) { errors.addError("RequestLeaveAppDateFrom", "Date To cannot be earlier/equal than Date From"); } else if (c.RequestLeaveAppDateFromAM.CompareTo(c.RequestLeaveAppDateToAM) == 0) { // Convert to Half Day application if only AM/PM is applied c.RequestLeaveAppUnit = c.RequestLeaveAppDateFromAM.Substring(0, 1); c.RequestLeaveAppDateFromAM = null; c.RequestLeaveAppDateToAM = null; c.RequestLeaveDays = 0.5; } } // End 0000201, Ricky So, 2015-05-29 else { TimeSpan ts = c.RequestLeaveAppDateTo.Subtract(c.RequestLeaveAppDateFrom); if (c.RequestLeaveDays > ts.Days + 1) { errors.addError("RequestLeaveDays", "Days taken is too large"); } } } if (c.RequestLeaveAppDateFrom.Month != c.RequestLeaveAppDateTo.Month || c.RequestLeaveAppDateFrom.Year != c.RequestLeaveAppDateTo.Year) { errors.addError("Leave application must be within the same month"); } if (HoursClaimPanel.Visible) { if (c.RequestLeaveAppHours <= 0) { errors.addError(string.Format(HROne.Translation.PageErrorMessage.ERROR_FIELD_REQUIRED, new string[] { lblLeaveAppHours.Text })); } } ELeaveCode curreintLeaveCode = new ELeaveCode(); curreintLeaveCode.LeaveCodeID = c.RequestLeaveCodeID; if (ELeaveCode.db.select(dbConn, curreintLeaveCode)) { ELeaveType leaveType = new ELeaveType(); leaveType.LeaveTypeID = curreintLeaveCode.LeaveTypeID; if (ELeaveType.db.select(dbConn, leaveType)) { // Start 0000008, Ricky So, 2014-11-21 double m_hours = 0; double m_days = 0; GetPendingLeaveBalance(c.EmpID, leaveType.LeaveTypeID, out m_hours, out m_days); // End 0000008, Ricky So, 2014-11-21 if (leaveType.LeaveTypeIsESSIgnoreEntitlement) { HROne.LeaveCalc.LeaveBalanceCalc calc = new HROne.LeaveCalc.LeaveBalanceCalc(dbConn, c.EmpID); HROne.LeaveCalc.LeaveBalanceProcess balanceProcess = calc.getLeaveBalanceProcess(leaveType.LeaveTypeID); // assume as at today (since entitlement is ignored, as-at-date doesn't make any difference balanceProcess.LoadData(AppUtils.ServerDateTime().Date); ELeaveBalance balance = balanceProcess.getLatestLeaveBalance(); // Start 0000008, Ricky So, 2014-11-21 //if (balance == null // || (balance.getBalance() - balance.LeaveBalanceEntitled < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) // || (balance.getBalance() - balance.LeaveBalanceEntitled < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) if (balance == null || (balance.getBalance() - m_days - balance.LeaveBalanceEntitled < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || (balance.getBalance() - m_hours - balance.LeaveBalanceEntitled < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) ) // Start 0000008, Ricky So, 2014-11-21 { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } } else if (leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfApplicationDateFrom || leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfApplicationDateTo || leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfEndOfLeaveYear || leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfToday) { HROne.LeaveCalc.LeaveBalanceCalc calc = new HROne.LeaveCalc.LeaveBalanceCalc(dbConn, c.EmpID); HROne.LeaveCalc.LeaveBalanceProcess balanceProcess = calc.getLeaveBalanceProcess(leaveType.LeaveTypeID); if (leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfToday) { balanceProcess.LoadData(AppUtils.ServerDateTime().Date); ELeaveBalance balance = balanceProcess.getLatestLeaveBalance(); // Start 0000093, Ricky So, 2014-09-06 if (balance == null) { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } // Start 0000008, Ricky So, 2014-11-21 //else if ((balance.getBalance() - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || // (balance.getBalance() - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) else if ((balance.getBalance() - m_days - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || (balance.getBalance() - m_hours - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) ) // End 0000008, Ricky So, 2014-11-21 { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } //if (balance == null // || (balance.getBalance() < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) // || (balance.getBalance() < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) //{ // errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); //} // End 0000093, Ricky So, 2014-09-06 } if (errors.isEmpty() && leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfApplicationDateFrom) { balanceProcess.LoadData(c.RequestLeaveAppDateFrom); ELeaveBalance balance = balanceProcess.getLatestLeaveBalance(); // Start 0000093, Ricky So, 2014-09-06 if (balance == null) { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } // Start 0000008, Ricky So, 2014-11-21 //else if ((balance.getBalance() - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || // (balance.getBalance() - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) else if ((balance.getBalance() - m_days - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || (balance.getBalance() - m_hours - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) ) // End 0000008, Ricky So, 2014-11-21 { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } //if (balance == null // || (balance.getBalance() < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) // || (balance.getBalance() < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) //{ // errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); //} // End 0000093, Ricky So, 2014-09-06 } if (errors.isEmpty() && leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfApplicationDateTo) { balanceProcess.LoadData(c.RequestLeaveAppDateTo); ELeaveBalance balance = balanceProcess.getLatestLeaveBalance(); // Start 0000093, Ricky So, 2014-09-06 if (balance == null) { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } // Start 0000008, Ricky So, 2014-11-21 //else if ((balance.getBalance() - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || // (balance.getBalance() - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) else if ((balance.getBalance() - m_days - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || (balance.getBalance() - m_hours - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) ) // End 0000008, Ricky So, 2014-11-21 { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } //if (balance == null // || (balance.getBalance() < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) // || (balance.getBalance() < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) //{ // errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); //} // End 0000093, Ricky So, 2014-09-06 } if (errors.isEmpty() && leaveType.LeaveTypeIsESSRestrictNegativeBalanceAsOfEndOfLeaveYear) { balanceProcess.LoadData(AppUtils.ServerDateTime().Date); ELeaveBalance balance = balanceProcess.getLatestLeaveBalance(); if (!balance.LeaveBalanceEffectiveEndDate.Ticks.Equals(0)) { balanceProcess.LoadData(balance.LeaveBalanceEffectiveEndDate); balance = balanceProcess.getLatestLeaveBalance(); } // Start 0000093, Ricky So, 2014-09-06 if (balance == null) { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } // Start 0000008, Ricky So, 2014-11-21 //else if ((balance.getBalance() - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || // (balance.getBalance() - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) else if ((balance.getBalance() - m_days - c.RequestLeaveDays < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) || (balance.getBalance() - m_hours - c.RequestLeaveAppHours < -1 * leaveType.LeaveTypeIsESSAllowableAdvanceBalance && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) ) // End 0000008, Ricky So, 2014-11-21 { errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); } //if (balance == null // || (balance.getBalance() < c.RequestLeaveDays && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Day) // || (balance.getBalance() < c.RequestLeaveAppHours && balanceProcess.BalanceUnit == ELeaveBalance.LeaveBalanceUnit.Hour) // ) //{ // errors.addError(ERROR_MESSAGE_BALANCE_NOT_ENOUGH); //} // End 0000093, Ricky So, 2014-09-06 } } } } if (!errors.isEmpty()) { return; } ArrayList overlapLeaveAppList = new ArrayList(); if (c.IsOverlapLeaveApplication(dbConn, out overlapLeaveAppList)) { string strDailyOverlapMessage = string.Empty; string strHourlyOverlapMessage = string.Empty; foreach (BaseObject overlapLeaveApp in overlapLeaveAppList) { if (overlapLeaveApp is ELeaveApplication) { ELeaveApplication previousLeaveApp = (ELeaveApplication)overlapLeaveApp; if (previousLeaveApp.LeaveAppUnit.Equals("D") || c.RequestLeaveAppUnit.Equals("D")) { if (string.IsNullOrEmpty(strDailyOverlapMessage)) { strDailyOverlapMessage = "Leave dates cannot overlap with previous leave applications"; } ELeaveCode leaveCode = new ELeaveCode(); leaveCode.LeaveCodeID = previousLeaveApp.LeaveCodeID; if (ELeaveCode.db.select(dbConn, leaveCode)) { // Start 0000201, Ricky So, 2015-06-02 //strDailyOverlapMessage += "\r\n- " + previousLeaveApp.LeaveAppDateFrom.ToString("yyyy-MM-dd") + (previousLeaveApp.LeaveAppDateFrom.Equals(previousLeaveApp.LeaveAppDateTo) ? "" : " To " + previousLeaveApp.LeaveAppDateTo.ToString("yyyy-MM-dd")) + " " + leaveCode.LeaveCodeDesc; strDailyOverlapMessage += "\r\n- " + previousLeaveApp.LeaveAppDateFrom.ToString("yyyy-MM-dd"); if (previousLeaveApp.LeaveAppUnit == "A") { strDailyOverlapMessage += "AM"; } else if (previousLeaveApp.LeaveAppUnit == "P") { strDailyOverlapMessage += "PM"; } else if (previousLeaveApp.LeaveAppUnit == "D" && !string.IsNullOrEmpty(previousLeaveApp.LeaveAppDateFromAM)) { strDailyOverlapMessage += previousLeaveApp.LeaveAppDateFromAM; } else if (previousLeaveApp.LeaveAppDateFrom.Equals(previousLeaveApp.LeaveAppDateTo)) { strDailyOverlapMessage += " To " + previousLeaveApp.LeaveAppDateTo.ToString("yyyy-MM-dd"); } if (previousLeaveApp.LeaveAppUnit == "D" && !string.IsNullOrEmpty(previousLeaveApp.LeaveAppDateToAM)) { strDailyOverlapMessage += previousLeaveApp.LeaveAppDateToAM; } else { strDailyOverlapMessage += " " + leaveCode.LeaveCodeDesc; } // End 0000201, Ricky So, 2015-06-02 } } else { if (string.IsNullOrEmpty(strHourlyOverlapMessage)) { strHourlyOverlapMessage = "Leave time cannot overlap with previous leave applications"; } } } else if (overlapLeaveApp is ERequestLeaveApplication) { ERequestLeaveApplication previousRequestLeaveApp = (ERequestLeaveApplication)overlapLeaveApp; if (previousRequestLeaveApp.RequestLeaveAppUnit.Equals("D") || c.RequestLeaveAppUnit.Equals("D")) { if (string.IsNullOrEmpty(strDailyOverlapMessage)) { strDailyOverlapMessage = "Leave dates cannot overlap with previous leave applications"; } ELeaveCode leaveCode = new ELeaveCode(); leaveCode.LeaveCodeID = previousRequestLeaveApp.RequestLeaveCodeID; if (ELeaveCode.db.select(dbConn, leaveCode)) { // Start 0000201, Ricky So, 2015-06-02 //strDailyOverlapMessage += "\r\n- " + previousRequestLeaveApp.RequestLeaveAppDateFrom.ToString("yyyy-MM-dd") + (previousRequestLeaveApp.RequestLeaveAppDateFrom.Equals(previousRequestLeaveApp.RequestLeaveAppDateTo) ? "" : " To " + previousRequestLeaveApp.RequestLeaveAppDateTo.ToString("yyyy-MM-dd")) + " " + leaveCode.LeaveCodeDesc; strDailyOverlapMessage += "\r\n- " + previousRequestLeaveApp.RequestLeaveAppDateFrom.ToString("yyyy-MM-dd"); if (previousRequestLeaveApp.RequestLeaveAppUnit == "A") { strDailyOverlapMessage += "AM"; } else if (previousRequestLeaveApp.RequestLeaveAppUnit == "P") { strDailyOverlapMessage += "PM"; } else if (previousRequestLeaveApp.RequestLeaveAppUnit == "D" && !string.IsNullOrEmpty(previousRequestLeaveApp.RequestLeaveAppDateFromAM)) { strDailyOverlapMessage += previousRequestLeaveApp.RequestLeaveAppDateFromAM; } else if (previousRequestLeaveApp.RequestLeaveAppDateFrom.Equals(previousRequestLeaveApp.RequestLeaveAppDateTo)) { strDailyOverlapMessage += " To " + previousRequestLeaveApp.RequestLeaveAppDateTo.ToString("yyyy-MM-dd"); } if (previousRequestLeaveApp.RequestLeaveAppUnit == "D" && !string.IsNullOrEmpty(previousRequestLeaveApp.RequestLeaveAppDateToAM)) { strDailyOverlapMessage += previousRequestLeaveApp.RequestLeaveAppDateToAM; } else { strDailyOverlapMessage += " " + leaveCode.LeaveCodeDesc; } // End 0000201, Ricky So, 2015-06-02 } } else { if (string.IsNullOrEmpty(strHourlyOverlapMessage)) { strHourlyOverlapMessage = "Leave time cannot overlap with previous leave applications"; } } } } if (!string.IsNullOrEmpty(strDailyOverlapMessage)) { errors.addError(strDailyOverlapMessage); } if (!string.IsNullOrEmpty(strHourlyOverlapMessage)) { errors.addError(strHourlyOverlapMessage); } } if (!errors.isEmpty()) { return; } try { ESSAuthorizationProcess authorization = new ESSAuthorizationProcess(dbConn); authorization.SubmitLeaveApplication(c); } catch (Exception ex) { errors.addError(ex.Message); } if (!errors.isEmpty()) { return; } if (c.RequestLeaveAppHasMedicalCertificate) { string message = ESystemParameter.getParameter(dbConn, ESystemParameter.PARAM_CODE_ESS_LEAVE_MEDICIAL_CERT_ALERT); if (!string.IsNullOrEmpty(message)) { message = message.Replace("\r", "\\r").Replace("\n", "\\n"); ScriptManager.RegisterStartupScript(Page, Page.GetType(), "leaveAppAlert", "alert(\"" + message + "\"); window.location=\"./ESS_EmpRequestStatus.aspx\";", true); //ScriptManager.RegisterStartupScript(Page, Page.GetType(), "errorMessage", "popupDialog(\"testing\");", true); return; } } HROne.Common.WebUtility.RedirectURLwithEncryptedQueryString(Response, Session, "~/ESS_EmpRequestStatus.aspx"); }
protected override void LoadServerData(DateTime asOfDate) { ELeaveBalance m_balance = new ELeaveBalance(); ELeaveBalance m_preBalance = new ELeaveBalance(); ELeaveBalance m_curBalance = new ELeaveBalance(); ELeaveBalance m_subBalance; DateTime m_periodFromDate = new DateTime(1900, 1, 1); DateTime m_periodToDate = asOfDate; m_balance.EmpID = EmpID; m_balance.LeaveTypeID = LeaveTypeID; m_balance.BalanceUnit = ELeaveBalance.LeaveBalanceUnit.Hour; m_balance.LeaveBalanceEffectiveDate = new DateTime(asOfDate.Year, 1, 1); ArrayList entitledList = LoadAllEntitled(m_periodFromDate, asOfDate, m_balance.EmpID); ArrayList adjustedList = LoadAllAdjust(m_periodFromDate, asOfDate, EmpID, m_balance.LeaveTypeID); ArrayList takenList = LoadAllTaken(m_periodFromDate, m_periodToDate, EmpID, m_balance.LeaveTypeID); ArrayList processedList = new ArrayList(); ArrayList removalList = new ArrayList(); m_earned = BuildEarnedTable(entitledList, adjustedList); m_preBalance.LeaveBalanceEntitled = GetEntitledBalance(m_periodFromDate, m_balance.LeaveBalanceEffectiveDate.AddDays(-1)); m_preBalance.Adjust = GetAdjustedBalance(m_periodFromDate, m_balance.LeaveBalanceEffectiveDate.AddDays(-1)); //********************* before effective date ******************/ foreach (ELeaveApplication o in takenList) // process Taken before effective date { if (o.LeaveAppDateFrom >= m_balance.LeaveBalanceEffectiveDate) { break; } double m_takenHours = o.LeaveAppHours; // check available balance before process leave taken m_subBalance = GetAvailableBalance(o, m_balance.LeaveBalanceEffectiveDate.AddDays(-1)); //, entitledList, processedList, adjustedList, o.LeaveAppHours); m_preBalance.ExpiryForfeit += m_subBalance.ExpiryForfeit; m_preBalance.Taken += m_takenHours; removalList.Add(o); } foreach (ELeaveApplication o in removalList) { takenList.Remove(o); } m_balance.LeaveBalanceBF = m_preBalance.LeaveBalanceEntitled + m_preBalance.Adjust - m_preBalance.Taken - m_preBalance.ExpiryForfeit; m_balance.LeaveBalanceEntitled = GetEntitledBalance(m_balance.LeaveBalanceEffectiveDate, asOfDate); m_balance.Adjust = GetAdjustedBalance(m_balance.LeaveBalanceEffectiveDate, asOfDate); foreach (ELeaveApplication o in takenList) // process Taken after effective date { if (o.LeaveAppDateFrom > asOfDate) { break; } double m_takenHours = o.LeaveAppHours; // check available balance before process leave taken m_subBalance = GetAvailableBalance(o, asOfDate); m_curBalance.ExpiryForfeit += m_subBalance.ExpiryForfeit; m_curBalance.Taken += m_takenHours; removalList.Add(o); } foreach (ELeaveApplication o in removalList) { takenList.Remove(o); } m_balance.Taken = m_curBalance.Taken; m_balance.ExpiryForfeit = m_curBalance.ExpiryForfeit; // let unused entitlement/adjustment expire if there are no further taken. m_balance.ExpiryForfeit += GetUnusedExpiredBalance(asOfDate); //********************** get next expiry information *************/ if (m_earned.Rows.Count > 0) { m_earned.DefaultView.Sort = "EXPIRY_DATE, UNUSED_HOURS desc"; m_earned = m_earned.DefaultView.ToTable(); foreach (DataRow row in m_earned.Rows) { if (row["EXPIRY_DATE"] != null && System.Convert.ToDateTime(row["EXPIRY_DATE"]).CompareTo(asOfDate) >= 0 && System.Convert.ToDouble(row["UNUSED_HOURS"]) > 0) { if (m_balance.NextExpiryDate.Ticks.Equals(0)) { m_balance.NextExpiryDate = System.Convert.ToDateTime(row["EXPIRY_DATE"]); m_balance.NextExpiryForfeit = System.Convert.ToDouble(row["UNUSED_HOURS"]); } else if (m_balance.NextExpiryDate == System.Convert.ToDateTime(row["EXPIRY_DATE"])) { m_balance.NextExpiryForfeit += System.Convert.ToDouble(row["UNUSED_HOURS"]); } } } if (m_balance.NextExpiryForfeit <= 0) { m_balance.NextExpiryDate = new DateTime(); } } // find the reserved m_balance.Reserved = GetReservedBalance(takenList, asOfDate); balanceItemList.Add(m_balance); }
protected override double LoadTaken(ELeaveBalance balanceItem, DateTime AsOfDate) { base.LoadTaken(balanceItem, AsOfDate); DateTime DateFrom, DateTo; DateFrom = balanceItem.LeaveBalanceEffectiveDate; DateTo = balanceItem.LeaveBalanceEffectiveEndDate; DBFilter rosterCodeFilter = new DBFilter(); rosterCodeFilter.add(new Match("RosterCodeType", ERosterCode.ROSTERTYPE_CODE_PUBLICHOLIDAY)); // Use AttendanceRecord as primary source for Rest Day taken { DBFilter attendanceRecordFilter = new DBFilter(); attendanceRecordFilter.add(new Match("AttendanceRecordDate", ">=", DateFrom)); attendanceRecordFilter.add(new Match("EmpID", balanceItem.EmpID)); attendanceRecordFilter.add(new IN("RosterCodeID", "Select RosterCodeID from " + ERosterCode.db.dbclass.tableName, rosterCodeFilter)); ArrayList AttendanceRecordList = EAttendanceRecord.db.select(dbConn, attendanceRecordFilter); foreach (EAttendanceRecord attendanceRecord in AttendanceRecordList) { // Check if duplicate rest day leave application exists // double actualDayTaken = 1; DBFilter leaveApplicationFilter = new DBFilter(); DBFilter leaveCodeFilter = new DBFilter(); leaveCodeFilter.add(new Match("LeaveTypeID", LeaveTypeID)); leaveApplicationFilter.add(new Match("EmpID", balanceItem.EmpID)); leaveApplicationFilter.add(new Match("LeaveAppDateFrom", "<=", attendanceRecord.AttendanceRecordDate)); leaveApplicationFilter.add(new Match("LeaveAppDateTo", ">=", attendanceRecord.AttendanceRecordDate)); leaveApplicationFilter.add(new IN("LeaveCodeID", "SELECT LeaveCodeID FROM " + ELeaveCode.db.dbclass.tableName, leaveCodeFilter)); ArrayList leaveAppList = ELeaveApplication.db.select(dbConn, leaveApplicationFilter); foreach (ELeaveApplication leaveApp in leaveAppList) { actualDayTaken -= leaveApp.LeaveAppDays; } if (actualDayTaken > 0) { if (attendanceRecord.AttendanceRecordDate <= AsOfDate && attendanceRecord.AttendanceRecordDate <= DateTo) { balanceItem.Taken += actualDayTaken; } else { balanceItem.Reserved += actualDayTaken; } } } } // Use rostertable for Rest Day taken only if attendence record does not exist { DBFilter rosterTableFilter = new DBFilter(); rosterTableFilter.add(new Match("RosterTableDate", ">=", DateFrom)); rosterTableFilter.add(new Match("EmpID", balanceItem.EmpID)); rosterTableFilter.add(new IN("RosterCodeID", "Select RosterCodeID from " + ERosterCode.db.dbclass.tableName, rosterCodeFilter)); DBFilter notExistsFilter = new DBFilter(); notExistsFilter.add(new MatchField("RosterTableDate", "AttendanceRecordDate")); notExistsFilter.add(new Match("EmpID", balanceItem.EmpID)); rosterTableFilter.add(new Exists(EAttendanceRecord.db.dbclass.tableName + " ar", notExistsFilter, true)); ArrayList rosterTableList = ERosterTable.db.select(dbConn, rosterTableFilter); foreach (ERosterTable rosterTable in rosterTableList) { // Check if duplicate rest day leave application exists // double actualDayTaken = 1; DBFilter leaveApplicationFilter = new DBFilter(); DBFilter leaveCodeFilter = new DBFilter(); leaveCodeFilter.add(new Match("LeaveTypeID", LeaveTypeID)); leaveApplicationFilter.add(new Match("EmpID", balanceItem.EmpID)); leaveApplicationFilter.add(new Match("LeaveAppDateFrom", "<=", rosterTable.RosterTableDate)); leaveApplicationFilter.add(new Match("LeaveAppDateTo", ">=", rosterTable.RosterTableDate)); leaveApplicationFilter.add(new IN("LeaveCodeID", "SELECT LeaveCodeID FROM " + ELeaveCode.db.dbclass.tableName, leaveCodeFilter)); ArrayList leaveAppList = ELeaveApplication.db.select(dbConn, leaveApplicationFilter); foreach (ELeaveApplication leaveApp in leaveAppList) { actualDayTaken -= leaveApp.LeaveAppDays; } if (actualDayTaken > 0) { if (rosterTable.RosterTableDate <= AsOfDate && rosterTable.RosterTableDate <= DateTo) { balanceItem.Taken += actualDayTaken; } else { balanceItem.Reserved += actualDayTaken; } } } } //DBFilter filter = new DBFilter(); //filter.add(new Match("RosterTableDate", ">=", DateFrom)); //filter.add(new Match("EmpID", balanceItem.EmpID)); //DBFilter rosterCodeFilter = new DBFilter(); //rosterCodeFilter.add(new Match("RosterCodeType", ERosterCode.ROSTERTYPE_CODE_STATUTORYHOLIDAY)); //filter.add(new IN("RosterCodeID", "Select RosterCodeID from " + ERosterCode.db.dbclass.tableName, rosterCodeFilter)); //ArrayList rosterTableList = ERosterTable.db.select(dbConn, filter); //foreach (ERosterTable rosterTable in rosterTableList) //{ // // Check if duplicate rest day leave application exists // // // double actualDayTaken = 1; // DBFilter leaveApplicationFilter = new DBFilter(); // DBFilter leaveCodeFilter = new DBFilter(); // leaveCodeFilter.add(new Match("LeaveTypeID", LeaveTypeID)); // leaveApplicationFilter.add(new Match("EmpID", balanceItem.EmpID)); // leaveApplicationFilter.add(new Match("LeaveAppDateFrom", "<=", rosterTable.RosterTableDate)); // leaveApplicationFilter.add(new Match("LeaveAppDateTo", ">=", rosterTable.RosterTableDate)); // leaveApplicationFilter.add(new IN("LeaveCodeID", "SELECT LeaveCodeID FROM " + ELeaveCode.db.dbclass.tableName, leaveCodeFilter)); // ArrayList leaveAppList = ELeaveApplication.db.select(dbConn, leaveApplicationFilter); // foreach (ELeaveApplication leaveApp in leaveAppList) // actualDayTaken -= leaveApp.LeaveAppDays; // if (actualDayTaken > 0) // if (rosterTable.RosterTableDate <= AsOfDate && rosterTable.RosterTableDate <= DateTo) // balanceItem.Taken += actualDayTaken; // else // balanceItem.Reserved += actualDayTaken; //} return(balanceItem.Taken); }