using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using HRM.BO;
using HRM.BO.Report;
using HRM.DA;
using Microsoft.AspNetCore.Authorization;
using System.IO;
using HRM.BO.Configuration;
using iTextSharp.text;
using Microsoft.Extensions.Options;
using NPOI.POIFS.Storage;
using Ease.Core;
using static iTextSharp.text.pdf.AcroFields;
using HRM.Service;

namespace HRM.UI.Controllers.Leave
{
    [Route("api/Leave")]
    [ApiController]
    public class LeaveController : ControllerBase
    {
        private readonly IEmployeeShortLeaveService _employeeShortLeaveService;
        private readonly ILeaveService _leaveService;
        private readonly ILeaveEntryService _leaveEntryService;
        private readonly ILeaveExceptionService _leaveExceptionService;
        private readonly ILeaveParameterService _leaveParameterService;
        private readonly ILeavePlanService _leavePlanService;
        private readonly ILeaveProcessService _leaveProcessService;
        private readonly ILeaveYearService _leaveYearService;
        private readonly IUploadEncashAmountService _uploadEncashAmountService;
        private readonly IDepartmentService _departmentService;
        private readonly IDesignationService _designationService;
        private readonly IWeeklyHolidayService _weeklyHoliday;
        private readonly IOptions<EmailSettings> _emailSettings;
        private readonly ILeaveEncashmentService _leaveEncashmentService;
        private readonly IEmployeeService _employeeService;
        private readonly IShortLeaveService _shortLeaveService;
        private readonly IMaternityLeaveService _maternityLeaveService;

        public LeaveController(IEmployeeShortLeaveService employeeShortLeaveService,
            ILeaveService leaveService,
            ILeaveEntryService leaveEntryService,
            ILeaveExceptionService leaveExceptionService,
            ILeaveParameterService leaveParameterService,
            ILeavePlanService leavePlanService,
            ILeaveProcessService leaveProcessService,
            ILeaveYearService leaveYearService,
            IUploadEncashAmountService uploadEncashAmountService,
            IDepartmentService departmentService,
            IDesignationService designationService,
            IWeeklyHolidayService weeklyHoliday,
            IOptions<EmailSettings> emailSettings,
            ILeaveEncashmentService leaveEncashmentService,
            IEmployeeService employeeService,
            IShortLeaveService shortLeaveService,
            IMaternityLeaveService maternityLeaveService)
        {
            this._employeeShortLeaveService = employeeShortLeaveService;
            this._leaveService = leaveService;
            this._leaveEntryService = leaveEntryService;
            this._leaveExceptionService = leaveExceptionService;
            this._leaveParameterService = leaveParameterService;
            this._leavePlanService = leavePlanService;
            this._leaveProcessService = leaveProcessService;
            this._leaveYearService = leaveYearService;
            this._uploadEncashAmountService = uploadEncashAmountService;
            this._departmentService = departmentService;
            this._designationService = designationService;
            this._weeklyHoliday = weeklyHoliday;
            this._emailSettings = emailSettings;
            _leaveEncashmentService = leaveEncashmentService;
            _employeeService = employeeService;
            this._shortLeaveService = shortLeaveService;
            this._maternityLeaveService = maternityLeaveService;
        }

        // EmployeeShortLeave


        [HttpGet("getWeeklyHoliday")]
        public ActionResult getWeeklyHoliday()
        {
            List<WeeklyHoliday> item = new List<WeeklyHoliday>();
            try
            {
                item = _weeklyHoliday.Get(EnumStatus.Regardless);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getWeeklyHolidayByID/{ID}")]
        public ActionResult getWeeklyHolidayByID(int id)
        {
            WeeklyHoliday item = new WeeklyHoliday();
            try
            {
                item = _weeklyHoliday.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getWeeklyHolidayByLocation/{ID}")]
        public ActionResult getWeeklyHolidayByLocation(int locationID)
        {
            List<WeeklyHoliday> item = new List<WeeklyHoliday>();
            try
            {
                item = _weeklyHoliday.GetByLocation(locationID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpPost("SaveWeeklyHoliday")]
        public ActionResult SaveWeeklyHoliday(List<WeeklyHoliday> holidays)
        {
            try
            {
                _weeklyHoliday.Save(holidays);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(true);
        }

        [HttpPost("DeleteWeeklyHoliday")]
        public ActionResult DeleteWeeklyHoliday(WeeklyHoliday item)
        {
            try
            {
                _weeklyHoliday.Delete(item.ID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(true);
        }

        [HttpGet("getEmployeeShortLeave")]
        public ActionResult GetEmployeeShortLeave()
        {
            EmployeeShortLeave item = new EmployeeShortLeave();
            try
            {
                item = _employeeShortLeaveService.Get();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getEmployeeShortLeaveById/{id}")]
        public ActionResult GetEmployeeShortLeaveById(int id)
        {
            EmployeeShortLeave item = new EmployeeShortLeave();
            try
            {
                item = _employeeShortLeaveService.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getEmployeeShortLeaveByType/{type}")]
        public ActionResult GetEmployeeShortLeaveByType(int type)
        {
            EmployeeShortLeave item = new EmployeeShortLeave();
            try
            {
                item = _employeeShortLeaveService.GetByType(type);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getEmployeeShortLeaveByEmpId/{employeeId}")]
        public ActionResult GetEmployeeShortLeaveByEmpId(int employeeId)
        {
            EmployeeShortLeave item = new EmployeeShortLeave();
            try
            {
                item = _employeeShortLeaveService.GetByEmpID(employeeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getEmployeeShortLeaveByEmp/{employeeId}")]
        public ActionResult GetEmployeeShortLeaveByEmp(int employeeId)
        {
            List<EmployeeShortLeave> items = new List<EmployeeShortLeave>();
            try
            {
                items = _employeeShortLeaveService.GetByEmp(employeeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpPost]
        [Route("saveEmployeeShortLeave")]
        public ActionResult SaveEmployeeShortLeave(EmployeeShortLeave item)
        {
            try
            {
                _employeeShortLeaveService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteEmployeeShortLeave")]
        public ActionResult DeleteEmployeeShortLeave(int id)
        {
            try
            {
                _employeeShortLeaveService.Delete(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // Leave
        [HttpGet("getLeaveById/{id}")]
        public ActionResult GetLeaveById(int id)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            BO.Leave item = new BO.Leave();
            try
            {
                item = _leaveService.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        //[HttpGet("getLeaveIdByName/{leave}")]
        //public ActionResult GetLeaveIdByName(string leave)
        //{
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
        //    BO.Leave item = new BO.Leave();
        //    try
        //    {
        //        item = _leaveService.GetIDByName(leave, payrollTypeId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        //[HttpGet("getLeaveIdByCode/{leave}")]
        //public ActionResult GetLeaveIdByCode(string leave)
        //{
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
        //    BO.Leave item = new BO.Leave();
        //    try
        //    {
        //        item = _leaveService.GetIDByCode(leave, payrollTypeId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        //[HttpGet("getLeaveListByInParamId/{inParamId}")]
        //public ActionResult GetLeaveListByInParamId(string inParamId)
        //{
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
        //    List<BO.Leave> item = new List<BO.Leave>();
        //    try
        //    {
        //        item = _leaveService.Get(inParamId, payrollTypeId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        [HttpGet("getAllLeave/{status}/{code}/{name}")]
        public ActionResult getAllLeave(EnumStatus status, string code, string name)
        {
            code = GlobalFunctions.GetApiDefaultData(code);
            name = GlobalFunctions.GetApiDefaultData(name);

            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            List<BO.Leave> item = new List<BO.Leave>();
            try
            {
                item = _leaveService.Get(status, code, name, payrollTypeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getEmpApplicableLeave/{employeeid}")]
        public ActionResult getEmpApplicableLeave(int employeeid)
        {
            List<BO.Leave> item = new List<BO.Leave>();
            try
            {
                item = _leaveService.getEmpApplicableLeave(employeeid);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }


        //[HttpGet("getLeaves")]
        //public ActionResult GetLeaves()
        //{
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
        //    List<BO.Leave> item = new List<BO.Leave>();
        //    try
        //    {
        //        item = _leaveService.Get(EnumStatus.Regardless, payrollTypeId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        //[HttpGet("getStringValue")]
        //public ActionResult GetStringValue(DateTime fromDate, DateTime toDate)
        //{
        //    string ans;
        //    try
        //    {
        //        ans = _leaveService.Get(fromDate, toDate);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(ans);
        //}

        [HttpPost]
        [Route("saveLeave")]
        public ActionResult SaveLeave(BO.Leave item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
                if (item.IsNew)
                {
                    item.CreatedBy = currentUser.UserID;
                    item.CreatedDate = DateTime.Today;
                    item.PayrollTypeID = payrollTypeId;
                }
                else
                {
                    item.ModifiedBy = currentUser.UserID;
                    item.ModifiedDate = DateTime.Today;

                }
                _leaveService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeave")]
        public ActionResult DeleteLeave(BO.Leave item)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            try
            {
                _leaveService.Delete(item.ID, payrollTypeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // LeaveEntry
        [HttpGet("getAllLeaveEntry")]
        public ActionResult GetAllLeaveEntry()
        {
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.GetAll();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getLeaveEntry/{id}")]
        public ActionResult getLeaveEntry(int id)
        {
            LeaveEntry item = new LeaveEntry();
            try
            {
                item = _leaveEntryService.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("isLeaveEntryEntered/{year}")]
        public ActionResult IsLeaveEntryEntered(DateTime year)
        {
            bool ans;
            try
            {
                ans = _leaveEntryService.IsEntered(year);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }
        //[HttpGet("getEmployeeWiseLeaveDetailReport/{empId}/{fromDate}/{toDate}/{leaveType}")]
        //public ActionResult GetEmployeeWiseLeaveDetailReport(int empId, DateTime fromDate, DateTime toDate, int leaveType)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.GetEmployeeWiseLeaveDetailReport(empId, fromDate, toDate, leaveType);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getByLeaveYear/{leaveType}")]
        //public ActionResult GetByLeaveYear(int leaveType)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.GetByLeaveYear(leaveType);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //        getLeaveEntries(empId?: number, empids?: string, leaveID?: number, fromDate?: Date,
        //toDate?: Date, leavestatus?: EnumLeaveStatus, isLFA?: boolean)
        [HttpGet("getLeaveEntries/{empids}/{empId}/{leaveYearid}/{leaveID}/{fromDate}/{toDate}/{leavestatus}/{isLFA}")]
        public ActionResult GetLeaveEntryByEmpId(string EmpIds, string empId, string leaveYearid,
            string leaveid,
            string fromDate, string toDate, string leaveStatus, string isLfa)
        {
            string cEmpIds = GlobalFunctions.GetApiDefaultData(EmpIds);
            var cempId = GlobalFunctions.GetApiDefaultIntData(empId);
            var cleaveYearid = GlobalFunctions.GetApiDefaultIntData(leaveYearid);
            var cleaveid = GlobalFunctions.GetApiDefaultIntData(leaveid);
            var cfromDate = GlobalFunctions.GetApiDefaultDateData(fromDate);
            var ctoDate = GlobalFunctions.GetApiDefaultDateData(toDate);
            EnumLeaveStatus? cleaveStatus = null;
            if (leaveStatus.ToLower() != "undefined" && leaveStatus.ToLower() != "null" &&
                leaveStatus.ToLower() != string.Empty)
            {
                cleaveStatus = (EnumLeaveStatus)GlobalFunctions.GetApiDefaultIntData(leaveStatus);
            }

            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.Get(cEmpIds, cempId, cleaveYearid, cleaveid, cfromDate, ctoDate,
                    cleaveStatus, false);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        //[HttpGet("getLeaveEntryByDateRange/{fromDate}/{toDate}/{leaveStatus}")]
        //public ActionResult GetLeaveEntryByDateRange(DateTime fromDate, DateTime toDate, EnumLeaveStatus leaveStatus)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(fromDate, toDate, leaveStatus);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getLeaveEntryByAttnDate/{attnDate}")]
        //public ActionResult GetLeaveEntryByAttnDate(DateTime attnDate)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(attnDate);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getLeaveEntryByEmpIdAndDateRange/{empId}/{fromDate}/{toDate}/{leaveStatus}")]
        //public ActionResult GetLeaveEntryByEmpIdAndDateRange(string empId, DateTime fromDate, DateTime toDate, EnumLeaveStatus leaveStatus)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(empId, fromDate, toDate, leaveStatus);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getLeaveEntryPending/{empId}/{leaveId}/{status}")]
        //public ActionResult GetLeaveEntryPending(int empId, int leaveId, EnumLeaveStatus leaveStatus)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.GetPending(empId, leaveId, leaveStatus);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getLeaveEntryByEmpIdAndLeaveYearId/{empId}/{leaveYearId}")]
        //public ActionResult GetLeaveEntryByEmpIdAndLeaveYearId(int empId, int leaveYearId)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(empId, leaveYearId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getByLeaveID/{leaveId}/{empId}/{fromDate}/{toDate}")]
        //public ActionResult GetByLeaveID(int leaveId, int empId, DateTime fromDate, DateTime toDate)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.GetByLeaveID(leaveId, empId, fromDate, toDate);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        [HttpGet("getEmployeeLeaveBalance/{empId}/{leaveYear}/{leaveType}")]
        public ActionResult GetEmployeeLeaveBalance(int empId, int leaveYear, int leaveType)
        {
            int ans;
            try
            {
                ans = _leaveEntryService.GetEmployeeLeaveBalance(empId, leaveYear, leaveType);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        //[HttpGet("getLeaveEntryByLeaveStatus/{empId}/{fromDate}/{toDate}/{leaveStatus}")]
        //public ActionResult GetLeaveEntryByLeaveStatus(string empId, DateTime fromDate, DateTime toDate, string leaveStatus)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(empId, fromDate, toDate, leaveStatus);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getLeaveEntryByLeaveStatusAndSortExpresion/{empId}/{fromDate}/{toDate}/{leaveStatus}/{sortExpresion}")]
        //public ActionResult GetLeaveEntryByLeaveStatusAndSortExpresion(string empId, DateTime fromDate, DateTime toDate, EnumLeaveStatus leaveStatus, string sortExpresion)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.Get(empId, fromDate, toDate, leaveStatus, sortExpresion);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        //[HttpGet("getForAdminPanel/{empId}")]
        //public ActionResult GetForAdminPanel(int empId)
        //{
        //    List<LeaveEntry> items = new List<LeaveEntry>();
        //    try
        //    {
        //        items = _leaveEntryService.GetForAdminPanel(empId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        [HttpGet("getLeaveAmtByType/{empId}/{leaveId}/{leaveYear}/{leaveStatus}")]
        public ActionResult GetLeaveAmtByType(int empId, int leaveId, int leaveYear, EnumLeaveStatus leaveStatus)
        {
            double ans;
            try
            {
                ans = _leaveEntryService.GetLeaveAmtByType(empId, leaveId, leaveYear, leaveStatus);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("getAvailedLeave/{empId}/{leaveId}/{leaveYear}/{leaveStatus}")]
        public ActionResult GetAvailedLeave(int empId, int leaveId, int leaveYear, EnumLeaveStatus leaveStatus)
        {
            double ans;
            try
            {
                ans = _leaveEntryService.GetAvailedLeave(empId, leaveId, leaveYear, leaveStatus);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("getSumOfAvailedLeaveByEmpId/{empId}/{leaveYear}")]
        public ActionResult GetSumOfAvailedLeaveByEmpId(int empId, int leaveYear)
        {
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.GetSumOfAvailedLeave(empId, leaveYear);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }
        [HttpGet("getLeaveEntriesByEmpId/{empId}/{leaveYearId}")]
        public ActionResult GetLeaveEntriesByEmpId(int empId, int leaveYearId)
        {
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.GetLeaveEntries(empId, leaveYearId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }
        // string empIds, int leaveYearId, EnumLeaveStatus leaveStatus
        [HttpPost("getLeaveEntriesByEmpIds")]
        public ActionResult GetLeaveEntriesByEmpIds(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            string empIds = (string)item["empIds"].ToObject<string>();
            int leaveYearId = item["leaveYearId"].ToObject<int>();
            var leaveStatus = (EnumLeaveStatus)item["leaveStatus"].ToObject<int>();
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.Get(empIds, leaveYearId, leaveStatus);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }



        [HttpGet("getSumOfAvailedLeave/{leaveYear}")]
        public ActionResult GetSumOfAvailedLeave(int leaveYear)
        {
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.GetSumOfAvailedLeave(leaveYear);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getAmountOnFromDate/{empId}/{leaveYearId}/{leaveId}/{leaveStatus}/{startDate}/{endDate}")]
        public ActionResult GetAmountOnFromDate(int empId, int leaveYearId, int leaveID, EnumLeaveStatus leaveStatus,
            DateTime startDate, DateTime endDate)
        {
            double ans;
            try
            {
                ans = _leaveEntryService.GetAmountOnFromDate(empId, leaveYearId, leaveID, leaveStatus, startDate,
                    endDate);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("getTotalLeaveAmountInYear/{empId}/{leaveYearId}/{leaveId}/{leaveStatus}")]
        public ActionResult GetTotalLeaveAmountInYear(int empId, int leaveYearId, int leaveID,
            EnumLeaveStatus leaveStatus)
        {
            double ans;
            try
            {
                ans = _leaveEntryService.GetTotalLeaveAmountInYear(empId, leaveYearId, leaveID, leaveStatus);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("getLFAOnMonth/{month}")]
        public ActionResult GetLFAOnMonth(DateTime month)
        {
            List<LeaveEntry> items = new List<LeaveEntry>();
            try
            {
                items = _leaveEntryService.GetLFAOnMonth(month);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpPost]
        [Route("saveLeaveEntry")]
        public ActionResult SaveLeaveEntry(LeaveEntry item)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            if (item.IsNew == false)
            {
                item.ModifiedBy = currentUser.UserID;
                item.ModifiedDate = DateTime.Today;
            }
            else
            {
                item.CreatedBy = currentUser.UserID;
                item.CreatedDate = DateTime.Today;
                item.EntryDate = DateTime.Today;
                item.IsDrafted = 1;
                item.IsAvailed = 1;
            }
            int leaveentryid = 0;
            try
            {
                leaveentryid = _leaveEntryService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(leaveentryid);
        }


        [HttpPost]
        [Route("leaveApprove")]
        public ActionResult leaveApprove(WFMovementTran item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item.FromEmployeeID = (int)currentUser.EmployeeID;
                _leaveEntryService.LeaveApplicationApprove(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }


        [HttpPost]
        [Route("leaveReject")]
        public ActionResult LeaveReject(WFMovementTran item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item.FromEmployeeID = (int)currentUser.EmployeeID;
                _leaveEntryService.LeaveApplicationReject(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("LeaveRevert")]
        public ActionResult LeaveRevert(WFMovementTran item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item.FromEmployeeID = (int)currentUser.EmployeeID;
                _leaveEntryService.LeaveApplicationRevert(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("saveLeaveEntryList")]
        public ActionResult SaveLeaveEntry(List<LeaveEntry> items)
        {
            try
            {
                _leaveEntryService.SaveLeaveEntry(items);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeaveEntryById")]
        public ActionResult DeleteLeaveEntryById(LeaveEntry entry)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                _leaveEntryService.Delete(entry.ID, (int) currentUser.UserID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeaveEntry")]
        public ActionResult DeleteLeaveEntry(LeaveEntry item)
        {
            try
            {
                _leaveEntryService.Delete(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteByLeaveYear")]
        public ActionResult DeleteByLeaveYear(int leaveYear)
        {
            int leaveId = 1;
            try
            {
                _leaveEntryService.DeleteByLeaveYear(leaveYear, leaveId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpGet("isLeaveEntryExist/{employee}/{fromDate}/{toDate}")]
        public ActionResult IsLeaveEntryExist(Employee employee, DateTime fromDate, DateTime toDate)
        {
            bool ans;
            try
            {
                ans = _leaveEntryService.IsExist(employee, fromDate, toDate);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpPost("uploadLeaveAttachment")]
        [AllowAnonymous]
        public ActionResult UploadLeaveAttachment()
        {
            LeaveAttachment item = new LeaveAttachment();
            string base64String = "";
            try
            {
                var fdata = Request.Form.Files["filedata"];

                item.OriginalFileName = Request.Form["originalfilename"].ToString();
                item.LeaveEntryID = Convert.ToInt32(Request.Form["leaveentryid"]);
                item.FileType = (EnumFileType)Convert.ToInt32(Request.Form["filetype"]);
                using (var ms = new MemoryStream())
                {
                    fdata.CopyTo(ms);
                    item.FileAsByteArray = ms.ToArray();
                    byte[] textAsBytes = ms.ToArray();
                    new LeaveEntryService().UplaodFileInProfileUpdate(item);
                    base64String = Convert.ToBase64String(textAsBytes);
                }
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(base64String);
        }

        [HttpGet("getLeaveAttachments/{leaveEntryId}")]
        public ActionResult GetEmployeeAttachments(int leaveEntryId)
        {
            List<LeaveAttachment> items = new List<LeaveAttachment>();
            try
            {
                items = new LeaveEntryService().GetAllAttachmentsById(leaveEntryId);
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(items);
        }

        [HttpGet("getAttachments/{leaveEntryId}")]
        public ActionResult GetAttachments(int leaveEntryId)
        {
            List<LeaveAttachment> items = new List<LeaveAttachment>();
            try
            {
                items = _leaveEntryService.GetAttachments(leaveEntryId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        // LeaveException

        [HttpGet("getLeaveException")]
        public ActionResult GetLeaveException()
        {
            List<LeaveException> items = new List<LeaveException>();
            try
            {
                items = _leaveExceptionService.Get();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getLeaveExceptionByDateRange/{from}/{to}")]
        public ActionResult GetLeaveExceptionByDateRange(DateTime from, DateTime to)
        {
            List<LeaveException> items = new List<LeaveException>();
            try
            {
                items = _leaveExceptionService.Get(from, to);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getLeaveExceptionByLeaveId/{leaveId}/{empId}")]
        public ActionResult GetLeaveExceptionByLeaveId(int leaveId, int empId)
        {
            List<LeaveException> items = new List<LeaveException>();
            try
            {
                items = _leaveExceptionService.GetByEmpID(leaveId, empId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpPost]
        [Route("saveLeaveException")]
        public ActionResult SaveLeaveException(LeaveException item)
        {
            try
            {
                _leaveExceptionService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeaveExceptionByEmpId")]
        public ActionResult DeleteLeaveExceptionByEmpId(LeaveException item)
        {
            try
            {
                _leaveExceptionService.DeleteByEmpID(item.EmployeeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeaveExceptionById")]
        public ActionResult DeleteLeaveExceptionById(int id)
        {
            try
            {
                _leaveExceptionService.DeleteItem(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // LeaveParameter
        [HttpGet("getLeaveParameterById/{leaveParameterId}")]
        public ActionResult GetLeaveParameterById(int leaveParameterId)
        {
            LeaveParameter item = new LeaveParameter();
            try
            {
                item = _leaveParameterService.Get(leaveParameterId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }


        [HttpGet("GetUsedParamItem/{leaveParameterId}")]
        public ActionResult GetUsedParamItem(int leaveParameterId)
        {
            List<LeaveParameter.paramItem> item = new List<LeaveParameter.paramItem>();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);

            try
            {
                item = _leaveParameterService.GetUsedParam(leaveParameterId, (int)currentUser.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        //        double CalculatedLeaveDays(int leaveid, int itemid, EnumLeaveparamOn paramType, int payrollTypeid,
        //DateTime FromDate, DateTime ToDate, int ddlFromValue, int ddlToValue);
        [HttpGet(
            "CalculatedLeaveDays/{leaveid}/{itemID}/{locationID}/{paramType}/{fromDate}/{Todate}/{firstHalf}/{secondHalf}/{isHalfday}/{empId}")]
        public ActionResult CalculatedLeaveDays(int leaveid, int itemID, int locationID, EnumLeaveparamOn paramType,
            DateTime fromDate,
            DateTime Todate, bool firstHalf, bool secondHalf, bool isHalfday, int empId)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            double days = 0;
            try
            {
                days = _leaveEntryService.CalculatedLeaveDays(leaveid, itemID, locationID, paramType,
                    (int)currentUser.PayrollTypeID, fromDate, Todate, firstHalf, secondHalf, isHalfday, empId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(days);
        }


        [HttpGet("getLeaveParameter/{status}/{leaveID}")]
        public ActionResult GetLeaveParameter(EnumStatus status, string leaveid)
        {
            int? lvid = GlobalFunctions.GetApiDefaultIntData(leaveid);

            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            List<LeaveParameter> item = new List<LeaveParameter>();
            try
            {
                item = _leaveParameterService.Get(status, (int)payrollTypeId, lvid);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }


        //[HttpGet("getLeaveParameterListByLeaveID/{leaveId}")]
        //public ActionResult getLeaveParameterListByLeaveID(int leaveId)
        //{
        //    List<LeaveParameter> item = new List<LeaveParameter>();
        //    try
        //    {
        //        item = _leaveParameterService.GetbyLeaveID(leaveId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        [HttpGet("getLeaveParameterDetails/{leaveParamId}")]
        public ActionResult GetLeaveParameterDetails(int leaveParamId)
        {
            List<LeaveParameterDetail> items = new List<LeaveParameterDetail>();
            try
            {
                items = _leaveParameterService.GetDetails(leaveParamId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getLeaveParameterDetailsByParamId/{paramId}")]
        public ActionResult GetLeaveParameterDetailsByParamId(int paramId)
        {
            LeaveParameterDetail item = new LeaveParameterDetail();
            try
            {
                item = _leaveParameterService.GetDetail(paramId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        //[HttpGet("getLeaveParameterByLeaveID/{paramId}")]
        //public ActionResult GetLeaveParameterByLeaveID(int paramId)
        //{
        //    LeaveParameter item = new LeaveParameter();
        //    try
        //    {
        //        item = _leaveParameterService.GetByLeaveID(paramId);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(item);
        //}

        //[HttpGet("getAllLeaveParameterDetails")]
        //public ActionResult GetAllLeaveParameterDetails()
        //{
        //    List<LeaveParameterDetail> items = new List<LeaveParameterDetail>();
        //    try
        //    {
        //        items = _leaveParameterService.GetDetails();
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }
        //    return Ok(items);
        //}

        [HttpPost]
        [Route("deleteLeaveParameter")]
        public ActionResult DeleteLeaveParameter(int leaveParamId)
        {
            try
            {
                _leaveParameterService.Delete(leaveParamId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("saveLeaveParameter")]
        public ActionResult SaveLeaveParameter(LeaveParameter item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                if (item.IsNew == false)
                {
                    item.ModifiedBy = currentUser.UserID;
                    item.ModifiedDate = DateTime.Today;
                }
                else

                {
                    item.CreatedBy = currentUser.UserID;
                    item.CreatedDate = DateTime.Today;
                    item.PayrollTypeID = (int)currentUser.PayrollTypeID;
                }

                _leaveParameterService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // LeavePlan
        [HttpGet("getLeavePlanByEmpId/{empId}")]
        public ActionResult GetLeavePlanByEmpId(int empId)
        {
            List<LeavePlan> items = new List<LeavePlan>();
            try
            {
                items = _leavePlanService.Get(empId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getPlanData/{empId}/{leaveYear}")]
        public ActionResult GetPlanData(int empId, int leaveYear)
        {
            List<LeavePlan> items = new List<LeavePlan>();
            try
            {
                items = _leavePlanService.GetPlanData(empId, leaveYear);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getAllPlanData")]
        public ActionResult GetAllPlanData()
        {
            List<LeavePlan> items = new List<LeavePlan>();
            try
            {
                items = _leavePlanService.GetAllData();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }


        [HttpGet("getPlanId/{id}")]
        public ActionResult GetPlanId(int id)
        {
            LeavePlan item = new LeavePlan();
            try
            {
                item = _leavePlanService.GetID(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getPlanByMonthRange/{empId}/{fromDate}/{toDate}")]
        public ActionResult GetPlanByMonthRange(int empId, DateTime fromDate, DateTime toDate)
        {
            List<LeavePlan> items = new List<LeavePlan>();
            try
            {
                items = _leavePlanService.GetByMonthRange(empId, fromDate, toDate);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("isEmpIDExist")]
        public ActionResult IsEmpIDExist(int empId, int leaveYear)
        {
            bool ans;
            try
            {
                ans = _leavePlanService.IsEmpIDExist(empId, leaveYear);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("isEmpApproved")]
        public ActionResult IsEmpApproved(int empId, int leaveYear, DateTime fromDate, DateTime toDate, bool isApproved)
        {
            bool ans;
            try
            {
                ans = _leavePlanService.IsEmpApproved(empId, leaveYear, fromDate, toDate, isApproved);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpPost]
        [Route("saveLeavePlan")]
        public ActionResult SaveLeavePlan(List<LeavePlan> items)
        {
            try
            {
                _leavePlanService.Save(items);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeavePlan")]
        public ActionResult DeleteLeavePlan(int id)
        {
            try
            {
                _leavePlanService.Delete(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("updateApproveLeavePlan")]
        public ActionResult UpdateApproveLeavePlan(int empId)
        {
            int leaveYear = 1;
            DateTime formDate = new DateTime();
            DateTime toDate = new DateTime();
            bool isApproved = true;
            try
            {
                _leavePlanService.UpdateApprove(empId, leaveYear, formDate, toDate, isApproved);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("upDateLeavePlan")]
        public ActionResult UpDateLeavePlan(LeavePlan item)
        {
            int planID = 1;
            try
            {
                _leavePlanService.UpDateLeavePlan(item, planID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("updateLeavePlanSubmit")]
        public ActionResult UpdateLeavePlanSubmit(List<LeavePlan> items)
        {
            int planID = 1;
            try
            {
                _leavePlanService.UpdateLeavePlanSubmit(items);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // LeaveProcess
        [HttpGet("getLeaveProcessById/{leaveProcessId}")]
        public ActionResult GetLeaveProcessById(int leaveProcessId)
        {
            LeaveProcess item = new LeaveProcess();
            try
            {
                item = _leaveProcessService.Get(leaveProcessId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }
        //       List<EmpLeaveStatus> GetLeaveBalance(int leaveYearID, int payrollTypeID, string EmpIDsIn, int? empID = null);


        [HttpGet("GetEmpLeaveStatus/{leaveYearID}/{empids}")]
        public ActionResult GetEmpLeaveStatus(int leaveYearID, string empids)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            empids = GlobalFunctions.GetApiDefaultData(empids);
            List<EmpLeaveStatus> item = new List<EmpLeaveStatus>();
            try
            {
                item = _leaveProcessService.GetByEmpIDs(empids, leaveYearID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpPost("saveEmpLeaveStatus")]
        public ActionResult saveEmpLeaveStatus(List<EmpLeaveStatus> leaveStatus)
        {
            try
            {
                _leaveProcessService.SaveStatus(leaveStatus);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(true);
        }

        [HttpGet("GetLeaveBalance/{leaveYearID}/{EmpIDsIn}/{EmpId}")]
        public ActionResult GetLeaveBalance(int leaveYearID, string EmpIDsIn, string empID)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int? nempid = GlobalFunctions.GetApiDefaultIntData(empID);
            EmpIDsIn = GlobalFunctions.GetApiDefaultData(EmpIDsIn);
            List<EmpLeaveStatus> item = new List<EmpLeaveStatus>();
            try
            {
                item = _leaveProcessService.GetLeaveBalance(leaveYearID, (int)currentUser.PayrollTypeID, EmpIDsIn,
                    nempid);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getLeaveBalanceInDataSet/{leaveYearID}/{EmpIDsIn}/{EmpId}")]
        public ActionResult GetLeaveBalanceInDataSet(int leaveYearID, string EmpIDsIn, string empID)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int? nempid = GlobalFunctions.GetApiDefaultIntData(empID);
            EmpIDsIn = GlobalFunctions.GetApiDefaultData(EmpIDsIn);
            List<EmpLeaveStatus> item = new List<EmpLeaveStatus>();
            DataTable dataTable = new DataTable();
            try
            {
                item = _leaveProcessService.GetLeaveBalance(leaveYearID, (int)currentUser.PayrollTypeID, EmpIDsIn,
                    nempid);
                dataTable.Columns.Add("AnnualLeave");
                dataTable.Columns.Add("alOpening");
                item.ForEach(x =>
                {
                    dataTable.Columns.Add(x.LeaveNameView);
                    dataTable.Columns.Add(x.LeaveNameView + "Opening");
                    dataTable.Columns.Add(x.LeaveNameView + "Balance");
                    dataTable.Columns.Add(x.LeaveNameView + "Closing");
                });
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getLeaveProcessByLeaveProcessYear/{leaveProcessYear}")]
        public ActionResult GetLeaveProcessByLeaveProcessYear(int leaveProcessYear)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            LeaveProcess item = new LeaveProcess();
            try
            {
                item = _leaveProcessService.Get(leaveProcessYear, payrollTypeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getAllLeaveProcess")]
        public ActionResult GetAllLeaveProcess()
        {
            List<LeaveProcess> items = new List<LeaveProcess>();
            try
            {
                items = _leaveProcessService.Get();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getLastProcess")]
        public ActionResult GetLastProcess()
        {
            LeaveProcess item = new LeaveProcess();
            try
            {
                item = _leaveProcessService.GetLastProcess();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("isProcessed/{processYear}")]
        public ActionResult IsProcessed(int processYear)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            bool ans;
            try
            {
                ans = _leaveProcessService.IsProcessed(processYear, (int)currentUser.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpPost]
        [Route("DoYearEnd")]
        public ActionResult DoYearEnd(LeaveProcess item)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            if (item.LeaveYear == null) item.LeaveYear = new LeaveYearService().Get(item.LeaveYearID);
            item.CreatedDate = DateTime.Today;
            item.CreatedBy = (int)currentUser.UserID;
            item.PayrollTypeID = (int)currentUser.PayrollTypeID;
            item.ProcessDate = DateTime.Today;
            item.ProcessYearDescription = "";
            try
            {
                _leaveProcessService.DoYearEnd(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(true);
        }

        [HttpPost]
        [Route("UnDoYearEnd")]
        public ActionResult UnDoYearEnd(LeaveProcess item)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            if (item.LeaveYear == null) item.LeaveYear = new LeaveYearService().Get(item.LeaveYearID);
            item.CreatedDate = DateTime.Today;
            item.CreatedBy = (int)currentUser.UserID;
            item.PayrollTypeID = (int)currentUser.PayrollTypeID;
            try
            {
                _leaveProcessService.UnDoYearEnd(item.LeaveYearID, item.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(true);
        }

        [HttpPost]
        [Route("updateLeaveYearStatus")]
        public ActionResult UpdateLeaveYearStatus(LeaveProcess item)
        {
            try
            {
                _leaveProcessService.UpadteLeaveYearStatus(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }


        [HttpGet("getLeaveDetails/{empId}")]
        public ActionResult GetLeaveDetails(int empId)
        {
            LeaveDetails item = new LeaveDetails();
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item = new LeaveDetails();
                item.LeaveYear = _leaveYearService.GetCurrentYear((int)currentUser.PayrollTypeID);
                item.Empleavestatus = _leaveProcessService.GetLeaveBalance(item.LeaveYear.ID,
                    (int)currentUser.PayrollTypeID, string.Empty,
                    empId);
                item.LeaveHistory = _leaveProcessService.GetRecord(empId.ToString(), item.LeaveYear.StartDate,
                    item.LeaveYear.EndDate, EnumLeaveStatus.Drafted);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        // LeaveYear
        [HttpGet("getLeaveYear/{id}")]
        public ActionResult GetLeaveYear(int id)
        {
            LeaveYear item = new LeaveYear();
            try
            {
                item = _leaveYearService.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getCurrentYearByYear/{year}")]
        public ActionResult GetCurrentYearByYear(string year)
        {
            LeaveYear item = new LeaveYear();
            try
            {
                item = _leaveYearService.GetCurrentYear(year);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }


        [HttpGet("getAllLeaveYear")]
        public ActionResult GetAllLeaveYear()
        {
            List<LeaveYear> items = new List<LeaveYear>();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                items = _leaveYearService.GetByPayrollTypeId((int)currentUser.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }


        [HttpGet("getLeaveYearListByStatus")]
        public ActionResult GetLeaveYearListByStatus(EnumStatus status)
        {
            List<LeaveYear> items = new List<LeaveYear>();
            try
            {
                items = _leaveYearService.Get(status);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getCurrentYear")]
        public ActionResult GetCurrentYear()
        {
            LeaveYear item = new LeaveYear();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                item = _leaveYearService.GetCurrentYear((int)currentUser.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpGet("getLastLeaveYear")]
        public ActionResult getLastLeaveYear()
        {
            LeaveYear item = new LeaveYear();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                item = _leaveYearService.GetLastYear((int)currentUser.PayrollTypeID);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }


        [HttpGet("countCurrentYear")]
        public ActionResult CountCurrentYear()
        {
            int ans;
            try
            {
                ans = _leaveYearService.CountCurrentYear();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(ans);
        }

        [HttpGet("getIDByName/{leaveYear}")]
        public ActionResult GetIDByName(string leaveYear)
        {
            LeaveYear item = new LeaveYear();
            try
            {
                item = _leaveYearService.GetIDByName(leaveYear);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpPost]
        [Route("saveLeaveYear")]
        public ActionResult SaveLeaveYear(LeaveYear item)
        {
            try
            {
                _leaveYearService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteLeaveYearById")]
        public ActionResult DeleteLeaveYearById(int id)
        {
            try
            {
                _leaveYearService.Delete(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        // UploadEncashAmount


        [HttpGet("getAllUploadEncashAmount")]
        public ActionResult GetAllUploadEncashAmount()
        {
            List<UploadEncashAmount> items = new List<UploadEncashAmount>();
            try
            {
                items = _uploadEncashAmountService.Get();
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpGet("getUploadEncashAmountByEmpId/{empId}")]
        public ActionResult GetUploadEncashAmountByEmpId(int empId)
        {
            List<UploadEncashAmount> items = new List<UploadEncashAmount>();
            try
            {
                items = _uploadEncashAmountService.Get(empId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpPost]
        [Route("saveUploadEncashAmount")]
        public ActionResult SaveUploadEncashAmount(List<UploadEncashAmount> items)
        {
            try
            {
                _uploadEncashAmountService.Save(items);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("deleteUploadEncashAmount")]
        public ActionResult DeleteUploadEncashAmount(int id)
        {
            try
            {
                _uploadEncashAmountService.Delete(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpGet("getEmpLeaveStatusByEmpIds/{empIds}/{leaveYearId}")]
        public ActionResult GetEmpLeaveStatusByEmpIds(string empIds, int leaveYearId)
        {
            List<EmpLeaveStatus> items = new List<EmpLeaveStatus>();
            try
            {
                items = _leaveProcessService.GetByEmpIDs(empIds, leaveYearId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        [HttpPost("getMonthWiseLeaveRegister")]
        public ActionResult GetMonthWiseLeaveRegister(dynamic data)
        {
            var datas = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            string empIds = (string)datas["empIds"].ToObject<string>();
            int leaveYearId = datas["leaveYearId"].ToObject<int>();
            int leaveId = datas["leaveId"].ToObject<int>();
            EnumLeaveStatus leaveStatus =
                (EnumLeaveStatus)Enum.Parse(typeof(EnumLeaveStatus), datas["status"].ToObject<string>(), true);
            string leaveFromMonth = (string)datas["leaveFromMonth"].ToObject<string>();
            string leaveToMonth = (string)datas["leaveToMonth"].ToObject<string>();
            List<LeaveDetailsMonthWiseDTO> items = new List<LeaveDetailsMonthWiseDTO>();
            try
            {
                DateTime dateFromTime = Convert.ToDateTime(leaveFromMonth);
                DateTime dateToTime = Convert.ToDateTime(leaveToMonth);
                items = _leaveProcessService.GetMonthWiseLeaveRegister(empIds, leaveYearId, leaveId, leaveStatus,
                    dateFromTime, dateToTime);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(items);
        }

        //[HttpPost("getMultipleEmployeeLeaveBalance")]
        //public ActionResult GetMultipleEmployeeLeaveBalance(List<SearchEmployee> emps)
        //{
        //    List<EmpLeaveStatus> items = new List<EmpLeaveStatus>();
        //    List<MultipleEmployeeLeaveBalance> employeeLeaveBalances = new List<MultipleEmployeeLeaveBalance>();
        //    DataTable mulLeaveBalance = new DataTable();
        //    DataSet dSet = new DataSet();
        //    try
        //    {
        //        EmployeeService empService = new EmployeeService();
        //        LeaveYearService leaveYearService = new LeaveYearService();
        //        CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //        int payrollTypeID = currentUser.PayrollTypeID.GetValueOrDefault();
        //        DataRow dr = null;
        //        string sDatecheck = string.Empty;
        //        LeaveYear lyy = new LeaveYear();
        //        lyy = _leaveYearService.Get(emps[0].DepartmentID);
        //        List<BO.Leave> oleaves = _leaveService.Get(EnumStatus.Regardless, payrollTypeID);

        //        LeaveYear cly = leaveYearService.GetCurrentYear((int)currentUser.PayrollTypeID);
        //        List<EmpLeaveStatus> obalance = new List<EmpLeaveStatus>();
        //        if (cly == lyy)
        //        {
        //            obalance = _leaveProcessService.GetLeaveBalance(cly.ID, payrollTypeID,
        //                SearchEmployee.getEmpID(emps));
        //        }
        //        else
        //        {
        //            obalance = _leaveProcessService.GetByEmpIDs(SearchEmployee.getEmpID(emps), lyy.ID);
        //        }

        //        string empID = string.Empty;
        //        mulLeaveBalance.Columns.Add("EmpNo");
        //        mulLeaveBalance.Columns.Add("Name");

        //        List<BO.Leave> newLeaves = new List<BO.Leave>();
        //        foreach (HRM.BO.Leave ol in oleaves)
        //        {
        //            if (obalance.Any(x => x.LeaveId == ol.ID) == true)
        //            {
        //                if (newLeaves.Any(x => x.ID == ol.ID) == false)
        //                    newLeaves.Add(ol);
        //            }
        //        }

        //        oleaves = newLeaves;

        //        foreach (HRM.BO.Leave ol in oleaves)
        //        {
        //            //mulLeaveBalance.Columns.Add(ol.Code + "_Op");
        //            //mulLeaveBalance.Columns.Add(ol.Code + "_Av");
        //            //mulLeaveBalance.Columns.Add(ol.Code + "_Cls");
        //            mulLeaveBalance.Columns.Add(ol.Code + "_Opening");
        //            mulLeaveBalance.Columns.Add(ol.Code + "_Availed");
        //            mulLeaveBalance.Columns.Add(ol.Code + "_Closing");
        //        }

        //        var results = from p in obalance
        //                      group p by p.EmpId
        //            into g
        //                      select g;

        //        foreach (var eItem in results)
        //        {
        //            List<EmpLeaveStatus> leaveStatus = obalance.FindAll(x => x.EmpId == eItem.Key);

        //            dr = mulLeaveBalance.NewRow();
        //            SearchEmployee oemp =
        //                emps.Find(delegate (SearchEmployee oem) { return oem.EmployeeID == eItem.Key; });
        //            if (oemp == null) continue;

        //            dr["EmpNo"] = oemp.EmployeeNo;
        //            dr["Name"] = oemp.Name;

        //            foreach (EmpLeaveStatus olevestatus in leaveStatus)
        //            {
        //                HRM.BO.Leave oleave = oleaves.FirstOrDefault(x => x.ID == olevestatus.LeaveId);
        //                dr[oleave.Code + "_Opening"] = olevestatus.OpeningBalance;
        //                dr[oleave.Code + "_Availed"] = olevestatus.LeaveAvailed;
        //                dr[oleave.Code + "_Closing"] = olevestatus.ClosingBalance;
        //            }

        //            mulLeaveBalance.Rows.Add(dr);
        //        }
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }

        //    return Ok(mulLeaveBalance);
        //}

        [HttpPost("getMultipleEmployeeLeaveBalance/{leaveyearid}")]
        public ActionResult GetMultipleEmployeeLeaveBalance(int leaveyearid, List<SearchEmployee> emps)
        {
            List<EmpLeaveStatus> items = new List<EmpLeaveStatus>();
            List<MultipleEmployeeLeaveBalance> employeeLeaveBalances = new List<MultipleEmployeeLeaveBalance>();
            DataTable mulLeaveBalance = new DataTable();
            DataSet dSet = new DataSet();
            try
            {
                EmployeeService empService = new EmployeeService();
                LeaveYearService leaveYearService = new LeaveYearService();
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                int payrollTypeID = currentUser.PayrollTypeID.GetValueOrDefault();
                DataRow dr = null;
                string sDatecheck = string.Empty;
                LeaveYear lyy = new LeaveYear();
                lyy = _leaveYearService.Get(leaveyearid);
                List<BO.Leave> oleaves = _leaveService.Get(EnumStatus.Regardless, payrollTypeID);

                LeaveYear cly = leaveYearService.GetCurrentYear((int)currentUser.PayrollTypeID);
                List<EmpLeaveStatus> obalance = new List<EmpLeaveStatus>();
                if (cly == lyy)
                {
                    obalance = _leaveProcessService.GetLeaveBalance(cly.ID, payrollTypeID,
                        SearchEmployee.getEmpID(emps));
                }
                else
                {
                    obalance = _leaveProcessService.GetByEmpIDs(SearchEmployee.getEmpID(emps), lyy.ID);
                }

                string empID = string.Empty;
                mulLeaveBalance.Columns.Add("EmpNo");
                mulLeaveBalance.Columns.Add("Name");

                List<BO.Leave> newLeaves = new List<BO.Leave>();
                foreach (HRM.BO.Leave ol in oleaves)
                {
                    if (obalance.Any(x => x.LeaveId == ol.ID) == true)
                    {
                        if (newLeaves.Any(x => x.ID == ol.ID) == false)
                            newLeaves.Add(ol);
                    }
                }

                oleaves = newLeaves;

                foreach (HRM.BO.Leave ol in oleaves)
                {
                    //mulLeaveBalance.Columns.Add(ol.Code + "_Op");
                    //mulLeaveBalance.Columns.Add(ol.Code + "_Av");
                    //mulLeaveBalance.Columns.Add(ol.Code + "_Cls");
                    mulLeaveBalance.Columns.Add(ol.Code + "_Opening");
                    mulLeaveBalance.Columns.Add(ol.Code + "_Availed");
                    mulLeaveBalance.Columns.Add(ol.Code + "_Closing");
                }

                var results = from p in obalance
                              group p by p.EmpId
                    into g
                              select g;

                foreach (var eItem in results)
                {
                    List<EmpLeaveStatus> leaveStatus = obalance.FindAll(x => x.EmpId == eItem.Key);

                    dr = mulLeaveBalance.NewRow();
                    SearchEmployee oemp =
                        emps.Find(delegate (SearchEmployee oem) { return oem.EmployeeID == eItem.Key; });
                    if (oemp == null) continue;

                    dr["EmpNo"] = oemp.EmployeeNo;
                    dr["Name"] = oemp.Name;

                    foreach (EmpLeaveStatus olevestatus in leaveStatus)
                    {
                        HRM.BO.Leave oleave = oleaves.FirstOrDefault(x => x.ID == olevestatus.LeaveId);
                        dr[oleave.Code + "_Opening"] = olevestatus.OpeningBalance;
                        dr[oleave.Code + "_Availed"] = olevestatus.LeaveAvailed;
                        dr[oleave.Code + "_Closing"] = olevestatus.ClosingBalance;
                    }

                    mulLeaveBalance.Rows.Add(dr);
                }
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(mulLeaveBalance);
        }
        [HttpGet("GetMyTeamLeave/{frommonth}/{tomonth}")]
        public ActionResult GetMyTeamLeave(string frommonth, string tomonth)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            DataTable olist = null;
            DateTime ddate = Convert.ToDateTime(frommonth);
            DateTime dtomonth = Convert.ToDateTime(tomonth);
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();

            try
            {
                olist = _leaveEntryService.GetMyTeamLeave((int)currentUser.EmployeeID
                    , GlobalFunctions.FirstDateOfMonth(ddate), GlobalFunctions.LastDateOfMonth(dtomonth));

            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(olist);
        }

        [HttpPost]
        [Route("initiateCancelRequest")]
        [AllowAnonymous]
        public ActionResult InitiateCancelRequest(LeaveEntry item)
        {
            try
            {
                _leaveEntryService.InitiateCancelRequest(item);
                return Ok();
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
        }

        [HttpPost("currentYearStatus")]
        public ActionResult CurrentYearStatus(dynamic data)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int payrollTypeId = (int)currentUser.PayrollTypeID;
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            string empIds = (string)item["empIds"].ToObject<string>();
            int leaveYearId = item["leaveYearId"].ToObject<int>();
            var employeeIdList = empIds.Split(',');
            List<Employee> employees = new List<Employee>();
            try
            {
                foreach (var employeeId in employeeIdList)
                {
                    var employee = _employeeService.Get(int.Parse(employeeId));
                    employees.Add(employee);
                }
                var leaveYear = _leaveYearService.Get(leaveYearId);
                var employeeStatus = _leaveProcessService.CurrentYearStatus(employees, leaveYear, payrollTypeId);
                return Ok(employeeStatus);
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
        }

        [HttpGet("OnapprovalCancelRequest/{tranId}")]
        public ActionResult OnapprovalCancelRequest(int tranId)
        {
            try
            {
                EmailSettings emailSettings = _emailSettings.Value;

                _leaveEntryService.OnapprovalCancelRequest(tranId);
                List<string> temperr = _leaveEntryService.SendMailToTheApproversForCancellation(tranId, emailSettings);
                if (temperr.Count > 0)
                {
                    return StatusCode(StatusCodes.Status500InternalServerError, "Mail Sending Failed");
                }
                return Ok();
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
        }

        [HttpPost]
        [Route("cancelLeaveApprove")]
        [AllowAnonymous]
        public ActionResult CancelLeaveApprove(WFMovementTran item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item.FromEmployeeID = (int)currentUser.EmployeeID;

                _leaveEntryService.CancelRequestApprove(item);
                return Ok();
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
        }

        [HttpPost]
        [Route("cancelLeaveReject")]
        [AllowAnonymous]
        public ActionResult CancelLeaveReject(WFMovementTran item)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                item.FromEmployeeID = (int)currentUser.EmployeeID;
                _leaveEntryService.CancelRequestReject(item);
                return Ok();
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
        }

        [HttpGet]
        [Route("getLeaveEncashment/{leaveYearId}/{employeeId}")]
        public ActionResult GetLeaveEncashment(int leaveYearId, int employeeId)
        {
            LeaveEncashment item = new LeaveEncashment();
            try
            {
                item = _leaveEncashmentService.Get(leaveYearId, employeeId);
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(item);
        }
        [HttpGet]
        [Route("getLeaveEncashmentByLeaveYearId/{leaveYearId}")]
        public ActionResult GetLeaveEncashmentByLeaveYearId(int leaveYearId)
        {
            List<LeaveEncashment> items = new List<LeaveEncashment>();
            try
            {
                items = _leaveEncashmentService.Get(leaveYearId);
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(items);
        }

        // Leave Encashment
        [HttpPost("saveLeaveEncashment")]
        public ActionResult SaveLeaveEncashment(LeaveEncashment item)
        {
            try
            {
                _leaveEncashmentService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }
        [HttpPost("saveLeaveEncashmentList")]
        public ActionResult SaveLeaveEncashmentList(List<LeaveEncashment> items)
        {
            try
            {
                CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
                foreach (var leaveEncashment in items)
                {
                    if (leaveEncashment.IsNew == true)
                    {
                        leaveEncashment.CreatedBy = currentUser.UserID;
                        leaveEncashment.CreatedDate = DateTime.Today;
                    }
                    else
                    {
                        leaveEncashment.ModifiedBy = currentUser.UserID;
                        leaveEncashment.ModifiedDate = DateTime.Today;
                    }
                }
                _leaveEncashmentService.Save(items);

            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }
        [HttpPost("calculateTax")]
        public ActionResult CalculateTax(List<LeaveEncashment> items)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            var nextPayProcess = currentUser.NextPayProcessDate.GetValueOrDefault();
            var payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            var taxParamId = currentUser.TaxParamID.GetValueOrDefault();
            try
            {
                _leaveEncashmentService.CalculateTax(items, nextPayProcess, taxParamId, payrollTypeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }
        [HttpPost("calculateTaxForLeaveEncashment")]
        public ActionResult calculateTaxForLeaveEncashment(List<LeaveEncashment> items)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            var nextPayProcess = currentUser.NextPayProcessDate.GetValueOrDefault();
            var payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            var taxParamId = currentUser.TaxParamID.GetValueOrDefault();
            try
            {
                //new LeaveEncashmentService().calculateTaxForLeaveEncashment(items, currentUser, taxParamId, payrollTypeId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpPost]
        [Route("getMultipleLeaveLedgerData")]
        public ActionResult GetMultipleLeaveLedgerData(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            string empIds = (string)item["empIds"].ToObject<string>();
            int leaveYearId = item["leaveYearId"].ToObject<int>();
            int leaveId = item["leaveId"].ToObject<int>();
            DateTime fromDate = item["fromDate"].ToObject<DateTime>();
            DateTime toDate = item["toDate"].ToObject<DateTime>();
            DataTable dt = null;
            try
            {
                if (leaveId > 0)
                {
                    dt = _leaveEntryService.GetMultipleLeaveLedgerData(leaveYearId, leaveId, empIds, fromDate, toDate);
                }
                else
                {
                    dt = _leaveEntryService.GetMultipleLeaveLedgerData(leaveYearId, empIds, fromDate, toDate);
                }
                
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }


        #region Short Leave

        [HttpPost]
        [Route("saveShortLeave")]
        public ActionResult SaveShortLeave(ShortLeave item)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            Employee oEmp = _employeeService.Get(currentUser.EmployeeID.GetValueOrDefault());

            item.EmployeeID = oEmp.ID;
            item.PayrollTypeID = oEmp.PayrollTypeID;
            item.LineManagerID = (int)oEmp.LineManagerID;
            if(item.ExpectedReturnTime != null)
            {
                TimeSpan timeDiff = (TimeSpan)(item.ExpectedReturnTime - item.DepartureTime);
                if (timeDiff.TotalHours >= 1)
                {
                    item.TotalHour = timeDiff.TotalHours;
                }
                else
                {
                    item.TotalHour = 0;
                }
            }
            //else
            //{

            //}

            if (item.IsNew == false)
            {
                item.ModifiedBy = currentUser.UserID;
                item.ModifiedDate = DateTime.Today;
            }
            else
            {
                item.CreatedBy = currentUser.UserID;
                item.CreatedDate = DateTime.Today;
            }
            try
            {
                _shortLeaveService.Save(item);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }

        [HttpGet]
        [Route("getShortLeaveByID/{ID}")]
        public ActionResult getShortLeaveByID(int id)
        {
            
            ShortLeave item = new ShortLeave();

            try
            {
                item = _shortLeaveService.Get(id);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        //[HttpGet]
        //[Route("getShortLeaveByDate/{empID}/{payrollTypeID}/{status}/{fromDate}/{toDate}")]
        //public ActionResult getShortLeaveByDate(int empid, int pID, int status, DateTime fromDate, DateTime toDate)
        //{
        //    //code = GlobalFunctions.GetApiDefaultData(code);
        //    //name = GlobalFunctions.GetApiDefaultData(name);

        //    List<ShortLeave> items = new List<ShortLeave>();
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    int employeeId = currentUser.EmployeeID.GetValueOrDefault();
        //    int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
        //    try
        //    {
        //        //DateTime fromDate = Convert.ToDateTime(sFromDate);
        //        //DateTime toDate = Convert.ToDateTime(sToDate);
        //        items = _shortLeaveService.Get(employeeId, payrollTypeId, status, fromDate, toDate);
        //    }
        //    catch (Exception e)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
        //    }

        //    return Ok(items);
        //}


        [HttpPost]
        [Route("getShortLeaveByDateRange")]
        public ActionResult getShortLeaveByDateRange(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = item["status"].ToObject<EnumGatePassStatus>();
            DateTime fromDate = item["fromDate"].ToObject<DateTime>();
            DateTime toDate = item["toDate"].ToObject<DateTime>();
            DataTable dt = null;

            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int employeeId = currentUser.EmployeeID.GetValueOrDefault();
            int payrollTypeId = currentUser.PayrollTypeID.GetValueOrDefault();
            try
            {
                    dt = _shortLeaveService.Get(employeeId, payrollTypeId, status, fromDate, toDate);
               
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }

        [HttpPost]
        [Route("getAppliedShortLeave")]
        public ActionResult getAppliedShortLeave(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = item["status"].ToObject<EnumGatePassStatus>();
            DataTable dt = null;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int lmId = currentUser.EmployeeID.GetValueOrDefault();
            try
            {
                dt = _shortLeaveService.GetAppliedSortLeave(lmId, status);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }
        [HttpPost]
        [Route("getApprovedShortLeave")]
        public ActionResult getApprovedShortLeave(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = item["status"].ToObject<EnumGatePassStatus>();
            DateTime fromDate = item["fromDate"].ToObject<DateTime>();
            DateTime toDate = item["toDate"].ToObject<DateTime>();
            DataTable dt = null;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int lmId = currentUser.EmployeeID.GetValueOrDefault();
            try
            {
                dt = _shortLeaveService.GetApprovedShortLeave(lmId, status, fromDate, toDate);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }
        [HttpPost]
        [Route("ApproveOrRejectShortLeave")]
        public ActionResult ApproveShortLeave(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = item["status"].ToObject<EnumGatePassStatus>();
            int shortLeaveid = item["item"]["shortLeaveId"].ToObject<int>();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int approver = currentUser.EmployeeID.GetValueOrDefault();
            try
            {
                _shortLeaveService.ApproveOrRejectShortLeave(shortLeaveid, status, approver);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }
        [HttpPost]
        [Route("ApproveMultipleShortLeave")]
        public ActionResult ApproveMultipleShortLeave(dynamic data)
        {
            var items = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = items["status"].ToObject<EnumGatePassStatus>();
            string sID = (string)items["item"].ToObject<string>();
            //int shortLeaveid = item["item"]["shortLeaveId"].ToObject<int>();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);

            int approver = currentUser.EmployeeID.GetValueOrDefault();
            try
            {
                _shortLeaveService.ApproveMultipleShortLeave(sID, status, approver);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok();
        }
        [HttpPost]
        [Route("getGatemanShortLeave")]
        public ActionResult getGatemanShortLeave(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            EnumGatePassStatus status = item["status"].ToObject<EnumGatePassStatus>();
            DateTime fromDate = item["fromDate"].ToObject<DateTime>();
            DateTime toDate = item["toDate"].ToObject<DateTime>();
            DataTable dt = null;

            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                dt = _shortLeaveService.getGatemanShortLeave(status, fromDate, toDate);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }
        [HttpPost]
        [Route("saveGatemanEntry")]
        public ActionResult saveGatemanEntry(dynamic data)
        {
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            int empid = item["employeeid"].ToObject<int>(); 
            int shortleaveid = item["shortLeaveid"].ToObject<int>();
            string type = item["type"].ToObject<string>();
            ShortLeave oShortleave = _shortLeaveService.Get(shortleaveid);
            DateTime now = DateTime.Now;
            TimeSpan timeSpan = now.TimeOfDay;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int id = currentUser.EmployeeID.GetValueOrDefault();
            Employee oEmp = _employeeService.Get(id);

            if (type == "IN")
            {
                oShortleave.ActualInTime = timeSpan;
            }
            if (type == "OUT")
            {
                oShortleave.ActualOutTime = timeSpan;
            }
            if (oShortleave.ActualInTime != TimeSpan.FromMinutes(0) && oShortleave.ActualOutTime != TimeSpan.FromMinutes(0))
            {
                TimeSpan timeDiff = (TimeSpan)(oShortleave.ActualInTime - oShortleave.ActualOutTime);
                if (timeDiff.TotalHours >= 1)
                {
                    oShortleave.TotalHour = timeDiff.TotalHours;
                }
                else
                {
                    oShortleave.TotalHour = 0;
                }
            }
            try
            {
                //_shortLeaveService.saveGatemanEntry(shortleaveid, type);
                _shortLeaveService.UpdateInAndOutTime(oShortleave, oEmp);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok();
        }
        #endregion

        #region My Team Leave

        [HttpGet]
        [Route("GetLeaveTodayAndNextWeek")]
        public ActionResult GetLeaveTodayAndNextWeek()
        {
            DataTable dt = null;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int id = currentUser.EmployeeID.GetValueOrDefault();
            Employee oEmp = _employeeService.Get(id);
            try
            {
                dt = _leaveEntryService.GetLeaveTodayAndNextWeek(oEmp, EnumLeaveStatus.Approved);
                
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }

        [HttpGet]
        [Route("getTopLeaveChartData")]
        public ActionResult getTopLeaveChartData()
        {
            DataTable dt = null;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int id = currentUser.EmployeeID.GetValueOrDefault();
            LeaveYear LeaveYear = new LeaveYearService().GetCurrentYear((int)currentUser.PayrollTypeID);
            Employee oEmp = _employeeService.Get(id);
            try
            {
                dt = _leaveEntryService.getTopLeaveChartData(oEmp, LeaveYear.ID, EnumLeaveStatus.Approved);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }
        [HttpGet]
        [Route("getcorehrLeaveChartData")]
        public ActionResult getcorehrLeaveChartData()
        {
            DataTable dt = null;
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            int id = currentUser.EmployeeID.GetValueOrDefault();
            LeaveYear LeaveYear = new LeaveYearService().GetCurrentYear((int)currentUser.PayrollTypeID);
            Employee oEmp = _employeeService.Get(id);
            try
            {
                dt = _leaveEntryService.getcorehrLeaveChartData(oEmp, LeaveYear.ID, EnumLeaveStatus.Approved);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }


        [HttpPost]
        [Route("rmgLeaveEncashmentCalculation")]
        public ActionResult rmgLeaveEncashmentCalculation(dynamic data)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);

            var items = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            var item = items[0];
            int month = (int)item["month"].ToObject<int>();
            string years = (string)item["year"].ToObject<string>();
            string empIds = (string)item["empid"].ToObject<string>();
            //int leaveYearId = item["leaveyearid"].ToObject<int>();
            List<LeaveEncashment> dt = null;
            try
            {
                dt = new LeaveEncashmentService().rmgLeaveEncashmentCalculation(
                    month, years,empIds, (int) currentUser.PayrollTypeID,5);

            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(dt);
        }
        #endregion My Team Leave

        #region Maternity Leave

        [HttpGet]
        [Route("getMaternityLeave")]
        public ActionResult getMaternityLeave()
        {
            int rowIndex = 0;
            List<MaternityLeave> oMaternityLeaves = new List<MaternityLeave>();
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                //List<Employee> employees = _employeeService.GetAllEmps();
                List<Employee> employees = _employeeService.GetAllLive();
                List<MaternityLeave> maternityLeaves = _maternityLeaveService.Get();
                foreach (MaternityLeave item in maternityLeaves)
                {
                    Employee oEmployee = employees.Find(delegate (Employee oem) { return oem.ID == item.EmployeeID; });
                    if(oEmployee!= null)
                    {
                        item.EmployeeNo = employees.Find(delegate (Employee oem) { return oem.ID == item.EmployeeID; }).EmployeeNo;
                        item.EmployeeName = employees.Find(delegate (Employee oem) { return oem.ID == item.EmployeeID; }).Name;
                        rowIndex++;
                        oMaternityLeaves.Add(item);
                    }
                }
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok(oMaternityLeaves);
        }

        [HttpPost]
        [Route("deleteMaternityLeave")]
        public ActionResult deleteMaternityLeave(MaternityLeave oMaternityLeave)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            try
            {
                List<TaxRawItem> _taxRawItems = new List<TaxRawItem>();
                oMaternityLeave.MaternityItemDetailColl = _maternityLeaveService.GetMItemDetail(oMaternityLeave.ID);
                oMaternityLeave.MaternityStatusDetailColl = _maternityLeaveService.GetMStatusDetail(oMaternityLeave.ID);
                if (oMaternityLeave.MaternityStatusDetailColl.Count == 0)
                {
                    //MakeTaxRawItems(oMaternityLeave.MaternityItemDetailColl);
                    foreach (MaternityLeave.MaternityItemDetail maternityItemDetail in oMaternityLeave.MaternityItemDetailColl)
                    {
                        TaxRawItem taxRawItem = new TaxRawItem();
                        if (maternityItemDetail.ItemType == EnumMaternityItemDetailType.GrossSalary)
                        {
                            taxRawItem = TaxRawItem.Create("Gross Component", maternityItemDetail.Amount, maternityItemDetail.IncomeTaxItemType, maternityItemDetail.SalaryComponentID);
                            _taxRawItems.Add(taxRawItem);
                        }
                        else if (maternityItemDetail.ItemType != EnumMaternityItemDetailType.Total && maternityItemDetail.ItemType != EnumMaternityItemDetailType.Days)
                        {
                            taxRawItem = TaxRawItem.Create(maternityItemDetail.Description, maternityItemDetail.Amount, maternityItemDetail.IncomeTaxItemType, maternityItemDetail.SalaryComponentID);
                            _taxRawItems.Add(taxRawItem);
                        }
                    }
                    TaxCalculator otaxCal = new TaxCalculator();
                    otaxCal.TaxParameter = new TaxParameterService().Get((int)currentUser.TaxParamID);
                    otaxCal.Employee = _employeeService.Get(oMaternityLeave.EmployeeID);
                    //oMaternityLeave.IncomeTaxColl = otaxCal.UndoCalculate(_taxRawItems, oMaternityLeave.TaxAmount);
                    oMaternityLeave.IncomeTaxColl = new List<IncomeTax>();
                    _maternityLeaveService.Delete(oMaternityLeave);
                }
                else
                {
                    throw new Exception("Payment is already done. so, Data delete is not allowed." + " This Data is not Deleteable");
                }
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }
            
            return Ok();
        }
        //[HttpPost]
        //[Route("deleteMaternityStatusDetail")]
        //public ActionResult deleteMaternityStatusDetail(MaternityLeave.MaternityStatusDetail oMaternityStatusDetail)
        //{
        //    CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
        //    try
        //    {
        //        MaternityLeave.MaternityStatusDetail maternityStatusDetailRemove = oMaternityStatusDetail;
        //        MaternityLeave _maternityLeave = _maternityLeaveService.Get(oMaternityStatusDetail.MaternityLeaveID);

        //        MaternityLeave.MaternityStatusDetail maternityStatusDetail = _maternityLeave.MaternityStatusDetailColl.Find(delegate (MaternityLeave.MaternityStatusDetail mStatusDetail) { return mStatusDetail.PaymentDate.Value == maternityStatusDetailRemove.PaymentDate.Value; });
        //        if (maternityStatusDetail != null)
        //        {
        //            _maternityLeave.PaidAmount -= maternityStatusDetail.Amount;
        //            //AmountAndDaysCalculation(_maternityLeave.PaidAmount, _maternityLeave.NetAmount - _maternityLeave.PaidAmount, (int)numPaymentDays.Value + maternityStatusDetail.PaymentDays);
        //            _maternityLeave.MaternityStatusDetailColl.Remove(maternityStatusDetail);
        //            //RefreshGridPayment();
        //            //if (_maternityLeave.MaternityStatusDetailColl.Count == 0)
        //            //{
        //            //    btnAddAllowance.Enabled = true;
        //            //    btnRemoveAllowance.Enabled = true;
        //            //}
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
        //    }

        //    return Ok();
        //}
        [HttpGet("getMaternityStatusDetail/{parentId}")]
        public ActionResult GetMStatusDetail(int parentId)
        {
            List<MaternityLeave.MaternityStatusDetail> item = new List<MaternityLeave.MaternityStatusDetail>();
            try
            {
                item = _maternityLeaveService.GetMStatusDetail(parentId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }
        [HttpGet("getMaternityItemDetail/{parentId}")]
        public ActionResult GetMaternityItemDetail(int parentId)
        {
            List<MaternityLeave.MaternityItemDetail> item = new List<MaternityLeave.MaternityItemDetail>();
            try
            {
                item = _maternityLeaveService.GetMItemDetail(parentId);
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            return Ok(item);
        }

        [HttpPost]
        [Route("prepareMaternityItemDetails")]
        public ActionResult prepareMaternityItemDetails(dynamic data)
        {
            //List<DataTable> listItems = new List<DataTable>();
            //DataSet ds = new DataSet();

            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);

            //var items = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            //var item = items[0];
            var item = Newtonsoft.Json.JsonConvert.DeserializeObject(Convert.ToString(data));
            int maternityLeaveid = (int)item["id"].ToObject<int>();
            int employeeid = (int)item["employeeid"].ToObject<int>();
            DateTime applyDate = (DateTime)item["applyDate"].ToObject<DateTime>();
            DateTime dateOfApproval = (DateTime)item["dateOfApproval"].ToObject<DateTime>();
            DateTime leaveFromDate = item["leaveFromDate"].ToObject<DateTime>();
            DateTime leaveToDate = item["leaveToDate"].ToObject<DateTime>();
            int totalDays = (int)item["totalDays"].ToObject<int>();

            DataTable dt = null;
            double totalEarning = 0;
            int totalWorkingDays = 0;
            double dailyAvgEarning = 0;
            int numPaymentDays = 0;

            MaternityLeave maternityLeave = new MaternityLeave();

            if (maternityLeaveid == 0)
            {
                maternityLeave.ID = maternityLeaveid;
                maternityLeave.EmployeeID = employeeid;
                maternityLeave.ApplicationDate = applyDate;
                maternityLeave.DateOfApproval = dateOfApproval;
                maternityLeave.LeaveFromDate = leaveFromDate;
                maternityLeave.LeaveToDate = leaveToDate;
                maternityLeave.ApproveDays = totalDays;
                maternityLeave.MaternityItemDetailColl = _maternityLeaveService.GetMItemDetail(maternityLeave.ID);
            }
            else
            {
                maternityLeave = _maternityLeaveService.Get(maternityLeaveid);
                maternityLeave.MaternityItemDetailColl = _maternityLeaveService.GetMItemDetail(maternityLeave.ID);
                maternityLeave.MaternityStatusDetailColl = _maternityLeaveService.GetMStatusDetail(maternityLeave.ID);
            }

            Employee employee = new EmployeeService().Get(employeeid);
            DateTime monthLastDate = GlobalFunctions.LastDateOfMonth(leaveFromDate);
            List<MaternityLeave.MaternityItemDetail> MaternityItemDetailOut = new List<MaternityLeave.MaternityItemDetail>();
            MaternityLeaveService maternityLeaveService = new MaternityLeaveService();
            try
            {
                maternityLeave.MaternityItemDetailColl = maternityLeaveService.PrepareMaternityItemDetails(maternityLeave, employee, monthLastDate, (int)currentUser.PayrollTypeID, out totalEarning, out totalWorkingDays);
                dt = maternityLeaveService.RefreshGridAllowanceMaternityLeave(maternityLeave, monthLastDate, out MaternityItemDetailOut);
                if (maternityLeave.ID == 0)
                {

                    maternityLeave = maternityLeaveService.RefreshGridPaymentMaternityLeave(maternityLeave, out numPaymentDays);

                    double nTaxAmount = 0;
                    TaxCalculator otaxCal = new TaxCalculator();
                    if (leaveFromDate <= leaveToDate)
                    {
                        int days = totalDays;
                        if (totalWorkingDays > 0)
                        {
                            dailyAvgEarning = totalEarning / totalWorkingDays;
                        }
                        else
                        {
                            //_maternityLeave = new MaternityLeave();
                            //dgvMaternityItemDetails.Rows.Clear();
                            //dgvPaymentStatus.Rows.Clear();
                            //MessageBox.Show("Zero or invalid value of total working days.", "Zero or Invalid value", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            //return;
                        }
                        List<TaxRawItem> taxRawItems = new List<TaxRawItem>();
                        double ntaxableIncome = days * dailyAvgEarning;
                        TaxRawItem taxRawItemBS = TaxRawItem.Create("Maternity Benefit", ntaxableIncome, enumIncomeTaxItemType.AdjustItem, 5);
                        taxRawItems.Add(taxRawItemBS);
                        otaxCal.TaxParameter = new TaxParameterService().Get((int)currentUser.TaxParamID);
                        otaxCal.Employee = _employeeService.Get(employeeid);
                        try
                        {
                            //List<IncomeTax> incomeTaxes = otaxCal.MaternityLeaveCalculate(taxRawItems, currentUser, ref nTaxAmount);
                        }
                        catch (Exception ex)
                        {
                            nTaxAmount = 0;
                            throw new Exception("Failed to calculate tax");
                        }
                        double netAmount = 0;
                        netAmount = days * dailyAvgEarning - nTaxAmount;
                        if (maternityLeave == null)
                        {
                            maternityLeave = new MaternityLeave();
                        }
                        maternityLeave.EmployeeID = employeeid;
                        maternityLeave.ApplicationDate = applyDate;
                        maternityLeave.LeaveFromDate = leaveFromDate;
                        maternityLeave.LeaveToDate = leaveToDate;
                        maternityLeave.DateOfApproval = dateOfApproval;
                        maternityLeave.ApproveDays = Convert.ToInt32(totalDays);
                        maternityLeave.CurrentStatus = (int)EnumLeaveStatus.Approved;
                        maternityLeave.DailyAvgEarning = dailyAvgEarning;
                        maternityLeave.MaternityBenifit = days * dailyAvgEarning;
                        maternityLeave.TaxAmount = nTaxAmount;
                        maternityLeave.NetAmount = maternityLeave.MaternityBenifit - maternityLeave.TaxAmount;
                        maternityLeave.PaidAmount = 0;
                        maternityLeave.MaternityItemDetailColl = MaternityItemDetailOut;

                        numPaymentDays = days / 2;
                    }

                

                }
                else
                {
                    MaternityItemDetailOut = maternityLeave.MaternityItemDetailColl;
                    //foreach(MaternityLeave.MaternityItemDetail miDtailitem in maternityLeave.MaternityItemDetailColl)
                    //{
                    //    if(miDtailitem.Description == "Actual Working Days")
                    //        totalWorkingDays += (int)miDtailitem.Amount;
                    //}
                    maternityLeave = maternityLeaveService.RefreshGridPaymentMaternityLeave(maternityLeave, out numPaymentDays);
                    //if (leaveFromDate <= leaveToDate)
                    //{
                    //    int days = totalDays;
                    //    if (totalWorkingDays > 0)
                    //    {
                    //        dailyAvgEarning = totalEarning / totalWorkingDays;
                    //    }
                    //}
                }
            }
            catch (Exception e)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, e.Message);
            }

            DataSet ds = new DataSet();
            //List<MaternityLeave> maternityLeaves = new List<MaternityLeave>();
            //maternityLeaves.Add(maternityLeave);

            DataTable maternityLeavedt = new DataTable();
            maternityLeavedt.Columns.Add("id", typeof(int));
            maternityLeavedt.Columns.Add("employeeID", typeof(int));
            maternityLeavedt.Columns.Add("applicationDate", typeof(DateTime));
            maternityLeavedt.Columns.Add("leaveFromDate", typeof(DateTime));
            maternityLeavedt.Columns.Add("leaveToDate", typeof(DateTime));
            maternityLeavedt.Columns.Add("dateOfApproval", typeof(DateTime));
            maternityLeavedt.Columns.Add("approveDays", typeof(int));
            maternityLeavedt.Columns.Add("currentStatus", typeof(int));
            maternityLeavedt.Columns.Add("dailyAvgEarning", typeof(double));
            maternityLeavedt.Columns.Add("maternityBenifit", typeof(double));
            maternityLeavedt.Columns.Add("taxAmount", typeof(double));
            maternityLeavedt.Columns.Add("netAmount", typeof(double));
            maternityLeavedt.Columns.Add("paidAmount", typeof(double));
            maternityLeavedt.Columns.Add("maternityItemDetailColl", typeof(List<MaternityLeave.MaternityItemDetail>));
            maternityLeavedt.Columns.Add("maternityStatusDetailColl", typeof(List<MaternityLeave.MaternityStatusDetail>));
            maternityLeavedt.Columns.Add("incomeTaxColl", typeof(List<IncomeTax>));

            DataRow oDr = maternityLeavedt.NewRow();
            oDr["id"] = maternityLeave.ID;
            oDr["employeeID"] = maternityLeave.EmployeeID;
            oDr["applicationDate"] = maternityLeave.ApplicationDate;
            oDr["leaveFromDate"] = maternityLeave.LeaveFromDate;
            oDr["leaveToDate"] = maternityLeave.LeaveToDate;
            oDr["dateOfApproval"] = maternityLeave.DateOfApproval;
            oDr["approveDays"] = maternityLeave.ApproveDays;
            oDr["currentStatus"] = maternityLeave.CurrentStatus;
            oDr["dailyAvgEarning"] = maternityLeave.DailyAvgEarning;
            oDr["maternityBenifit"] = maternityLeave.MaternityBenifit;
            oDr["taxAmount"] = maternityLeave.TaxAmount;
            oDr["netAmount"] = maternityLeave.NetAmount;
            oDr["paidAmount"] = maternityLeave.PaidAmount;
            oDr["maternityItemDetailColl"] = maternityLeave.MaternityItemDetailColl;
            oDr["maternityStatusDetailColl"] = maternityLeave.MaternityStatusDetailColl;
            oDr["incomeTaxColl"] = maternityLeave.IncomeTaxColl;
            maternityLeavedt.Rows.Add(oDr);

            maternityLeavedt.TableName = "MaternityLeave";
            ds.Tables.Add(maternityLeavedt);
            dt.TableName = "MaternityLeaveItemDetailsGridData";
            ds.Tables.Add(dt);

            DataTable paymentDays = new DataTable();
            paymentDays.Columns.Add("numPaymentDays", typeof(int));
            //paymentDays.Columns.Add("dailyAvgEarning", typeof(double));
            DataRow dRow = paymentDays.NewRow();
            dRow["numPaymentDays"] = numPaymentDays;
            //dRow["dailyAvgEarning"] = dailyAvgEarning;
            paymentDays.Rows.Add(dRow);
            paymentDays.TableName = "Payment";
            ds.Tables.Add(paymentDays);

            //DataTable mIDetails = new DataTable();
            //mIDetails.Columns.Add("id", typeof(int));
            //mIDetails.Columns.Add("MaternityLeaveID", typeof(int));
            //mIDetails.Columns.Add("ItemType", typeof(EnumMaternityItemDetailType));
            //mIDetails.Columns.Add("Amount", typeof(double));
            //mIDetails.Columns.Add("Description", typeof(string));
            //mIDetails.Columns.Add("MonthDate", typeof(DateTime));
            //mIDetails.Columns.Add("SalaryComponentID", typeof(int));
            //mIDetails.Columns.Add("IncomeTaxItemType", typeof(int));
            //mIDetails.Columns.Add("TaxRawItemObject", typeof(TaxRawItem));

            //foreach (MaternityLeave.MaternityItemDetail itemDetail in MaternityItemDetailOut)
            //{
            //    DataRow midRow = mIDetails.NewRow();
            //    midRow["id"] = itemDetail.ID;
            //    midRow["MaternityLeaveID"] = itemDetail.MaternityLeaveID;
            //    midRow["ItemType"] = itemDetail.ItemType;
            //    midRow["Amount"] = itemDetail.Amount;
            //    midRow["Description"] = itemDetail.Description;
            //    midRow["MonthDate"] = itemDetail.MonthDate;
            //    midRow["SalaryComponentID"] = itemDetail.SalaryComponentID;
            //    midRow["IncomeTaxItemType"] = itemDetail.IncomeTaxItemType;
            //    midRow["TaxRawItemObject"] = itemDetail.TaxRawItemObject;
            //    mIDetails.Rows.Add(midRow);
            //}
            //mIDetails.TableName = "MaternityItemDetails";
            //ds.Tables.Add(mIDetails);

            return Ok(ds);
        }
        [HttpPost]
        [Route("saveMaternityLeave")]
        public ActionResult saveMaternityLeave(MaternityLeave oMaternityLeave)
        {
            CurrentUser currentUser = CurrentUser.GetCurrentUser(HttpContext.User);
            User user = new UserService().Get(currentUser.UserID);
            try
            {
                _maternityLeaveService.Save(oMaternityLeave, user);
            }
            catch (Exception ex)
            {
                return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
            }

            return Ok();
        }
        #endregion Maternity Leave


    }
}