private void MapLeaveType(LeaveType leaveobject, LeaveTypeFormViewModel model, OptionsViewModel moreInfo)
        {
            model.Branches         = model.IBranches == null ? null : string.Join(",", model.IBranches.ToArray());
            model.Jobs             = model.IJobs == null ? null : string.Join(",", model.IJobs.ToArray());
            model.Employments      = model.IEmployments == null ? null : string.Join(",", model.IEmployments.ToArray());
            model.PeopleGroups     = model.IPeopleGroups == null ? null : string.Join(",", model.IPeopleGroups.ToArray());
            model.Payrolls         = model.IPayrolls == null ? null : string.Join(",", model.IPayrolls.ToArray());
            model.PayrollGrades    = model.IPayrollGrades == null ? null : string.Join(",", model.IPayrollGrades.ToArray());
            model.CompanyStuctures = model.ICompanyStuctures == null ? null : string.Join(",", model.ICompanyStuctures.ToArray());
            model.Positions        = model.IPositions == null ? null : string.Join(",", model.IPositions.ToArray());
            moreInfo.VisibleColumns.Add("Branches");
            moreInfo.VisibleColumns.Add("Jobs");
            moreInfo.VisibleColumns.Add("Employments");
            moreInfo.VisibleColumns.Add("PeopleGroups");
            moreInfo.VisibleColumns.Add("Payrolls");
            moreInfo.VisibleColumns.Add("PayrollGrades");
            moreInfo.VisibleColumns.Add("CompanyStuctures");
            moreInfo.VisibleColumns.Add("Positions");
            _hrUnitOfWork.LeaveRepository.AddLName(Language, leaveobject.Name, model.Name, model.LocalName);
            AutoMapper(new Models.AutoMapperParm
            {
                Destination = leaveobject,
                Source      = model,
                ObjectName  = "LeaveType",
                Options     = moreInfo
            });
            //MonthOrYear: 2-year, AccBalDays: 1-Fixed days
            leaveobject.MonthOrYear = (byte)(model.AccBalDays == 1 || !model.HasAccrualPlan ? 0 : model.MonthOrYear ?? 2);
            if (model.ChangAssignStat == false)
            {
                leaveobject.AutoChangStat = null;
                leaveobject.AssignStatus  = null;
            }
            if (model.AccBalDays != 1)
            {
                leaveobject.NofDays = null;
            }
            if (model.AllowNegBal == false)
            {
                leaveobject.Percentage = null;
            }
            if (model.Balanace50 == false)
            {
                leaveobject.Age50     = null;
                leaveobject.NofDays50 = null;
            }
            //postOption Sec
            if (model.PostOpt == 1)
            {
                leaveobject.MaxNofDays  = null;
                leaveobject.MaxPercent  = null;
                leaveobject.DiffDaysOpt = null;
            }
            else if (model.PostOpt == 2)
            {
                leaveobject.MaxPercent = null;
            }
            else if (model.PostOpt == 3)
            {
                leaveobject.MaxNofDays = null;
            }
            else
            {
                leaveobject.MaxNofDays    = null;
                leaveobject.MaxPercent    = null;
                leaveobject.DiffDaysOpt   = null;//
                leaveobject.MinLeaveDays  = null;
                leaveobject.IncludContinu = null;
            }

            if (model.HasAccrualPlan == false)
            {
                leaveobject.AccBalDays     = null;
                leaveobject.NofDays        = null;
                leaveobject.Balanace50     = false;
                leaveobject.Age50          = null;
                leaveobject.NofDays50      = null;
                leaveobject.WorkServMethod = null;
                leaveobject.PostOpt        = null;
                leaveobject.MaxNofDays     = null;
                leaveobject.MaxPercent     = null;
            }
            else
            {
                leaveobject.MaxDaysInPeriod = null;
            }
            leaveobject.Percentage = model.Percentage / 100;
            leaveobject.MaxPercent = model.MaxPercent / 100;
        }
        public ActionResult Details(LeaveTypeFormViewModel model, OptionsViewModel moreInfo, LeaveRangeVM grid1, bool clear)
        {
            List <Error> errors = new List <Error>();

            if (ModelState.IsValid)
            {
                if (ServerValidationEnabled)
                {
                    errors = _hrUnitOfWork.SiteRepository.CheckForm(new CheckParm
                    {
                        CompanyId    = CompanyId,
                        ObjectName   = "LeaveType",
                        TableName    = "LeaveTypes",
                        ParentColumn = "CompanyId",
                        Columns      = Models.Utils.GetColumnViews(ModelState.Where(a => !a.Key.Contains('.'))),
                        Culture      = Language
                    });

                    if (errors.Count() > 0)
                    {
                        foreach (var e in errors)
                        {
                            foreach (var errorMsg in e.errors)
                            {
                                ModelState.AddModelError(errorMsg.field, errorMsg.message);
                            }
                        }

                        return(Json(Models.Utils.ParseFormErrors(ModelState)));
                    }
                }

                PeriodName calendar = new PeriodName {
                    Id = model.CalendarId
                };
                if (model.HasAccrualPlan)
                {
                    if (model.CalendarId == 0)
                    {
                        string error;
                        calendar = AddPeriodName(model.Name, model.FrequencyId.Value, model.IsLocal, out error);
                        if (!string.IsNullOrEmpty(error))
                        {
                            ModelState.AddModelError("FrequencyId", error);
                            return(Json(Models.Utils.ParseFormErrors(ModelState)));
                        }
                    }
                }

                LeaveType record;
                //insert
                if (model.Id == 0)
                {
                    record = new LeaveType();
                    MapLeaveType(record, model, moreInfo);
                    record.CreatedUser = UserName;
                    record.CreatedTime = DateTime.Now;
                    record.CompanyId   = model.IsLocal ? CompanyId : (int?)null;
                    if (record.StartDate > record.EndDate)
                    {
                        ModelState.AddModelError("EndDate", MsgUtils.Instance.Trls("EndDateGthanStartDate"));
                        return(Json(Models.Utils.ParseFormErrors(ModelState)));
                    }
                    if (record.HasAccrualPlan)
                    {
                        record.CalendarId = calendar.Id;
                    }
                    _hrUnitOfWork.LeaveRepository.Add(record);
                }
                //update
                else
                {
                    record = _hrUnitOfWork.Repository <LeaveType>().FirstOrDefault(a => a.Id == model.Id);
                    MapLeaveType(record, model, moreInfo);
                    record.ModifiedTime = DateTime.Now;
                    record.ModifiedUser = UserName;
                    record.CompanyId    = model.IsLocal ? CompanyId : (int?)null;

                    if (record.StartDate > record.EndDate)
                    {
                        ModelState.AddModelError("EndDate", MsgUtils.Instance.Trls("MustGreaterthanStart"));
                        return(Json(Models.Utils.ParseFormErrors(ModelState)));
                    }

                    if (record.HasAccrualPlan)
                    {
                        record.CalendarId = calendar.Id;
                    }
                    _hrUnitOfWork.LeaveRepository.Attach(record);
                    _hrUnitOfWork.LeaveRepository.Entry(record).State = EntityState.Modified;
                }

                // Save grid2
                errors = SaveGrid2(grid1, ModelState.Where(a => a.Key.Contains("grid1")), record);
                if (errors.Count > 0)
                {
                    return(Json(errors.First().errors.First().message));
                }

                errors = SaveChanges(Language);

                if (clear)
                {
                    model = new LeaveTypeFormViewModel();
                }
                else
                {
                    model.Id = record.Id;
                }

                if (errors.Count > 0)
                {
                    return(Json(errors.First().errors.First().message));
                }

                return(Json("OK," + ((new JavaScriptSerializer()).Serialize(model))));
            }

            return(Json(Models.Utils.ParseFormErrors(ModelState)));
        }