protected void SaveBtn_Click(object sender, ImageClickEventArgs e) { if (accessionId != 0) { //updating existing accession record SpecimenAccession accession = new SpecimenAccession(); accession.Get(accessionId); CICHelper.SetBOValues(inputControlsRow.Controls, accession, patientId); accession.Save(); specimensGrid.Save(accessionId); LoadAccesssionInfo(accessionId); BindSpecimensGrid(accessionId); Page.ClientScript.RegisterStartupScript(typeof(Page), "refreshParent", "refreshParent('" + EncryptPatientId(patientId.ToString()) + "','" + accessionId + "');", true); } else { //saving new accession SpecimenAccession newaccession = new SpecimenAccession(); CICHelper.SetBOValues(inputControlsRow.Controls, newaccession, patientId); newaccession[SpecimenAccession.PatientId] = patientId; newaccession.Save(); newAccessionId = int.Parse(newaccession[SpecimenAccession.SpecimenAccessionId].ToString()); specimensGrid.Save(newAccessionId); LoadAccesssionInfo(newAccessionId); BindSpecimensGrid(newAccessionId); Page.ClientScript.RegisterClientScriptBlock(typeof(Page), "refreshParent", "refreshParent('" + EncryptPatientId(patientId.ToString()) + "','" + newAccessionId + "');", true); } }
/// <summary> /// Saves the Diganostic + Imaging details, and adds related record /// </summary> /// <param name="specimenAccession"></param> private void SaveDiagnostic(SpecimenAccession specimenAccession) { int patientId = (int)specimenAccession[SpecimenAccession.PatientId]; int specimenAccessionId = (int)specimenAccession[SpecimenAccession.SpecimenAccessionId]; // save Diagnostics int?diagnosticId = null; if (!string.IsNullOrEmpty(DiagnosticIdField.Value)) { diagnosticId = int.Parse(DiagnosticIdField.Value); } Diagnostic diagnostic = new Diagnostic(); // load diagnostic if (diagnosticId.HasValue) { diagnostic.Get(diagnosticId.Value); } // set required fields else { diagnostic[Diagnostic.PatientId] = patientId; diagnostic[Diagnostic.DxDate] = specimenAccession[SpecimenAccession.CollectDate]; diagnostic[Diagnostic.DxDateText] = specimenAccession[SpecimenAccession.CollectDateText]; diagnostic[Diagnostic.DxTarget] = "Prostate"; } // update type??? diagnostic[Diagnostic.DxType] = AccessionProcName.Text; // set bizo value CICHelper.SetBOValues(Tissue_DiagnosticFields.Controls, diagnostic, patientId); // save diagnostic diagnostic.Save(); // on update, link to SA if (diagnostic.PrimaryKeyHasValue) { diagnosticId = (int)diagnostic[Diagnostic.DiagnosticId]; DiagnosticIdField.Value = diagnosticId.Value.ToString(); // create related Diagnostic RelatedRecord relatedDiagnostic = CreateRelatedDiagnostic(specimenAccessionId, diagnosticId.Value); // get ImageFindingProstate ImageFindingProstate finding = BusinessObject.GetByParent <ImageFindingProstate>(diagnosticId.Value).FirstOrDefault(); // else, create if (finding == null) { finding = new ImageFindingProstate(); finding[ImageFindingProstate.DiagnosticId] = diagnosticId.Value; } // set fields CICHelper.SetBOValues(Tissue_DiagnosticFields.Controls, finding, diagnosticId.Value); // update finding.Save(); } }
/// <summary> /// Dynamically set columns /// </summary> private void InitSpecimensGrid() { SpecimenAccession accession = new SpecimenAccession(); Specimen specimen = new Specimen(); var accessionFields = accession.FieldNames; var specimenFields = specimen.FieldNames; var specimenMetadata = CICHelper.GetCaisisInputControlsByTableName(specimen.TableName, "").ToDictionary(f => f.Field, f => f); //SpecimenInventory.Columns.Clear(); foreach (var column in GetSpecimenColumns()) { string fieldName = column.Key; string fieldLabel = column.Value; // get input CaisisTextBox defaultInput = new CaisisTextBox(); ICaisisInputControl fieldInput = defaultInput; // special case: lookup controls map to distinct combo values if (specimenFields.Contains(fieldName) && specimenMetadata.ContainsKey(fieldName)) { fieldInput = specimenMetadata[fieldName]; // select, radio list, check list => combo box if (fieldInput is ICaisisLookupControl && !(fieldInput is CaisisComboBox)) fieldInput = new CaisisComboBox(); fieldInput.Table = specimen.TableName; } // global fieldInput.Field = fieldName; fieldInput.FieldLabel = fieldLabel; fieldInput.ShowLabel = false; CaisisDataBoundField boundField = new CaisisDataBoundField(fieldInput); SpecimenInventory.Columns.Add(boundField); } // only enable specimen fields for edit SpecimenInventory.RowCreated += (o, e) => { var inputs = CICHelper.GetCaisisInputControls(e.Row); foreach (var fieldInput in inputs) { if (fieldInput.Table == specimen.TableName) { fieldInput.Enabled = true; // special lookup distinct if (fieldInput is ICaisisLookupControl) (fieldInput as ICaisisLookupControl).LookupDistinct = string.Format("{0};{1};{2}", specimen.TableName, fieldInput.Field, fieldInput.Field); } else { fieldInput.Enabled = false; } } }; }
private void PopulateNeedleBizField(SpecimenAccession biz) { string gauge = Tissue_Gauge.Value; string length = Tissue_Length.Value; string unit = Tissue_Unit.Value; if (!string.IsNullOrEmpty(gauge + length + unit)) { string needle = string.Format("{0}G {1} {2}", gauge, length, unit); biz[SpecimenAccession.AccessionProcInstrument] = needle; } biz.Save(); }
private void PopulateNeedleUIField(SpecimenAccession biz) { string needle = biz[SpecimenAccession.AccessionProcInstrument].ToString(); string[] pairs = needle.Split(' '); if (pairs.Length == 3) { string gauge = pairs[0].Replace("G", "");; string length = pairs[1]; string unit = pairs[2]; Tissue_Gauge.Value = gauge; Tissue_Length.Value = length; Tissue_Unit.Value = unit; } }
override protected void Page_Load(object sender, System.EventArgs e) { patientId = int.Parse(DecryptPatientId(Request.QueryString["patientId"].ToString())); Caisis.BOL.Patient ptObj = new Caisis.BOL.Patient(); ptObj.Get(patientId); string datasetSql = CacheManager.GetDatasetSQL(Session[SessionKey.DatasetId]); DataTable identifiersdt = da.GetIdentifierByType(patientId, _identifierType, datasetSql); if (identifiersdt.Rows.Count >= 1) { identifier = identifiersdt.Rows[0]["Identifier"].ToString(); } if (PermissionManager.HasPermission(PermissionManager.ViewPatientIdentifiers)) { AccessionTitle.Text = "Specimen Accession for " + ptObj[Patient.PtFirstName].ToString() + " " + ptObj[Patient.PtLastName].ToString(); } else { AccessionTitle.Text = "Specimen Accession for " + _identifierType + " : " + identifier; } if (!string.IsNullOrEmpty(Request.QueryString["specimenaccessionId"])) { accessionId = int.Parse(Request.QueryString["specimenaccessionId"].ToString()); } // Get Accession sa = new SpecimenAccession(); sa.Get(accessionId); if (!Page.IsPostBack) { LoadAccesssionInfo(accessionId); BindSpecimensGrid(accessionId); if (accessionId == 0) { SetButtonStates(false, false, true, true, false); } else { this.IsFormEnabled = false; SetButtonStates(true, true, false, false, false); } } }
protected override void Page_Load(object sender, System.EventArgs e) { patientId = Convert.ToInt32(DecryptPatientId(Request.QueryString["patientId"].ToString())); if (!string.IsNullOrEmpty(Request.QueryString["specimenaccessionId"])) { accessionId = int.Parse(Request.QueryString["specimenaccessionId"].ToString()); } //get Accession sa = new SpecimenAccession(); sa.Get(accessionId); if (!Page.IsPostBack) { LoadAccessionInfo(); } }
/// <summary> /// Builds a list of custom visit types, returning if the list is custom (true) or default (false) /// </summary> /// <param name="type"></param> /// <param name="sa"></param> /// <returns></returns> private bool BuildSpecimenVisitTypes(string type, SpecimenAccession sa) { var visits = specimenController.GetSpecimenVisits(base.ProtocolNumber, type + " Specimens"); if (visits.Count() > 0) { AccessionVisit.DataTextField = "Key"; AccessionVisit.DataValueField = "Value"; AccessionVisit.DataSource = visits; AccessionVisit.DataBind(); // set value if (sa != null && sa.PrimaryKeyHasValue) { AccessionVisit.Value = sa[SpecimenAccession.AccessionVisitType] + ""; } } return(visits.Count() > 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); }
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(); }