예제 #1
0
        /// <summary>
        /// For the given collection build a list of specimens contained.
        /// </summary>
        /// <param name="collectionId"></param>
        private void PopulateSpecimens(int?collectionId, IEnumerable <int> newSpecimens)
        {
            Dictionary <int, string> existingSpecimens = new Dictionary <int, string>();

            if (collectionId.HasValue)
            {
                int    protocolId = int.Parse(BaseProtocolId);
                string datasetSQL = base.GetSpecimenPatientsDatasetSQL();
                existingSpecimens = da.GetTransferSpecimensByProtocol(protocolId, collectionId.Value, datasetSQL).AsEnumerable().ToDictionary(
                    c => (int)c[Specimen_SpecimenCollections.SpecimenId],
                    c => c[Specimen_SpecimenCollections.SpecimenCollectionId].ToString());

                //    existingSpecimens = BOL.BusinessObject.GetByFields<Specimen_SpecimenCollections>(new Dictionary<string, object>
                //{
                //    { Specimen_SpecimenCollections.CollectionId, collectionId }
                //}).ToDictionary(c => (int)c[Specimen_SpecimenCollections.SpecimenId], c => c[Specimen_SpecimenCollections.SpecimenCollectionId].ToString());
                newSpecimens = newSpecimens.Except(existingSpecimens.Keys);
            }

            // build unified data source
            var dataSource = from specimen in GetSpecimens(existingSpecimens.Keys.Concat(newSpecimens))
                             let specimenId = (int)specimen[Specimen.SpecimenId]
                                              select new
            {
                SpecimenId              = specimenId,
                SpecimenSubType         = specimen[Specimen.SpecimenSubType].ToString(),
                CollectionId            = collectionId,
                SpecimenCollectionId    = existingSpecimens.ContainsKey(specimenId) ? existingSpecimens[specimenId].ToString() : "",
                SpecimenReferenceNumber = specimen[Specimen.SpecimenReferenceNumber].ToString()
            };

            //  var specimens = da.GetSpecimensInCollection(collectionId, "");

            SpecimensGrid.DataSource = dataSource;
            SpecimensGrid.DataBind();
        }
예제 #2
0
        private int?SaveForm(int?specimenAccessionId)
        {
            bool isNewAccession = !specimenAccessionId.HasValue;
            int  patientId      = int.Parse(BaseDecryptedPatientId);
            // udpate SpecimenAccession
            SpecimenAccession sa = new SpecimenAccession();

            // load
            if (specimenAccessionId.HasValue)
            {
                sa.Get(specimenAccessionId.Value);
            }
            CICHelper.SetBOValues(this.Controls, sa, patientId);
            // special case: needle
            PopulateNeedleBizField(sa);
            sa.Save();
            // validate accession data
            if (!sa.PrimaryKeyHasValue)
            {
                return(null);
            }
            specimenAccessionId = (int)sa[SpecimenAccession.SpecimenAccessionId];

            // special case: diagnostics for tissue
            if (QuerySpecimenType == QUERY_TISSUE && !string.IsNullOrEmpty(AccessionProcName.Text) && AccessionProcName.Text.StartsWith("Image-Guided", StringComparison.OrdinalIgnoreCase))
            {
                SaveDiagnostic(sa);
            }
            else if (specimenAccessionId.HasValue && !string.IsNullOrEmpty(DiagnosticIdField.Value))
            {
                int diagnosticId = int.Parse(DiagnosticIdField.Value);
                DeleteRelatedDiagnostic(specimenAccessionId.Value, diagnosticId);
            }

            /*
             *  SPECIMENS: for new accessions and single field udpates, force save/update
             */
            string selectedTissueSubType = Tissue_SpecimenSubType.Value;
            Dictionary <string, List <int?> > validation = new Dictionary <string, List <int?> >();

            foreach (GridViewRow row in SpecimensGrid.Rows)
            {
                int rowIndex = row.RowIndex;
                ICaisisInputControl specimenIdField = row.FindControl(Specimen.SpecimenId) as ICaisisInputControl;
                ICaisisInputControl refNumField     = row.FindControl(Specimen.SpecimenReferenceNumber) as ICaisisInputControl;
                ICaisisInputControl subTypeField    = row.FindControl(Specimen.SpecimenSubType) as ICaisisInputControl;

                if (QuerySpecimenType == QUERY_TISSUE)
                {
                    subTypeField.Value = selectedTissueSubType;
                }
                if (isNewAccession || forceSpecimenUpdate)
                {
                    // only for rows with a reference #
                    if (!string.IsNullOrEmpty(refNumField.Value) && !SpecimensGrid.DirtyRows.Contains(rowIndex))
                    {
                        SpecimensGrid.DirtyRows.Add(rowIndex);
                    }
                }
                // validation
                int?   specimenId = null;
                string specimenReferenceNumber = refNumField.Value;
                if (!string.IsNullOrEmpty(specimenReferenceNumber))
                {
                    if (!string.IsNullOrEmpty(specimenIdField.Value))
                    {
                        specimenId = int.Parse(specimenIdField.Value);
                    }
                    validation.Adjoin(specimenReferenceNumber, new List <int?>());
                    validation[specimenReferenceNumber].Add(specimenId);
                }
            }
            List <string> currentDuplicates  = new List <string>();
            List <string> externalDuplicates = new List <string>();

            // TODO: refactor
            Caisis.Data.Database db = new Data.Database();
            string db_table         = new Specimen().TableName;

            if (validation.Count() > 0)
            {
                // validate against siblings
                currentDuplicates.AddRange(validation.Where(a => a.Value.Count() > 1).Select(a => a.Key));
                if (currentDuplicates.Count() == 0)
                {
                    // validate against db
                    foreach (var pair in validation)
                    {
                        bool   specimenValid           = true;
                        string specimenReferenceNumber = pair.Key;
                        foreach (int?specimenId in pair.Value)
                        {
                            Dictionary <string, object> db_query = new Dictionary <string, object>()
                            {
                                { Specimen.SpecimenReferenceNumber, specimenReferenceNumber }
                            };
                            var specimens = Caisis.BOL.BusinessObject.GetByFields <Specimen>(db_query);
                            var found     = new List <int>();
                            db.Select(db_table, Specimen.SpecimenId, new string[] { Specimen.SpecimenId }, new string[0], db_query, (r) =>
                            {
                                int rowSpecimenId = r.GetInt32(r.GetOrdinal(Specimen.SpecimenId));
                                found.Add(rowSpecimenId);
                                return(true);
                            });
                            // OK, if doesn't exist in db or if current specimen already assigned to #
                            specimenValid = found.Count() == 0 || (specimenId.HasValue && found.Contains(specimenId.Value));
                        }
                        if (!specimenValid)
                        {
                            externalDuplicates.Add(specimenReferenceNumber);
                        }
                    }
                }
            }
            if (currentDuplicates.Count() > 0)
            {
                string message = "Unable to update the form. The following Specimen IDs were entered more than once. [" + string.Join(",", currentDuplicates.ToArray()) + "]";
                throw new ClientException(message);
            }
            else if (externalDuplicates.Count() > 0)
            {
                string message = "Unable to update the form. The following Specimen IDs already exist is the system. [" + string.Join(",", externalDuplicates.ToArray()) + "]";
                throw new ClientException(message);
            }
            // OK
            else
            {
                // save specimens
                SpecimensGrid.Save(specimenAccessionId.Value);

                // populate form
                this.PopulateForm(specimenAccessionId.Value);
            }

            return(specimenAccessionId);
        }
예제 #3
0
        private void PopulateForm(int?specimenAccessionId)
        {
            bool isNewAccession = !specimenAccessionId.HasValue;
            int  patientId      = int.Parse(BaseDecryptedPatientId);
            int  ptProtocolId   = int.Parse(PatientProtocolId);

            // set study id
            PatientProtocol ptProtocol = new PatientProtocol();

            if (!string.IsNullOrEmpty(PatientProtocolId))
            {
                ptProtocol.Get(int.Parse(PatientProtocolId));
                PtProtocolStudyId.Value = ptProtocol[PatientProtocol.PtProtocolStudyId].ToString();
            }

            // populate SpecimenAccessions
            SpecimenAccession sa = new SpecimenAccession();

            if (specimenAccessionId.HasValue)
            {
                sa.Get(specimenAccessionId.Value);
                base.PopulateForm(sa);
                // special case: needle
                PopulateNeedleUIField(sa);
                // special case: diagnostics for tissue
                if (QuerySpecimenType == QUERY_TISSUE) // && !string.IsNullOrEmpty(AccessionProcName.Text) && AccessionProcName.Text.StartsWith("Image-Guided", StringComparison.OrdinalIgnoreCase))
                {
                    PopulateDiagnostic(specimenAccessionId.Value);
                }
            }

            // populate Specimens grid
            DataView specimens;

            // STEP 1: get all accessions of this type, will filter later on
            specimens = da.GetSpecimenReport(ptProtocolId, null, QuerySpecimenType).DefaultView;
            var allSpecimentRefNum = specimens.Table.AsEnumerable().Select(r => r[Specimen.SpecimenReferenceNumber].ToString()).Distinct();

            // STEP 2: generate an auto-calculated spec ref num for the patient (exclude currently assigned)
            autoGeneratedSpecimenRefNum.Clear();
            // only auto-generate spec # if filtering by type + visit
            if (!string.IsNullOrEmpty(QuerySpecimenType) && !string.IsNullOrEmpty(QueryVisitType))
            {
                int totalSpecimens = SpecimensGrid.BlankRows + specimens.Count;
                int start          = 1;
                // find the max currently assigned reference num
                for (int seqNum = 1; seqNum <= totalSpecimens; seqNum++)
                {
                    // check if currently assigned, else add to available bucket
                    if (allSpecimentRefNum.Contains(GetSpecimenReferenceNumber(seqNum + "")))
                    {
                        start += 1;
                    }
                }
                // fill auto ref num
                autoGeneratedSpecimenRefNum.AddRange(Enumerable.Range(start, totalSpecimens).Select(seqNum => GetSpecimenReferenceNumber(seqNum + "")));
            }
            // when no parent record specified, build estimated reference num, but do not popualte with exisiting data
            if (!specimenAccessionId.HasValue)
            {
                specimens.Table.Clear();
            }

            // build restrictions
            List <string> restrictions = new List <string>();

            // restrict to this accession
            if (specimenAccessionId.HasValue)
            {
                restrictions.Add(Specimen.SpecimenAccessionId + " = " + specimenAccessionId.Value);
            }
            // restrict to this type
            if (!string.IsNullOrEmpty(QuerySpecimenType))
            {
                restrictions.Add(Specimen.SpecimenType + " = '" + QuerySpecimenType + "'");
                // restrict to visit (requires specimen type)
                if (!string.IsNullOrEmpty(QueryVisitType))
                {
                    string refNumMatch = GetSpecimenReferenceNumber("");
                    restrictions.Add(Specimen.SpecimenReferenceNumber + " LIKE '" + PageUtil.EscapeSingleQuotesForSql(refNumMatch) + "%'");
                }
            }


            if (restrictions.Count() > 0)
            {
                specimens.RowFilter = string.Join(" AND ", restrictions.ToArray());
                specimens           = new DataView(specimens.ToTable());
            }
            else
            {
                specimens.RowFilter = "";
            }

            // data binding

            // adjust subType heading
            DataControlField subTypeColumn          = SpecimensGrid.Columns[1];
            DataControlField vialTypeColumn         = SpecimensGrid.Columns[2];
            DataControlField processingMethodColumn = SpecimensGrid.Columns[3];
            DataControlField specimenStatusColumn   = SpecimensGrid.Columns[6];

            if (QuerySpecimenType == QUERY_TISSUE)
            {
                // custom visits ??
                bool customVisits = BuildSpecimenVisitTypes(QUERY_TISSUE, sa);

                subTypeColumn.HeaderText = "Sample Type";
                // hide columns from UI
                foreach (DataControlField column in new DataControlField[] { subTypeColumn, subTypeColumn, vialTypeColumn })
                {
                    column.HeaderStyle.CssClass = "hidden";
                    column.ItemStyle.CssClass   = "hidden";
                }

                // set selection in parent
                Tissue_SpecimenSubType.Value = specimens.Count > 0 ? specimens[0][Specimen.SpecimenSubType].ToString() : "";

                // blank rows
                SpecimensGrid.BlankRows        = Math.Max(0, 6 - specimens.Count);
                SpecimensGrid.VisibleBlankRows = 1;
                if (SpecimensGrid.BlankRows == 0)
                {
                    AddBtn.Visible = false;
                }
                if (specimens.Count != 0)
                {
                    SpecimensGrid.VisibleBlankRows = 0;
                }
            }
            else if (QuerySpecimenType == QUERY_BLOOD)
            {
                // custom visits ??
                bool customVisits = BuildSpecimenVisitTypes(QUERY_BLOOD, sa);
                // static visits
                if (!customVisits)
                {
                    // default accession visit
                    AccessionVisit.Value   = "A";
                    AccessionVisit.Enabled = false;
                }

                AddBtn.Visible           = true;
                subTypeColumn.HeaderText = "Tube Use";

                // hide columns from UI
                foreach (DataControlField column in new DataControlField[] { processingMethodColumn })
                {
                    column.HeaderStyle.CssClass = "hidden";
                    column.ItemStyle.CssClass   = "hidden";
                }
                // update default blood specimens
                bloodAutoSpecimens = ProtocolMgmtSpecimenController.GetBloodAutoSpecimenIds(base.ProtocolNumber, (int)ptProtocol[PatientProtocol.PatientProtocolId], PtProtocolStudyId.Value, AccessionVisit.Enabled ? AccessionVisit.Value : "");

                SpecimensGrid.BlankRows        = Math.Max(0, 15 - specimens.Count);
                SpecimensGrid.VisibleBlankRows = specimens.Count > 0 ? 0 : (bloodAutoSpecimens.Length > 0 ? bloodAutoSpecimens.Length : 3);
                AddBtn.Visible = SpecimensGrid.BlankRows > 0;
            }

            SpecimensGrid.DataSource = specimens;
            SpecimensGrid.DataBind();
        }