Page 1 of 1
Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Options
Posted: Mon Feb 22, 2021 11:15 am
by Walker@ExtraDent
OpenDental Plug-In/Hook Additions
The following hooks are requested to implement electronic claims, eligibility, reports retrieval (ERAs, 271s, 277s, DentiCal Reports) and some Clearinghouse Setup options in OpenDental using Plug-in/Hooks per our previous discussion. Per Plug-in/Hooks instructions, Hook names were created using class naming conventions.
OpenDental\Forms\FormClearinghouseEdit.cs: OpenDental.FormClearinghouseEdit
1. In FillFields() – Plugins.HookMethod: FormClearinghouseEdit.AllowFeature_ERA
object[] param = new object[] { ClearinghouseCur };
if (ClearinghouseCur.CommBridge.In(EclaimsCommBridge.ClaimConnect, EclaimsCommBridge.EDS, EclaimsCommBridge.Claimstream, EclaimsCommBridge.ITRANS,EclaimsCommBridge.EmdeonMedical, EclaimsCommBridge.EdsMedical) || Plugins.HookMethod(null, "FormClearinghouseEdit.AllowFeature_ERA", param))
{
listBoxEraBehavior.Enabled = true;
checkIsClaimExportAllowed.Enabled = true;
checkIsClaimExportAllowed.Checked = ClearinghouseCur.IsClaimExportAllowed
}
2. In FillFields() – Plugins.HookMethod: FormClearinghouseEdit.AllowFeature_Attachments
(Remove comment since Clearinghouses with Hook can use Attachments)//Uncheck and disable if not ClaimConnect as this checkbox only applies to ClaimConnect.
checkSaveDXC.Checked = PrefC.GetBool(PrefName.SaveDXCAttachments);
if (ClearinghouseCur.CommBridge != EclaimsCommBridge.ClaimConnect && !Plugins.HookMethod(null, "FormClearinghouseEdit.AllowFeature_Attachments", param))
{
checkAllowAttachSend.Enabled = false;
checkAllowAttachSend.Checked = false;
checkSaveDXC.Visible = false;
}
else
{
checkAllowAttachSend.Enabled = true;
checkAllowAttachSend.Checked = ClearinghouseCur.IsAttachmentSendAllowed;
}
OpenDental\Forms\FormInsPlan.cs: OpenDental.FormInsPlan
1. In butGetElectronic_Click() – Plugins.HookMethod: FormInsPlan.Is270Supported
object[] param = new object[] { clearinghouseHq };
if ((clearinghouseHq.CommBridge!=EclaimsCommBridge.ClaimConnect
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.EDS
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.WebMD)
&& clearinghouseHq.Eformat!=ElectronicClaimFormat.Canadian
&& !Plugins.HookMethod(null, "FormInsPlan.Is270Supported", param))
{
(Change Message text since clearinghouse with Hook can use this)MsgBox.Show(this,"So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.");
return;
}
OpenDentBusiness\Data Interface\Clearinghouse.cs: OpenDentBusiness.Clearinghouses
1. In RetrieveReports() – Plugins.HookMethod: Clearinghouses.RetrieveReports
else
{
StringBuilder errorMessage = new StringBuilder();
object[] param = new object[] { clearinghouseClin, errorMessage, progress };
if (!Plugins.HookMethod(null, "Clearinghouses.RetrieveReports", param) && errorMessage.ToString().Length > 0)
{
return OpenDentBusiness.Lans.g("FormClaimReports", "Error retrieving.") + "\r\n" + errorMessage.ToString();
}
}
OpenDentBusiness\Eclaims\Eclaims.cs: OpenDentBusiness.Eclaims.Eclaims
1. In SendBatch() – Plugins.HookMethod: Eclaims.SendBatch
else
{
StringBuilder errorMessage = new StringBuilder();
object[] param = new object[] { clearinghouseClin, messageText, errorMessage };
if (!Plugins.HookMethod(null, "Eclaims.SendBatch", param) && errorMessage.ToString().Length > 0)
{
MessageBox.Show(Lans.g("Eclaims", "Error sending.") + "\r\n" + errorMessage.ToString());
if (clearinghouseClin.IsClaimExportAllowed)
//if a file was written out, delete it on fail
x837Controller.Rollback(clearinghouseClin, batchNum);
return;
}
}
//----------------------------------------------------------------------------------------
//finally, mark the claims sent. (only if not Canadian)
EtransType etype=EtransType.ClaimSent;
if(clearinghouseClin.Eformat==ElectronicClaimFormat.Renaissance){
etype=EtransType.Claim_Ren;
}
OpenDentBusiness\Eclaims\x270Controller.cs: OpenDentBusiness.x270Controller
1. In TryInsVerifyRequest() – Plugins.HookMethod: FormInsPlan.Is270Supported
object[] param = new object[] { clearinghouseHq };
if (!ListTools.In(clearinghouseHq.CommBridge,EclaimsCommBridge.ClaimConnect, EclaimsCommBridge.EDS,EclaimsCommBridge.WebMD) &&
!Plugins.HookMethod(null, "FormInsPlan.Is270Supported", param))
{
(Change message text since clearinghouse with Hook can use this) error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
return null;
}
2. In RequestBenefits() – Plugins.HookMethod: x270Controller.RequestBenefits
try {
if(!String.IsNullOrWhiteSpace(FakeResponseOverride271)) {
x12response=FakeResponseOverride271;
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.ClaimConnect) {
x12response=ClaimConnect.Benefits270(clearinghouseClin,x12message);
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.EDS) {
x12response=EDS.Benefits270(clearinghouseClin,x12message,out etransHtml);
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.WebMD) {
x12response=WebMD.Benefits270(clearinghouseClin,x12message);
}
else
{
StringBuilder result_x12Message = new StringBuilder();
object[] param = new object[] { clearinghouseClin, x12message, result_x12Message };
if (Plugins.HookMethod(null, "x270Controller.RequestBenefits", param))
x12response = result_x12Message.ToString();
}
}
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Mar 11, 2021 3:59 pm
by joes
Sorry for the late reply. After reviewing this hook request, we could not implement it as written. We would like to make the following changes to the requested hooks:
1. In FormClearinghouseEdit, to make the hook as general purpose as possible, We will add a call to HoodAddCode() at the end of the load method instead of adding multiple calls to HookAddMethod() in FillFields(). You can manipulate all of the controls as needed by accessing them through the form that is passed in.
Code: Select all
private void FormClearinghouseEdit_Load(object sender,System.EventArgs e) {
comboFormat.Items.AddEnums<ElectronicClaimFormat>();
for(int i=0;i<Enum.GetNames(typeof(EclaimsCommBridge)).Length;i++) {
string translatedCommBridgeName=Lan.g("enumEclaimsCommBridge",Enum.GetNames(typeof(EclaimsCommBridge))[i]);
comboCommBridge.Items.Add(translatedCommBridgeName,(EclaimsCommBridge)i);
}
comboClinic.SelectedClinicNum=ClinicNum;
FillFields();
Plugins.HookAddCode(this,"FormClearingHouseEdit.FormClearinghouseEdit_Load_end",ClearinghouseCur);
}
2. I was informed that using EclaimsCommBridge.None may have been causing some issues for you. In Clearinghouses.RetreiveReports(), we would like to move your HookMethod() call to the spot indicated below and that may resolve the issue. You will have to call Lans.g() for the error message within your plugin, or just have the StringBuilder contain an empty string if no error occurs.
Code: Select all
if(clearinghouseClin.ISA08=="113504607") {//TesiaLink
//But the import will still happen
return "";
}
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Clearinghouses.RetrieveReports",clearinghouseClin,errorMessage,progress)) {
return errorMessage.ToString();
}
if(clearinghouseClin.CommBridge==EclaimsCommBridge.None
|| clearinghouseClin.CommBridge==EclaimsCommBridge.Renaissance
|| clearinghouseClin.CommBridge==EclaimsCommBridge.RECS)
{
return "";
}
3. We would also like to move the HookMethod() call in Eclaims.SendBatch() to the spot indicated below. Showing the message box and calling x837Controller.Rollback can all happen within your plugin code.
Code: Select all
if(Plugins.HookMethod(null,"Eclaims.SendBatch",clearinghouseClin,messageText)) {
return;
}
//----------------------------------------------------------------------------------------
//Launch Client Program for this clearinghouse if applicable
if(clearinghouseClin.CommBridge==EclaimsCommBridge.None){
AttemptLaunch(clearinghouseClin,batchNum);
}
4. The HookMethod() call in X270Controller.RequestBenefits() should also become a HookAddCode() call. The x12response will be passed to it so that you can set it in your plugin.
Code: Select all
try {
if(!String.IsNullOrWhiteSpace(FakeResponseOverride271)) {
x12response=FakeResponseOverride271;
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.ClaimConnect) {
x12response=ClaimConnect.Benefits270(clearinghouseClin,x12message);
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.EDS) {
x12response=EDS.Benefits270(clearinghouseClin,x12message,out etransHtml);
}
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.WebMD) {
x12response=WebMD.Benefits270(clearinghouseClin,x12message);
}
object[] param=new object[] {x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_setX12response",clearinghouseClin,x12message,param);
x12response=(string)param[0];
}
catch(Exception ex) {
EtransMessageTexts.Delete(etrans.EtransMessageTextNum);
Etranss.Delete(etrans.EtransNum);
throw new ApplicationException(Lans.g("FormInsPlan","Connection Error:")+"\r\n"+ex.GetType().Name+"\r\n"+ex.Message);
}
5. A final note. We won't change the message or error text in our code to accommodate plugins. This is because anyone can use these hooks and we have no way of knowing how they will be used.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 8:14 am
by joes
Please let us know if you would like any modifications to the changes described in my previous post.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 9:12 am
by joes
I made one edit to our suggested changes in my original post. To make the hook as general as possible, a single HookAddCode() call can be placed in FormClearinghouseEdit.FormClearinghouseEdit_Load() to manipulate any controls on the form.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 9:31 am
by Walker@ExtraDent
Thank you for reviewing.
1. FormClearinghouseEdit.cs: I will review the HookAddCode(). It looks like it should accomplish what we need, except that when the drop-down box for CommBridge is selected as "None" it grays out the options we need. Do we need to request another HookAddCode()/HookMethod() to the selectionchange to get around that? comboCommBridge_SelectionChangeCommitted()
object[] param = new object[] { ClearinghouseCur };
hasEclaimsEnabled = Plugins.HookMethod(null, "FormClearinghouseEdit.AllowFeature_EClaims", param);
2. Clearinghouse.RetrieveReports(): That appears to accomplish what we need. However, I found we were not able to get to that point because of the CommBridge.None in FormClaimReports.cs method butRetrieve_Click(). We need to be able to get past the CommBridge.None check so Open Dental calls RetrieveAndImport() in this method and allows the progressbar to continue and finish. Do we need to request another HookMethod/HookAddCode to get around that?
object[] param = new object[] { clearhouseHq };
if ((clearhouseHq.CommBridge==EclaimsCommBridge.None && !Plugins.HookMethod(null, "FormClaimReports.IsRetrieveReportsSupported", param)) || clearhouseHq.CommBridge==EclaimsCommBridge.Renaissance
|| clearhouseHq.CommBridge==EclaimsCommBridge.RECS)
{
progressbar.UpdateProgress(Lan.g(this, "No built-in functionality for retrieving reports from this clearinghouse."));
progressbar.OnProgressDone();
return;
}
3. Eclaims.SendBatch(): That appears to accomplish what we want except that the "return" will bypass marking the claim as sent, which happens after the if statements. We do not need the AttemptLaunch() or Rollback(). That was included in our suggested code in case others would need it. Would it be better to add the "not" symbol (!) to the Hook's "if" statement so a good claim will drop through the "if" statements to get marked as sent? "if (!Plugins.HookMethod(null, "Eclaims.SendBatch", clearinghouseClin, messageText)) return;"
//----------------------------------------------------------------------------------------
//finally, mark the claims sent. (only if not Canadian)
EtransType etype=EtransType.ClaimSent;
4. X270Controller.RequestBenefits(): I will review the HookAddCode(). It looks like it should accomplish what we need.
5. Sounds good.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 9:38 am
by Walker@ExtraDent
I saw we were posting replies at the same time. The FormClearinghouseEdit.cs Load() HookAddCode you listed will work.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 10:59 am
by joes
Sorry. I'm now realizing that the single HookAddCode in FormClearinhouseEdit.cs should instead be at the end of FillFields() because that method is called in methods other than the Load() method. We can implement it there as:
Code: Select all
UpdateClientProgramLabel();
Plugins.HookAddCode(this,"FormClearingHouseEdit.FillFields_end",ClearinghouseCur);
I do see the problem with our suggested change to the hook in Eclaims.cs. I'll look further into an alternative solution for that one. I will also get back to you on the additional hook in FormClaimReports.butRetrieve_Click().
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 11:15 am
by Walker@ExtraDent
Got it. Thanks
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 2:05 pm
by joes
I was able to get approval for all of your hooks. I'll post all of them below so you have one list that reflects how we will implement them. Please let me know if all of these work for you as written, and I will work on getting these changes committed.
1. FormClearinghouseEdit.FillFields
Code: Select all
UpdateClientProgramLabel();
Plugins.HookAddCode(this,"FormClearingHouseEdit.FillFields_end",ClearinghouseCur);
}
2. FormInsPlan.butGetElectronic_Click
Code: Select all
if((clearinghouseHq.CommBridge!=EclaimsCommBridge.ClaimConnect
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.EDS
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.WebMD)
&& clearinghouseHq.Eformat!=ElectronicClaimFormat.Canadian
&& !Plugins.HookMethod(this,"FormInsPlan.butGetElectronic_Click_is270Supported",clearinghouseHq))
{
MsgBox.Show(this,"So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.");
return;
}
3. Clearinghouses.RetrieveReports
Code: Select all
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Clearinghouses.RetrieveReports",clearinghouseClin,errorMessage,progress)) {
return errorMessage.ToString();
}
if(clearinghouseClin.CommBridge==EclaimsCommBridge.None
|| clearinghouseClin.CommBridge==EclaimsCommBridge.Renaissance
|| clearinghouseClin.CommBridge==EclaimsCommBridge.RECS)
{
return "";
}
4. Eclaims.SendBatch
Code: Select all
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Eclaims.SendBatch",clearinghouseClin,messageText,errorMessage) && errorMessage.ToString().Length > 0) {
return;
}
//----------------------------------------------------------------------------------------
//finally, mark the claims sent. (only if not Canadian)
5. x270Controller.RequestBenefits
Code: Select all
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.WebMD) {
x12response=WebMD.Benefits270(clearinghouseClin,x12message);
}
object[] param=new object[] {x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",clearinghouseClin,x12message,param);
x12response=(string)param[0];
}
6. x270Controller.TryInsVerifyRequest
Code: Select all
if(!ListTools.In(clearinghouseHq.CommBridge,EclaimsCommBridge.ClaimConnect,EclaimsCommBridge.EDS,EclaimsCommBridge.WebMD)
&& !Plugins.HookMethod(null,"x270ControllerTryInsVerifyRequest",clearinghouseHq))
{
error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
return null;
}
7. FormClaimReports.ButRetrieve_Click
Code: Select all
if((clearhouseHq.CommBridge==EclaimsCommBridge.None
&& !Plugins.HookMethod(this,"FormClaimReports.butRetrieve_Click_isRetrievingReportsSupported",clearhouseHq))
|| clearhouseHq.CommBridge==EclaimsCommBridge.Renaissance
|| clearhouseHq.CommBridge==EclaimsCommBridge.RECS)
{
progressbar.UpdateProgress(Lan.g(this,"No built-in functionality for retrieving reports from this clearinghouse."));
progressbar.OnProgressDone();
return;
}
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 2:56 pm
by Walker@ExtraDent
Great news! Those all look correct (and in the correct places in the code), but I will not be able to write the HookAddCode pieces in our plug-in until Monday 3/15 to test. I am not familiar with HookAddCode so need to look at the examples of how to change the display in our plug-in and what additional OpenDental classes/dlls we'll need to reference/include. Do you need to wait until I have our code done to proceed?
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 12, 2021 3:52 pm
by joes
I will wait just so we can be sure that they will work for you.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Mar 16, 2021 1:07 pm
by Walker@ExtraDent
Sorry for the delay. I am having trouble with this one:
object[] param=new object[] {x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",clearinghouseClin,x12message,param);
x12response=(string)param[0];
The string is showing in the object[] when it comes back into Open Dental's base Plug In class's HookAddCode, but when it comes back into the x20Controller's RequestBenefits HoodAddCode, the "param" is empty. It's as if the value is not the correct type, but it shows as a string in the object[]. The way the HookAddCode is designed, does a StringBuilder variable need used to pass into the HoodAddCode, then x12response = param[0].ToString() ?
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Mar 16, 2021 2:53 pm
by joes
I think I know what the problem is. The way that the arguments are being passed results in an array of objects as the third element in the array of parameters like this [ clearinghouseClin, x12message, [x12response] ]. I would like to change that so that it is easier to use. The code below should work if you assign the response you get to param[0] in the plug-in.
Code: Select all
object[] param=new object[] {x12response,x12message,clearinghouseClin};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",param);
x12response=(string)param[0];
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Mar 16, 2021 3:37 pm
by Walker@ExtraDent
Does the ClearinghouseClin always have to be the first parameter? I thought I read that in the Plug In instructions. Should they instead be in order: clearinghouse, 270, response ?
object[] param=new object[] {clearinghouseClin,x12message,x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",param);
x12response=(string)param[2];
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Mar 16, 2021 3:49 pm
by joes
I can switch it so that they are in the order you described.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Mar 16, 2021 8:26 pm
by Walker@ExtraDent
I've verified this works (change order of parameters and assign param[2] back to x12response), along with all the other HookMethod and HookAddMethod code from 3/12. I believe we're good to go.
object[] param=new object[] {clearinghouseClin,x12message,x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",param);
x12response=(string)param[2];
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Mar 17, 2021 8:25 am
by joes
I will work on these changes and will post the version that these hooks will be in once they are committed.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Mar 18, 2021 8:57 am
by joes
During review of these hooks, one of our Senior Engineers requested a few more changes. Please let me know if these changes cause any problems for your plugin.
1. In FormInsPlan.butGetElectronic_Click, you had originally requested that we modify the error message. Instead, we will implement a second hook that will allow you to modify the error message.
Code: Select all
if(clearinghouseHq.CommBridge!=EclaimsCommBridge.ClaimConnect
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.EDS
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.WebMD
&& clearinghouseHq.Eformat!=ElectronicClaimFormat.Canadian
&& !Plugins.HookMethod(this,"FormInsPlan.butGetElectronic_Click_is270Supported",clearinghouseHq))
{
string error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
object[] parameters={error};
Plugins.HookAddCode(this,"FormInsPlan.butGetElectronic_Click_270NotSupportedError",parameters);
error=(string)parameters[0];
MsgBox.Show(this,error);
return;
}
2. In Clearinghouses.RetrieveReports, the hook was moved above the TesiaLink check.
Code: Select all
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Clearinghouses.RetrieveReports_afterProgressPauseOrCancel",clearinghouseClin,errorMessage,progress)) {
return errorMessage.ToString();
}
if(clearinghouseClin.ISA08=="113504607") {//TesiaLink
//But the import will still happen
return "";
}
3. In x270Controller.TryInsVerifyRequest, we again added a second hook so that you can modify the error message.
Code: Select all
if(!ListTools.In(clearinghouseHq.CommBridge,EclaimsCommBridge.ClaimConnect,EclaimsCommBridge.EDS,EclaimsCommBridge.WebMD)
&& !Plugins.HookMethod(null,"x270Controller.TryInsVerifyRequest_is270Supported",clearinghouseHq))
{
error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
object[] parameters={error};
Plugins.HookAddCode(null,"x270Controller.TryInsVerifyRequest_270NotSupportedError",parameters);
error=(string)parameters[0];
return null;
}
4. In FormClaimReports.butRetrieve_Click, the hook was modified to use a "goto" to avoid returning. This way, the hook is not bound to EclaimsCommBridge.None. This allows more flexibility for other developers who may use these hooks.
Code: Select all
if(Plugins.HookMethod(this,"FormClaimReports.butRetrieve_Click_isRetrievingReportsSupported",clearhouseHq)) {
goto HookSkipRetrievingNotSupported;
}
if(clearhouseHq.CommBridge==EclaimsCommBridge.None
|| clearhouseHq.CommBridge==EclaimsCommBridge.Renaissance
|| clearhouseHq.CommBridge==EclaimsCommBridge.RECS)
{
progressbar.UpdateProgress(Lan.g(this,"No built-in functionality for retrieving reports from this clearinghouse."));
progressbar.OnProgressDone();
return;
}
HookSkipRetrievingNotSupported: { }
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Mar 18, 2021 2:35 pm
by Walker@ExtraDent
Those all look fine to me. I will be out of the office until 3/29/21 and will pick back up then. Thank you
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Mar 19, 2021 10:45 am
by joes
All of the hooks will be available in version 21.1.11 which should release on Tuesday, next week. Note that some hook method names have changed to fit our naming standards.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Sun Mar 21, 2021 6:27 am
by Walker@ExtraDent
Can you list all the hook names/code so we can test and be ready to go?
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Mar 22, 2021 1:44 pm
by joes
Yes, here are the hooks as they were committed.
1. Clearinghouses.RetrieveReports
Code: Select all
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Clearinghouses.RetrieveReports_afterProgressPauseOrCancel",clearinghouseClin,errorMessage,progress)) {
return errorMessage.ToString();
}
if(clearinghouseClin.ISA08=="113504607") {//TesiaLink
//But the import will still happen
return "";
}
2. Eclaims.SendBatch
Code: Select all
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Eclaims.SendBatch_afterClientProgramLaunch",clearinghouseClin,messageText,errorMessage)
&& errorMessage.Length > 0)
{
return;
}
//----------------------------------------------------------------------------------------
//finally, mark the claims sent. (only if not Canadian)
3. X270Controller.RequestBenefits
Code: Select all
else if(clearinghouseClin.CommBridge==EclaimsCommBridge.WebMD) {
x12response=WebMD.Benefits270(clearinghouseClin,x12message);
}
object[] parameters={clearinghouseClin,x12message,x12response};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",parameters);
x12response=(string)parameters[2];
}
4. x270Controller.TryInsVerifyRequest
Code: Select all
if(!ListTools.In(clearinghouseHq.CommBridge,EclaimsCommBridge.ClaimConnect,EclaimsCommBridge.EDS,EclaimsCommBridge.WebMD)
&& !Plugins.HookMethod(null,"x270Controller.TryInsVerifyRequest_is270Supported",clearinghouseHq))
{
error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
object[] parameters={error};
Plugins.HookAddCode(null,"x270Controller.TryInsVerifyRequest_270NotSupportedError",parameters);
error=(string)parameters[0];
return null;
}
5. FormClaimReports.butRetrieve_Click
Code: Select all
if(Plugins.HookMethod(this,"FormClaimReports.butRetrieve_Click_isRetrievingReportsSupported",clearhouseHq)) {
goto HookSkipRetrievingNotSupported;
}
if(clearhouseHq.CommBridge==EclaimsCommBridge.None
|| clearhouseHq.CommBridge==EclaimsCommBridge.Renaissance
|| clearhouseHq.CommBridge==EclaimsCommBridge.RECS)
{
progressbar.UpdateProgress(Lan.g(this,"No built-in functionality for retrieving reports from this clearinghouse."));
progressbar.OnProgressDone();
return;
}
HookSkipRetrievingNotSupported: { }
6. FormClearinghouseEdit.FillFields
Code: Select all
UpdateClientProgramLabel();
Plugins.HookAddCode(this,"FormClearingHouseEdit.FillFields_end",ClearinghouseCur);
}
7. FomInsPlan.butGetElectronic_Click
Code: Select all
if(clearinghouseHq.CommBridge!=EclaimsCommBridge.ClaimConnect
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.EDS
&& clearinghouseHq.CommBridge!=EclaimsCommBridge.WebMD
&& clearinghouseHq.Eformat!=ElectronicClaimFormat.Canadian
&& !Plugins.HookMethod(this,"FormInsPlan.butGetElectronic_Click_is270Supported",clearinghouseHq))
{
string error="So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.";
object[] parameters={error};
Plugins.HookAddCode(this,"FormInsPlan.butGetElectronic_Click_270NotSupportedError",parameters);
error=(string)parameters[0];
MsgBox.Show(this,error);
return;
}
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Apr 07, 2021 8:20 am
by Walker@ExtraDent
Just tidying up the code on our end. I'm wondering if the "IF" for Plugins.HookMethodEclaims.SendBatch_afterClientProgramLaunch should check for "!" (not) in order to return without marking the claims Sent. Currently in order to return so the claims doesn't get marked as Sent, we need to return True plus an ErrorMessage. Our code can always return true, but I'm wondering about future vendors trying to use the HookMethod. They might return False if there's an issue on their end and the claims would all get marked as sent by mistake, even if there is an errorMessage.
2. Eclaims.SendBatch
StringBuilder errorMessage=new StringBuilder();
if(Plugins.HookMethod(null,"Eclaims.SendBatch_afterClientProgramLaunch",clearinghouseClin,messageText,errorMessage)
&& errorMessage.Length > 0)
{
return;
}
//----------------------------------------------------------------------------------------
//finally, mark the claims sent. (only if not Canadian)
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Apr 07, 2021 9:16 am
by Walker@ExtraDent
Maybe I mis-spoke in my last question. Does the SendBatch HookMethod need to return true even on error so Open Dental knows the plugin handles that HookMethod?
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Apr 07, 2021 2:32 pm
by joes
Yes, that hook method should always return true when it is implemented.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Apr 12, 2021 10:56 am
by Walker@ExtraDent
I am having trouble with the 2 pieces that run by the Open Dental Service. I cannot get the service to run these 2 pieces. I have the 21.1.15.0 Open Dental Service installed and running and did the setup according to the help system. Are there hooks that needs added specifically to the Open Dental Service for it to even call the methods in the Open Dental code?
1. Beta Feature Automatic Batch Insurance Validation: Patient Eligibility does not run when I use the instructions in the help system. However, it works correctly through the patient’s Family, Primary/Secondary Edit Insurance Plan, Request button. After the designated time for the Service to check eligibility, I see the following:
a. When viewing the Insurance Verify List,
i. Status: “ServiceError”
ii. Status Date: Today
iii. Status Note: “So far, eligibility checks only work with ClaimConnect, EDS, WebMD (Emdeon Dental), and CDAnet.”
b. This makes me think the code for the Open Dental Service needs a Hook like FormInsPlan.butGetElectronic_Click_is270Supported and
x270Controller.TryInsVerifyRequest_is270Supported
2. Pickup and Import reports: Reports don't pickup and import when I use the setup option “Receive Reports by Service.” However, when I use the setup option “Computer To Receive Reports Automatically,” it works correctly and picks up and imports reports. Reports also pickup and import if I manually retrieve reports through the Manage, Send Claims, Get Reports option.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Apr 14, 2021 11:22 am
by joes
The Open Dental Service does not load the plug-in framework. Effectively, it is unaware of plug-ins and runs methods with hooks as though no plug-ins are implemented. We have no plans to implement plug-ins for the service at this time.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Apr 15, 2021 5:16 am
by Walker@ExtraDent
Thank you for researching
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Apr 15, 2021 5:54 am
by Walker@ExtraDent
I see the offices can set up Automatic Reports Retrieval not using the Service, but I am not seeing in the Help system a way for the office to send multiple Patient Eligibility Requests at once (not using the Service). Is there a way to send a batch or multiple requests from the Insurance Verify screen? It looks like the office has to click on each appointment in the Insurance Verify List and press the Request button.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Apr 15, 2021 8:55 am
by joes
Using the service is currently the only way to do batch insurance verification requests.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Apr 15, 2021 9:04 am
by Walker@ExtraDent
Thank you
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed May 12, 2021 5:32 am
by Walker@ExtraDent
Can you tell me when 21.1.11 or higher will be released as a normal update? Our support staff has offices wanting to use our Plug-In DLL but the offices want to wait until the Plug-Ins are out of Open Dental Beta.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed May 12, 2021 8:56 am
by joes
We are expecting to move 21.1 to stable later this month.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Jun 04, 2021 5:11 am
by Walker@ExtraDent
Has 21.1 or higher been moved out of Beta yet? The offices we are working don't want to use the OpenDental beta versions.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Jun 04, 2021 8:20 am
by joes
Yes, 21.1 is the current stable version.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Jun 16, 2021 8:25 am
by Walker@ExtraDent
We are having an issue with Payer IDs. We'd like to avoid having the office manually update to our Payer IDs and eligibility settings. We'd like to do it automatically for them.
1. Is there an existing utility that allows to update the Insurance Carriers' Payer IDs and "Is trusted for real-time eligibility" options (for all Insurance Carriers)? Maybe a utility somewhere that a hook could be added? I was unable to find anything in the code. (I see there is a Payer List at Setup, Family / Insurance, Payer ID's. Is this just a list for viewing?)
2. We also would like to get the address of the Insurance Carrier for eligibility requests - 270s. There's a couple of options.
a. Add the carrier to the end of the parameters list on the existing HookAddCode in x270Controller. This would solve the issue at hand but might not address future information that's also needed.
object[] parameters={clearinghouseClin,x12message,x12response,carrier};
Plugins.HookAddCode(null,"x270Controller.RequestBenefits_benefits270",parameters);
x12response=(string)parameters[2];
b. Thinking of other changes that might be needed in the future for the 270, would it be better to add a HookAddCode to the end of the X270.GenerateMessageText that would allow plugins to make their own changes to the transaction?
string create270X12 = strb.ToString();
object[] parameters={clearinghouseClin,return270X12,carrier,billProv,clinic,insPlan,subscriber,insSub,patForRequest};
Plugins.HookAddCode(null,"x270.GenerateMessageText_create270",parameters);
return create270X12=(string)parameters[1];
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Thu Jun 17, 2021 2:34 pm
by joes
1. We don't have any features that update Payer IDs or "Is trusted for real-time eligibility" for multiple carriers at once. Entries in the Electronic Payer ID's list that you are referring to can be edited by double clicking on a row in the list.
2. We can implement option b. Will it work for you as this:
object[] parameters={clearinghouseClin,strb,carrier,billProv,clinic,insPlan,subscriber,insSub,patForRequest};
Plugins.HookAddCode(null,"X270.GenerateMessateText_end",parameters);
return strb.ToString();
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Jun 18, 2021 6:31 am
by Walker@ExtraDent
1. Can a button be added to the Electronic Payer ID's list (Setup, Family / Insurance, Payer ID's) that would call a HookMethod to allow us to update the list with our payers and payer IDs?
private void butUpdateBatchIDs_Click(object sender,EventArgs e)
{
StringBuilder errorMessage = new StringBuilder();
object[] param = new object[] { clearinghouseClin, errorMessage };
if (!Plugins.HookMethod(null, "FormElectIDs.UpdateBatchPayerIDs", param) && errorMessage.ToString().Length > 0)
MessageBox.Show(Lans.g("Electronic Payer ID's", "Error Updating Payer IDs.") + "\r\n" + errorMessage.ToString());
else
FillElectIDs(0);
}
2. Yes that will work. I see other HookAddCode places that pass in a string builder and then just use the string builder without accessing the paramenter.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Fri Jun 18, 2021 10:43 am
by joes
We don't add buttons that are only used for plugins, but I can add a hook to the load method that would allow you to add a button to the form. You will need to call some LayoutManager methods to make the button scale properly when zoom is being used. The following forum thread has some information on how this is done,
viewtopic.php?f=3&t=7403&p=32827#p32827.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Jun 21, 2021 6:40 am
by Walker@ExtraDent
Thanks. The ability to add a button in the load will solve #1. However, the link you shared doesn't seem to be to the right topic. It is discussing resizing a button that was added with a plugin.
Please let me know the final code for both HookAddCode additions and I will finish up and test our Plugin using those.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Jun 21, 2021 10:53 am
by joes
I should have been more specific. The link I shared was intended to show the LayoutManager methods you would need to call to have the custom button scale appropriately when the zoom feature is being used. Here is another forum thread with some info on how custom buttons are added:
viewtopic.php?f=3&t=5558&p=24197&hilit= ... ton#p24197.
1. FormElectIDs.FormElectIDs_Load()
Code: Select all
private void FormElectIDs_Load(object sender, System.EventArgs e) {
FillElectIDs(0);
butAdd.Visible=(!IsSelectMode);
Plugins.HookAddCode(this,"FormElectIDs.Load_end");
}
2. X270.GenerateMessageText()
Code: Select all
strb.AppendLine("IEA*1*"//IEA01: number of functional groups
+batchNum.ToString().PadLeft(9,'0')+"~");//IEA02: Interchange control number
object[] parameters={clearinghouseClin,strb,carrier,billProv,clinic,insPlan,subscriber,insSub,patForRequest};
Plugins.HookAddCode(null,"X270.GenerateMessateText_end",parameters);
return strb.ToString();
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Jun 21, 2021 11:32 am
by Walker@ExtraDent
Thank you
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Mon Jun 21, 2021 1:34 pm
by joes
You're welcome. Let me know if these hooks work for you as written, and I will get them committed to beta.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Tue Jun 22, 2021 5:08 am
by Walker@ExtraDent
Ok. It will probably be the end of the week before I can get to them. I will let you know.
Thank you
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Aug 04, 2021 4:56 am
by Walker@ExtraDent
These Hooks work correctly, but I'm having an issue with #1.
What DLL is the OpenDental.UI and LayoutManager in? Just using the normal Windows Forms, I'm able to add my button to the form's PanelChild (that was added by the OD LayoutManager). But, since I don't have access to the OD LayoutManager and OD UI.Button I'm not able to make the button look right or scale size.
1. FormElectIDs.FormElectIDs_Load(): Plugins.HookAddCode(this, "FormElectIDs.Load_end");
2. X270.GenerateMessageText(): Plugins.HookAddCode(null,"X270.GenerateMessateText_end",parameters);
public static void PayerIDList_AddButton(System.Windows.Forms.Form sender)
{
Button claimXDirectButton = new Button();
claimXDirectButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
claimXDirectButton.Location = new System.Drawing.Point(200, 635);
claimXDirectButton.Size = new System.Drawing.Size(135, 25);
claimXDirectButton.Text = "ClaimX Direct Payer List";
claimXDirectButton.Name = "ClaimXDirectButton";
claimXDirectButton.TabIndex = 211;
claimXDirectButton.Click += new System.EventHandler(claimXDirectButton_Click);
//NOTE: LayoutManager is not accessible
//int xlocation = 200;
//int ylocation = 635;
//xlocation = sender.LayoutManager.Scale(xlocation);
//ylocation = sender.LayoutManager.Scale(ylocation);
//customButton.Size = sender.LayoutManager.ScaleSize(claimXDirectButton.Size);
Control[] controlList = sender.Controls.Find("PanelClient", true);
if (controlList.Length == 1)
claimXDirectButton.Parent = controlList[0];
}
public static void claimXDirectButton_Click(object sender, System.EventArgs e)
{
//launch my payer list here
}
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Aug 04, 2021 9:12 am
by joes
Our PluginExample solution has a reference to OpenDental.exe. With that reference you can cast the sender to a FormElectID and that should allow you to access LayoutManager.
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Aug 04, 2021 11:18 am
by Walker@ExtraDent
Thanks, I included the OpenDental.exe and added the custom button to the form's LayoutManager. It is all working correctly now. Can you proceed with adding the 2 Hooks?
Re: Plug-In/Hooks for E-Claims, Eligibility, Reports(ERAs, 271s, 277s, DentiCal Reports) and for Clearinghouse Setup Opt
Posted: Wed Aug 04, 2021 3:44 pm
by joes
I will have them committed to 21.2.25 which should release tomorrow.