public ActionResult PostCostCenters(List <int> CostCenterId, DateTime CloseDate)
        {
            List <LogTypeViewModel> LogList = new List <LogTypeViewModel>();

            int[] CostCenterIds = CostCenterId.Select(m => m).ToArray();



            if (ModelState.IsValid)
            {
                var CostCenters = (from p in db.CostCenter
                                   join t in db.CostCenterStatus on p.CostCenterId equals t.CostCenterId into CostCenterStatusTable
                                   from CostCenterStatusTab in CostCenterStatusTable.DefaultIfEmpty()
                                   join jos in db.JobOrderSettings on new { A = p.ReferenceDocTypeId ?? 0, B = p.SiteId ?? 0, C = p.DivisionId ?? 0 } equals new { A = jos.DocTypeId, B = jos.SiteId, C = jos.DivisionId } into josTable
                                   from josTab in josTable.DefaultIfEmpty()
                                   where CostCenterIds.Contains(p.CostCenterId)
                                   select new
                {
                    p.CostCenterId,
                    p.LedgerAccountId,
                    p.DivisionId,
                    p.SiteId,
                    p.ReferenceDocId,
                    p.ReferenceDocTypeId,
                    AmountDr = CostCenterStatusTab.AmountDr ?? 0,
                    AmountCr = CostCenterStatusTab.AmountCr ?? 0,
                    p.DocTypeId,
                    p.StartDate,
                    p.Status,
                    p.CloseDate,
                    p.ModifiedBy,
                    p.ModifiedDate,
                    josTab.RetensionCostCenter,
                }).ToList();

                int?ProcessId = null;
                var Process   = db.Process.Where(m => m.ProcessName == ProcessConstants.Weaving).FirstOrDefault();
                if (Process != null)
                {
                    ProcessId = Process.ProcessId;
                }

                int    itemcount   = 0;
                int    ROitemcount = 0;
                string DocNo       = "";
                string TempDocNo   = "";


                foreach (var item in CostCenters)
                {
                    itemcount = itemcount + 1;
                    int          PurjaAmountTransferDocTypeId = 717;
                    int          LedgerAccountId = (int)item.LedgerAccountId;
                    LedgerHeader Header          = new LedgerHeader();



                    Header.CreatedBy   = User.Identity.Name;
                    Header.CreatedDate = DateTime.Now;
                    Header.DivisionId  = (int)item.DivisionId;
                    Header.SiteId      = (int)item.SiteId;
                    Header.DivisionId  = (int)item.DivisionId;
                    Header.DocDate     = CloseDate;
                    Header.PaymentFor  = CloseDate;
                    Header.ProcessId   = ProcessId;
                    //Header.DocDate = (DateTime)item.CloseDate;
                    //Header.PaymentFor = item.CloseDate;
                    Header.DocTypeId    = PurjaAmountTransferDocTypeId;
                    Header.CostCenterId = item.CostCenterId;
                    // Header.DocHeaderId = StokHeader.StockHeaderId;
                    DocNo = new DocumentTypeService(_unitOfWork).FGetNewDocNo("DocNo", ConfigurationManager.AppSettings["DataBaseSchema"] + ".LedgerHeaders", Header.DocTypeId, Header.DocDate, Header.DivisionId, Header.SiteId);


                    TempDocNo = DocNo.Substring(0, 2) + "-" + (Convert.ToInt32(DocNo.Substring(DocNo.IndexOf("-") + 1)) + itemcount - 1).ToString().PadLeft(4, '0').ToString();
                    DocNo     = TempDocNo;



                    Header.LedgerHeaderId  = -itemcount;
                    Header.DocNo           = DocNo;
                    Header.LedgerAccountId = LedgerAccountId;
                    Header.ModifiedBy      = User.Identity.Name;
                    Header.ModifiedDate    = DateTime.Now;
                    //Header.Remark = StokHeader.Remark;
                    Header.Status      = (int)StatusConstants.Locked;
                    Header.ObjectState = Model.ObjectState.Added;
                    db.LedgerHeader.Add(Header);


                    decimal Amount         = Math.Round((decimal)item.AmountDr - (decimal)item.AmountCr, 0, MidpointRounding.AwayFromZero);
                    decimal RoundOffAmount = Amount - ((decimal)item.AmountDr - (decimal)item.AmountCr);

                    if (Amount != 0)
                    {
                        //Postingcontra LedgerRecord;;
                        LedgerLine Ledgerline = new LedgerLine();
                        Ledgerline.LedgerHeaderId  = Header.LedgerHeaderId;
                        Ledgerline.LedgerAccountId = LedgerAccountId;
                        Ledgerline.Amount          = Amount;
                        Ledgerline.CostCenterId    = item.RetensionCostCenter;
                        Ledgerline.CreatedDate     = DateTime.Now;
                        Ledgerline.ModifiedDate    = DateTime.Now;
                        Ledgerline.CreatedBy       = User.Identity.Name;
                        //Ledgerline.Remark = svm.Remark;
                        Ledgerline.ModifiedBy  = User.Identity.Name;
                        Ledgerline.ObjectState = Model.ObjectState.Added;


                        db.LedgerLine.Add(Ledgerline);


                        //Postingcontra LedgerRecord;;
                        Ledger Ledger = new Ledger();

                        Ledger.AmtDr                 = Amount < 0 ? Math.Abs(Amount) : 0;
                        Ledger.AmtCr                 = Amount < 0 ? 0 : Math.Abs(Amount);
                        Ledger.LedgerHeaderId        = Header.LedgerHeaderId;
                        Ledger.LedgerAccountId       = LedgerAccountId;
                        Ledger.CostCenterId          = item.CostCenterId;
                        Ledger.ContraLedgerAccountId = LedgerAccountId;
                        Ledger.ObjectState           = Model.ObjectState.Added;
                        db.Ledger.Add(Ledger);
                        //new LedgerService(_unitOfWork).Create(Ledger);



                        //Postingcontra LedgerRecord;;
                        Ledger ContraLedger = new Ledger();
                        ContraLedger.AmtCr                 = Amount;
                        ContraLedger.AmtDr                 = Amount < 0 ? 0 : Math.Abs(Amount);
                        ContraLedger.AmtCr                 = Amount < 0 ? Math.Abs(Amount) : 0;
                        ContraLedger.LedgerHeaderId        = Header.LedgerHeaderId;
                        ContraLedger.LedgerAccountId       = LedgerAccountId;
                        ContraLedger.CostCenterId          = item.RetensionCostCenter;
                        ContraLedger.ContraLedgerAccountId = LedgerAccountId;
                        ContraLedger.ObjectState           = Model.ObjectState.Added;
                        //new LedgerService(_unitOfWork).Create(ContraLedger);
                        db.Ledger.Add(ContraLedger);
                    }



                    if (RoundOffAmount != 0)
                    {
                        ROitemcount = ROitemcount + 1;

                        LedgerHeader ROLHeader = new LedgerHeader();

                        int RODocType         = 0;
                        int RoundOffAccountId = 6660;

                        if (RoundOffAmount > 0)
                        {
                            RODocType = 785;//dr
                        }
                        else
                        {
                            RODocType = 786;//cr
                        }
                        ROLHeader.CreatedBy    = User.Identity.Name;
                        ROLHeader.CreatedDate  = DateTime.Now;
                        ROLHeader.DivisionId   = (int)item.DivisionId;
                        ROLHeader.SiteId       = (int)item.SiteId;
                        ROLHeader.DivisionId   = (int)item.DivisionId;
                        ROLHeader.DocDate      = CloseDate;
                        ROLHeader.PaymentFor   = CloseDate;
                        ROLHeader.ProcessId    = ProcessId;
                        ROLHeader.DocTypeId    = RODocType;
                        ROLHeader.CostCenterId = item.CostCenterId;
                        DocNo = new DocumentTypeService(_unitOfWork).FGetNewDocNo("DocNo", ConfigurationManager.AppSettings["DataBaseSchema"] + ".LedgerHeaders", ROLHeader.DocTypeId, ROLHeader.DocDate, ROLHeader.DivisionId, ROLHeader.SiteId);;


                        TempDocNo = DocNo.Substring(0, 2) + "-" + (Convert.ToInt32(DocNo.Substring(DocNo.IndexOf("-") + 1)) + ROitemcount - 1).ToString().PadLeft(4, '0').ToString();
                        DocNo     = TempDocNo;

                        ROLHeader.LedgerHeaderId  = +ROitemcount;
                        ROLHeader.DocNo           = DocNo;
                        ROLHeader.LedgerAccountId = RoundOffAccountId;
                        ROLHeader.ModifiedBy      = User.Identity.Name;
                        ROLHeader.ModifiedDate    = DateTime.Now;
                        ROLHeader.Remark          = "On Cost Center Closing";
                        ROLHeader.Status          = (int)StatusConstants.Locked;
                        ROLHeader.ObjectState     = Model.ObjectState.Added;

                        db.LedgerHeader.Add(ROLHeader);



                        //Postingcontra LedgerRecord;;
                        LedgerLine Ledgerline1 = new LedgerLine();
                        Ledgerline1.LedgerHeaderId  = ROLHeader.LedgerHeaderId;
                        Ledgerline1.LedgerAccountId = LedgerAccountId;
                        Ledgerline1.Amount          = Math.Abs(RoundOffAmount);
                        Ledgerline1.CostCenterId    = item.CostCenterId;
                        Ledgerline1.CreatedDate     = DateTime.Now;
                        Ledgerline1.ModifiedDate    = DateTime.Now;
                        Ledgerline1.CreatedBy       = User.Identity.Name;
                        //Ledgerline.Remark = svm.Remark;
                        Ledgerline1.ModifiedBy  = User.Identity.Name;
                        Ledgerline1.ObjectState = Model.ObjectState.Added;


                        db.LedgerLine.Add(Ledgerline1);


                        #region CSEUpdate
                        var CSE = db.CostCenterStatusExtended.Find(item.CostCenterId);

                        if (RODocType == 785)
                        {
                            CSE.DebitAmount = (CSE.DebitAmount ?? 0) + Math.Abs(RoundOffAmount);
                        }
                        else if (RODocType == 786)
                        {
                            CSE.CreditAmount = (CSE.CreditAmount ?? 0) + Math.Abs(RoundOffAmount);
                        }

                        CSE.ObjectState = Model.ObjectState.Modified;
                        db.CostCenterStatusExtended.Add(CSE);
                        #endregion



                        //Postingcontra LedgerRecord;;
                        Ledger Ledger1 = new Ledger();



                        Ledger1.AmtDr                 = RoundOffAmount > 0 ? Math.Abs(RoundOffAmount) : 0;
                        Ledger1.AmtCr                 = RoundOffAmount < 0 ? Math.Abs(RoundOffAmount) : 0;
                        Ledger1.LedgerHeaderId        = ROLHeader.LedgerHeaderId;
                        Ledger1.LedgerAccountId       = LedgerAccountId;
                        Ledger1.CostCenterId          = item.CostCenterId;
                        Ledger1.ContraLedgerAccountId = RoundOffAccountId;
                        Ledger1.ObjectState           = Model.ObjectState.Added;
                        db.Ledger.Add(Ledger1);
                        //new LedgerService(_unitOfWork).Create(Ledger);



                        //Postingcontra LedgerRecord;;
                        Ledger ContraLedger1 = new Ledger();
                        ContraLedger1.AmtDr                 = RoundOffAmount < 0 ? Math.Abs(RoundOffAmount) : 0;
                        ContraLedger1.AmtCr                 = RoundOffAmount > 0 ? Math.Abs(RoundOffAmount) : 0;
                        ContraLedger1.LedgerHeaderId        = ROLHeader.LedgerHeaderId;
                        ContraLedger1.LedgerAccountId       = RoundOffAccountId;
                        ContraLedger1.ContraLedgerAccountId = LedgerAccountId;
                        ContraLedger1.ObjectState           = Model.ObjectState.Added;
                        //new LedgerService(_unitOfWork).Create(ContraLedger);
                        db.Ledger.Add(ContraLedger1);
                    }
                }



                // Start For Old RetentionTrf
                foreach (var item in CostCenters)
                {
                    IQueryable <JobOrderHeaderViewModel> p = _JobOrderHeaderService.GetJobOrderHeaderListByCostCenter(item.CostCenterId);

                    foreach (var V1 in p)
                    {
                        JobOrderHeader joborder = db.JobOrderHeader.Find(V1.JobOrderHeaderId);
                        joborder.Status       = (int)StatusConstants.Closed;
                        joborder.ModifiedBy   = User.Identity.Name;
                        joborder.ModifiedDate = DateTime.Now;
                        joborder.ObjectState  = Model.ObjectState.Modified;
                        db.JobOrderHeader.Add(joborder);


                        #region CSEUpdate
                        var JOHS = db.JobOrderHeaderStatus.Find(V1.JobOrderHeaderId);
                        JOHS.Status      = (int)StatusConstants.Closed;
                        JOHS.ObjectState = Model.ObjectState.Modified;
                        db.JobOrderHeaderStatus.Add(JOHS);
                        #endregion
                    }

                    CostCenter costcenter = db.CostCenter.Find(item.CostCenterId);

                    costcenter.Status       = (int)StatusConstants.Closed;
                    costcenter.CloseDate    = CloseDate;
                    costcenter.IsActive     = false;
                    costcenter.ModifiedBy   = User.Identity.Name;
                    costcenter.ModifiedDate = DateTime.Now;
                    costcenter.ObjectState  = Model.ObjectState.Modified;
                    db.CostCenter.Add(costcenter);


                    LogList.Add(new LogTypeViewModel {
                        ExObj = costcenter, Obj = costcenter
                    });

                    XElement    Modifications = new ModificationsCheckService().CheckChanges(LogList);
                    ActivityLog Log           = new ActivityLog()
                    {
                        ActivityType  = (int)ActivityTypeContants.Closed,
                        CreatedBy     = User.Identity.Name,
                        CreatedDate   = DateTime.Now,
                        DocId         = item.CostCenterId,
                        DocTypeId     = item.DocTypeId,
                        Modifications = Modifications.ToString(),
                        Narration     = "",
                    };

                    Log.ObjectState = Model.ObjectState.Added;
                    db.ActivityLog.Add(Log);
                }

                // End  For Old RetentionTrf
                try
                {
                    db.SaveChanges();
                }

                catch (Exception ex)
                {
                    string message = _exception.HandleException(ex);
                    ModelState.AddModelError("", message);
                    return(Json(new { Success = false }));
                }


                return(Json(new { Success = true }));
            }

            //PrepareViewBag(svm.DocTypeId);
            //ViewBag.Mode = "Add";
            //return View("Create", svm);
            return(View("CloseCostCenters"));
        }