public void DeleteImage(IList <Document> documents) { for (int i = 0; i < documents.Count; i++) { if (documents[i] == null) { continue; } try { DeleteDocument(documents[i]); } catch { if (verbose) { Debug.WriteLine(Lan.g("ContrDocs", "Could not delete file. It may be in use elsewhere, or may have already been deleted.")); } } Documents.Delete(documents[i]); } }
public Bitmap RetrieveImage(Document document) { if (Patient == null) { throw new NoActivePatientException(); } if (document == null) { throw new ArgumentNullException("document"); } try { return(OpenImage(document)); } catch { MessageBox.Show(Lan.g("ContrDocs", "File not found") + document.FileName); return(null); } }
private void OnPrint_Click() { if (!PrinterL.SetPrinter(Document, Sit)) { return; } if (Document.OriginAtMargins) { //In the sheets framework,we had to set margins to 20 because of a bug in their preview control. //We now need to set it back to 0 for the actual printing. //Hopefully, this doesn't break anything else. Document.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); } try{ Document.Print(); } catch (Exception e) { MessageBox.Show(Lan.g(this, "Error: ") + e.Message); } DialogResult = DialogResult.OK; }
private void butRunAllocatorTool_Click(object sender, EventArgs e) { if (!rbutIHaveRead.Checked) { PU.MB = Lan.g(this, "You must indicate that you have read the text in the box!"); return; } if (MessageBox.Show("Do you want to run the batch allocation?", "Please Respond", MessageBoxButtons.YesNo) == DialogResult.Yes) { FormWarnToCloseComputers fwc = new FormWarnToCloseComputers(); if (fwc.ShowDialog() == DialogResult.Yes) { Reporting.Allocators.MyAllocator1_ProviderPayment allocator1 = new OpenDental.Reporting.Allocators.MyAllocator1_ProviderPayment(); SecurityLogs.MakeLogEntry(OpenDentBusiness.Permissions.Setup, 0, "Started Batch Allocation For Provider Allocation Tool"); allocator1.StartBatchAllocation(); SecurityLogs.MakeLogEntry(OpenDentBusiness.Permissions.Setup, 0, "Finished Batch Allocation For Provider Allocation Tool"); List <string> commands = new List <string>(); if (!PrefC.ContainsKey(MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_ToolHasRun)) { commands.Add("INSERT INTO preference VALUES ('" + MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_ToolHasRun + "','0')"); } if (!PrefC.ContainsKey(MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_Use)) { commands.Add("INSERT INTO preference VALUES ('" + MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_Use + "','0')"); } if (commands.Count != 0) { Db.NonQOld(commands.ToArray()); Cache.Refresh(InvalidType.Prefs); } Prefs.UpdateRaw(MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_ToolHasRun, "1"); Prefs.UpdateRaw(MyAllocator1_ProviderPayment.Pref_AllocatorProvider1_Use, "1"); } } RefreshForm(); }
///<summary>Adds a ReportObject with the given font, at the bottom-center of the Report Header Section. ///Should only be done after AddTitle. You can add as many subtitles as you want. Padding is added to the height only of the subtitle.</summary> public void AddSubTitle(string name, string subTitle, Font font, int padding) { ReportComplexEvent.Fire(new ODEventArgs("ReportComplexEvent", Lan.g("ReportComplex", "Adding SubTitle To Report") + "...")); Size size = new Size((int)(_grfx.MeasureString(subTitle, font).Width / _grfx.DpiX * 100 + 2) , (int)(_grfx.MeasureString(subTitle, font).Height / _grfx.DpiY * 100 + 2)); int xPos; if (_isLandscape) { xPos = 1100 / 2; xPos -= 50; } else { xPos = 850 / 2; xPos -= 30; } xPos -= (int)(size.Width / 2); if (_sections[AreaSectionType.ReportHeader] == null) { _sections.Add(new Section(AreaSectionType.ReportHeader, 0)); } //find the yPos+Height of the last reportObject in the Report Header section int yPos = 0; foreach (ReportObject reportObject in _reportObjects) { if (reportObject.SectionType != AreaSectionType.ReportHeader) { continue; } if (reportObject.Location.Y + reportObject.Size.Height > yPos) { yPos = reportObject.Location.Y + reportObject.Size.Height; } } _reportObjects.Add(new ReportObject(name, AreaSectionType.ReportHeader, new Point(xPos, yPos + padding), size, subTitle, font, ContentAlignment.MiddleCenter)); _sections[AreaSectionType.ReportHeader].Height += (int)size.Height + padding; }
//these are temporary: //private static string vendorID="68"; //private static string vendorPMScode="144"; //private static string clientAccountNumber="8011";//the dental office number set by EHG //private static string creditCardChoices="MC,D,V,A";//MasterCard,Discover,Visa,AmericanExpress //private static string userName=""; //private static string password=""; ///<summary>Returns empty list if no errors. Otherwise returns a list with error messages.</summary> public static List <string> Validate(long clinicNum) { List <string> listErrors = new List <string>(); Clinic clinic = Clinics.GetClinic(clinicNum); Ebill eBillClinic = Ebills.GetForClinic(clinicNum); Ebill eBillDefault = Ebills.GetForClinic(0); EHG_Address addressRemit = null; if (eBillClinic == null) { addressRemit = GetAddress(eBillDefault.RemitAddress, clinic); } else { addressRemit = GetAddress(eBillClinic.RemitAddress, clinic); } if (addressRemit.Address1.Trim().Length == 0 || addressRemit.City.Trim().Length == 0 || addressRemit.State.Trim().Length == 0 || addressRemit.Zip.Trim().Length == 0) { listErrors.Add(Lan.g("EHG_Statements", "invalid") + " " + Lan.g("EHG_Statements", addressRemit.Source)); } return(listErrors); }
private void butOK_Click(object sender, EventArgs e) { DataTable tableProvs = KPIDowntime.GetDowntime(dtpStart.Value, dtpEnd.Value); ReportComplex report = new ReportComplex(true, false); report.ReportName = Lan.g(this, "Provider Down-times"); report.AddTitle("Title", Lan.g(this, "Provider Down-times")); report.AddSubTitle("Date", dtpStart.Value.ToShortDateString() + " - " + dtpEnd.Value.ToShortDateString()); QueryObject query; query = report.AddQuery(tableProvs, "", "", SplitByKind.None, 0); query.AddColumn("Provider Number", 90, FieldValueType.String); query.AddColumn("Total Down-time", 100, FieldValueType.String); report.AddPageNum(); if (!report.SubmitQueries()) { return; } FormReportComplex FormR = new FormReportComplex(report); FormR.ShowDialog(); }
protected override void OnMouseDown(MouseEventArgs e) { if (_isMouseDown) //User right clicked while dragging appt around. { return; } //set selected index before firing the mouse down event. //figure out which appt mouse is on. Start at end and work backwards int index = -1; for (int i = ListPinBoardItems.Count - 1; i >= 0; i--) { int top = 13 * i; if (e.Y < top || e.Y > top + ListPinBoardItems[i].BitmapAppt.Height) { continue; } index = i; break; } bool changed = index != SelectedIndex; if (changed) { SelectedIndex = index; } base.OnMouseDown(e); if (changed) { Invalidate(); OnSelectedIndexChanged(); //fires to parent, which sets selected appt in main area to -1. } //--Prepare to drag or show context menu----------------------------------------------------- if (SelectedIndex == -1) { return; } if (e.Button == MouseButtons.Right) { ContextMenu contextMenu = new ContextMenu(); MenuItem menuItemProv = new MenuItem(Lan.g(this, "Change Provider")); menuItemProv.Click += new EventHandler(menuItemProv_Click); contextMenu.MenuItems.Add(menuItemProv); contextMenu.Show(this, e.Location); return; } _isMouseDown = true; OnPreparingToDragFromPinboard(ListPinBoardItems[SelectedIndex].DataRowAppt); //this event goes to ContrAppt, //which then sends new bitmap here via SetBitmapTempPinAppt before the code below continues. //So, we have now set the size of contrTempPinAppt. contrTempPinAppt.Visible = false; //Visible flag gets flipped when the mouse moves. We are just preparing it to be shown here. _pointMouseOrigin = e.Location; //local pinboard coords. contrTempPinAppt.Location = new Point( this.Location.X + Parent.Location.X, this.Location.Y + Parent.Location.Y + SelectedIndex * 13); if (contrTempPinAppt.Right < this.Location.X + Parent.Location.X + _pointMouseOrigin.X) //appointment is very narrow { contrTempPinAppt.Left = this.Location.X + Parent.Location.X + _pointMouseOrigin.X - contrTempPinAppt.Width; //so move it to the right } _pointApptOrigin = contrTempPinAppt.Location; }
private void FillGrid() { Color needsAttnCol = OpenDental.SetupWizard.GetColor(ODSetupStatus.NeedsAttention); gridMain.BeginUpdate(); gridMain.Columns.Clear(); ODGridColumn col; if (PrefC.HasClinicsEnabled) { col = new ODGridColumn(Lan.g("FormSetupWizard", "OpName"), 110); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "Abbrev"), 110); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "Clinic"), 110); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "ProvDentist"), 110); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "ProvHygienist"), 110); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "IsHygiene"), 60, HorizontalAlignment.Center); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "IsHidden"), 60, HorizontalAlignment.Center); gridMain.Columns.Add(col); } else { col = new ODGridColumn(Lan.g("FormSetupWizard", "OpName"), 135); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "Abbrev"), 120); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "ProvDentist"), 130); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "ProvHygienist"), 130); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "IsHygiene"), 80, HorizontalAlignment.Center); gridMain.Columns.Add(col); col = new ODGridColumn(Lan.g("FormSetupWizard", "IsHidden"), 80, HorizontalAlignment.Center); gridMain.Columns.Add(col); } //col = new ODGridColumn("Clinic",120); //gridMain.Columns.Add(col); gridMain.Rows.Clear(); ODGridRow row; bool IsAllComplete = true; if (_listOps.Count == 0) { IsAllComplete = false; } foreach (Operatory opCur in _listOps) { row = new ODGridRow(); row.Cells.Add(opCur.OpName); if (string.IsNullOrEmpty(opCur.OpName)) { row.Cells[row.Cells.Count - 1].CellColor = needsAttnCol; IsAllComplete = false; } row.Cells.Add(opCur.Abbrev); if (string.IsNullOrEmpty(opCur.Abbrev)) { row.Cells[row.Cells.Count - 1].CellColor = needsAttnCol; IsAllComplete = false; } if (PrefC.HasClinicsEnabled) { row.Cells.Add(Clinics.GetAbbr(opCur.ClinicNum)); } //not a required field row.Cells.Add(Providers.GetAbbr(opCur.ProvDentist)); //not a required field row.Cells.Add(Providers.GetAbbr(opCur.ProvHygienist)); //not a required field row.Cells.Add(opCur.IsHygiene ? "X" : ""); //not a required field row.Cells.Add(opCur.IsHidden ? "X" : ""); //not a required field //row = new ODGridRow(); //row.Cells.Add(opCur.OpName); //if(string.IsNullOrEmpty(opCur.OpName)) { // row.Cells[row.Cells.Count-1].CellColor=needsAttnCol; // IsAllComplete=false; //} row.Tag = opCur; gridMain.Rows.Add(row); } gridMain.EndUpdate(); if (IsAllComplete) { IsDone = true; } else { IsDone = false; } }
private void OnExport_Click() { SaveFileDialog saveFileDialog2 = new SaveFileDialog(); saveFileDialog2.AddExtension = true; //saveFileDialog2.Title=Lan.g(this,"Select Folder to Save File To"); saveFileDialog2.FileName = MyReport.ReportName + ".txt"; if (!Directory.Exists(PrefC.GetString(PrefName.ExportPath))) { try{ Directory.CreateDirectory(PrefC.GetString(PrefName.ExportPath)); saveFileDialog2.InitialDirectory = PrefC.GetString(PrefName.ExportPath); } catch { //initialDirectory will be blank } } else { saveFileDialog2.InitialDirectory = PrefC.GetString(PrefName.ExportPath); } //saveFileDialog2.DefaultExt="txt"; saveFileDialog2.Filter = "Text files(*.txt)|*.txt|Excel Files(*.xls)|*.xls|All files(*.*)|*.*"; saveFileDialog2.FilterIndex = 0; if (saveFileDialog2.ShowDialog() != DialogResult.OK) { return; } try{ using (StreamWriter sw = new StreamWriter(saveFileDialog2.FileName, false)){ String line = ""; for (int i = 0; i < MyReport.ReportTable.Columns.Count; i++) { line += MyReport.ReportTable.Columns[i].Caption; if (i < MyReport.ReportTable.Columns.Count - 1) { line += "\t"; } } sw.WriteLine(line); string cell; for (int i = 0; i < MyReport.ReportTable.Rows.Count; i++) { line = ""; for (int j = 0; j < MyReport.ReportTable.Columns.Count; j++) { cell = MyReport.ReportTable.Rows[i][j].ToString(); cell = cell.Replace("\r", ""); cell = cell.Replace("\n", ""); cell = cell.Replace("\t", ""); cell = cell.Replace("\"", ""); line += cell; if (j < MyReport.ReportTable.Columns.Count - 1) { line += "\t"; } } sw.WriteLine(line); } } //using } catch { MessageBox.Show(Lan.g(this, "File in use by another program. Close and try again.")); return; } MessageBox.Show(Lan.g(this, "File created successfully")); }
///<summary>Submits the queries to the database and makes query objects for each query with the results. Returns false if one of the queries failed.</summary> public bool SubmitQueries(bool isShowMessage = false) { bool hasRows = false; bool hasReportServer = !string.IsNullOrEmpty(PrefC.ReportingServer.DisplayStr); Graphics grfx = Graphics.FromImage(new Bitmap(1, 1)); string displayText; ReportObjectCollection newReportObjects = new ReportObjectCollection(); _sections.Add(new Section(AreaSectionType.Query, 0)); for (int i = 0; i < _reportObjects.Count; i++) { if (_reportObjects[i].ObjectType == ReportObjectType.QueryObject) { QueryObject query = (QueryObject)_reportObjects[i]; if (!query.SubmitQuery()) { _actionCloseReportProgress?.Invoke(); MsgBox.Show(this, "There was an error generating this report." + (hasReportServer ? "\r\nVerify or remove the report server connection settings and try again." : "")); return(false); } if (query.ReportTable.Rows.Count == 0) { continue; } hasRows = true; TotalRows += query.ReportTable.Rows.Count; //Check if the query needs to be split up into sub queries. E.g. one payment report query split up via payment type. if (!String.IsNullOrWhiteSpace(query.ColumnNameToSplitOn)) { ReportComplexEvent.Fire(ODEventType.ReportComplex, Lan.g("ReportComplex", "Creating Splits Based On") + " " + query.ColumnNameToSplitOn + "..."); //The query needs to be split up into sub queries every time the ColumnNameToSplitOn cell changes. //Therefore, we need to create a separate QueryObject for every time the cell value changes. string lastCellValue = ""; query.IsLastSplit = false; QueryObject newQuery = null; for (int j = 0; j < query.ReportTable.Rows.Count; j++) { if (query.ReportTable.Rows[j][query.ColumnNameToSplitOn].ToString() == lastCellValue) { if (newQuery == null) { newQuery = query.DeepCopyQueryObject(); newQuery.AddInitialHeader(newQuery.GetGroupTitle().StaticText, newQuery.GetGroupTitle().Font); } newQuery.ReportTable.ImportRow(query.ReportTable.Rows[j]); } else { //Must happen the first time through if (newQuery != null) { switch (newQuery.SplitByKind) { case SplitByKind.None: return(false); case SplitByKind.Enum: if (newQuery.ListEnumNames == null) { return(false); } displayText = newQuery.ListEnumNames[PIn.Int(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString())]; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); newQuery.GetGroupTitle().StaticText = displayText; break; case SplitByKind.Definition: if (newQuery.DictDefNames == null) { return(false); } if (newQuery.DictDefNames.ContainsKey(PIn.Long(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString()))) { displayText = newQuery.DictDefNames[PIn.Long(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString())]; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); newQuery.GetGroupTitle().StaticText = displayText; } else { newQuery.GetGroupTitle().StaticText = "Undefined"; } break; case SplitByKind.Date: displayText = PIn.Date(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString()).ToShortDateString(); newQuery.GetGroupTitle().StaticText = displayText; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); break; case SplitByKind.Value: displayText = newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString(); newQuery.GetGroupTitle().StaticText = displayText; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); break; } newQuery.SubmitQuery(); newReportObjects.Add(newQuery); } if (newQuery == null && query.GetGroupTitle().StaticText != "") { newQuery = query.DeepCopyQueryObject(); newQuery.ReportTable.ImportRow(query.ReportTable.Rows[j]); newQuery.AddInitialHeader(newQuery.GetGroupTitle().StaticText, newQuery.GetGroupTitle().Font); } else { newQuery = query.DeepCopyQueryObject(); newQuery.ReportTable.ImportRow(query.ReportTable.Rows[j]); } } lastCellValue = query.ReportTable.Rows[j][query.ColumnNameToSplitOn].ToString(); } switch (newQuery.SplitByKind) { case SplitByKind.None: return(false); case SplitByKind.Enum: if (newQuery.ListEnumNames == null) { return(false); } displayText = newQuery.ListEnumNames[PIn.Int(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString())]; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); newQuery.GetGroupTitle().StaticText = displayText; break; case SplitByKind.Definition: if (newQuery.DictDefNames == null) { return(false); } if (newQuery.DictDefNames.ContainsKey(PIn.Long(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString()))) { displayText = newQuery.DictDefNames[PIn.Long(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString())]; newQuery.GetGroupTitle().Size = new Size((int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Width / grfx.DpiX * 100 + 2), (int)(grfx.MeasureString(displayText, newQuery.GetGroupTitle().Font).Height / grfx.DpiY * 100 + 2)); newQuery.GetGroupTitle().StaticText = displayText; } else { newQuery.GetGroupTitle().StaticText = Lans.g(this, "Undefined"); } break; case SplitByKind.Date: newQuery.GetGroupTitle().StaticText = PIn.Date(newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString()).ToShortDateString(); break; case SplitByKind.Value: newQuery.GetGroupTitle().StaticText = newQuery.ReportTable.Rows[0][query.ColumnNameToSplitOn].ToString(); break; } newQuery.SubmitQuery(); newQuery.IsLastSplit = true; newReportObjects.Add(newQuery); } else { newReportObjects.Add(_reportObjects[i]); } } else { newReportObjects.Add(_reportObjects[i]); } } if (!hasRows && isShowMessage) { _actionCloseReportProgress?.Invoke(); MsgBox.Show(this, "The report has no results to show."); return(false); } _reportObjects = newReportObjects; return(true); }
private void FillGrid() { Cursor = Cursors.WaitCursor; gridMain.BeginUpdate(); List <DisplayField> fields = DisplayFields.GetForCategory(DisplayFieldCategory.CEMTSearchPatients); if (gridMain.Columns.Count == 0) //Init only once. { foreach (DisplayField field in fields) { string heading = field.InternalName; if (string.IsNullOrEmpty(heading)) { heading = field.Description; } gridMain.Columns.Add(new ODGridColumn(heading, field.ColumnWidth)); } } gridMain.Rows.Clear(); ODGridRow row; for (int i = 0; i < _dataConnPats.Tables.Count; i++) { for (int j = 0; j < _dataConnPats.Tables[i].Rows.Count; j++) { row = new ODGridRow(); foreach (DisplayField field in fields) { switch (field.InternalName) { #region Row Cell Filling case "Conn": row.Cells.Add(_dataConnPats.Tables[i].TableName); break; case "PatNum": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["PatNum"].ToString()); break; case "LName": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["LName"].ToString()); break; case "FName": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["FName"].ToString()); break; case "SSN": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["SSN"].ToString()); break; case "PatStatus": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["PatStatus"].ToString()); break; case "Age": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["age"].ToString()); break; case "City": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["City"].ToString()); break; case "State": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["State"].ToString()); break; case "Address": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["Address"].ToString()); break; case "Wk Phone": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["WkPhone"].ToString()); break; case "Email": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["Email"].ToString()); break; case "ChartNum": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["ChartNumber"].ToString()); break; case "MI": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["MiddleI"].ToString()); break; case "Pref Name": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["Preferred"].ToString()); break; case "Hm Phone": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["HmPhone"].ToString()); break; case "Bill Type": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["BillingType"].ToString()); break; case "Pri Prov": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["PriProv"].ToString()); break; case "Birthdate": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["Birthdate"].ToString()); break; case "Site": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["site"].ToString()); break; case "Clinic": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["clinic"].ToString()); break; case "Wireless Ph": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["WirelessPhone"].ToString()); break; case "Sec Prov": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["SecProv"].ToString()); break; case "LastVisit": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["lastVisit"].ToString()); break; case "NextVisit": row.Cells.Add(_dataConnPats.Tables[i].Rows[j]["nextVisit"].ToString()); break; #endregion } } row.Tag = ListConns.Find(x => ((x.ServerName + ", " + x.DatabaseName) == _dataConnPats.Tables[i].TableName || x.ServiceURI == _dataConnPats.Tables[i].TableName)); gridMain.Rows.Add(row); } } gridMain.EndUpdate(); Cursor = Cursors.Default; if (_complConnAmt == ListConns.Count) { ODThread.QuitSyncThreadsByGroupName(1, "FetchPats"); //Clean up finished threads. butRefresh.Text = Lans.g(this, "Refresh"); labelFetch.Visible = false; if (!_hasWarningShown && _invalidConnsLog != "") { _hasWarningShown = true; //Keeps the message box from showing up for subsequent threads. MessageBox.Show(this, Lan.g(this, "Could not connect to the following servers") + ":" + _invalidConnsLog); } } else { butRefresh.Text = Lans.g(this, "Stop Refresh"); labelFetch.Visible = true; } }
protected override void OnPatientStoreOpened(EventArgs e, object sender) { if (Patient.ImageFolder == "") //creates new folder for patient if none present { string name = Patient.LName + Patient.FName; string folder = ""; for (int i = 0; i < name.Length; i++) { if (Char.IsLetter(name, i)) { folder += name.Substring(i, 1); } } folder += Patient.PatNum.ToString(); //ensures unique name try { Patient PatOld = Patient.Copy(); Patient.ImageFolder = folder; patFolder = ODFileUtils.CombinePaths(new string[] { FileStoreSettings.GetPreferredImagePath, Patient.ImageFolder.Substring(0, 1).ToUpper(), Patient.ImageFolder }); Directory.CreateDirectory(patFolder); ImageStore.UpdatePatient(Patient, PatOld); } catch { throw new Exception(Lan.g("ContrDocs", "Error. Could not create folder for patient. ")); return; } } else //patient folder already created once { patFolder = ODFileUtils.CombinePaths(new string[] { FileStoreSettings.GetPreferredImagePath, Patient.ImageFolder.Substring(0, 1).ToUpper(), Patient.ImageFolder }); } if (!Directory.Exists(patFolder)) //this makes it more resiliant and allows copies //of the opendentaldata folder to be used in read-only situations. { try { Directory.CreateDirectory(patFolder); } catch { throw new Exception(Lan.g("ContrDocs", "Error. Could not create folder for patient. ")); } } //now find all files in the patient folder that are not in the db and add them DirectoryInfo di = new DirectoryInfo(patFolder); FileInfo[] fiList = di.GetFiles(); string[] fileList = new string[fiList.Length]; for (int i = 0; i < fileList.Length; i++) { fileList[i] = fiList[i].Name; } int countAdded = Documents.InsertMissing(Patient, fileList); if (countAdded > 0) { Debug.WriteLine(countAdded.ToString() + " documents found and added to the first category."); } //it will refresh in FillDocList }
private void FillClinics() { if(!Db.HasDatabaseConnection && !Security.IsUserLoggedIn) { return; } try { if(!PrefC.HasClinicsEnabled) { Visible=false; return; } Items.Clear(); List<Clinic> listClinics=Clinics.GetForUserod(Security.CurUser); if(!Security.CurUser.ClinicIsRestricted || listClinics.Count > 1) { Items.Add(new ODBoxItem<Clinic>(Lan.g("ComboBoxClinicMulti","All"),new Clinic { Abbr=Lan.g("ComboBoxClinicMulti","All"), Description=Lan.g("ComboBoxClinicMulti","All"),ClinicNum=CLINIC_NUM_ALL })); } if(!Security.CurUser.ClinicIsRestricted) { Items.Add(new ODBoxItem<Clinic>(Lan.g("ComboBoxClinicMulti",HqDescription),new Clinic { Abbr=Lan.g("ComboBoxClinicMulti",HqDescription), Description=Lan.g("ComboBoxClinicMulti",HqDescription),ClinicNum=0 })); } foreach(Clinic clinic in listClinics.OrderBy(x => x.Abbr)) { Items.Add(new ODBoxItem<Clinic>(clinic.Abbr,clinic)); } if(Items.Count > 0) { ListSelectedClinicNums=new List<long> { Clinics.ClinicNum }; } } catch(Exception ex) { ex.DoNothing(); } }
private void FillControl() { labelClinicName.Text = Signup.ClinicNum != 0 ? Clinics.GetDesc(Signup.ClinicNum) : Lan.g(this, "Headquarters"); labelEnabled.Text = Signup.IsEnabled ? Lan.g(this, "Enabled") : Lan.g(this, "Disabled"); FillGrid(); }
private bool CheckTableStatus() { bool rValOK_TO_RUN = false; if (!TableExists(TABLENAME)) { DialogResult dr = MessageBox.Show(Lan.g(this, "The Table for holding provider split infomation generated\n" + "by MyAllocator1 does not exist." + "Creation of this table is required create set up allocation by provider\n" + "according to the rules in MyAllocator1.\n\n" + "Do you want to create this table?"), Lan.g(this, "Create Table"), MessageBoxButtons.YesNoCancel); if (dr == DialogResult.Yes) { Db.NonQOld(MyAllocator1_ProviderPayment.CreatTableString(OpenDentBusiness.DatabaseType.MySql)); } } rValOK_TO_RUN = TableExists(TABLENAME); return(rValOK_TO_RUN); }
/// <summary> /// Returns a list of guarantors that require allocation. /// Will look for a half finished job from previous. /// Returns null if user does not want to continue a suspended job. /// </summary> private int[] Generate_GuarantorList_ToAllocate() { int[] rValue = null; // Check status of an incomplete last run. Did it complete well? string TempTableName = TABLENAME + "_temp"; bool TempTableExists = TableExists(TempTableName); int[] FullyProcessedGuarantors = null; int[] PartiallyProcessedGuarantors = null; List <int> OD_Guarantors = new List <int>(); List <int> OD_Guarantors_NeedProcessing = null; // new List<int>(); // Find fully processed Guarantors #region Check with users on continuing an incomplete batch run if (TempTableExists) { DialogResult dr = MessageBox.Show(Lan.g(this, "Processing was incomplete during last\n" + "run of the batch allocation process. Do you want to start over?\n" + "This will likely result in a loss of data but the data will\n" + "be rebuilt\n\nDO YOU WANT TO START OVER?"), "Warning", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) // THEY Want to START OVER --DROP TABLE AND RECREATE { string dropCommand = "DROP TABLE " + TABLENAME + "_temp"; Db.NonQOld(dropCommand); dropCommand = "DROP TABLE " + TABLENAME; Db.NonQOld(dropCommand); Db.NonQOld(CreatTableString(OpenDentBusiness.DatabaseType.MySql)); Db.NonQOld(Create_AP_temp_table_string(OpenDentBusiness.DatabaseType.MySql)); } if (dr == DialogResult.No) // Don't want to start over { DialogResult dr2 = MessageBox.Show(Lan.g(this, "Do you want to continue from where you left of?\n" + "If you state no the allocation process will be aborted.\n\nContinue?"), Lan.g(this, "Continue?"), MessageBoxButtons.YesNo); if (dr2 == DialogResult.No) { return(null); // don't want to continue } } } else // Temp table does not exists so create it! { Db.NonQOld(Create_AP_temp_table_string(OpenDentBusiness.DatabaseType.MySql)); } #endregion // Here is what needs to be done: // 1) Find Guarantors with incomplete processing // 2) Drop the entries in the allocation_provier table associated with this guarantor // 3) Set _temp table Status for this guarantor // 4) Generate a list of unprocessed guarantors. // continuing #region Handle Incomplete Proccessed Guarantors string cmd2 = "SELECT tempIndex, Guarantor, AllocStatus FROM " + TempTableName + " WHERE AllocStatus = " + ((int)ProcessingState.Started_and_Incomplete).ToString(); DataTable dt = Db.GetTableOld(cmd2); if (dt.Rows.Count != 0) { string deleteCommand1 = "DELETE FROM " + TABLENAME + " WHERE "; string updateCommand1 = "UPDATE " + TABLENAME + "_temp SET AllocStatus = " + ((int)ProcessingState.NeverStarted).ToString() + "\n WHERE "; PartiallyProcessedGuarantors = new int[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { PartiallyProcessedGuarantors[i] = Int32.Parse(dt.Rows[i][1].ToString()); deleteCommand1 += "\nGuarantor = " + PartiallyProcessedGuarantors[i].ToString() + "\n"; updateCommand1 += "\nGuarantor = " + PartiallyProcessedGuarantors[i].ToString() + "\n"; if (i < dt.Rows.Count - 1) { deleteCommand1 += "OR "; updateCommand1 += "OR "; } } Db.NonQOld(deleteCommand1); // deletes entries from allocation_provider Db.NonQOld(updateCommand1); // updates status in allocation_provider_temp } #endregion #region Generate a list of unprocessed guarantors string ProccessedGuarantors_command = "SELECT Guarantor FROM " + TABLENAME + "_temp WHERE AllocStatus = " + ((int)ProcessingState.Complete); DataTable dt3 = Db.GetTableOld(ProccessedGuarantors_command); DataTable dtODGuarantors = Db.GetTableOld("SELECT DISTINCT(Guarantor) FROM Patient"); for (int i = 0; i < dtODGuarantors.Rows.Count; i++) { OD_Guarantors.Add(Int32.Parse(dtODGuarantors.Rows[i][0].ToString())); } if (dt3.Rows.Count != 0) { FullyProcessedGuarantors = new int[dt3.Rows.Count]; OD_Guarantors_NeedProcessing = new List <int>(); OD_Guarantors_NeedProcessing.AddRange(OD_Guarantors); for (int i = 0; i < dt3.Rows.Count; i++) { FullyProcessedGuarantors[i] = Int32.Parse(dt3.Rows[i][0].ToString()); if (OD_Guarantors_NeedProcessing.Contains(FullyProcessedGuarantors[i])) { OD_Guarantors_NeedProcessing.Remove(FullyProcessedGuarantors[i]); } } } else { OD_Guarantors_NeedProcessing = OD_Guarantors; } #endregion if (OD_Guarantors_NeedProcessing != null) { rValue = OD_Guarantors_NeedProcessing.ToArray(); } return(rValue); }
public UserControlSetupWizComplete(string name) { InitializeComponent(); labelDone.Text = Lan.g(this, "Congratulations! You have finished setting up your " + name + "!"); labelEnd.Text = "\r\n" + Lan.g(this, "You can always go back through this setup wizard if you need to make any modifications to your " + name + "."); }
private void btnImportForms_Click(object sender, EventArgs e) { this.Cursor = Cursors.WaitCursor; XmlDocument x = new XmlDocument(); AddResults("Downloading new patient list..."); try { x.Load(sURL); } catch (Exception ex) { MessageBox.Show("Cannot access account.\r\n\r\nPlease make sure URL, username and password are correct.\r\n\r\nContact www.NewPatientForm.com for help.\r\n\r\n" + ex.Message); this.Close(); return; } if (x.DocumentElement.ChildNodes.Count == 0) { MessageBox.Show("No new patients."); this.Close(); return; } //Now that we have loaded all the new patient forms, loop through //each patient, import the xml and store the pdf file foreach (XmlNode ndeMessage in x.DocumentElement.ChildNodes) { string sPatientName = ""; try { sPatientName += ndeMessage.SelectSingleNode("PatientIdentification/NameLast").InnerText; } catch { AddResults("No lastname found."); } try { sPatientName += ", " + ndeMessage.SelectSingleNode("PatientIdentification/NameFirst").InnerText; } catch { AddResults("No firstname found."); } if (MessageBox.Show("Do you want to import information for " + sPatientName + " ?", "", MessageBoxButtons.OKCancel) == DialogResult.OK) { AddResults("Adding patient " + sPatientName); string sPDF = ""; try { sPDF = ndeMessage.SelectSingleNode("PatientIdentification/NewPatientForm").InnerText; } catch { AddResults("No pdf form found."); } //We have the encoded pdf in sPDF string so lets //delete that node and try to import the patient ndeMessage.SelectSingleNode("PatientIdentification").RemoveChild(ndeMessage.SelectSingleNode("PatientIdentification/NewPatientForm")); FormImportXML frmX = new FormImportXML(); frmX.textMain.Text = ndeMessage.OuterXml; frmX.butOK_Click(null, null); //The patient info is entered, let's save the pdf document to the images folder try { //We'll be working with a document //First make sure we have a directory and //everything is up to date ContrDocs cd = new ContrDocs(); cd.RefreshModuleData(frmX.existingPatOld.PatNum); Document DocCur = new Document(); OpenFileDialog openFileDialog = new OpenFileDialog(); DocCur.FileName = ".pdf"; DocCur.DateCreated = DateTime.Today; //Find the category, hopefully 'Patient Information' //otherwise, just default to first one int iCategory = iCategory = DefB.Short[(int)DefCat.ImageCats][0].DefNum;; for (int i = 0; i < DefB.Short[(int)DefCat.ImageCats].Length; i++) { if (DefB.Short[(int)DefCat.ImageCats][i].ItemName == "Patient Information") { iCategory = DefB.Short[(int)DefCat.ImageCats][i].DefNum; } } DocCur.DocCategory = iCategory; DocCur.ImgType = ImageType.Document; DocCur.Description = "New Patient Form"; DocCur.WithPat = cd.PatCur.PatNum; Documents.Insert(DocCur, cd.PatCur);//this assigns a filename and saves to db try { // Convert the Base64 UUEncoded input into binary output. byte[] binaryData = System.Convert.FromBase64String(sPDF); // Write out the decoded data. System.IO.FileStream outFile = new System.IO.FileStream(cd.patFolder + DocCur.FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write); outFile.Write(binaryData, 0, binaryData.Length); outFile.Close(); //Above is the code to save the file to a particular directory from NewPatientForm.com } catch { MessageBox.Show(Lan.g(this, "Unable to write pdf file to disk.")); Documents.Delete(DocCur); } } catch { AddResults("Could not save pdf file to patient's file."); } AddResults("Done writing pdf file to disk"); } else { AddResults("Cacelled import for " + sPatientName + "."); } } this.Cursor = Cursors.Default; MessageBox.Show("Import complete.\r\n\r\nIf any form imports were cancelled or unsuccessful\r\nthey will need to be imported manually."); btnImportForms.Enabled = false; //clear form instanciations }
///<summary>Adds the xml for one statement.</summary> public static void GenerateOneStatement(XmlWriter writer, Statement stmt, Patient pat, Family fam, DataSet dataSet) { Patient guar = fam.ListPats[0]; writer.WriteStartElement("Statement"); //writer.WriteAttributeString("CreditCardChoice",PrefC.GetString(PrefName.BillingElectCreditCardChoices")); //remit address---------------------------------------------------------- writer.WriteStartElement("RemitAddress"); if (PrefC.HasClinicsEnabled && Clinics.GetCount() > 0 && //if using clinics Clinics.GetClinic(guar.ClinicNum) != null) //and this guar is assigned to a clinic { Clinic clinic = Clinics.GetClinic(guar.ClinicNum); writer.WriteElementString("Name", clinic.Description); writer.WriteElementString("Address", clinic.Address); writer.WriteElementString("Address2", clinic.Address2); writer.WriteElementString("City", clinic.City); writer.WriteElementString("State", clinic.State); writer.WriteElementString("Zip", clinic.Zip); string phone = ""; if (clinic.Phone.Length == 10) { phone = "(" + clinic.Phone.Substring(0, 3) + ")" + clinic.Phone.Substring(3, 3) + "-" + clinic.Phone.Substring(6); } writer.WriteElementString("Phone", phone); } else //not using clinics { writer.WriteElementString("Name", PrefC.GetString(PrefName.PracticeTitle)); writer.WriteElementString("Address", PrefC.GetString(PrefName.PracticeAddress)); writer.WriteElementString("Address2", PrefC.GetString(PrefName.PracticeAddress2)); writer.WriteElementString("City", PrefC.GetString(PrefName.PracticeCity)); writer.WriteElementString("State", PrefC.GetString(PrefName.PracticeST)); writer.WriteElementString("Zip", PrefC.GetString(PrefName.PracticeZip)); writer.WriteElementString("Phone", PrefC.GetString(PrefName.PracticePhone)); } writer.WriteEndElement(); //RemitAddress //Patient------------------------------------------------------------------------------- writer.WriteStartElement("Patient"); writer.WriteElementString("Name", guar.GetNameFLFormal()); writer.WriteElementString("AccountNum", guar.PatNum.ToString()); writer.WriteElementString("Address", guar.Address); writer.WriteElementString("Address2", guar.Address2); writer.WriteElementString("City", guar.City); writer.WriteElementString("State", guar.State); writer.WriteElementString("Zip", guar.Zip); writer.WriteEndElement(); //Patient //Account summary----------------------------------------------------------------------- writer.WriteStartElement("AccountSummary"); if (PrefC.GetLong(PrefName.StatementsCalcDueDate) == -1) { writer.WriteElementString("DueDate", Lan.g("FormRpStatement", "Upon Receipt")); } else { DateTime dueDate = DateTime.Today.AddDays(PrefC.GetLong(PrefName.StatementsCalcDueDate)); writer.WriteElementString("DueDate", dueDate.ToString("MM/dd/yyyy")); } writer.WriteElementString("StatementDate", stmt.DateSent.ToString("MM/dd/yyyy")); DataTable tableAccount = null; for (int i = 0; i < dataSet.Tables.Count; i++) { if (dataSet.Tables[i].TableName.StartsWith("account")) { tableAccount = dataSet.Tables[i]; } } //on a regular printed statement, the amount due at the top might be different from the balance at the middle right. //This is because of payment plan balances. //But in e-bills, there is only one amount due. //Insurance estimate is already subtracted, and payment plan balance is already added. double amountDue = guar.BalTotal; //add payplan due amt: for (int m = 0; m < dataSet.Tables["misc"].Rows.Count; m++) { if (dataSet.Tables["misc"].Rows[m]["descript"].ToString() == "payPlanDue") { amountDue += PIn.Double(dataSet.Tables["misc"].Rows[m]["value"].ToString()); } } if (PrefC.GetBool(PrefName.BalancesDontSubtractIns)) { writer.WriteElementString("EstInsPayments", ""); //optional. } else //this is typical { writer.WriteElementString("EstInsPayments", guar.InsEst.ToString("F2")); //optional. amountDue -= guar.InsEst; } InstallmentPlan installPlan = InstallmentPlans.GetOneForFam(guar.PatNum); if (installPlan != null) { //show lesser of normal total balance or the monthly payment amount. if (installPlan.MonthlyPayment < amountDue) { amountDue = installPlan.MonthlyPayment; } } writer.WriteElementString("AmountDue", amountDue.ToString("F2")); writer.WriteElementString("Bal_0_30", guar.Bal_0_30.ToString("F2")); writer.WriteElementString("Bal_31_60", guar.Bal_31_60.ToString("F2")); writer.WriteElementString("Bal_61_90", guar.Bal_61_90.ToString("F2")); writer.WriteElementString("BalOver90", guar.BalOver90.ToString("F2")); writer.WriteEndElement(); //AccountSummary //Notes----------------------------------------------------------------------------------- writer.WriteStartElement("Notes"); if (stmt.NoteBold != "") { writer.WriteStartElement("Note"); writer.WriteAttributeString("FgColor", ColorToHexString(Color.DarkRed)); writer.WriteCData(stmt.NoteBold); writer.WriteEndElement(); //Note } if (stmt.Note != "") { writer.WriteStartElement("Note"); writer.WriteAttributeString("FgColor", ColorToHexString(Color.Black)); writer.WriteCData(stmt.Note); writer.WriteEndElement(); //Note } writer.WriteEndElement(); //Notes //Detail items------------------------------------------------------------------------------ writer.WriteStartElement("DetailItems"); string descript; string fulldesc; string procCode; string tth; string[] lineArray; List <string> lines; DateTime date; int seq = 0; for (int i = 0; i < tableAccount.Rows.Count; i++) { procCode = tableAccount.Rows[i]["ProcCode"].ToString(); tth = tableAccount.Rows[i]["tth"].ToString(); descript = tableAccount.Rows[i]["description"].ToString(); fulldesc = procCode + " " + tth + " " + descript; lineArray = fulldesc.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); lines = new List <string>(lineArray); //We assume that the line limit is 40 char. if (lines[0].Length > 40) { string newline = lines[0].Substring(40); lines[0] = lines[0].Substring(0, 40); //first half lines.Insert(1, newline); //second half } for (int li = 0; li < lines.Count; li++) { writer.WriteStartElement("Item"); writer.WriteAttributeString("sequence", seq.ToString()); if (li == 0) { date = (DateTime)tableAccount.Rows[i]["DateTime"]; writer.WriteElementString("Date", date.ToString("MM/dd/yyyy")); writer.WriteElementString("PatientName", tableAccount.Rows[i]["patient"].ToString()); } else { writer.WriteElementString("Date", ""); writer.WriteElementString("PatientName", ""); } writer.WriteElementString("Description", lines[li]); if (li == 0) { writer.WriteElementString("Charges", tableAccount.Rows[i]["charges"].ToString()); writer.WriteElementString("Credits", tableAccount.Rows[i]["credits"].ToString()); writer.WriteElementString("Balance", tableAccount.Rows[i]["balance"].ToString()); } else { writer.WriteElementString("Charges", ""); writer.WriteElementString("Credits", ""); writer.WriteElementString("Balance", ""); } writer.WriteEndElement(); //Item seq++; } } writer.WriteEndElement(); //DetailItems writer.WriteEndElement(); //Statement }
///<summary>Adds the xml for one statement. Validation is performed here. Throws an exception if there is a validation failure.</summary> public static void GenerateOneStatement(XmlWriter writer, Statement stmt, Patient pat, Family fam, DataSet dataSet) { DataTable tableMisc = dataSet.Tables["misc"]; DataTable tableAccount = dataSet.Tables.OfType <DataTable>().FirstOrDefault(x => x.TableName.StartsWith("account")); Patient guar = fam.ListPats[0]; if (!Regex.IsMatch(guar.State, "^[A-Z]{2}$")) { throw new ApplicationException(Lan.g("EHG_Statements", "Guarantor state must be two uppercase characters.") + " " + guar.FName + " " + guar.LName + " #" + guar.PatNum); } writer.WriteStartElement("EisStatement"); writer.WriteAttributeString("OutputFormat", "StmOut_Blue6Col"); writer.WriteAttributeString("CreditCardChoice", PrefC.GetString(PrefName.BillingElectCreditCardChoices)); writer.WriteStartElement("Patient"); writer.WriteElementString("Name", guar.GetNameFLFormal()); writer.WriteElementString("Account", guar.PatNum.ToString()); writer.WriteElementString("Address1", guar.Address); writer.WriteElementString("Address2", guar.Address2); writer.WriteElementString("City", guar.City); writer.WriteElementString("State", guar.State); writer.WriteElementString("Zip", guar.Zip); writer.WriteElementString("EMail", guar.Email); //Account summary----------------------------------------------------------------------- writer.WriteStartElement("AccountSummary"); if (stmt.DateRangeFrom.Year < 1880) //make up a statement date. { writer.WriteElementString("PriorStatementDate", DateTime.Today.AddMonths(-1).ToString("MM/dd/yyyy")); } else { writer.WriteElementString("PriorStatementDate", stmt.DateRangeFrom.AddDays(-1).ToString("MM/dd/yyyy")); } DateTime dueDate; if (PrefC.GetLong(PrefName.StatementsCalcDueDate) == -1) { dueDate = DateTime.Today.AddDays(10); } else { dueDate = DateTime.Today.AddDays(PrefC.GetLong(PrefName.StatementsCalcDueDate)); } writer.WriteElementString("DueDate", dueDate.ToString("MM/dd/yyyy")); writer.WriteElementString("StatementDate", stmt.DateSent.ToString("MM/dd/yyyy")); double balanceForward = tableMisc.Rows.OfType <DataRow>().Where(x => x["descript"].ToString() == "balanceForward") .Select(x => PIn.Double(x["value"].ToString())).FirstOrDefault();//defaults to 0 writer.WriteElementString("PriorBalance", balanceForward.ToString("F2")); writer.WriteElementString("RunningBalance", ""); //for future use writer.WriteElementString("PerPayAdj", ""); //optional writer.WriteElementString("InsPayAdj", ""); //optional writer.WriteElementString("Adjustments", ""); //for future use double charges = tableAccount.Rows.OfType <DataRow>().Sum(x => PIn.Double(x["chargesDouble"].ToString())); writer.WriteElementString("NewCharges", charges.ToString("F2")); //optional writer.WriteElementString("FinanceCharges", ""); //for future use double credits = tableAccount.Rows.OfType <DataRow>().Sum(x => PIn.Double(x["creditsDouble"].ToString())); writer.WriteElementString("Credits", credits.ToString("F2")); //On a regular printed statement, the amount due at the top might be different from the balance at the middle right due to payplan balances. //But in e-bills, there is only one amount due. Insurance estimate is already subtracted, and payment plan balance is already added. double amountDue = guar.BalTotal; if (PrefC.GetInt(PrefName.PayPlansVersion) == 1) //with version 2, payplan debits/credits are aged individually and are included in guar.BalTotal { amountDue += tableMisc.Rows.OfType <DataRow>().Where(x => x["descript"].ToString() == "payPlanDue") .Select(x => PIn.Double(x["value"].ToString())).DefaultIfEmpty(0).Sum(); //add payplan(s) due amt } double insEst = 0; if (!PrefC.GetBool(PrefName.BalancesDontSubtractIns)) //this is typical { insEst = guar.InsEst; } InstallmentPlan installPlan = InstallmentPlans.GetOneForFam(guar.PatNum); if (installPlan != null && installPlan.MonthlyPayment < (amountDue - insEst)) { amountDue = installPlan.MonthlyPayment; insEst = 0; } writer.WriteElementString("EstInsPayments", insEst.ToString("F2")); //optional. writer.WriteElementString("PatientShare", (amountDue - insEst).ToString("F2")); writer.WriteElementString("CurrentBalance", amountDue.ToString("F2")); //this is ambiguous. It seems to be AmountDue, but it could be 0-30 days aging writer.WriteElementString("PastDue30", guar.Bal_31_60.ToString("F2")); //optional writer.WriteElementString("PastDue60", guar.Bal_61_90.ToString("F2")); //optional writer.WriteElementString("PastDue90", guar.BalOver90.ToString("F2")); //optional writer.WriteElementString("PastDue120", ""); //optional writer.WriteEndElement(); //AccountSummary //Notes----------------------------------------------------------------------------------- writer.WriteStartElement("Notes"); if (stmt.NoteBold != "") { writer.WriteStartElement("Note"); writer.WriteAttributeString("FgColor", "Red"); //ColorToHexString(Color.DarkRed)); //writer.WriteAttributeString("BgColor",ColorToHexString(Color.White)); writer.WriteCData(stmt.NoteBold.Left(500)); //Limit of 500 char on notes. writer.WriteEndElement(); //Note } if (stmt.Note != "") { writer.WriteStartElement("Note"); //writer.WriteAttributeString("FgColor",ColorToHexString(Color.Black)); //writer.WriteAttributeString("BgColor",ColorToHexString(Color.White)); writer.WriteCData(stmt.Note.Left(500)); //Limit of 500 char on notes. writer.WriteEndElement(); //Note } writer.WriteEndElement(); //Notes //Detail items------------------------------------------------------------------------------ writer.WriteStartElement("DetailItems"); List <string> lines; int seq = 0; //Jessica at DentalXchange says limit is 120. Specs say limit is 30. //If we send more than 50 characters, DentalXChange will break the line at the 50th character, even if it is in the middle of a word, and wrap //the rest of the line, so up to 70 chars onto line 2, which could easily extend past the end of the description field. The wrapped line will //also have a different line spacing than if sent as a separate xml element. See the examples in //...\Programmers Documents\eClaims Clearinghouse and Carrier Specific Details\DentalXChange ClaimConnect\ClaimConnect - EHG - WebClaim\EHG Statements\Examples //Example: original description: //line 1: 'D6103 5 bone graft for repair of periimplant defect - does not include flap entry and closure. Placement of a barrier membrane or biologic materials to aid in osseous regeneration are reported separately' //version 16.2 sent as: //line 1: 'D6103 5 bone graft for repair of periimplant defect - does not include flap entry and closure. Placement of a barrier ' //line 2: 'membrane or biologic materials to aid in osseous regeneration are reported separately' //DentalXChange displayed lines as (with line 2 extended past the end of the description field): //line 1: 'D6103 5 bone graft for repair of periimplant defe -' //line 2: 'ct - does not include flap entry and closure. Placement of a barrier' //line 3: 'membrane or biologic materials to aid in osseous r -' //line 4: 'egeneration are reported separately' //version 16.3 and up sent and displayed as: //line 1: 'D6103 5 bone graft for repair of periimplant' //line 2: 'defect - does not include flap entry and closure.' //line 3: 'Placement of a barrier membrane or biologic' //line 4: 'materials to aid in osseous regeneration are' //line 5: 'reported separately' const int lineMaxLen = 50; int firstIndexNewLine; string lineCur; foreach (DataRow rowCur in tableAccount.Rows) { //There are frequently CRs within a procedure description for things like ins est. lines = string.Join(" ", new[] { rowCur["ProcCode"].ToString(), rowCur["tth"].ToString(), rowCur["description"].ToString() }) .Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToList(); for (int li = 0; li < lines.Count; li++) { lineCur = lines[li]; if (lineCur.Length < 1 || lineCur.All(x => char.IsWhiteSpace(x))) //nothing to write { continue; } writer.WriteStartElement("DetailItem"); //has a child item. We won't add optional child note writer.WriteAttributeString("sequence", seq.ToString()); writer.WriteStartElement("Item"); writer.WriteElementString("Date", li == 0?PIn.Date(rowCur["DateTime"].ToString()).ToString("MM/dd/yyyy"):""); writer.WriteElementString("PatientName", li == 0?rowCur["patient"].ToString():""); if (lineCur.Length > lineMaxLen) { firstIndexNewLine = lineMaxLen; for (int c = lineMaxLen - 2; c > -1; c--) //-2, 1 for length to index and 1 so we can safely check index and index+1 { if (!char.IsWhiteSpace(lineCur[c]) && char.IsWhiteSpace(lineCur[c + 1])) { firstIndexNewLine = c + 1; break; } } lines.Insert(li + 1, lineCur.Substring(firstIndexNewLine).Trim()); lines[li] = lineCur.Left(firstIndexNewLine); } writer.WriteStartElement("Description"); writer.WriteCData(lines[li]); //CData to allow any string, including punctuation, syntax characters and special characters. writer.WriteEndElement(); //Description writer.WriteElementString("Charges", li == 0?rowCur["charges"].ToString():""); writer.WriteElementString("Credits", li == 0?rowCur["credits"].ToString():""); writer.WriteElementString("Balance", li == 0?rowCur["balance"].ToString():""); writer.WriteEndElement(); //Item writer.WriteEndElement(); //DetailItem seq++; } #region Notes Don't Display On Statements /*The code below just didn't work because notes don't get displayed on the statement. * linedesc=lines[0]; * note=""; * if(linedesc.Length>30) { * note=linedesc.Substring(30); * linedesc=linedesc.Substring(0,30); * } * for(int l=1;l<lines.Length;l++) { * if(note!="") { * note+="\r\n"; * } * note+=lines[l]; * } * * if(note!="") { * writer.WriteStartElement("Note"); * //we're not going to specify colors here since they're optional * writer.WriteCData(note); * writer.WriteEndElement();//Note * }*/ #endregion Notes Don't Display On Statements } writer.WriteEndElement(); //DetailItems writer.WriteEndElement(); //Patient writer.WriteEndElement(); //EisStatement }
///<summary></summary> public static void SendData(Program ProgramCur, Patient pat) { string path = Programs.GetProgramPath(ProgramCur); if (pat == null) { MsgBox.Show("Carestream", "Please select a patient first."); return; } string infoFile = ProgramProperties.GetPropVal(ProgramCur.ProgramNum, "Patient.ini path"); if (infoFile.Length > 150) { MsgBox.Show("Carestream", "Patient.ini file folder path too long. Must be 150 characters or less."); return; } string id = ""; if (ProgramProperties.GetPropVal(ProgramCur.ProgramNum, "Enter 0 to use PatientNum, or 1 to use ChartNum") == "0") { id = pat.PatNum.ToString(); } else { id = pat.ChartNumber; } try { using (StreamWriter sw = new StreamWriter(infoFile, false)) { //Create file if does not exist. Overwrite contents if exists. sw.WriteLine("[PATIENT]"); sw.WriteLine("ID=" + Tidy(id, 15)); sw.WriteLine("FIRSTNAME=" + Tidy(pat.FName, 255)); if (!string.IsNullOrEmpty(pat.Preferred)) { sw.WriteLine("COMMONNAME=" + Tidy(pat.Preferred, 255)); } sw.WriteLine("LASTNAME=" + Tidy(pat.LName, 255)); if (!string.IsNullOrEmpty(pat.MiddleI)) { sw.WriteLine("MIDDLENAME=" + Tidy(pat.MiddleI, 255)); } if (pat.Birthdate.Year > 1880) { sw.WriteLine("DOB=" + pat.Birthdate.ToString("yyyyMMdd")); } if (pat.Gender == PatientGender.Female) { sw.Write("GENDER=F"); } else if (pat.Gender == PatientGender.Male) { sw.Write("GENDER=M"); } } } catch (Exception ex) { MessageBox.Show(Lan.g("Carestream", "Unable to write to file") + ": " + infoFile + "\r\n" + Lan.g("Carestream", "Error") + ": " + ex.Message); return; } try { string arguments = @"-I """ + infoFile + @""""; Process.Start(path, arguments); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
///<summary>Prints one section other than details at the specified x and y position on the page. The math to decide whether it will fit on the current page is done ahead of time. There is no mechanism for splitting a section across multiple pages.</summary> private void PrintSection(Graphics g, Section section, int xPos, int yPos) { ReportObject textObject; ReportObject fieldObject; //LineObject lineObject; //BoxObject boxObject; StringFormat strFormat; //used each time text is drawn to handle alignment issues //string rawText="";//the raw text for a given field as taken from the database string displayText = ""; //The formatted text to print foreach (ReportObject reportObject in MyReport.ReportObjects) { //todo later: check for lines and boxes that span multiple sections. if (reportObject.SectionName != section.Name) { continue; } if (reportObject.ObjectKind == ReportObjectKind.TextObject) { textObject = reportObject; strFormat = ReportObject.GetStringFormat(textObject.TextAlign); RectangleF layoutRect = new RectangleF(xPos + textObject.Location.X , yPos + textObject.Location.Y , textObject.Size.Width, textObject.Size.Height); g.DrawString(textObject.StaticText, textObject.Font, Brushes.Black, layoutRect, strFormat); } else if (reportObject.ObjectKind == ReportObjectKind.FieldObject) { fieldObject = reportObject; strFormat = ReportObject.GetStringFormat(fieldObject.TextAlign); RectangleF layoutRect = new RectangleF(xPos + fieldObject.Location.X , yPos + fieldObject.Location.Y , fieldObject.Size.Width, fieldObject.Size.Height); displayText = ""; if (fieldObject.FieldKind == FieldDefKind.SummaryField) { displayText = fieldObject.GetSummaryValue (MyReport.ReportTable, MyReport.DataFields.IndexOf (fieldObject.SummarizedField)) .ToString(fieldObject.FormatString); } else if (fieldObject.FieldKind == FieldDefKind.SpecialField) { if (fieldObject.SpecialType == SpecialFieldType.PageNofM) //not functional yet //displayText=Lan.g(this,"Page")+" "+(pagesPrinted+1).ToString() // +Lan.g( { } else if (fieldObject.SpecialType == SpecialFieldType.PageNumber) { displayText = Lan.g(this, "Page") + " " + (pagesPrinted + 1).ToString(); } } g.DrawString(displayText, fieldObject.Font, Brushes.Black, layoutRect, strFormat); } //incomplete: else if lines //incomplete: else if boxes. } //foreach reportObject //sectionsPrinted=sectionIndex+1;//mark current section as printed. //MessageBox.Show(pagesPrinted.ToString()+","+sectionsPrinted.ToString()); //yPos+=section.Height;//set current yPos to the bottom of the section just printed. }
///<summary>Returns true if the communications were successful, and false if they failed. Both sends and retrieves.</summary> public static bool Launch(Clearinghouse clearhouse, int batchNum) { clearinghouse = clearhouse; //Before this function is called, the X12 file for the current batch has already been generated in //the clearinghouse export folder. The export folder will also contain batch files which have failed //to upload from previous attempts and we must attempt to upload these older batch files again if //there are any. //Step 1: Retrieve reports regarding the existing pending claim statuses. //Step 2: Send new claims in a new batch. bool success = true; //Connect to the Denti-Cal SFTP server. Session session = null; Channel channel = null; ChannelSftp ch = null; JSch jsch = new JSch(); try { session = jsch.getSession(clearinghouse.LoginID, remoteHost); session.setPassword(clearinghouse.Password); Hashtable config = new Hashtable(); config.Add("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); channel = session.openChannel("sftp"); channel.connect(); ch = (ChannelSftp)channel; } catch (Exception ex) { MessageBox.Show(Lan.g("DentiCal", "Connection Failed") + ": " + ex.Message); return(false); } try { string homeDir = "/Home/" + clearhouse.LoginID + "/"; //At this point we are connected to the Denti-Cal SFTP server. if (batchNum == 0) //Retrieve reports. { if (!Directory.Exists(clearhouse.ResponsePath)) { throw new Exception("Clearinghouse response path is invalid."); } //Only retrieving reports so do not send new claims. string retrievePath = homeDir + "out/"; Tamir.SharpSsh.java.util.Vector fileList = ch.ls(retrievePath); for (int i = 0; i < fileList.Count; i++) { string listItem = fileList[i].ToString().Trim(); if (listItem[0] == 'd') { continue; //Skip directories and focus on files. } Match fileNameMatch = Regex.Match(listItem, ".*\\s+(.*)$"); string getFileName = fileNameMatch.Result("$1"); string getFilePath = retrievePath + getFileName; string exportFilePath = CodeBase.ODFileUtils.CombinePaths(clearhouse.ResponsePath, getFileName); Tamir.SharpSsh.java.io.InputStream fileStream = null; FileStream exportFileStream = null; try { fileStream = ch.get(getFilePath); exportFileStream = File.Open(exportFilePath, FileMode.Create, FileAccess.Write); //Creates or overwrites. byte[] dataBytes = new byte[4096]; int numBytes = fileStream.Read(dataBytes, 0, dataBytes.Length); while (numBytes > 0) { exportFileStream.Write(dataBytes, 0, numBytes); numBytes = fileStream.Read(dataBytes, 0, dataBytes.Length); } } catch { success = false; } finally { if (exportFileStream != null) { exportFileStream.Dispose(); } if (fileStream != null) { fileStream.Dispose(); } } if (success) { //Removed the processed report from the Denti-Cal SFTP so it does not get processed again in the future. try { ch.rm(getFilePath); } catch { } } } } else //Send batch of claims. { if (!Directory.Exists(clearhouse.ExportPath)) { throw new Exception("Clearinghouse export path is invalid."); } string[] files = Directory.GetFiles(clearhouse.ExportPath); for (int i = 0; i < files.Length; i++) { //First upload the batch file to a temporary file name. Denti-Cal does not process file names unless they start with the Login ID. //Uploading to a temporary file and then renaming the file allows us to avoid partial file uploads if there is connection loss. string tempRemoteFilePath = homeDir + "in/temp_" + Path.GetFileName(files[i]); ch.put(files[i], tempRemoteFilePath); //Denti-Cal requires the file name to start with the Login ID followed by a period and end with a .txt extension. //The middle part of the file name can be anything. string remoteFilePath = homeDir + "in/" + clearhouse.LoginID + "." + Path.GetFileName(files[i]); ch.rename(tempRemoteFilePath, remoteFilePath); File.Delete(files[i]); //Remove the processed file. } } } catch { success = false; } finally { //Disconnect from the Denti-Cal SFTP server. channel.disconnect(); ch.disconnect(); session.disconnect(); } return(success); }
///<summary> ///This is the new version of SendData that should be linux compliant. ///Advoids the kernal32.WritePrivateProfileString call ///</summary> public static void SendData(Program ProgramCur,Patient pat) { string path=Programs.GetProgramPath(ProgramCur); List<ProgramProperty> ForProgram =ProgramProperties.GetForProgram(ProgramCur.ProgramNum); ProgramProperty PPCur=ProgramProperties.GetCur(ForProgram,"Tiger1.ini path"); string bDayFormat=ProgramProperties.GetCur(ForProgram,"Birthdate format (default MM/dd/yy)").PropertyValue; iniFile=PPCur.PropertyValue; System.Collections.Hashtable htKeyVals=new Hashtable(); if(pat!=null) { if(!File.Exists(iniFile)) { MessageBox.Show("Could not find "+iniFile); return; } htKeyVals["LastName"]=pat.LName; htKeyVals["FirstName"]=pat.FName; //Patient Id can be any string format. PPCur=ProgramProperties.GetCur(ForProgram,"Enter 0 to use PatientNum, or 1 to use ChartNum"); if(PPCur.PropertyValue=="0") { htKeyVals["PatientID"]=pat.PatNum.ToString(); } else { htKeyVals["PatientID"]=pat.ChartNumber; } htKeyVals["PatientSSN"]=pat.SSN; //WriteValue("SubscriberSSN",pat); if(pat.Gender==PatientGender.Female) { htKeyVals["Gender"]="Female"; } else { htKeyVals["Gender"]="Male"; } htKeyVals["DOB"]=pat.Birthdate.ToString(bDayFormat); //WriteValue("ClaimID",pat);??huh htKeyVals["AddrStreetNo"]=pat.Address; //WriteValue("AddrStreetName",pat);?? //WriteValue("AddrSuiteNo",pat);?? htKeyVals["AddrCity"]=pat.City; htKeyVals["AddrState"]=pat.State; htKeyVals["AddrZip"]=pat.Zip; htKeyVals["PhHome"]=LimitLength(pat.HmPhone,13); htKeyVals["PhWork"]=LimitLength(pat.WkPhone,13); if(!WritePrivatePofileString2("Slave",htKeyVals,iniFile)) { MessageBox.Show(Lan.g(null,"Unable to start external program: ")+path); } else { try { Process.Start(path,ProgramCur.CommandLine); } catch { MessageBox.Show(path+" is not available."); } } }//if patient is loaded else { try { Process.Start(path);//should start TigerView without bringing up a pt. } catch { MessageBox.Show(path+" is not available."); } } }
///<summary>Supply a list of ClaimSendQueueItems. Called from FormClaimSend. Can only send to one clearinghouse at a time. Able to send just send one claim. Cannot include Canadian.</summary> public static void SendBatch(List <ClaimSendQueueItem> queueItems, Clearinghouse clearhouse, EnumClaimMedType medType) { string messageText = ""; if (clearhouse.Eformat == ElectronicClaimFormat.Canadian) { MsgBox.Show("Eclaims", "Cannot send Canadian claims as part of Eclaims.SendBatch."); return; } //get next batch number for this clearinghouse int batchNum = Clearinghouses.GetNextBatchNumber(clearhouse); //--------------------------------------------------------------------------------------- //Create the claim file for this clearinghouse if (clearhouse.Eformat == ElectronicClaimFormat.x837D_4010 || clearhouse.Eformat == ElectronicClaimFormat.x837D_5010_dental || clearhouse.Eformat == ElectronicClaimFormat.x837_5010_med_inst) { messageText = x837Controller.SendBatch(queueItems, batchNum, clearhouse, medType); } else if (clearhouse.Eformat == ElectronicClaimFormat.Renaissance) { messageText = Renaissance.SendBatch(queueItems, batchNum); } else if (clearhouse.Eformat == ElectronicClaimFormat.Dutch) { messageText = Dutch.SendBatch(queueItems, batchNum); } else { messageText = ""; //(ElectronicClaimFormat.None does not get sent) } if (messageText == "") //if failed to create claim file properly, { return; //don't launch program or change claim status } //---------------------------------------------------------------------------------------- //Launch Client Program for this clearinghouse if applicable if (clearhouse.CommBridge == EclaimsCommBridge.None) { AttemptLaunch(clearhouse, batchNum); } else if (clearhouse.CommBridge == EclaimsCommBridge.WebMD) { if (!WebMD.Launch(clearhouse, batchNum)) { MessageBox.Show(Lan.g("Eclaims", "Error sending.")); return; } } else if (clearhouse.CommBridge == EclaimsCommBridge.BCBSGA) { if (!BCBSGA.Launch(clearhouse, batchNum)) { MessageBox.Show(Lan.g("Eclaims", "Error sending.")); return; } } else if (clearhouse.CommBridge == EclaimsCommBridge.Renaissance) { AttemptLaunch(clearhouse, batchNum); } else if (clearhouse.CommBridge == EclaimsCommBridge.ClaimConnect) { if (!ClaimConnect.Launch(clearhouse, batchNum)) { MessageBox.Show(Lan.g("Eclaims", "Error sending.")); return; } } else if (clearhouse.CommBridge == EclaimsCommBridge.RECS) { if (!RECS.Launch(clearhouse, batchNum)) { MessageBox.Show("Claim file created, but could not launch RECS client."); //continue; } } else if (clearhouse.CommBridge == EclaimsCommBridge.Inmediata) { if (!Inmediata.Launch(clearhouse, batchNum)) { MessageBox.Show("Claim file created, but could not launch Inmediata client."); //continue; } } else if (clearhouse.CommBridge == EclaimsCommBridge.AOS) // added by SPK 7/13/05 { if (!AOS.Launch(clearhouse, batchNum)) { MessageBox.Show("Claim file created, but could not launch AOS Communicator."); //continue; } } else if (clearhouse.CommBridge == EclaimsCommBridge.PostnTrack) { AttemptLaunch(clearhouse, batchNum); } else if (clearhouse.CommBridge == EclaimsCommBridge.MercuryDE) { if (!MercuryDE.Launch(clearhouse, batchNum)) { MsgBox.Show("Eclaims", "Error sending."); return; } } else if (clearhouse.CommBridge == EclaimsCommBridge.ClaimX) { if (!ClaimX.Launch(clearhouse, batchNum)) { MessageBox.Show("Claim file created, but encountered an error while launching ClaimX Client."); } } else if (clearhouse.CommBridge == EclaimsCommBridge.EmdeonMedical) { if (!EmdeonMedical.Launch(clearhouse, batchNum, medType)) { MessageBox.Show(Lan.g("Eclaims", "Error sending.")); return; } } else if (clearhouse.CommBridge == EclaimsCommBridge.DentiCal) { if (!DentiCal.Launch(clearhouse, batchNum)) { return; //Error message was already shown inside of the DentiCal class. } } else if (clearhouse.CommBridge == EclaimsCommBridge.NHS) { if (!NHS.Launch(clearhouse, batchNum)) { MessageBox.Show(Lan.g("Eclaims", "Error sending.")); return; } } //---------------------------------------------------------------------------------------- //finally, mark the claims sent. (only if not Canadian) EtransType etype = EtransType.ClaimSent; if (clearhouse.Eformat == ElectronicClaimFormat.Renaissance) { etype = EtransType.Claim_Ren; } if (clearhouse.Eformat != ElectronicClaimFormat.Canadian) { for (int j = 0; j < queueItems.Count; j++) { Etrans etrans = Etranss.SetClaimSentOrPrinted(queueItems[j].ClaimNum, queueItems[j].PatNum, clearhouse.ClearinghouseNum, etype, batchNum); Etranss.SetMessage(etrans.EtransNum, messageText); } } }