public object FindByID(string entityID)
 {
     try
     {
         PatientTaskData    taskData = null;
         List <IMongoQuery> queries  = new List <IMongoQuery>();
         queries.Add(Query.EQ(MEPatientTask.IdProperty, ObjectId.Parse(entityID)));
         queries.Add(Query.EQ(MEPatientTask.DeleteFlagProperty, false));
         queries.Add(Query.EQ(MEPatientTask.TTLDateProperty, BsonNull.Value));
         IMongoQuery mQuery = Query.And(queries);
         using (PatientGoalMongoContext ctx = new PatientGoalMongoContext(_dbName))
         {
             MEPatientTask t = ctx.PatientTasks.Collection.Find(mQuery).FirstOrDefault();
             if (t != null)
             {
                 taskData = new PatientTaskData
                 {
                     Id               = t.Id.ToString(),
                     TargetValue      = t.TargetValue,
                     PatientGoalId    = t.PatientGoalId.ToString(),
                     StatusId         = ((int)t.Status),
                     TargetDate       = t.TargetDate,
                     BarrierIds       = Helper.ConvertToStringList(t.BarrierIds),
                     Description      = t.Description,
                     StatusDate       = t.StatusDate,
                     StartDate        = t.StartDate,
                     CustomAttributes = DTOUtil.GetCustomAttributeIdAndValues(t.Attributes),
                     ClosedDate       = t.ClosedDate,
                     CreatedById      = t.RecordCreatedBy.ToString(),
                     DeleteFlag       = t.DeleteFlag,
                     Details          = t.Details
                 };
                 var mePG = ctx.PatientGoals.Collection.Find(Query.EQ(MEPatientGoal.IdProperty, ObjectId.Parse(taskData.PatientGoalId))).SetFields(MEPatientGoal.NameProperty).FirstOrDefault();
                 if (mePG != null)
                 {
                     taskData.GoalName = mePG.Name;
                 }
             }
         }
         return(taskData);
     }
     catch (Exception) { throw; }
 }
        public object Initialize(object newEntity)
        {
            PutInitializeTaskRequest ptr  = (PutInitializeTaskRequest)newEntity;
            PatientTaskData          task = null;
            MEPatientTask            pat  = null;

            try
            {
                pat = new MEPatientTask(this.UserId)
                {
                    Id            = ObjectId.GenerateNewId(),
                    PatientGoalId = ObjectId.Parse(ptr.PatientGoalId),
                    TTLDate       = System.DateTime.UtcNow.AddDays(_initializeDays),
                    StatusDate    = DateTime.UtcNow,
                    DeleteFlag    = false
                                    //,
                                    //LastUpdatedOn = DateTime.UtcNow,
                                    //UpdatedBy = ObjectId.Parse(this.UserId)
                };

                using (PatientGoalMongoContext ctx = new PatientGoalMongoContext(_dbName))
                {
                    ctx.PatientTasks.Collection.Insert(pat);

                    AuditHelper.LogDataAudit(this.UserId,
                                             MongoCollectionName.PatientTask.ToString(),
                                             pat.Id.ToString(),
                                             Common.DataAuditType.Insert,
                                             ptr.ContractNumber);

                    task = new PatientTaskData
                    {
                        Id = pat.Id.ToString()
                    };
                }
                return(task);
            }
            catch (Exception) { throw; }
        }
        public object Update(object entity)
        {
            bool result = false;
            PutUpdateTaskRequest ptr = (PutUpdateTaskRequest)entity;
            PatientTaskData      pt  = ptr.Task;

            try
            {
                using (PatientGoalMongoContext ctx = new PatientGoalMongoContext(_dbName))
                {
                    var q = MB.Query <MEPatientTask> .EQ(b => b.Id, ObjectId.Parse(pt.Id));

                    // Set the StatusDate to Now if the status is changed. Set the ClosedDate depending on the Status.
                    MEPatientTask existingPB = ctx.PatientTasks.Collection.Find(q).SetFields(MEPatientTask.StatusProperty).FirstOrDefault();
                    if (existingPB != null)
                    {
                        if ((int)existingPB.Status != pt.StatusId)
                        {
                            pt.StatusDate = DateTime.UtcNow;
                        }
                        if ((pt.StatusId == (int)GoalTaskStatus.Met || pt.StatusId == (int)GoalTaskStatus.Abandoned))
                        {
                            if (existingPB.Status != (GoalTaskStatus)pt.StatusId)
                            {
                                pt.ClosedDate = DateTime.UtcNow;
                            }
                        }
                        else
                        {
                            pt.ClosedDate = null;
                        }
                    }
                    var uv = new List <MB.UpdateBuilder>();
                    uv.Add(MB.Update.Set(MEPatientTask.UpdatedByProperty, ObjectId.Parse(this.UserId)));
                    uv.Add(MB.Update.Set(MEPatientTask.VersionProperty, ptr.Version));
                    uv.Add(MB.Update.Set(MEPatientTask.LastUpdatedOnProperty, System.DateTime.UtcNow));
                    if (pt.Description != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.DescriptionProperty, pt.Description));
                    }
                    if (pt.Details != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.DetailProperty, pt.Details));
                    }
                    if (pt.StartDate != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.StartDateProperty, pt.StartDate));
                    }
                    else
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.StartDateProperty, BsonNull.Value));
                    }
                    if (pt.StatusDate != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.StatusDateProperty, pt.StatusDate));
                    }
                    if (pt.StatusId != 0)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.StatusProperty, pt.StatusId));
                    }
                    if (pt.TargetDate != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TargetDateProperty, pt.TargetDate));
                    }
                    else
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TargetDateProperty, BsonNull.Value));
                    }
                    if (pt.TargetValue != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TargetValueProperty, pt.TargetValue));
                    }
                    if (pt.CustomAttributes != null)
                    {
                        uv.Add(MB.Update.SetWrapped <List <MAttribute> >(MEPatientTask.AttributesProperty, DTOUtil.GetAttributes(pt.CustomAttributes)));
                    }
                    if (pt.BarrierIds != null)
                    {
                        uv.Add(MB.Update.SetWrapped <List <ObjectId> >(MEPatientTask.BarriersProperty, DTOUtil.ConvertObjectId(pt.BarrierIds)));
                    }
                    if (pt.ClosedDate != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.ClosedDateProperty, pt.ClosedDate));
                    }
                    else
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.ClosedDateProperty, BsonNull.Value));
                    }
                    uv.Add(MB.Update.Set(MEPatientTask.DeleteFlagProperty, pt.DeleteFlag));
                    if (pt.TemplateId != null)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TemplateIdProperty, ObjectId.Parse(pt.TemplateId)));
                    }

                    DataAuditType type;
                    if (pt.DeleteFlag)
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TTLDateProperty, System.DateTime.UtcNow.AddDays(_expireDays)));
                        type = Common.DataAuditType.Delete;
                    }
                    else
                    {
                        uv.Add(MB.Update.Set(MEPatientTask.TTLDateProperty, BsonNull.Value));
                        type = Common.DataAuditType.Update;
                    }
                    IMongoUpdate update = MB.Update.Combine(uv);
                    ctx.PatientTasks.Collection.Update(q, update);

                    AuditHelper.LogDataAudit(this.UserId,
                                             MongoCollectionName.PatientTask.ToString(),
                                             pt.Id,
                                             type,
                                             ptr.ContractNumber);

                    result = true;
                }
                return(result as object);
            }
            catch (Exception) { throw; }
        }