/// <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(); }
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); }
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(); }