using Ease.Core; using Ease.Core.DataAccess; using Ease.Core.Model; using Ease.Core.Utility; using HRM.BO; using HRM.BO.Configuration; using Microsoft.Extensions.Configuration; using NPOI.SS.Formula.Eval; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using static iTextSharp.text.pdf.AcroFields; namespace HRM.DA { public class ShortLeaveService : ServiceTemplate , IShortLeaveService { #region Private functions and declaration protected override T CreateObject(DataReader oReader) { ShortLeave oShortLeave = new ShortLeave(); MapObject(oShortLeave, oReader); return oShortLeave as T; } private void MapObject(ShortLeave oShortLeave, DataReader oReader) { base.SetObjectID(oShortLeave, oReader.GetInt32("ShortLeaveId").Value); oShortLeave.TelephoneNo = oReader.GetString("TelephoneNo"); oShortLeave.ALTEMPID = oReader.GetString("ALTEMPID"); oShortLeave.EntryDate = oReader.GetDateTime("EntryDate").Value; oShortLeave.TotalHour = oReader.GetDouble("TotalHour").Value; oShortLeave.DepartureTime = oReader.GetTime("DepartureTime").Value; oShortLeave.DepartureEntryByID = oReader.GetInt32("DepartureEntryByID", true, 0); oShortLeave.ReturnTime = oReader.GetTime("ReturnTime", true, TimeSpan.FromMinutes(0)); oShortLeave.ReturnEntryByID = oReader.GetInt32("ReturnEntryByID", true, 0); oShortLeave.ActualInTime = oReader.GetTime("ActualInTime", true, TimeSpan.FromMinutes(0)); oShortLeave.ActualOutTime = oReader.GetTime("ActualOutTime", true, TimeSpan.FromMinutes(0)); oShortLeave.ExpectedReturnTime = oReader.GetTime("ExpectedReturnTime", true, TimeSpan.FromMinutes(0)); oShortLeave.GatePassStatus = (EnumGatePassStatus)oReader.GetInt32("GatePassStatus").Value; oShortLeave.LineManagerID = oReader.GetInt32("LineManagerID").Value; oShortLeave.ApprovedBy = oReader.GetInt32("ApprovedBy", true, 0); oShortLeave.ApprovedDate = oReader.GetDateTime("ApprovedDate").Value; oShortLeave.EmployeeID = oReader.GetInt32("EmployeeID").Value; oShortLeave.PayrollTypeID = oReader.GetInt32("PayrollTypeID").Value; oShortLeave.Remarks = oReader.GetString("Remarks"); oShortLeave.PlaceOfVisit = oReader.GetString("PlaceOfVisit"); oShortLeave.PurposeOfVisit = oReader.GetString("PurposeOfVisit"); } private ShortLeave CreateObject(DataReader oReader) { ShortLeave oShortLeave = new ShortLeave(); MapObject(oShortLeave, oReader); return oShortLeave; } #endregion #region Service implementation #region Get Functions public ShortLeave Get(int id) { ShortLeave oShortLeave = new ShortLeave(); TransactionContext tc = null; try { tc = TransactionContext.Begin(); DataReader oreader = new DataReader(ShortLeaveDA.Get(tc, id)); if (oreader.Read()) { oShortLeave = this.CreateObject(oreader); } oreader.Close(); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Short Leave", e); #endregion } return oShortLeave; } public ShortLeave GetByDate(int id, DateTime date) { ShortLeave oShortLeave = new ShortLeave(); TransactionContext tc = null; try { tc = TransactionContext.Begin(); DataReader oreader = new DataReader(ShortLeaveDA.GetByDate(tc, id, date)); if (oreader.Read()) { oShortLeave = this.CreateObject(oreader); } oreader.Close(); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Short Leave", e); #endregion } return oShortLeave; } public List GetListByDate(int id, DateTime date) { List oShortLeaves = new List(); TransactionContext tc = null; try { tc = TransactionContext.Begin(); DataReader oreader = new DataReader(ShortLeaveDA.GetByDate(tc, id, date)); oShortLeaves = this.CreateObjects(oreader); oreader.Close(); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Short Leave", e); #endregion } return oShortLeaves; } public DataTable Get(int empid, int payrollTypeID, EnumGatePassStatus status, DateTime fromDate, DateTime toDate) { TransactionContext tc = null; DataTable dt = null; try { tc = TransactionContext.Begin(); //fromDate = fromDate.FirstDateOfMonth(); //toDate = toDate.LastDateOfMonth(); dt = ShortLeaveDA.Get(tc, empid, payrollTypeID, status, fromDate, toDate); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Short Leave Information" + e.Message, e); #endregion } return dt; } public DataTable GetAppliedSortLeave(int lmId, EnumGatePassStatus status) { TransactionContext tc = null; DataTable dt = null; try { tc = TransactionContext.Begin(); dt = ShortLeaveDA.GetAppliedSortLeave(tc, lmId, status); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Applied Short Leave Data" + e.Message, e); #endregion } return dt; } public DataTable GetApprovedShortLeave(int lmId, EnumGatePassStatus status, DateTime fromDate, DateTime toDate) { TransactionContext tc = null; DataTable dt = null; try { tc = TransactionContext.Begin(); dt = ShortLeaveDA.GetApprovedShortLeave(tc, lmId, status, fromDate, toDate); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Applied Short Leave Data" + e.Message, e); #endregion } return dt; } public void ApproveOrRejectShortLeave(int shortLeaveid, EnumGatePassStatus status, int approver) { TransactionContext tc = null; try { tc = TransactionContext.Begin(); ShortLeaveDA.ApproveOrRejectShortLeave(tc, shortLeaveid, status, approver); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new Exception("Failed to Approve Or Reject Short Leave. Because " + e.Message, e); #endregion } } public void ApproveMultipleShortLeave (string shortLeaveid, EnumGatePassStatus status, int approver) { TransactionContext tc = null; try { tc = TransactionContext.Begin(); ShortLeaveDA.ApproveMultipleShortLeave(tc, shortLeaveid, status, approver); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new Exception("Failed to Approve Or Reject Short Leave. Because " + e.Message, e); #endregion } } public DataTable getGatemanShortLeave(EnumGatePassStatus status, DateTime fromDate, DateTime toDate) { TransactionContext tc = null; DataTable dt = null; try { tc = TransactionContext.Begin(); //fromDate = fromDate.FirstDateOfMonth(); //toDate = toDate.LastDateOfMonth(); dt = ShortLeaveDA.getGatemanShortLeave(tc, status, fromDate, toDate); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException("Failed to Get Short Leave Information" + e.Message, e); #endregion } return dt; } #endregion #region Save public int Save(ShortLeave oShortLeave) { TransactionContext tc = null; try { if (oShortLeave == null) { oShortLeave = new ShortLeaveService().Get(oShortLeave.ID); } if (oShortLeave.Employee == null) { oShortLeave.Employee = new EmployeeService().Get(oShortLeave.EmployeeID); } List oSL = new List(); int currentoShortLeaveID = oShortLeave.ID; oSL = this.GetListByDate(oShortLeave.EmployeeID, oShortLeave.EntryDate); oSL = oSL.Where(x => x.GatePassStatus != EnumGatePassStatus.Rejected //&& x.GatePassStatus != EnumGatePassStatus.Approved && x.ID != currentoShortLeaveID).ToList(); if (oSL.Count>0) { throw new Exception("Overlaps with previously applied Short leaves."); } else { tc = TransactionContext.Begin(true); Save(oShortLeave, tc); tc.End(); } //if (isNew == true && oShortLeave.GatePassStatus == EnumGatePassStatus.Applied) //{ // string subject = oShortLeave.Employee.EmployeeNo + "-" + oShortLeave.Employee.Name + ", has applied " + oShortLeave.PurposeOfVisit + " Short Leave on " // + oShortLeave.EntryDate.ToString("dd MMM yyyy") // + " at " + oShortLeave.EntryDate.Add(oShortLeave.DepartureTime).ToString("hh:mm tt") // //" to " + oShortLeave.AppliedToDate.ToString("dd MMM yyyy") + // //" days:" + oShortLeave.AppliedTotalDays.ToString() // + ". Your Approval is required"; // WFManager om = new WFManager(oShortLeave); // om.InitiateProcess(tc, oShortLeave.EmployeeID, oShortLeave.SetupID, oShortLeave.ID, "", subject); //} //else //{ // tc = TransactionContext.Begin(true); // if (oShortLeave.IsNew) // { // int id = tc.GenerateID("ShortLeave", "ShortLeaveID"); // base.SetObjectID(oShortLeave, id); // ShortLeaveDA.Insert(tc, oShortLeave); // } // else // { // ShortLeaveDA.Update(tc, oShortLeave); // } // tc.End(); //} //else if (oLeaveEntry.LeaveStatus == EnumLeaveStatus.Approved) //{ // new DailyAttnProcessService().UpdateLeave(tc, oLeaveEntry.EmpID, oLeaveEntry.LeaveID, oLeaveEntry.CreatedBy, oLeaveEntry.ApprovedFromDate, oLeaveEntry.ApprovedToDate); //} return oShortLeave.ID; } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new Exception("Failed to Apply Short Leave. Because " + e.Message, e); #endregion } } public int Save(ShortLeave oShortLeave, TransactionContext tc) { try { bool isNew = oShortLeave.IsNew; if (oShortLeave.IsNew) { int id = tc.GenerateID("ShortLeave", "ShortLeaveID"); base.SetObjectID(oShortLeave, id); ShortLeaveDA.Insert(tc, oShortLeave); } else { ShortLeaveDA.Update(tc, oShortLeave); } if (isNew == true && oShortLeave.GatePassStatus == EnumGatePassStatus.Applied) { SendMail(oShortLeave); } //if (isNew == true && oShortLeave.GatePassStatus == EnumGatePassStatus.Applied) //{ // string subject = oShortLeave.Employee.EmployeeNo + "-" + oShortLeave.Employee.Name + ", has applied " + oShortLeave.PurposeOfVisit + " Shortleave at " // + oShortLeave.EntryDate.ToString("dd MMM yyyy") // + ". Your Approval is required"; // WFManager om = new WFManager(oShortLeave); // om.InitiateProcess(tc, oShortLeave.EmployeeID, oLeaveEntry.SetupID, oShortLeave.ID, "", subject); //} //else if (oLeaveEntry.LeaveStatus == EnumLeaveStatus.Approved) //{ //} return oShortLeave.ID; } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException(e.Message, e); #endregion } } public void UpdateInAndOutTime(ShortLeave oShortleave, Employee oEmp) { TransactionContext tc = null; try { ShortLeave oSL = new ShortLeaveService().Get(oShortleave.ID); if(oShortleave.EntryDate != DateTime.Now.Date) { throw new Exception("Incorrect Entry: Select employee applied today."); } if (oShortleave.ActualOutTime >= oSL.ActualOutTime && oSL.ActualOutTime != TimeSpan.FromMinutes(0) && oShortleave.ActualInTime == TimeSpan.FromMinutes(0) ) { throw new Exception("The Departure Entry is Already recorded."); } if (oShortleave.ActualInTime >= oSL.ActualInTime && oSL.ActualInTime != TimeSpan.FromMinutes(0) ) { throw new Exception("The Return Entry is Already recorded."); } tc = TransactionContext.Begin(true); ShortLeaveDA.UpdateInAndOutTime(tc, oShortleave, oEmp); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException(e.Message, e); #endregion } } #endregion #region Delete public void Delete(int id) { TransactionContext tc = null; try { tc = TransactionContext.Begin(true); ShortLeaveDA.Delete(tc, id); tc.End(); } catch (Exception e) { #region Handle Exception if (tc != null) tc.HandleError(); ExceptionLog.Write(e); throw new ServiceException(e.Message, e); #endregion } } #endregion #endregion #region private methods private void SendMail(ShortLeave shortLeave) { try { //string Name = shortLeave.Employee.EmployeeNo + "-" + shortLeave.Employee.Name; Employee lm = new EmployeeService().Get(shortLeave.LineManagerID); string Name = lm.Name; string Email = lm.EmailAddress; var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json"); EmailSettings emailSettings = new EmailSettings(); IConfiguration Configuration = builder.Build(); Configuration.GetSection("EmailSettings").Bind(emailSettings); MailSender mailSender = new MailSender(); mailSender.AddTo(Email) ; mailSender.Subject = "Notification of Short Leave request (" + DateTime.Now.ToString("dd MMM yyyy") + ")"; mailSender.Body = $@"

Dear {Name},

A Short Leave request has been submitted for Employee ID-{shortLeave.Employee.EmployeeNo}

Your Approval is required.

Thanks {Name}

"; //

Regards,

//

{shortLeave.Employee.Name}

"; mailSender.ThreadSendMail(emailSettings); } catch (Exception ex) { //throw new ServiceException(ex.Message); // throw new CustomException(EnumExceptionType.Informational, "Successfully submitted but system could not send E-mail. You do not need to submit it again."); } } #endregion } }