using framework_business; using framework_library; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class controls_medical_procedures : System.Web.UI.UserControl { #region methods /// /// Method to Bind Procedure Data /// private void BindProcedureData() { try { ArrayList ProcedureList = xData.GetTypedByCriteriaSpecific("recId", typeof(oMedicalProcedure), "", "", "code"); rptProcedures.DataSource = ProcedureList; rptProcedures.DataBind(); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } private void BindMacroProcedures() { try { ddMacroProcedure.Items.Clear(); ddMacroProcedure.ClearSelection(); DataTable ProcedureList = xData.GetDynamicTable("recId", typeof(oMedicalProcedure), "code"); for (int i = ProcedureList.Rows.Count - 1; i >= 0; i--) { if (ProcedureList.Rows[i]["codeType"].ToString() == "3") ProcedureList.Rows.RemoveAt(i); } ProcedureList.Columns.Add(new DataColumn("TextField", System.Type.GetType("System.String"), "code + ' - ' + description")); ddMacroProcedure.DataSource = ProcedureList; ddMacroProcedure.DataTextField = "TextField"; ddMacroProcedure.DataValueField = "recId"; ddMacroProcedure.DataBind(); ddMacroProcedure_SelectedIndexChanged(null, null); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Method to Bind Tariff Data /// private void BindTariffs() { try { ArrayList tariffs = xData.GetTypedByCriteriaSpecific("recId", typeof(oTariffPlan), "", "", "name"); ddTariffPlans.DataSource = tariffs; ddTariffPlans.DataValueField = "code"; ddTariffPlans.DataTextField = "name"; ddTariffPlans.DataBind(); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Populate Form Values /// /// private void PopulatePageFormValues(ref oMedicalProcedure _Procedure) { try { txtCode.Value = _Procedure.code; txtDescription.Value = _Procedure.description; txtAbbreviation.Value = _Procedure.procedureAbbreviation; ddCodeTypes.SelectedValue = _Procedure.codeType.ToString(); txtComments.Value = _Procedure.comments; txtNAPPI.Value = _Procedure.nappi; txtNAPPISuffix.Value = _Procedure.nappiSuffix; txtICD1.Value = _Procedure.icd1; txtICD2.Value = _Procedure.icd2; txtICD3.Value = _Procedure.icd3; txtICD4.Value = _Procedure.icd4; chkClaimActive.Checked = _Procedure.claimActive; chkNonSurgical.Checked = _Procedure.nonSurgical; /* CVH 2016-09-30 Set additional description (tendon) */ chkAdditionalDescription.Checked = _Procedure.additionalDescription; if (_Procedure.codeType == 2)//modifier { txtModifier.Value = utils.returnFormattedDecimal(Convert.ToString(_Procedure.modifier)); } else txtModifier.Value = "0"; if (_Procedure.codeType == 1)//consumable { if (_Procedure.consumableCode != String.Empty) ddConsumableCode.SelectedValue = _Procedure.consumableCode; } else _Procedure.consumableCode = String.Empty; //CVH 2016-11-11 Load macro procedures DataTable dt = new DataTable(); dt.Columns.Add("id"); dt.Columns.Add("procedureId"); dt.Columns.Add("description"); dt.Columns.Add("quantity"); dt.Columns.Add("rate"); if (_Procedure.codeType == 3)//macro { chkUseMacroRate.Checked = _Procedure.useMacroRate; foreach (string macro in _Procedure.macroProcedures.Split(',')) { string[] macroArray = macro.Split('|'); if (macroArray.Length == 3) { string procedureId = macroArray[0]; string qty = macroArray[1]; string rate = macroArray[2]; string description = ""; if (ddMacroProcedure.Items.FindByValue(procedureId) != null) { description = ddMacroProcedure.Items.FindByValue(procedureId).Text; } DataRow row = dt.NewRow(); row["id"] = dt.Rows.Count; row["procedureId"] = procedureId; row["description"] = description; row["quantity"] = qty; row["rate"] = rate; dt.Rows.Add(row); } } Session["Macro"] = dt; } rptMacroProcedures.DataSource = dt; rptMacroProcedures.DataBind(); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Save Form Values /// /// private void SavePageFormValues(ref oMedicalProcedure _Procedure) { try { _Procedure.code = txtCode.Value; _Procedure.description = txtDescription.Value; _Procedure.procedureAbbreviation = txtAbbreviation.Value; _Procedure.codeType = int.Parse(ddCodeTypes.SelectedValue); _Procedure.comments = txtComments.Value; _Procedure.nappi = txtNAPPI.Value; _Procedure.nappiSuffix = txtNAPPISuffix.Value; _Procedure.stockType = int.Parse(ddCodeTypes.SelectedValue); _Procedure.icd1 = txtICD1.Value; _Procedure.icd2 = txtICD2.Value; _Procedure.icd3 = txtICD3.Value; _Procedure.icd4 = txtICD4.Value; _Procedure.claimActive = chkClaimActive.Checked; _Procedure.nonSurgical = chkNonSurgical.Checked; /* CVH 2016-09-30 Set additional description (tendon) */ _Procedure.additionalDescription = chkAdditionalDescription.Checked; //hardcode list of tendons now, tendons are the only additional description required currently. if there are more at a later stage this can be handled better if (_Procedure.additionalDescription) _Procedure.additionalDescriptionOptions = "Subscapularis~Supraspinatus~Infraspinatus~Teres minor"; else _Procedure.additionalDescriptionOptions = ""; if (_Procedure.codeType == 2)//modifier { decimal mod = 0; decimal.TryParse(txtModifier.Value, out mod); _Procedure.modifier = mod; } else _Procedure.modifier = 0; if (_Procedure.codeType == 1)//consumable _Procedure.consumableCode = ddConsumableCode.SelectedValue; else _Procedure.consumableCode = String.Empty; //CVH 2016-11-11 Save macro procedures string macroProcedures = String.Empty; if (_Procedure.codeType == 3)//macro { _Procedure.useMacroRate = chkUseMacroRate.Checked; if (utils.verifySession("Macro")) { DataTable dt = (DataTable)Session["Macro"]; if (dt != null) { foreach (DataRow row in dt.Rows) { string procedureId = row["procedureId"].ToString(); int qty = 0; int.TryParse(row["quantity"].ToString(), out qty); decimal rate = 0; decimal.TryParse(row["rate"].ToString(), out rate); if (macroProcedures == String.Empty) macroProcedures = procedureId + "|" + (qty < 1 ? 1 : qty) + "|" + rate; else macroProcedures += "," + procedureId + "|" + (qty < 1 ? 1 : qty) + "|" + rate; } } } } _Procedure.macroProcedures = macroProcedures; } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Method to Toggle Panels /// /// private void TogglePanels(string panelName) { switch (panelName) { case "pnlProcedurePage": pnlProcedurePage.Visible = true; pnlProcedureList.Visible = false; break; case "pnlProcedureList": pnlProcedurePage.Visible = false; pnlProcedureList.Visible = true; break; } //clear result pnlResult.Visible = false; } /// /// opulate the rate from the tariff /// private void populateRateFromTariff() { try { if (ddTariffPlans.SelectedValue != null && ddTariffPlans.SelectedValue != "" && txtCode.Value != String.Empty) { string planCode = ddTariffPlans.SelectedValue; foreach (oTariffRate rate in xData.GetTypedByCriteriaSpecific("recId", typeof(oTariffRate), "planCode,procedureCode", planCode + "," + txtCode.Value)) { txtRate.Value = utils.returnFormattedDecimal(Convert.ToString(rate.rate)); break; } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } /// /// Set display based on selected code type /// private void SetCodeTypeDisplay() { try { chkUseMacroRate.Visible = false; switch (ddCodeTypes.SelectedValue) { case "0"://service item pnlConsumable.Visible = false; pnlModifier.Visible = false; pnlMakroProcedures.Visible = false; break; case "1"://consumable pnlConsumable.Visible = true; pnlModifier.Visible = false; pnlMakroProcedures.Visible = false; break; case "2"://modifier pnlConsumable.Visible = false; pnlModifier.Visible = true; pnlMakroProcedures.Visible = false; break; case "3"://macro pnlConsumable.Visible = false; pnlModifier.Visible = false; pnlMakroProcedures.Visible = true; chkUseMacroRate.Visible = true; break; } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, 0); Response.Redirect("/error", false); } } #endregion #region events /// /// Page Load Event /// /// /// protected void Page_Load(object sender, EventArgs e) { try { if (!Page.IsPostBack) { BindProcedureData(); BindTariffs(); } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// New Procedure Click /// /// /// protected void btnNewProcedure_Click(object sender, EventArgs e) { try { utils.disposeSession("Macro"); //show Content Specific TogglePanels("pnlProcedurePage"); Session["ProcedureId"] = 0; utils.disposeSession("Procedure"); oMedicalProcedure Procedure = new oMedicalProcedure(); BindMacroProcedures(); PopulatePageFormValues(ref Procedure); txtCode.Disabled = false; pnlRates.Visible = false; } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Edit the Procedure page /// /// /// protected void lnkEdit_Click(object sender, EventArgs e) { oMedicalProcedure _Procedure = new oMedicalProcedure(); ArrayList catList = new ArrayList(); try { if (sender.GetType() == typeof(LinkButton)) { // int recId = int.Parse(((LinkButton)sender).CommandArgument); if (recId > 0) { Session["ProcedureId"] = recId; //get cat catList = xData.GetTypedByCriteriaSpecific("recId", typeof(oMedicalProcedure), "recId", recId.ToString()); //enumerate list foreach (oMedicalProcedure cat in catList) { //assign object _Procedure = cat; //populate page form BindMacroProcedures(); PopulatePageFormValues(ref _Procedure); populateRateFromTariff(); SetCodeTypeDisplay(); txtCode.Disabled = true; pnlRates.Visible = true; Session["Procedure"] = _Procedure; break; } //show Procedure Form TogglePanels("pnlProcedurePage"); } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Remove the Procedure /// /// /// protected void lnkRemove_Click(object sender, EventArgs e) { try { if (sender.GetType() == typeof(LinkButton)) { int recId = int.Parse(((LinkButton)sender).CommandArgument); foreach (oMedicalProcedure proc in xData.GetTypedByCriteriaSpecific("recId", typeof(oMedicalProcedure), "recId", recId.ToString())) { //delete rates for this procedure if (xData.DeleteTyped("procedureCode", proc.code, typeof(oTariffRate))) { //Delete fee if (xData.DeleteTyped("recId", recId.ToString(), typeof(oMedicalProcedure))) { //rebind pages grid BindProcedureData(); pnlResult.Visible = true; //display successful result lblResult.Text = "the selected Procedure was deleted successfully."; } } } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Cancel /// /// /// protected void btnCancel_Click(object sender, EventArgs e) { try { Session["ProcedureId"] = 0; utils.disposeSession("Procedure"); utils.disposeSession("Macro"); BindProcedureData(); //show cat list TogglePanels("pnlProcedureList"); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Save Click /// /// /// protected void btnSave_Click(object sender, EventArgs e) { oMedicalProcedure Procedure = new oMedicalProcedure(); try { if (utils.verifySession("Procedure"))//update mode { Procedure = (oMedicalProcedure)Session["Procedure"]; //save form values SavePageFormValues(ref Procedure); if (xData.UpdateTyped("recId", Procedure.recId.ToString(), typeof(oMedicalProcedure), Procedure)) { Session["ProcedureId"] = Procedure.recId; Session["Procedure"] = Procedure; BindProcedureData(); pnlResult.Visible = true; lblResult.Text = "your changes were updated successfully."; } } else { if (!xData.VerifyExists("recId", typeof(oMedicalProcedure), "code", txtCode.Value)) { //save form values SavePageFormValues(ref Procedure); //save procedure Procedure.recId = xData.SaveTyped("recId", typeof(oMedicalProcedure), Procedure); if (Procedure.recId > 0) { //create rates for procedure ArrayList Plans = xData.GetTypedByCriteriaSpecific("recId", typeof(oTariffPlan), "", "", "code"); ArrayList Rates = new ArrayList(); foreach (oTariffPlan pln in Plans) { oTariffRate rate = new oTariffRate(); rate.planCode = pln.code; rate.procedureCode = Procedure.code; rate.rate = 0; Rates.Add(rate); } if (Rates.Count > 0) { //save rates xData.SaveTypedCollection("recId", typeof(oTariffRate), Rates); } Session["ProcedureId"] = Procedure.recId; Session["Procedure"] = Procedure; BindProcedureData(); pnlRates.Visible = true; pnlResult.Visible = true; lblResult.Text = "your Procedure was created successfully."; txtCode.Disabled = true; } } else { pnlResult.Visible = true; lblResult.Text = "A Procedure with this code already exists on the system"; } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Selected Index Changed Event /// /// /// protected void ddCodeTypes_SelectedIndexChanged(object sender, EventArgs e) { try { SetCodeTypeDisplay(); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Selected Index Changed Event /// /// /// protected void ddTariffPlans_SelectedIndexChanged(object sender, EventArgs e) { try { populateRateFromTariff(); } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } /// /// Apply Rate changes /// /// /// protected void btnApplyRate_Click(object sender, EventArgs e) { try { decimal rate = 0; decimal.TryParse(txtRate.Value, out rate); if (ddTariffPlans.Items.Count > 0) { if (chkApplyRate.Checked)//apply rate to all plans for this code { if (xData.UpdateRates("", txtCode.Value, rate)) { lblRateResult.Text = "All plans were updated."; } } else { if (xData.UpdateRates(ddTariffPlans.SelectedValue, txtCode.Value, rate)) { lblRateResult.Text = "Plan successfully updated."; } } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } protected void btnAddMacroProcedure_Click(object sender, EventArgs e) { try { if (ddMacroProcedure.SelectedItem != null) { DataTable dt = new DataTable(); if (utils.verifySession("Macro")) dt = (DataTable)Session["Macro"]; if (dt.Columns.Count <= 0) { dt.Columns.Add("id"); dt.Columns.Add("procedureId"); dt.Columns.Add("description"); dt.Columns.Add("quantity"); dt.Columns.Add("rate"); } string procedureId = ddMacroProcedure.SelectedItem.Value; string description = ddMacroProcedure.SelectedItem.Text; int qty = 0; int.TryParse(txtMacroQty.Text, out qty); qty = (qty <= 0 ? 1 : qty); decimal rate = 0; decimal.TryParse(txtMacroRate.Text, out rate); //modifiers can be added to a macro only once 0005 0018 0011 0014 0009 0008 bool modifierExists = false; if (description.StartsWith("0005 -") || description.StartsWith("0018 -") || description.StartsWith("0011 -") || description.StartsWith("0014 -") || description.StartsWith("0009 -") || description.StartsWith("0008 -")) { if (!description.StartsWith("0011 -")) qty = 1; foreach (DataRow chkExists in dt.Rows) { if (chkExists["procedureId"].ToString() == procedureId) { modifierExists = true; break; } } } if (!modifierExists) { DataRow newRow = dt.NewRow(); newRow["id"] = dt.Rows.Count; newRow["procedureId"] = procedureId; newRow["description"] = description; newRow["quantity"] = qty; newRow["rate"] = rate; dt.Rows.Add(newRow); } Session["Macro"] = dt; rptMacroProcedures.DataSource = dt; rptMacroProcedures.DataBind(); btnAddMacroProcedure.Text = "Add"; } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } protected void lnkRemoveMacro_Click(object sender, EventArgs e) { try { LinkButton btn = (LinkButton)sender; if (btn != null) { int id = int.Parse(btn.CommandArgument); if (utils.verifySession("Macro")) { DataTable dt = (DataTable)Session["Macro"]; if (dt != null) { for (int i = dt.Rows.Count - 1; i >= 0; i--) { if (dt.Rows[i]["id"].ToString() == id.ToString()) { dt.Rows.RemoveAt(i); break; } } } Session["Macro"] = dt; rptMacroProcedures.DataSource = dt; rptMacroProcedures.DataBind(); } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } protected void ddMacroProcedure_SelectedIndexChanged(object sender, EventArgs e) { try { if (ddMacroProcedure.SelectedItem != null) { string procedureId = ddMacroProcedure.SelectedItem.Value; foreach (oMedicalProcedure proc in xData.GetTypedByCriteriaSpecific("recId", typeof(oMedicalProcedure), "recId", procedureId)) { foreach (oTariffRate rate in xData.GetTypedByCriteriaSpecific("recId", typeof(oTariffRate), "planCode,procedureCode", "DISC," + proc.code)) { txtMacroRate.Text = rate.rate.ToString(); } } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } protected void lnkEditMacro_Click(object sender, EventArgs e) { try { LinkButton btn = (LinkButton)sender; if (btn != null) { int id = int.Parse(btn.CommandArgument); if (utils.verifySession("Macro")) { DataTable dt = (DataTable)Session["Macro"]; if (dt != null) { for (int i = dt.Rows.Count - 1; i >= 0; i--) { if (dt.Rows[i]["id"].ToString() == id.ToString()) { txtMacroQty.Text = dt.Rows[i]["quantity"].ToString(); txtMacroRate.Text = dt.Rows[i]["rate"].ToString(); ddMacroProcedure.Items.FindByValue(dt.Rows[i]["procedureId"].ToString()); btnAddMacroProcedure.Text = "Re-Add"; dt.Rows.RemoveAt(i); break; } } } Session["Macro"] = dt; rptMacroProcedures.DataSource = dt; rptMacroProcedures.DataBind(); } } } catch (Exception ex) { exception.HandleException("Procedure:", MethodBase.GetCurrentMethod().Name, ex, Session["Procedure"]); Response.Redirect("/error", false); } } #endregion }