Ejemplo n.º 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="name"></param>
        /// <param name="isMale"></param>
        /// <param name="phoneNumber"></param>
        /// <param name="AdmissionDiagnosis"></param>
        /// <param name="admissionWeight"></param>
        /// <param name="dateTimeBirth"></param>
        /// <param name="gestAgeBirth"></param>
        /// <param name="hospitalIdentifier"></param>
        /// <param name="isInborn"></param>
        /// <param name="multipleSibblingId"></param>
        /// <param name="registeredAt"></param>
        /// <returns>Whether a protocol violation has been logged due to randomising criteria being altered</returns>
        public UpdateParticipantViolationType UpdateParticipant(int id,
                                                                string name,
                                                                bool isMale,
                                                                string phoneNumber,
                                                                string AdmissionDiagnosis,
                                                                int admissionWeight,
                                                                DateTime dateTimeBirth,
                                                                double gestAgeBirth,
                                                                string hospitalIdentifier,
                                                                bool?isInborn,
                                                                int?multipleSibblingId,
                                                                MaternalBCGScarStatus maternalBCGScar,
                                                                DateTime registeredAt,
                                                                bool isEnvelopeRandomising)
        {
            Participant participant = _dbContext.Participants.Find(id);
            var         pv          = new List <ProtocolViolation>();
            UpdateParticipantViolationType returnVar = UpdateParticipantViolationType.NoViolations;

            if (!RandomisingExtensions.IsSameRandomisingCategory(participant.IsMale, isMale, participant.AdmissionWeight, admissionWeight))
            {
                pv.Add(new ProtocolViolation
                {
                    Details = string.Format(BlockRandomisationViolation + "Block randomising information changed from {0}g {1} to {2}g {3}",
                                            participant.AdmissionWeight,
                                            GenderString(participant.IsMale),
                                            admissionWeight,
                                            GenderString(isMale))
                });
                Engine.RemoveAllocationFromArm(participant, _dbContext);
                returnVar |= UpdateParticipantViolationType.BlockCriteriaChanged;
            }
            if (admissionWeight > Engine.MaxBirthWeightGrams)
            {
                pv.Add(new ProtocolViolation
                {
                    Details = string.Format("Retrospectively inelligible participant!: Weight changed from {0} to {1}", participant.AdmissionWeight, admissionWeight)
                });

                participant.AdmissionWeight = admissionWeight;
                returnVar |= UpdateParticipantViolationType.IneligibleWeight;
            }
            if (participant.MultipleSiblingId != multipleSibblingId)
            {
                pv.Add(new ProtocolViolation
                {
                    Details = string.Format(BlockRandomisationViolation + "Twin/tripplet ID changed from '{0}' to '{1}';", participant.MultipleSiblingId, multipleSibblingId)
                });
                participant.MultipleSiblingId = multipleSibblingId;
                returnVar |= UpdateParticipantViolationType.MultipleSiblingIdChanged;
            }
            int nextPvId = GetNextId(_dbContext.ProtocolViolations, participant.CentreId);

            foreach (var p in pv)
            {
                p.ParticipantId         = participant.Id;
                p.Id                    = nextPvId++;
                p.ViolationType         = ViolationTypeOption.MajorWrongAllocation;
                p.ReportingTimeLocal    = DateTime.Now;
                p.ReportingInvestigator = System.Threading.Thread.CurrentPrincipal.Identity.Name;
                _dbContext.ProtocolViolations.Add(p);
            }
            participant.Name               = name;
            participant.PhoneNumber        = phoneNumber;
            participant.AdmissionDiagnosis = AdmissionDiagnosis;
            participant.DateTimeBirth      = dateTimeBirth;
            participant.GestAgeBirth       = gestAgeBirth;
            participant.HospitalIdentifier = hospitalIdentifier;
            participant.Inborn             = isInborn;
            participant.RegisteredAt       = registeredAt;
            participant.MaternalBCGScar    = maternalBCGScar;
            if ((returnVar & UpdateParticipantViolationType.BlockCriteriaChanged) != 0)
            {
                Engine.ForceAllocationToArm(participant, _dbContext);
            }
            _dbContext.SaveChanges(true);
            this.ParticipantUpdated?.Invoke(this, new ParticipantEventArgs(participant));
            return(returnVar);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="id"></param>
        /// <param name="causeOfDeath"></param>
        /// <param name="otherCauseOfDeathDetail"></param>
        /// <param name="bcgAdverse"></param>
        /// <param name="bcgAdverseDetail"></param>
        /// <param name="bcgPapuleAtDischarge"></param>
        /// <param name="lastContactWeight"></param>
        /// <param name="lastWeightDate"></param>
        /// <param name="dischargeDateTime"></param>
        /// <param name="deathOrLastContactDateTime"></param>
        /// <param name="outcomeAt28Days"></param>
        /// <param name="notes"></param>
        /// <param name="participantVaccines">if null (or ommitted) the vaccines administered will not be altered</param>
        public void UpdateParticipant(int id,
                                      CauseOfDeathOption causeOfDeath,
                                      string otherCauseOfDeathDetail,
                                      bool?bcgAdverse,
                                      string bcgAdverseDetail,
                                      bool?bcgPapuleAtDischarge,
                                      bool?bcgPauleAt28days,
                                      int?lastContactWeight,
                                      DateTime?lastWeightDate,
                                      DateTime?dischargeDateTime,
                                      DateTime?deathOrLastContactDateTime,
                                      OutcomeAt28DaysOption outcomeAt28Days,
                                      MaternalBCGScarStatus maternalBCGScar,
                                      FollowUpBabyBCGReactionStatus followUpBabyBCGReaction,
                                      DateTime?followUpContactMade,
                                      bool permanentlyUncontactable,
                                      string notes,
                                      IEnumerable <VaccineAdministered> participantVaccines   = null,
                                      IEnumerable <UnsuccessfulFollowUp> unsuccesfulFollowUps = null)
        {
            Participant participant = _dbContext.Participants.Find(id);

            participant.CauseOfDeath            = causeOfDeath;
            participant.OtherCauseOfDeathDetail = otherCauseOfDeathDetail;
            participant.BcgAdverse                 = bcgAdverse;
            participant.BcgAdverseDetail           = bcgAdverseDetail;
            participant.BcgPapuleAtDischarge       = bcgPapuleAtDischarge;
            participant.BcgPapuleAt28days          = bcgPauleAt28days;
            participant.LastContactWeight          = lastContactWeight;
            participant.LastWeightDate             = lastWeightDate;
            participant.DischargeDateTime          = dischargeDateTime;
            participant.DeathOrLastContactDateTime = deathOrLastContactDateTime;
            participant.OutcomeAt28Days            = outcomeAt28Days;
            participant.RecordLastModified         = DateTime.UtcNow;
            participant.MaternalBCGScar            = maternalBCGScar;
            participant.FollowUpBabyBCGReaction    = followUpBabyBCGReaction;
            participant.FollowUpContactMade        = followUpContactMade;
            participant.PermanentlyUncontactable   = permanentlyUncontactable;
            participant.Notes = notes;

            ((DbContext)_dbContext).AttachAndMarkModified(participant);
            if (participantVaccines != null)
            {
                AddOrUpdateVaccinesAdministered(participant.Id, participantVaccines);
            }
            if (unsuccesfulFollowUps != null)
            {
                AddOrUpdateUnsuccessfulFollowUps(participant.Id, unsuccesfulFollowUps);
            }
            _dbContext.SaveChanges(true);
            if (this.ParticipantUpdated != null)
            {
                if (participant.VaccinesAdministered == null)
                {
                    participant.VaccinesAdministered = _dbContext.VaccinesAdministered.Where(v => v.ParticipantId == participant.Id).ToList();
                }
                else
                {
                    foreach (var v in participant.VaccinesAdministered)
                    {
                        if (v.VaccineGiven == null)
                        {
                            v.VaccineGiven = _dbContext.Vaccines.Find(v.VaccineId);
                        }
                    }
                }
                if (participant.UnsuccessfulFollowUps == null)
                {
                    participant.UnsuccessfulFollowUps = _dbContext.UnsuccessfulFollowUps.Where(u => u.ParticipantId == participant.Id).ToList();
                }
                this.ParticipantUpdated(this, new ParticipantEventArgs(participant));
            }
        }
Ejemplo n.º 3
0
        public Participant AddParticipant(
            string name,
            string mothersName,
            string hospitalIdentifier,
            int admissionWeight,
            double gestAgeBirth,
            DateTime dateTimeBirth,
            string AdmissionDiagnosis,
            string phoneNumber,
            bool isMale,
            bool?inborn,
            DateTime registeredAt,
            int centreId,
            MaternalBCGScarStatus maternalBCGScar,
            int?multipleSiblingId,
            int?envelopeNumber = null)
        {
            Participant newParticipant = new Participant
            {
                Name                    = name,
                MothersName             = mothersName,
                HospitalIdentifier      = hospitalIdentifier.Trim(),
                AdmissionWeight         = admissionWeight,
                GestAgeBirth            = gestAgeBirth,
                DateTimeBirth           = dateTimeBirth,
                AdmissionDiagnosis      = AdmissionDiagnosis,
                PhoneNumber             = phoneNumber,
                IsMale                  = isMale,
                Inborn                  = inborn,
                RegisteredAt            = registeredAt,
                RegisteringInvestigator = System.Threading.Thread.CurrentPrincipal.Identity.Name,
                CentreId                = centreId,
                WasEnvelopeRandomised   = envelopeNumber.HasValue,
                MaternalBCGScar         = maternalBCGScar,
                AppVersionAtEnrollment  = App.CurrentAppVersion,
                VaccinesAdministered    = new List <VaccineAdministered>()
            };

            if (multipleSiblingId.HasValue)
            {
                var multipleSibling = _dbContext.Participants.Find(multipleSiblingId.Value);
                if (multipleSibling == null)
                {
                    throw new ArgumentException("Participant Not Found", "multipleSiblingId");
                }
                if (multipleSibling.IsMale == newParticipant.IsMale)
                {
                    newParticipant.TrialArm          = multipleSibling.TrialArm;
                    newParticipant.MultipleSiblingId = multipleSiblingId;
                    if (envelopeNumber.HasValue)
                    {
                        newParticipant.Id = (from p in _dbContext.Participants
                                             where p.Id > EnvelopeDetails.MaxEnvelopeNumber
                                             orderby p.Id descending
                                             select p.Id).FirstOrDefault();
                        if (newParticipant.Id == 0)
                        {
                            newParticipant.Id = EnvelopeDetails.MaxEnvelopeNumber;
                        }
                        newParticipant.Id += 1;
                    }
                    else
                    {
                        newParticipant.Id = GetNextId(_dbContext.Participants, centreId);
                        Engine.ForceAllocationToArm(newParticipant, _dbContext);
                    }
                }
            }
            if (!newParticipant.MultipleSiblingId.HasValue)
            {
                if (envelopeNumber.HasValue)
                {
                    Envelope envelope = EnvelopeDetails.GetEnvelope(envelopeNumber.Value);
                    if (!_dbContext.AllocationBlocks.Any(a => a.Id == envelope.BlockNumber))
                    {
                        _dbContext.AllocationBlocks.Add(new AllocationBlock
                        {
                            Id                    = envelope.BlockNumber,
                            GroupRepeats          = (byte)(envelope.BlockSize / 2),
                            AllocationGroup       = AllocationGroups.India2Arm,
                            RandomisationCategory = envelope.RandomisationCategory
                        });
                    }
                    newParticipant.AllocationBlockId = envelope.BlockNumber;
                    newParticipant.TrialArm          = envelope.IsInterventionArm ? RandomisationArm.RussianBCG : RandomisationArm.Control;
                    newParticipant.Id = envelopeNumber.Value;
                }
                else
                {
                    newParticipant.Id = GetNextId(_dbContext.Participants, centreId);
                    Engine.CreateAllocation(newParticipant, _dbContext);
                }
            }
            Add(newParticipant);
            return(newParticipant);
        }