using System;
using System.Data;
using Ease.Core.Model;
using Ease.Core.DataAccess;
using Ease.Core;
using System.Collections.Generic;
using Ease.Core.Utility;
using HRM.BO;

namespace HRM.DA
{
    public class ObjectiveService : ServiceTemplate, IObjectiveService
    {
        #region Object Mapping

        private void MapObject(Objective oObjective, DataReader oReader)
        {
            SetObjectID(oObjective, oReader.GetInt32("ObjectiveID", 0));
            oObjective.ObjectiveSetID = oReader.GetInt32("ObjectiveSetID", 0);
            oObjective.PMPYearID = oReader.GetInt32("PMPYearID", 0);
            oObjective.Title = oReader.GetString("Title");
            oObjective.Description = oReader.GetString("Description");
            oObjective.Activities = oReader.GetString("Activities");
            oObjective.MeasuresOfSuccess = oReader.GetString("MeasuresOfSuccess");
            oObjective.MeasuresOfSuccess2 = oReader.GetString("MeasuresOfSuccess2");
            oObjective.Weightages = oReader.GetDouble("Weightages").Value;
            oObjective.EmployeeID = oReader.GetInt32("EmployeeID", 0);
            oObjective.EmployeeNodeID = oReader.GetInt32("EmployeeNodeID", 0);
            oObjective.ObjectiveDate = oReader.GetDateTime("ObjectiveDate").HasValue
                ? oReader.GetDateTime("ObjectiveDate").Value
                : DateTime.MinValue;
            oObjective.LMID = oReader.GetInt32("LMID", 0);
            oObjective.LMNodeID = oReader.GetInt32("LMNodeID", 0);
            oObjective.LMRatingID = oReader.GetInt32("LMRatingID").GetValueOrDefault();
            oObjective.RagingDate = oReader.GetDateTime("RagingDate").HasValue
                ? oReader.GetDateTime("RagingDate").Value
                : DateTime.MinValue;
            oObjective.MYEmployeeComments = oReader.GetString("MYEmployeeComments");
            oObjective.MYLMComments = oReader.GetString("MYLMComments");
            oObjective.ObjComment = oReader.GetString("ObjComment");
            oObjective.StartDate = oReader.GetDateTime("StartDate").HasValue
                ? oReader.GetDateTime("StartDate").Value
                : DateTime.MinValue;
            oObjective.EndDate = oReader.GetDateTime("EndDate").HasValue
                ? oReader.GetDateTime("EndDate").Value
                : DateTime.MinValue;
            oObjective.IsDraft = oReader.GetBoolean("IsDraft").Value;
            oObjective.IsOldObjective = oReader.GetBoolean("IsOldObjective").Value;
            oObjective.ObjectiveType = oReader.GetInt32("ObjectiveType").Value;
            oObjective.YEEmployeeComments = oReader.GetString("YEEmployeeComments");
            oObjective.YELMComments = oReader.GetString("YELMComments");
            oObjective.MYAssessRating = (EnumAssessment)oReader.GetInt32("MYAssessRating").GetValueOrDefault();
            oObjective.MYLMAssessRating = (EnumAssessment)oReader.GetInt32("MYLMAssessRating").GetValueOrDefault();
            oObjective.MYStatus = (EnumObjectiveStatus)oReader.GetInt32("MYStatus").GetValueOrDefault();
            oObjective.YEStatus = (EnumObjectiveStatus)oReader.GetInt32("YEStatus").GetValueOrDefault();
            oObjective.PriorityPercent = oReader.GetDouble("PriorityPercent").Value;
            oObjective.YEEmpMark = oReader.GetDouble("YEEmpMark").Value;
            oObjective.YELMMark = oReader.GetInt32("YELMMark", 0);
            oObjective.YEAssessRating = oReader.GetDouble("YEASSESSRATING").HasValue 
                ? oReader.GetDouble("YEASSESSRATING").Value : null;
            oObjective.YELMAssessRating = oReader.GetInt32("YELMAssessRating").HasValue
                ? oReader.GetDouble("YELMAssessRating").Value : null;
            oObjective.KPIType = oReader.GetInt32("KPIType").GetValueOrDefault();
            oObjective.MasterKpiId = oReader.GetInt32("MASTERKPIID").GetValueOrDefault();
            oObjective.GroupID = oReader.GetInt32("GroupID", 0);
            oObjective.Tier = oReader.GetString("Tier");
            this.SetObjectState(oObjective, ObjectState.Saved);
        }

        protected override T CreateObject<T>(DataReader oReader)
        {
            Objective oObjective = new Objective();
            MapObject(oObjective, oReader);
            return oObjective as T;
        }

        #endregion

        #region Child Mapping

        #region LMObjective

        private List<LMObjective> CreateLMObjectives(DataReader oReader)
        {
            List<LMObjective> oLMObjectives = new List<LMObjective>();
            while (oReader.Read())
            {
                LMObjective oLMObjective = new LMObjective();
                MapLMObjectiveObject(oLMObjective, oReader);
                oLMObjectives.Add(oLMObjective);
            }

            return oLMObjectives;
        }

        private void MapLMObjectiveObject(LMObjective oLMObjective, DataReader oReader)
        {
            base.SetObjectID(oLMObjective, oReader.GetInt32("LMObjectiveID", 0));
            oLMObjective.ObjectiveID = oReader.GetInt32("ObjectiveID", 0);
            this.SetObjectState(oLMObjective, Ease.Core.ObjectState.Saved);
        }

        #endregion

        #region ObjectiveEmployees

        private List<ObjectiveEmployees> CreateObjectiveEmployeess(DataReader oReader)
        {
            List<ObjectiveEmployees> oObjectiveEmployeess = new List<ObjectiveEmployees>();
            while (oReader.Read())
            {
                ObjectiveEmployees oObjectiveEmployees = new ObjectiveEmployees();
                MapoObjectiveEmployeesObject(oObjectiveEmployees, oReader);
                oObjectiveEmployeess.Add(oObjectiveEmployees);
            }

            return oObjectiveEmployeess;
        }

        private void MapoObjectiveEmployeesObject(ObjectiveEmployees oObjectiveEmployees, DataReader oReader)
        {
            base.SetObjectID(oObjectiveEmployees, oReader.GetInt32("ObjectiveEmployeesID", 0));
            oObjectiveEmployees.ObjectiveID = oReader.GetInt32("ObjectiveID", 0);
            oObjectiveEmployees.EmployeeID = oReader.GetInt32("EmployeeID", 0);
            oObjectiveEmployees.ObjectiveNodeID = oReader.GetInt32("ObjectiveNodeID", 0);
            this.SetObjectState(oObjectiveEmployees, Ease.Core.ObjectState.Saved);
        }

        #endregion

        #region DevelopmentPlan

        private List<DevelopmentPlan> CreateDevelopmentPlans(DataReader oReader)
        {
            List<DevelopmentPlan> oDevelopmentPlans = new List<DevelopmentPlan>();
            while (oReader.Read())
            {
                DevelopmentPlan oDevelopmentPlan = new DevelopmentPlan();
                MapDevelopmentPlansObject(oDevelopmentPlan, oReader);
                oDevelopmentPlans.Add(oDevelopmentPlan);
            }

            return oDevelopmentPlans;
        }

        private void MapDevelopmentPlansObject(DevelopmentPlan oDevelopmentPlan, DataReader oReader)
        {
            base.SetObjectID(oDevelopmentPlan, oReader.GetInt32("DevelopmentPlanID").Value);
            //oDevelopmentPlan.FuncDevNeeds = oReader.GetString("Activities");
            //oDevelopmentPlan.NxtCarrierSteps = oReader.GetString("MeasuresOfSuccess");
            //oDevelopmentPlan.TimeLine = oReader.GetString("TimeLine");
            //oDevelopmentPlan.ObjectiveID = oReader.GetInt32("ObjectiveID", 0);
            //oDevelopmentPlan.TrainingID = oReader.GetInt32("TrainingID", 0);
            //oDevelopmentPlan.Remarks = oReader.GetString("Remarks");
            this.SetObjectState(oDevelopmentPlan, ObjectState.Saved);
        }

        #endregion

        #endregion

        #region IObjectiveService Members

        #region Get All

        public List<Objective> Get()
        {
            List<Objective> oObjective = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.Get(tc));
                oObjective = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjective;
        }

        #endregion

        #region Get By ID

        public Objective Get(int id)
        {
            Objective oObjective = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.Get(tc, id));
                if (oreader.Read())
                {
                    oObjective = this.CreateObject<Objective>(oreader);
                }

                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjective;
        }

        #endregion

        #region Get By Line Manager ID

        public Objective GetByLMID(int id)
        {
            Objective oObjective = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetByLMID(tc, id));
                if (oreader.Read())
                {
                    oObjective = this.CreateObject<Objective>(oreader);
                }

                //oObjective = this.CreateObject<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjective;
        }

        #endregion


        #region Get Draft Objective

        public List<Objective> GetObjectives(int id, int draft)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetDraftObjectives(tc, id, draft));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        #endregion

        #region Get By Employee ID

        public List<Objective> GetByEmployeeID(int Empid, int PMPID, bool IsDrafted)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetByEmployeeID(tc, Empid, PMPID, IsDrafted));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        public List<Objective> GetForValidation(int empId, int pmpYearId, int objectiveTypeId)
        {
            List<Objective> items = new List<Objective>();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader dataReader = new DataReader(ObjectiveDA.GetForValidation(tc, empId, pmpYearId, objectiveTypeId));
                items = this.CreateObjects<Objective>(dataReader);
                dataReader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return items;
        }

        public List<Objective> GetLMObjs(int Empid, int PMPYID, int nLMID)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetLMObjs(tc, Empid, PMPYID, nLMID));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        public List<Objective> GetByEmployeeID(string Empids, int PMPID, bool IsDrafted)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetByEmployeeID(tc, Empids, PMPID, IsDrafted));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        public List<Objective> GetByPMPYearID(int id, string InEmpSQL)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetByPMPYearID(tc, id, InEmpSQL));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        public List<Objective> GetByStatus(EnumPMPStatus estatus, bool IsFinalized)
        {
            List<Objective> oObjectives = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetByStatus(tc, estatus, IsFinalized));
                //if (oreader.Read())
                //{
                //    oObjectives = this.CreateObjects<Objective>(oreader);
                //}
                oObjectives = this.CreateObjects<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectives;
        }

        #endregion

        #region Get Development Plans

        public List<DevelopmentPlan> GetDevelopmentPlans(int iD)
        {
            List<DevelopmentPlan> oDevelopmentPlan = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetDevelopmentPlans(tc, iD));
                oDevelopmentPlan = this.CreateDevelopmentPlans(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oDevelopmentPlan;
        }

        #endregion

        #region Get LMObjectives

        public List<LMObjective> GetLMObjectives(int iD)
        {
            List<LMObjective> oLMObjective = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetLMObjectives(tc, iD));
                oLMObjective = this.CreateLMObjectives(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oLMObjective;
        }

        #endregion

        #region Get Objective Employees

        public List<ObjectiveEmployees> GetObjectiveEmployees(int iD)
        {
            List<ObjectiveEmployees> oObjectiveEmployees = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetObjectiveEmployees(tc, iD));
                oObjectiveEmployees = this.CreateObjectiveEmployeess(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjectiveEmployees;
        }

        #endregion

        #region Get Line Manager Objective

        public Objective GetLineManager(int id)
        {
            Objective oObjective = null;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                DataReader oreader = new DataReader(ObjectiveDA.GetLineManager(tc, id));
                if (oreader.Read())
                {
                    oObjective = this.CreateObject<Objective>(oreader);
                }

                //oObjective = this.CreateObject<Objective>(oreader);
                oreader.Close();
                tc.End();
            }

            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return oObjective;
        }

        #endregion

        #region Insert

        public int Save(Objective item)
        {
            TransactionContext tc = null;
            try
            {
                ObjectiveSet oObjectiveSet = null;
                ObjectiveSet objSet = (new ObjectiveSetService()).GetByEmployeeID(item.EmployeeID, item.PMPYearID);
                if (objSet != null)
                {
                    item.ObjectiveSetID = objSet.ID;
                }
                else
                {
                    oObjectiveSet = new ObjectiveSet();
                    oObjectiveSet.EmployeeID = item.EmployeeID;
                    oObjectiveSet.EmployeeNodeID = item.EmployeeNodeID;
                    oObjectiveSet.LMID = item.LMID;
                    oObjectiveSet.LMNodeID = item.LMNodeID;
                    oObjectiveSet.PMPYearID = item.PMPYearID;
                }

                tc = TransactionContext.Begin(true);

                if (oObjectiveSet != null)
                {
                    int obsetID = tc.GenerateID("ObjectiveSet", "ObjectiveSetID");
                    base.SetObjectID(oObjectiveSet, (obsetID));
                    ObjectiveSetDA.Save(tc, oObjectiveSet);
                    item.ObjectiveSetID = (obsetID);
                }

                if (item.IsNew)
                {
                    //List<ObjectiveSet> objSet= ObjectiveSetService.GetByEmployeeID(item.EmployeeID, item.PMPYearID);
                    int id = tc.GenerateID("Objective", "ObjectiveID");
                    base.SetObjectID(item, (id));
                    ObjectiveDA.Insert(tc, item);
                }
                else
                {
                    ObjectiveDA.Update(tc, item);

                    #region Delete Child

                    ObjectiveDA.DeleteLMObjective(tc, item.ID);
                    ObjectiveDA.DeleteDevelopmentPlan(tc, item.ID);
                    ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);

                    #endregion
                }

                #region Insert Child

                if (item.LMObjectives != null && item.LMObjectives.Count > 0)
                {
                    foreach (LMObjective lMObjective in item.LMObjectives)
                    {
                        lMObjective.ParentID = item.ID;
                        base.SetObjectID(lMObjective, (tc.GenerateID("LMObjective", "LMObjectiveID")));
                        LMObjectiveDA.Save(tc, lMObjective);
                    }
                }

                //foreach (DevelopmentPlan dDevelopmentPlan in item.DevelopmentPlans)
                //{
                //    dDevelopmentPlan.ObjectiveID = item.ID;
                //    base.SetObjectID(dDevelopmentPlan, (tc.GenerateID("DevelopmentPlan", "DevelopmentPlanID")));
                //    DevelopmentPlanDA.Insert(tc, dDevelopmentPlan, EnumObjectiveFlowStatus.Draft);
                //}

                if (item.ObjectiveEmployees != null && item.ObjectiveEmployees.Count > 0)
                {
                    foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
                    {
                        oObjectiveEmployees.ObjectiveID = item.ID;
                        base.SetObjectID(oObjectiveEmployees,
                            (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
                        ObjectiveEmployeesDA.Save(tc, oObjectiveEmployees);
                    }
                }

                #endregion

                tc.End();
                return item.ID;
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        public void Save(List<Objective> items)
        {
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                int id = tc.GenerateID("Objective", "ObjectiveID");
                int obsetID = tc.GenerateID("ObjectiveSet", "ObjectiveSetID");
                foreach (Objective item in items)
                {
                    ObjectiveSet oObjectiveSet = null;
                    ObjectiveSet objSet =
                        (new ObjectiveSetService()).GetByEmployeeID(tc, item.EmployeeID, item.PMPYearID);
                    if (objSet != null)
                    {
                        item.ObjectiveSetID = objSet.ID;
                    }
                    else
                    {
                        oObjectiveSet = new ObjectiveSet();
                        oObjectiveSet.EmployeeID = item.EmployeeID;
                        oObjectiveSet.EmployeeNodeID = item.EmployeeNodeID;
                        oObjectiveSet.LMID = item.LMID;
                        oObjectiveSet.LMNodeID = item.LMNodeID;
                        oObjectiveSet.PMPYearID = item.PMPYearID;
                    }


                    if (oObjectiveSet != null)
                    {
                        base.SetObjectID(oObjectiveSet, (obsetID));
                        ObjectiveSetDA.Save(tc, oObjectiveSet);
                        item.ObjectiveSetID = (obsetID);
                        obsetID++;
                    }

                    if (item.IsNew)
                    {
                        //List<ObjectiveSet> objSet= ObjectiveSetService.GetByEmployeeID(item.EmployeeID, item.PMPYearID);

                        base.SetObjectID(item, (id));
                        ObjectiveDA.Insert(tc, item);
                        id++;
                    }
                    else
                    {
                        ObjectiveDA.Update(tc, item);

                        #region Delete Child

                        ObjectiveDA.DeleteLMObjective(tc, item.ID);
                        ObjectiveDA.DeleteDevelopmentPlan(tc, item.ID);
                        ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);

                        #endregion
                    }

                    #region Insert Child

                    foreach (LMObjective lMObjective in item.LMObjectives)
                    {
                        lMObjective.ParentID = item.ID;
                        base.SetObjectID(lMObjective, (tc.GenerateID("LMObjective", "LMObjectiveID")));
                        LMObjectiveDA.Save(tc, lMObjective);
                    }

                    //foreach (DevelopmentPlan dDevelopmentPlan in item.DevelopmentPlans)
                    //{
                    //    dDevelopmentPlan.ObjectiveID = item.ID;
                    //    base.SetObjectID(dDevelopmentPlan, (tc.GenerateID("DevelopmentPlan", "DevelopmentPlanID")));
                    //    DevelopmentPlanDA.Insert(tc, dDevelopmentPlan, EnumObjectiveFlowStatus.Draft);
                    //}

                    foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
                    {
                        oObjectiveEmployees.ObjectiveID = item.ID;
                        base.SetObjectID(oObjectiveEmployees,
                            (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
                        ObjectiveEmployeesDA.Save(tc, oObjectiveEmployees);
                    }

                    #endregion

                    //return item.ID; 
                }

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        public void SaveForUpload(List<Objective> items)
        {
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                int id = tc.GenerateID("Objective", "ObjectiveID");
                int obsetID = tc.GenerateID("ObjectiveSet", "ObjectiveSetID");
                foreach (Objective item in items)
                {
                    ObjectiveSet oObjectiveSet = null;
                    ObjectiveSet objSet =
                        (new ObjectiveSetService()).GetByEmployeeID(tc, item.EmployeeID, item.PMPYearID);
                    if (objSet != null)
                    {
                        item.ObjectiveSetID = objSet.ID;
                        objSet.OBEmpComplete = true;
                        objSet.OBEmpCompleteDate = DateTime.Today;
                        objSet.OBLMComplete = EnumObjectiveFlowStatus.Agreed;
                        objSet.OBLMCompleteDate = DateTime.Today;
                    }
                    else
                    {
                        oObjectiveSet = new ObjectiveSet();
                        oObjectiveSet.EmployeeID = item.EmployeeID;
                        oObjectiveSet.EmployeeNodeID = item.EmployeeNodeID;
                        oObjectiveSet.LMID = item.LMID;
                        oObjectiveSet.LMNodeID = item.LMNodeID;
                        oObjectiveSet.PMPYearID = item.PMPYearID;
                        oObjectiveSet.OBEmpComplete = true;
                        oObjectiveSet.OBEmpCompleteDate = DateTime.Today;
                        oObjectiveSet.OBLMComplete = EnumObjectiveFlowStatus.Agreed;
                        oObjectiveSet.OBLMCompleteDate = DateTime.Today;
                    }


                    if (oObjectiveSet != null)
                    {
                        base.SetObjectID(oObjectiveSet, (obsetID));
                        ObjectiveSetDA.Save(tc, oObjectiveSet);
                        item.ObjectiveSetID = (obsetID);
                        obsetID++;
                    }
                    else
                    {
                        ObjectiveSetDA.Update(tc, objSet);
                    }

                    if (item.IsNew)
                    {
                        //List<ObjectiveSet> objSet= ObjectiveSetService.GetByEmployeeID(item.EmployeeID, item.PMPYearID);

                        base.SetObjectID(item, (id));
                        ObjectiveDA.Insert(tc, item);
                        id++;
                    }
                    else
                    {
                        ObjectiveDA.Update(tc, item);

                        #region Delete Child

                        ObjectiveDA.DeleteLMObjective(tc, item.ID);
                        ObjectiveDA.DeleteDevelopmentPlan(tc, item.ID);
                        ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);

                        #endregion
                    }
                    //#region Insert Child
                    //foreach (LMObjective lMObjective in item.LMObjectives)
                    //{
                    //    lMObjective.ParentID = item.ID;
                    //    base.SetObjectID(lMObjective, (tc.GenerateID("LMObjective", "LMObjectiveID")));
                    //    LMObjectiveDA.Insert(tc, lMObjective);
                    //}
                    //foreach (DevelopmentPlan dDevelopmentPlan in item.DevelopmentPlans)
                    //{
                    //    dDevelopmentPlan.ObjectiveID = item.ID;
                    //    base.SetObjectID(dDevelopmentPlan, (tc.GenerateID("DevelopmentPlan", "DevelopmentPlanID")));
                    //    DevelopmentPlanDA.Insert(tc, dDevelopmentPlan);
                    //}
                    //foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
                    //{
                    //    oObjectiveEmployees.ObjectiveID = item.ID;
                    //    base.SetObjectID(oObjectiveEmployees, (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
                    //    ObjectiveEmployeesDA.Insert(tc, oObjectiveEmployees);
                    //}
                    //#endregion

                    //return item.ID; 
                }

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        public void SaveForSalesUpload(List<Objective> items)
        {
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                int id = tc.GenerateID("Objective", "ObjectiveID");
                int obsetID = tc.GenerateID("ObjectiveSet", "ObjectiveSetID");
                foreach (Objective item in items)
                {
                    ObjectiveSet oObjectiveSet = null;
                    ObjectiveSet objSet =
                        (new ObjectiveSetService()).GetByEmployeeID(tc, item.EmployeeID, item.PMPYearID);
                    if (objSet != null)
                    {
                        item.ObjectiveSetID = objSet.ID;
                        objSet.OBEmpComplete = true;
                        objSet.OBEmpCompleteDate = DateTime.Today;
                        objSet.OBLMComplete = EnumObjectiveFlowStatus.Agreed;
                        objSet.OBLMCompleteDate = DateTime.Today;
                    }
                    else
                    {
                        oObjectiveSet = new ObjectiveSet();
                        oObjectiveSet.EmployeeID = item.EmployeeID;
                        oObjectiveSet.EmployeeNodeID = item.EmployeeNodeID;
                        oObjectiveSet.LMID = item.LMID;
                        oObjectiveSet.LMNodeID = item.LMNodeID;
                        oObjectiveSet.PMPYearID = item.PMPYearID;
                        oObjectiveSet.OBEmpComplete = true;
                        oObjectiveSet.OBEmpCompleteDate = DateTime.Today;
                        oObjectiveSet.OBLMComplete = EnumObjectiveFlowStatus.Agreed;
                        oObjectiveSet.OBLMCompleteDate = DateTime.Today;
                    }


                    if (oObjectiveSet != null)
                    {
                        base.SetObjectID(oObjectiveSet, (obsetID));
                        ObjectiveSetDA.Save(tc, oObjectiveSet);
                        item.ObjectiveSetID = (obsetID);
                        obsetID++;
                    }
                    else
                    {
                        ObjectiveSetDA.Update(tc, objSet);
                    }

                    if (item.IsNew)
                    {
                        //List<ObjectiveSet> objSet= ObjectiveSetService.GetByEmployeeID(item.EmployeeID, item.PMPYearID);

                        base.SetObjectID(item, (id));
                        ObjectiveDA.Insert(tc, item);
                        id++;
                    }
                    else
                    {
                        ObjectiveDA.Update(tc, item);

                        #region Delete Child

                        ObjectiveDA.DeleteLMObjective(tc, item.ID);
                        ObjectiveDA.DeleteDevelopmentPlan(tc, item.ID);
                        ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);

                        #endregion
                    }
                    //#region Insert Child
                    //foreach (LMObjective lMObjective in item.LMObjectives)
                    //{
                    //    lMObjective.ParentID = item.ID;
                    //    base.SetObjectID(lMObjective, (tc.GenerateID("LMObjective", "LMObjectiveID")));
                    //    LMObjectiveDA.Insert(tc, lMObjective);
                    //}
                    //foreach (DevelopmentPlan dDevelopmentPlan in item.DevelopmentPlans)
                    //{
                    //    dDevelopmentPlan.ObjectiveID = item.ID;
                    //    base.SetObjectID(dDevelopmentPlan, (tc.GenerateID("DevelopmentPlan", "DevelopmentPlanID")));
                    //    DevelopmentPlanDA.Insert(tc, dDevelopmentPlan);
                    //}
                    //foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
                    //{
                    //    oObjectiveEmployees.ObjectiveID = item.ID;
                    //    base.SetObjectID(oObjectiveEmployees, (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
                    //    ObjectiveEmployeesDA.Insert(tc, oObjectiveEmployees);
                    //}
                    //#endregion

                    //return item.ID; 
                }

                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        public void Update(List<Objective> items)
        {
            string sError = string.Empty;
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin();
                foreach (Objective item in items)
                {
                    ObjectiveDA.Update(tc, item);
                    ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);
                    foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
                    {
                        oObjectiveEmployees.ObjectiveID = item.ID;
                        base.SetObjectID(oObjectiveEmployees,
                            (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
                        ObjectiveEmployeesDA.Save(tc, oObjectiveEmployees);
                    }
                }


                tc.End();
            }
            catch (Exception e)
            {
                throw new Exception(sError);
            }
        }

        //public string Save2(Objective item, List<PMSUpdateHistory> UpdateHistory)
        //{
        //    string sError = string.Empty;
        //    TransactionContext tc = null;
        //    try
        //    {
        //        ObjectiveSet oObjectiveSet = null;
        //        sError += "error code:30";
        //        ObjectiveSet objSet = (new ObjectiveSetService()).GetByEmployeeID(item.EmployeeID, item.PMPYearID);
        //        if (objSet != null)
        //        {
        //            item.ObjectiveSetID = objSet.ID;
        //            //objSet.OBLMComplete = EnumObjectiveFlowStatus.Not_yet_Agreed;
        //            //objSet.OBEmpComplete = false;
        //            objSet.LMID = item.LMID;
        //            objSet.LMNodeID = item.LMNodeID;
        //        }
        //        else
        //        {
        //            oObjectiveSet = new ObjectiveSet();
        //            oObjectiveSet.EmployeeID = item.EmployeeID;
        //            oObjectiveSet.EmployeeNodeID = item.EmployeeNodeID;
        //            oObjectiveSet.LMID = item.LMID;
        //            oObjectiveSet.LMNodeID = item.LMNodeID;
        //            oObjectiveSet.PMPYearID = item.PMPYearID;
        //        }
        //        sError += "error code:04";
        //        tc = TransactionContext.Begin(true);

        //        if (oObjectiveSet != null)
        //        {
        //            int obsetID = tc.GenerateID("ObjectiveSet", "ObjectiveSetID");
        //            base.SetObjectID(oObjectiveSet, (obsetID));
        //            ObjectiveSetDA.Insert(tc, oObjectiveSet);
        //            item.ObjectiveSetID = (obsetID);
        //        }
        //        else
        //        {
        //            ObjectiveSetDA.Update(tc, objSet);
        //        }
        //        sError += "error code:05";

        //        if (item.IsNew)
        //        {
        //            //List<ObjectiveSet> objSet= ObjectiveSetService.GetByEmployeeID(item.EmployeeID, item.PMPYearID);
        //            int id = tc.GenerateID("Objective", "ObjectiveID");
        //            base.SetObjectID(item, (id));
        //            ObjectiveDA.Insert(tc, item);

        //        }
        //        else
        //        {
        //            ObjectiveDA.Update(tc, item);

        //            #region Delete Child
        //            ObjectiveDA.DeleteLMObjective(tc, item.ID);
        //            ObjectiveDA.DeleteDevelopmentPlan(tc, item.ID);
        //            ObjectiveDA.DeleteObjectiveEmployees(tc, item.ID);
        //            #endregion
        //        }
        //        #region Insert Child
        //        sError += "error code:06";
        //        foreach (LMObjective lMObjective in item.LMObjectives)
        //        {
        //            lMObjective.ParentID = item.ID;
        //            base.SetObjectID(lMObjective, (tc.GenerateID("LMObjective", "LMObjectiveID")));
        //            LMObjectiveDA.Insert(tc, lMObjective);
        //        }
        //        sError += "error code:07";
        //        foreach (DevelopmentPlan dDevelopmentPlan in item.DevelopmentPlans)
        //        {
        //            dDevelopmentPlan.ObjectiveID = item.ID;
        //            base.SetObjectID(dDevelopmentPlan, (tc.GenerateID("DevelopmentPlan", "DevelopmentPlanID")));
        //            DevelopmentPlanDA.Insert(tc, dDevelopmentPlan,EnumObjectiveFlowStatus.Draft);
        //        }
        //        sError += "error code:08";
        //        foreach (ObjectiveEmployees oObjectiveEmployees in item.ObjectiveEmployees)
        //        {
        //            oObjectiveEmployees.ObjectiveID = item.ID;
        //            base.SetObjectID(oObjectiveEmployees, (tc.GenerateID("ObjectiveEmployees", "ObjectiveEmployeesID")));
        //            ObjectiveEmployeesDA.Insert(tc, oObjectiveEmployees);
        //        }
        //        #endregion

        //        foreach (PMSUpdateHistory uph in UpdateHistory)
        //        {
        //            base.SetObjectID(uph, (tc.GenerateID("PMSUpdateHistory", "PMSUpdateHistoryID")));
        //            uph.CreatedBy = item.EmployeeID;
        //            uph.CreatedDate = DateTime.Today;
        //            uph.Sequence = PMSUpdateHistoryDA.GetSequence(tc, uph.PmpStatus, uph.ChangeType, uph.ActorType);
        //            PMSUpdateHistoryDA.Insert(tc, uph);
        //        }
        //        tc.End();
        //    }
        //    catch (Exception e)
        //    {
        //        throw new Exception(sError);
        //    }
        //    return sError;
        //}

        #endregion

        #region Delete

        public void Delete(int id)
        {
            TransactionContext tc = null;
            try
            {
                ObjectiveSet obset = new ObjectiveSetService().GetSetByObjectiveID(id);

                if(obset.OBEmpComplete ==true)
                {
                    throw new Exception(" Delete is not allowed after objective submit");
                }

                tc = TransactionContext.Begin(true);

                //#region Delete Child

                //ObjectiveDA.DeleteLMObjective(tc, id);
                //ObjectiveDA.DeleteDevelopmentPlan(tc, id);
                //ObjectiveDA.DeleteObjectiveEmployees(tc, id);

                //#endregion

                ObjectiveDA.Delete(tc, id);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        public void DeleteAllCompanyObj(int yearID)
        {
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                //#region Delete Child
                //ObjectiveDA.DeleteLMObjective(tc, id);
                //ObjectiveDA.DeleteDevelopmentPlan(tc, id);
                //ObjectiveDA.DeleteObjectiveEmployees(tc, id);
                //#endregion
                ObjectiveDA.DeleteAllCompanyObj(tc, yearID);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }
        }

        #endregion

        #endregion

        public DataSet GetComObjAssignedEmpID(int PMPYearID)
        {
            DataSet allData = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                allData = ObjectiveDA.GetComObjAssignedEmpID(tc, PMPYearID);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return allData;
        }

        public DataSet GetEmpObjectiveData(int year)
        {
            DataSet allData = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                allData = new DataSet(); //ObjectiveDA.GetEmpObjectiveData(tc,year);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return allData;
        }

        public DataSet GetEmpFreezedObjectiveData()
        {
            DataSet allData = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                allData = new DataSet(); //ObjectiveDA.GetEmpFreezedObjectiveData(tc);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return allData;
        }
        
        public DataSet GetPmsDataEmployeeWise(int pmpYearId, string empIds)
        {
            DataSet dataSet = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                dataSet = ObjectiveDA.GetPmsDataEmployeeWise(tc, pmpYearId, empIds);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return dataSet;
        }


        public DataSet GetPmsLmGoalReport(int pmpYearId, int empId)
        {
            DataSet dataSet = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                dataSet = ObjectiveDA.GetPmsLmGoalReport(tc, pmpYearId, empId);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return dataSet;
        }

        public DataSet GetPmsIndividualGoalData(int pmpYearId, int empId)
        {
            DataSet dataSet = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                dataSet = ObjectiveDA.GetPmsIndividualGoalData(tc, pmpYearId, empId);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return dataSet;
        }
        public DataSet getPMSReportData(int pmpYearID, int pmsReportType, string emps)
        {
            DataSet dataSet = new DataSet();
            TransactionContext tc = null;
            try
            {
                tc = TransactionContext.Begin(true);
                dataSet = ObjectiveDA.getPMSReportData(tc, pmpYearID, pmsReportType, emps);
                tc.End();
            }
            catch (Exception e)
            {
                #region Handle Exception

                if (tc != null)
                    tc.HandleError();
                ExceptionLog.Write(e);
                throw new ServiceException(e.Message, e);

                #endregion
            }

            return dataSet;
        }
    }
}