public ResponseMessage CreateRequirement(AddSiteRequirement siteRequirement)
        {
            using (var transaction = _context.Database.BeginTransaction()) {
                try {
                    ResponseMessage responseMessage = new ResponseMessage();
                    SiteRequirement sitereq         = _mapper.Map <SiteRequirement> (siteRequirement);

                    int    siteReqCount = _context.SiteRequirement.Count() + 1;
                    string mrno         = constantVal.MRNoPrefix + siteReqCount.ToString().PadLeft(6, '0');
                    sitereq.CreatedAt      = DateTime.Now;
                    sitereq.CreatedBy      = 1;  //TODO
                    sitereq.RoleId         = 13; // TODO
                    sitereq.MrNo           = mrno;
                    sitereq.Status         = "NEW";
                    sitereq.StatusInternal = "NEW";
                    _context.SiteRequirement.Add(sitereq);
                    _context.SaveChanges();

                    //Add the site requirement structure
                    if (siteRequirement.SiteRequirementStructures.Any())
                    {
                        foreach (var item in siteRequirement.SiteRequirementStructures)
                        {
                            SiteReqStructure siteReqStructure = new SiteReqStructure();
                            siteReqStructure.SiteReqId              = sitereq.Id;
                            siteReqStructure.StructId               = item.StructId;
                            siteReqStructure.Quantity               = item.Quantity;
                            siteReqStructure.PlanReleasedate        = item.PlanReleasedate;
                            siteReqStructure.PlanStartdate          = item.PlanStartdate;
                            siteReqStructure.RequireWbsId           = item.RequireWbsId;
                            siteReqStructure.ActualReleasedate      = DateTime.Now;
                            siteReqStructure.ActualStartdate        = item.RequireByDate;
                            siteReqStructure.StructureAttributesVal = item.StructureAttributesVal;
                            _context.SiteReqStructure.Add(siteReqStructure);
                        }
                    }
                    _context.SaveChanges();
                    SitereqStatusHistory siteStatusHist = new SitereqStatusHistory();
                    siteStatusHist.MrNo           = sitereq.MrNo;
                    siteStatusHist.RoleId         = sitereq.RoleId;
                    siteStatusHist.Status         = sitereq.Status;
                    siteStatusHist.StatusInternal = sitereq.StatusInternal;
                    siteStatusHist.SitereqId      = sitereq.Id;
                    siteStatusHist.UpdatedAt      = DateTime.Now;
                    siteStatusHist.UpdatedBy      = 1; //TODO
                    _context.SitereqStatusHistory.Add(siteStatusHist);
                    _context.SaveChanges();
                    responseMessage.Message = $"Site Requirement {sitereq.MrNo} created sucessfully";
                    transaction.Commit();
                    return(responseMessage);
                } catch (Exception ex) {
                    transaction.Rollback();
                    throw ex;
                }
            }
        }
        public ResponseMessage UpdateRequirement(AddSiteRequirement siteRequirement, int id)
        {
            ResponseMessage responseMessage = new ResponseMessage();

            try {
                var siteReq = _context.SiteRequirement.Where(x => x.Id == id && x.IsDelete == false).FirstOrDefault();
                if (siteReq != null)
                {
                    if (_context.SiteRequirement.Where(x => x.Id != id && x.IsDelete == false).Count() > 0)
                    {
                        throw new ValueNotFoundException("Site Requirement Id doesnot exist.");
                    }
                    else
                    {
                        siteReq.FromProjectId  = siteRequirement.ProjectId;
                        siteReq.Remarks        = siteRequirement.Remarks;
                        siteReq.Remarks        = siteRequirement.Remarks;
                        siteReq.Status         = siteRequirement.Status;
                        siteReq.StatusInternal = siteRequirement.StatusInternal;
                        siteReq.RoleId         = 1; //TODO
                        siteReq.UpdatedBy      = 1; //TODO
                        siteReq.UpdatedAt      = DateTime.Now;

                        var siteReqStructures        = _context.SiteReqStructure.Where(x => x.SiteReqId == siteReq.Id).ToList();
                        var addedsiteReqStructures   = siteRequirement.SiteRequirementStructures.Where(x => !siteReqStructures.Any(p => p.Id == x.Id)).ToList();
                        var deletedsiteReqStructures = siteReqStructures.Where(x => !siteRequirement.SiteRequirementStructures.Any(p => p.Id == x.Id)).ToList();
                        var updatedsiteReqStructures = siteRequirement.SiteRequirementStructures.Where(x => siteReqStructures.Any(p => p.Id == x.Id)).ToList();

                        //add Project site req structure
                        if (addedsiteReqStructures.Any())
                        {
                            foreach (var item in addedsiteReqStructures)
                            {
                                SiteReqStructure siteReqStructure = new SiteReqStructure();
                                siteReqStructure.SiteReqId       = siteReq.Id;
                                siteReqStructure.StructId        = item.StructId;
                                siteReqStructure.PlanStartdate   = item.PlanStartdate;
                                siteReqStructure.ActualStartdate = item.RequireByDate;
                                siteReqStructure.PlanReleasedate = item.PlanReleasedate;
                                siteReqStructure.RequireWbsId    = item.RequireWbsId;
                                _context.SiteReqStructure.Add(siteReqStructure);
                            }
                        }

                        //delete Project site req structure
                        if (deletedsiteReqStructures.Any())
                        {
                            foreach (var item in deletedsiteReqStructures)
                            {
                                _context.SiteReqStructure.Remove(item);
                            }
                        }

                        //update Project site req structure
                        if (updatedsiteReqStructures.Any())
                        {
                            foreach (var item in updatedsiteReqStructures)
                            {
                                SiteReqStructure siteReqStructure = _context.SiteReqStructure.Where(x => x.Id == item.Id).FirstOrDefault();
                                siteReqStructure.StructId = item.StructId;
                                siteReqStructure.Quantity = item.Quantity;
                                _context.SaveChanges();
                            }
                        }
                        _context.SaveChanges();
                        SitereqStatusHistory siteStatusHist = new SitereqStatusHistory();
                        siteStatusHist.MrNo           = siteReq.MrNo;
                        siteStatusHist.RoleId         = siteReq.RoleId;
                        siteStatusHist.Status         = siteReq.Status;
                        siteStatusHist.StatusInternal = siteReq.StatusInternal;
                        siteStatusHist.UpdatedAt      = DateTime.Now;
                        siteStatusHist.UpdatedBy      = 1; //TODO
                        _context.SitereqStatusHistory.Add(siteStatusHist);
                        _context.SaveChanges();
                        AuditLogs audit = new AuditLogs()
                        {
                            Action    = "Site Requirement",
                            Message   = string.Format("Site Requirement Updated Successfully {0}", siteReq.Id),
                            CreatedAt = DateTime.Now,
                            CreatedBy = 1 //TODO
                        };
                        _commonRepo.AuditLog(audit);
                        return(responseMessage = new ResponseMessage()
                        {
                            Message = "Site Requirement updated successfully.",
                        });
                    }
                }
                else
                {
                    throw new ValueNotFoundException("Site Requirement not available.");
                }
            } catch (Exception ex) {
                throw ex;
            }
        }