Пример #1
0
        private void butRefreshConns_Click(object sender, EventArgs e)
        {
            Cursor = Cursors.WaitCursor;
            if (gridMain.SelectedIndices.Length == 0)
            {
                gridMain.SetSelected(true);
            }
            for (int i = 0; i < gridMain.SelectedIndices.Length; i++)
            {
                CentralConnection conn = (CentralConnection)gridMain.Rows[gridMain.SelectedIndices[i]].Tag;
                if (conn.DatabaseName == "" && conn.ServerName == "" && conn.ServiceURI == "")
                {
                    continue;
                }
                ODThread odThread = new ODThread(ConnectAndVerify, new object[] { conn, _progVersion });
                odThread.Name      = "VerifyThread" + i;
                odThread.GroupName = "Verify";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "Verify");
            List <ODThread> listComplThreads = ODThread.GetThreadsByGroupName("Verify");

            for (int i = 0; i < listComplThreads.Count; i++)
            {
                object[]          obj        = (object[])listComplThreads[i].Tag;
                CentralConnection conn       = ((CentralConnection)obj[0]);
                string            status     = ((string)obj[1]);
                CentralConnection connection = _listConns.Find(x => x.CentralConnectionNum == conn.CentralConnectionNum);
                connection.ConnectionStatus = status;
            }
            ODThread.QuitSyncThreadsByGroupName(100, "Verify");
            Cursor = Cursors.Default;
            FillGrid();
        }
Пример #2
0
        private void RunTransfer()
        {
            //Get data from the source connection. This will have all the patients selected from the sourceconnection
            string   stringFailedConns = "";
            ODThread odThread          = new ODThread(GetDataFromSourceConnection, new object[] { _sourceConnection });

            odThread.GroupName = "FetchSheets";
            odThread.Start();
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "FetchSheets");
            if (_listSheetsForSelectedPats.IsNullOrEmpty())
            {
                string connString = CentralConnections.GetConnectionString(_sourceConnection);
                stringFailedConns += connString + "\r\n";
            }
            //Insert the sheets to each of the databases. The sheets will have a patnum=0;
            List <Action> listActions = new List <Action>();
            object        locker      = new object();

            foreach (CentralConnection conn in _listConnectionsToTransferTo)
            {
                List <Sheet> listSheets = _listSheetsForSelectedPats.Select(x => x.Copy()).ToList();
                listActions.Add(() => {
                    if (!InsertSheetsToConnection(conn, listSheets))
                    {
                        string connString = CentralConnections.GetConnectionString(conn);
                        lock (locker) {
                            stringFailedConns += connString + "\r\n";
                        }
                    }
                });
            }
            ODThread.RunParallel(listActions);
            if (stringFailedConns != "")
            {
                stringFailedConns = Lans.g(this, "There were some transfers that failed due to connection issues.  Fix connections and try again.\r\n"
                                           + "Failed Connections:") + "\r\n" + stringFailedConns;
                CodeBase.MsgBoxCopyPaste msgBoxCP = new CodeBase.MsgBoxCopyPaste(stringFailedConns);
                msgBoxCP.ShowDialog();
            }
            else
            {
                MsgBox.Show(this, "Transfers Completed Successfully\r\nGo to each database you transferred patients to and retrieve Webforms to finish the "
                            + "transfer process.");
            }
        }
 private void butRefresh_Click(object sender, EventArgs e)
 {
     ODThread.JoinThreadsByGroupName(1, "FetchPats");           //Stop fetching immediately
     _hasWarningShown = false;
     lock (_lockObj) {
         _invalidConnsLog = "";
     }
     if (butRefresh.Text == Lans.g(this, "Refresh"))
     {
         _dataConnPats.Clear();
         butRefresh.Text    = Lans.g(this, "Stop Refresh");
         labelFetch.Visible = true;
         _complConnAmt      = 0;
         StartThreadsForConns();
     }
     else
     {
         butRefresh.Text    = Lans.g(this, "Refresh");
         labelFetch.Visible = false;
         _complConnAmt      = ListConns.Count;
     }
 }
Пример #4
0
        private void butRefresh_Click(object sender, EventArgs e)
        {
            if (textProviderSearch.Text == "" && textClinicSearch.Text == "")
            {
                FillGrid();
                return;
            }
            for (int i = 0; i < gridMain.Rows.Count; i++)
            {
                CentralConnection conn = (CentralConnection)gridMain.Rows[i].Tag;
                if (conn.ConnectionStatus != "OK")
                {
                    continue;
                }
                ODThread odThread = new ODThread(ConnectAndSearch, new object[] { conn });
                odThread.Name      = "SearchThread" + i;
                odThread.GroupName = "Search";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "Search");
            List <ODThread> listComplThreads = ODThread.GetThreadsByGroupName("Search");
            List <long>     connNums         = new List <long>();

            for (int i = 0; i < listComplThreads.Count; i++)
            {
                object[]          obj  = (object[])listComplThreads[i].Tag;
                CentralConnection conn = ((CentralConnection)obj[0]);
                bool result            = ((bool)obj[1]);
                if (result)
                {
                    connNums.Add(conn.CentralConnectionNum);
                }
                listComplThreads[i].QuitAsync();
            }
            FillGrid(connNums);
        }
Пример #5
0
        ///<summary>Refresh the cache(s) associated with the given cellType. If waitToReturn==true then block until finished.
        ///If waitToReturn==false then runs async and returns immediately. Optionally wait for the method to return or run async.
        ///onExit event will be fired after async version has completed. Will not fire when sync version is run as this is a blocking call so when it returns it is done.
        ///If invalidateFirst==true then cache will be invalidated and forcefully refreshed. Use this sparingly.</summary>
        public static void RefreshCellTypeIfInvalid(DashboardCellType cellType, DashboardFilter filter, bool waitToReturn, bool invalidateFirst, EventHandler onExit = null)
        {
            //Create a random group name so we can arbitrarily group and wait on the threads we are about to start.
            string groupName = cellType.ToString() + _rand.Next();

            try {
                switch (cellType)
                {
                case DashboardCellType.HQPhone:
                case DashboardCellType.HQConfirmation:
                case DashboardCellType.HQMtMessage:
                case DashboardCellType.HQBillingUsageAccess:
                case DashboardCellType.HQMoMessage:
                case DashboardCellType.HQBillingInboundOutbound:
                case DashboardCellType.HQSignups:
                    //Broadcast monitor does not use the ODGraph cache.
                    return;
                }
                //Always fill certain caches first. These will not be threaded as they need to be available to the threads which will run below.
                //It doesn't hurt to block momentarily here as the queries will run very quickly.
                Providers.Run(new DashboardFilter()
                {
                    UseDateFilter = false
                }, invalidateFirst);
                Clinics.Run(new DashboardFilter()
                {
                    UseDateFilter = false
                }, invalidateFirst);
                //Start certain cache threads depending on which cellType we are interested in. Each cache will have its own thread.
                switch (cellType)
                {
                case DashboardCellType.ProductionGraph:
                    FillCacheThreaded(CompletedProcs, filter, groupName, invalidateFirst);
                    FillCacheThreaded(Writeoffs, filter, groupName, invalidateFirst);
                    FillCacheThreaded(Adjustments, filter, groupName, invalidateFirst);
                    break;

                case DashboardCellType.IncomeGraph:
                    FillCacheThreaded(PaySplits, filter, groupName, invalidateFirst);
                    FillCacheThreaded(ClaimPayments, filter, groupName, invalidateFirst);
                    break;

                case DashboardCellType.AccountsReceivableGraph:
                    FillCacheThreaded(AR, filter, groupName, invalidateFirst);
                    break;

                case DashboardCellType.NewPatientsGraph:
                    FillCacheThreaded(Patients, filter, groupName, invalidateFirst);
                    break;

                case DashboardCellType.BrokenApptGraph:
                    FillCacheThreaded(BrokenAppts, filter, groupName, invalidateFirst);
                    FillCacheThreaded(BrokenProcs, filter, groupName, invalidateFirst);
                    FillCacheThreaded(BrokenAdjs, filter, groupName, invalidateFirst);
                    break;

                case DashboardCellType.NotDefined:
                default:
                    throw new Exception("Unsupported DashboardCellType: " + cellType.ToString());
                }
            }
            finally {
                if (waitToReturn)                  //Block until all threads have completed.
                {
                    ODThread.JoinThreadsByGroupName(System.Threading.Timeout.Infinite, groupName, true);
                }
                else if (onExit != null)                //Exit immediately but fire event later once all threads have completed.
                {
                    ODThread.AddGroupNameExitHandler(groupName, onExit);
                }
            }
        }
Пример #6
0
        private void RunProvider()
        {
            ReportComplex report = new ReportComplex(true, true);

            _dateFrom = PIn.Date(textDateFrom.Text);
            _dateTo   = PIn.Date(textDateTo.Text);
            List <DataSet>  listProdData    = new List <DataSet>();
            List <Provider> listProvs       = new List <Provider>();
            List <string>   listServerNames = new List <string>();
            string          strFailedConn   = "";

            for (int i = 0; i < ConnList.Count; i++)
            {
                ODThread odThread = new ODThread(ConnectAndRunProviderReport, new object[] { ConnList[i] });
                odThread.GroupName = "ConnectAndReportProvider";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "ConnectAndReportProvider");
            List <ODThread> listThreads = ODThread.GetThreadsByGroupName("ConnectAndReportProvider");

            for (int i = 0; i < listThreads.Count; i++)
            {
                object[]        obj           = (object[])listThreads[i].Tag;
                DataSet         data          = (DataSet)obj[0];
                string          connString    = CentralConnections.GetConnectionString((CentralConnection)obj[1]);
                List <Provider> listConnProvs = (List <Provider>)obj[2];
                if (data == null)
                {
                    strFailedConn += connString + "\r\n";
                }
                else
                {
                    listServerNames.Add(connString);
                    listProdData.Add(data);
                    listProvs.AddRange(listConnProvs);
                }
                listThreads[i].QuitSync(Timeout.Infinite);
            }
            report.ReportName = "Provider P&I";
            report.AddTitle("Title", Lan.g(this, "Provider Production and Income"));
            report.AddSubTitle("PracName", PrefC.GetString(PrefName.PracticeTitle));
            report.AddSubTitle("Date", _dateFrom.ToShortDateString() + " - " + _dateTo.ToShortDateString());
            report.AddSubTitle("Providers", Lan.g(this, "All Providers"));
            report.AddSubTitle("Clinics", Lan.g(this, "All Clinics"));
            //setup query
            QueryObject query;
            DataSet     dsTotal = new DataSet();

            for (int i = 0; i < listProdData.Count; i++)
            {
                DataTable dt    = listProdData[i].Tables["Clinic"];
                DataTable dtTot = listProdData[i].Tables["Total"].Copy();
                dtTot.TableName = dtTot.TableName + "_" + i;
                dsTotal.Tables.Add(dtTot);
                query = report.AddQuery(dt, listServerNames[i], "Clinic", SplitByKind.Value, 1, true);
                // add columns to report
                query.AddColumn("Provider", 75, FieldValueType.String);
                query.AddColumn("Production", 120, FieldValueType.Number);
                query.AddColumn("Adjustments", 120, FieldValueType.Number);
                query.AddColumn("Writeoff", 120, FieldValueType.Number);
                query.AddColumn("Tot Prod", 120, FieldValueType.Number);
                query.AddColumn("Pt Income", 120, FieldValueType.Number);
                query.AddColumn("Ins Income", 120, FieldValueType.Number);
                query.AddColumn("Total Income", 120, FieldValueType.Number);
            }
            if (dsTotal.Tables.Count == 0)
            {
                MsgBox.Show(this, "This report returned no values");
                return;
            }
            DataTable dtTotal;
            decimal   production;
            decimal   adjust;
            decimal   inswriteoff;
            decimal   totalproduction;
            decimal   ptincome;
            decimal   insincome;
            decimal   totalincome;

            dtTotal = dsTotal.Tables[0].Clone();
            for (int i = 0; i < listProvs.Count; i++)
            {
                Provider provCur = listProvs[i];
                DataRow  row     = dtTotal.NewRow();
                row[0]          = provCur.Abbr;
                production      = 0;
                adjust          = 0;
                inswriteoff     = 0;
                totalproduction = 0;
                ptincome        = 0;
                insincome       = 0;
                totalincome     = 0;
                bool hasAnyAmount = false;
                for (int j = 0; j < dsTotal.Tables.Count; j++)
                {
                    for (int k = 0; k < dsTotal.Tables[j].Rows.Count; k++)
                    {
                        if (dsTotal.Tables[j].Rows[k][0].ToString() == provCur.Abbr &&
                            (PIn.Decimal(dsTotal.Tables[j].Rows[k]["Production"].ToString()) != 0 ||
                             PIn.Decimal(dsTotal.Tables[j].Rows[k]["Adjustments"].ToString()) != 0 ||
                             PIn.Decimal(dsTotal.Tables[j].Rows[k]["WriteOff"].ToString()) != 0 ||
                             PIn.Decimal(dsTotal.Tables[j].Rows[k]["Pt Income"].ToString()) != 0 ||
                             PIn.Decimal(dsTotal.Tables[j].Rows[k]["Ins Income"].ToString()) != 0))
                        {
                            production  += PIn.Decimal(dsTotal.Tables[j].Rows[k]["Production"].ToString());
                            adjust      += PIn.Decimal(dsTotal.Tables[j].Rows[k]["Adjustments"].ToString());
                            inswriteoff += PIn.Decimal(dsTotal.Tables[j].Rows[k]["WriteOff"].ToString());                          //Writeoffs stored as negative number
                            ptincome    += PIn.Decimal(dsTotal.Tables[j].Rows[k]["Pt Income"].ToString());
                            insincome   += PIn.Decimal(dsTotal.Tables[j].Rows[k]["Ins Income"].ToString());
                            hasAnyAmount = true;
                        }
                    }
                }
                totalproduction = production + adjust + inswriteoff;
                totalincome     = ptincome + insincome;
                row[1]          = production.ToString("n");
                row[2]          = adjust.ToString("n");
                row[3]          = inswriteoff.ToString("n");
                row[4]          = totalproduction.ToString("n");
                row[5]          = ptincome.ToString("n");
                row[6]          = insincome.ToString("n");
                row[7]          = totalincome.ToString("n");
                if (hasAnyAmount)
                {
                    dtTotal.Rows.Add(row);
                }
            }
            query = report.AddQuery(dtTotal, "Totals", "", SplitByKind.None, 2, true);
            query.AddColumn("Provider", 75, FieldValueType.String);
            query.AddColumn("Production", 120, FieldValueType.Number);
            query.AddColumn("Adjustments", 120, FieldValueType.Number);
            query.AddColumn("Writeoff", 120, FieldValueType.Number);
            query.AddColumn("Tot Prod", 120, FieldValueType.Number);
            query.AddColumn("Pt Income", 120, FieldValueType.Number);
            query.AddColumn("Ins Income", 120, FieldValueType.Number);
            query.AddColumn("Total Income", 120, FieldValueType.Number);
            report.AddPageNum();
            // execute query
            if (!report.SubmitQueries())             //Does not actually submit queries because we use datatables in the central management tool.
            {
                return;
            }
            if (strFailedConn != "")
            {
                MsgBoxCopyPaste msgBoxCP = new MsgBoxCopyPaste(strFailedConn);
                msgBoxCP.ShowDialog();
            }
            // display the report
            FormReportComplex FormR = new FormReportComplex(report);

            FormR.ShowDialog();
            DialogResult = DialogResult.OK;
        }
Пример #7
0
        private void RunMonthly()
        {
            ReportComplex report = new ReportComplex(true, false);

            _dateFrom = PIn.Date(textDateFrom.Text);
            _dateTo   = PIn.Date(textDateTo.Text);
            List <DataSet> listProdData      = new List <DataSet>();   //A list of all data sets for each connection.
            List <string>  listServerNames   = new List <string>();
            string         stringFailedConns = "";

            for (int i = 0; i < ConnList.Count; i++)
            {
                ODThread odThread = new ODThread(ConnectAndRunMonthlyReport, new object[] { ConnList[i] });
                odThread.GroupName = "ConnectAndReportMonthly";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "ConnectAndReportMonthly");
            List <ODThread> listThreads = ODThread.GetThreadsByGroupName("ConnectAndReportMonthly");

            for (int i = 0; i < listThreads.Count; i++)
            {
                object[] obj        = (object[])listThreads[i].Tag;
                DataSet  data       = (DataSet)obj[0];
                string   connString = CentralConnections.GetConnectionString((CentralConnection)obj[1]);
                if (data == null)
                {
                    stringFailedConns += connString + "\r\n";
                }
                else
                {
                    listServerNames.Add(connString);
                    listProdData.Add(data);
                }
                listThreads[i].QuitSync(Timeout.Infinite);
            }
            report.ReportName = "MonthlyP&I";
            report.AddTitle("Title", Lan.g(this, "Monthly Production and Income"));
            report.AddSubTitle("Date", _dateFrom.ToShortDateString() + " - " + _dateTo.ToShortDateString());
            report.AddSubTitle("Clinics", Lan.g(this, "All Clinics"));
            QueryObject query;
            DataSet     dsTotal        = new DataSet();//Totals dataset for all connections, it contains a totals table per connection.  We use this later for a summary section.
            int         queryObjectNum = 0;

            for (int i = 0; i < listProdData.Count; i++)
            {
                DataTable dt    = listProdData[i].Tables["Clinic"];
                DataTable dtTot = listProdData[i].Tables["Total"].Copy();
                if (dt.Rows.Count > 0 && dtTot.Rows.Count > 0)
                {
                    queryObjectNum++;
                    dtTot.TableName = dtTot.TableName + "_" + i;
                    dsTotal.Tables.Add(dtTot);
                    query = report.AddQuery(dt, listServerNames[i], "Clinic", SplitByKind.Value, 1, true);
                    // add columns to report
                    Font font = new Font("Tahoma", 8, FontStyle.Regular);
                    query.AddColumn("Date", 70, FieldValueType.String, font);
                    query.AddColumn("Weekday", 70, FieldValueType.String, font);
                    query.AddColumn("Production", 80, FieldValueType.Number, font);
                    query.AddColumn("Sched", 80, FieldValueType.Number, font);
                    query.AddColumn("Adj", 80, FieldValueType.Number, font);
                    query.AddColumn("Writeoff", 80, FieldValueType.Number, font);
                    query.AddColumn("Tot Prod", 80, FieldValueType.Number, font);
                    query.AddColumn("Pt Income", 80, FieldValueType.Number, font);
                    query.AddColumn("Ins Income", 80, FieldValueType.Number, font);
                    query.AddColumn("Tot Income", 80, FieldValueType.Number, font);
                }
                else
                {
                    MsgBox.Show(this, "Connection " + listServerNames[i] + " has no results to show.");
                }
            }
            if (dsTotal.Tables.Count == 0)
            {
                MsgBox.Show(this, "This report returned no values");
                return;
            }
            //setup query
            DataTable dtTotal;
            double    production;
            double    sched;
            double    adjust;
            double    writeoff;
            double    totprod;
            double    ptincome;
            double    insincome;
            double    totalincome;

            DateTime[] dates = new DateTime[(_dateTo - _dateFrom).Days];
            dtTotal = dsTotal.Tables[0].Clone();
            dtTotal.Rows.Clear();
            for (int i = 0; i < dates.Length; i++)       //Per day
            {
                production  = 0;
                sched       = 0;
                adjust      = 0;
                writeoff    = 0;
                totprod     = 0;
                ptincome    = 0;
                insincome   = 0;
                totalincome = 0;
                dates[i]    = _dateFrom.AddDays(i);
                DataRow row = dtTotal.NewRow();
                row[0] = dates[i].ToShortDateString();
                row[1] = dates[i].DayOfWeek;                               //Weekday
                for (int j = 0; j < dsTotal.Tables.Count; j++)             //Per totals table
                {
                    for (int k = 0; k < dsTotal.Tables[j].Rows.Count; k++) //Per row
                    //If it's the correct day, add to the totals.
                    {
                        if (PIn.Date(dsTotal.Tables[j].Rows[k]["Month"].ToString()).ToShortDateString() == dates[i].ToShortDateString())
                        {
                            DataRow dataRow = dsTotal.Tables[j].Rows[k];
                            production  += PIn.Double(dataRow["Production"].ToString());
                            sched       += PIn.Double(dataRow["Sched"].ToString());
                            adjust      += PIn.Double(dataRow["Adjustments"].ToString());
                            writeoff    += PIn.Double(dataRow["Writeoff"].ToString());                       //Writeoffs stored as negative number
                            totprod     += PIn.Double(dataRow["Tot Prod"].ToString());
                            ptincome    += PIn.Double(dataRow["Pt Income"].ToString());
                            insincome   += PIn.Double(dataRow["Ins Income"].ToString());
                            totalincome += PIn.Double(dataRow["Total Income"].ToString());
                            break;
                        }
                    }
                }
                if (production == 0 && sched == 0 && adjust == 0 && writeoff == 0 && totprod == 0 && ptincome == 0 && insincome == 0 && totalincome == 0)
                {
                    continue;                    //Don't display this row if there's nothing to show. (Wasn't like this in 14.3 but is now in 15.3)
                }
                row[2] = production.ToString("n");
                row[3] = sched.ToString("n");
                row[4] = adjust.ToString("n");
                row[5] = writeoff.ToString("n");
                row[6] = totprod.ToString("n");
                row[7] = ptincome.ToString("n");
                row[8] = insincome.ToString("n");
                row[9] = totalincome.ToString("n");
                dtTotal.Rows.Add(row);
            }
            query = report.AddQuery(dtTotal, "Totals", "", SplitByKind.None, 2, true);
            Font font2 = new Font("Tahoma", 8, FontStyle.Regular);

            query.AddColumn("Date", 70, FieldValueType.String, font2);
            query.AddColumn("Weekday", 70, FieldValueType.String, font2);
            query.AddColumn("Production", 80, FieldValueType.Number, font2);
            query.AddColumn("Sched", 80, FieldValueType.Number, font2);
            query.AddColumn("Adj", 80, FieldValueType.Number, font2);
            query.AddColumn("Writeoff", 80, FieldValueType.Number, font2);
            query.AddColumn("Tot Prod", 80, FieldValueType.Number, font2);
            query.AddColumn("Pt Income", 80, FieldValueType.Number, font2);
            query.AddColumn("Ins Income", 80, FieldValueType.Number, font2);
            query.AddColumn("Tot Income", 80, FieldValueType.Number, font2);
            query.AddGroupSummaryField("Total Production (Production + Adjustments - Writeoffs): ", "Writeoff", "Tot Prod", SummaryOperation.Sum, new List <int>()
            {
                queryObjectNum
            }, Color.Black, new Font("Tahoma", 9, FontStyle.Bold), 104, 20);
            query.AddGroupSummaryField("Total Income (Pt Income + Ins Income): ", "Writeoff", "Total Income", SummaryOperation.Sum, new List <int>()
            {
                queryObjectNum
            }, Color.Black, new Font("Tahoma", 9, FontStyle.Bold), 0, 25);
            report.AddPageNum();
            // execute query
            if (!report.SubmitQueries())             //Does not actually submit queries because we use datatables in the central management tool.
            {
                return;
            }
            if (stringFailedConns != "")
            {
                stringFailedConns = "Failed Connections:\r\n" + stringFailedConns;
                MsgBoxCopyPaste msgBoxCP = new MsgBoxCopyPaste(stringFailedConns);
                msgBoxCP.ShowDialog();
            }
            // display the report
            FormReportComplex FormR = new FormReportComplex(report);

            FormR.ShowDialog();
            DialogResult = DialogResult.OK;
        }
Пример #8
0
        private void RunDaily()
        {
            ReportComplex report = new ReportComplex(true, true);

            _dateFrom = PIn.Date(textDateFrom.Text);
            _dateTo   = PIn.Date(textDateTo.Text);
            List <DataSet> listProdData      = new List <DataSet>();   //A list of all data sets for each connection.
            List <string>  listServerNames   = new List <string>();
            string         stringFailedConns = "";

            for (int i = 0; i < ConnList.Count; i++)
            {
                ODThread odThread = new ODThread(ConnectAndRunDailyReport, ConnList[i]);
                odThread.GroupName = "ConnectAndReportDaily";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "ConnectAndReportDaily");
            List <ODThread> listThreads = ODThread.GetThreadsByGroupName("ConnectAndReportDaily");

            for (int i = 0; i < listThreads.Count; i++)
            {
                object[] obj        = (object[])listThreads[i].Tag;
                DataSet  data       = (DataSet)obj[0];
                string   connString = CentralConnections.GetConnectionString((CentralConnection)obj[1]);
                if (data == null)
                {
                    stringFailedConns += connString + "\r\n";
                }
                else
                {
                    listServerNames.Add(connString);
                    listProdData.Add(data);
                }
                listThreads[i].QuitSync(Timeout.Infinite);
            }
            report.ReportName = "DailyP&I";
            report.AddTitle("Title", Lan.g(this, "Daily Production and Income"));
            report.AddSubTitle("PracName", PrefC.GetString(PrefName.PracticeTitle));
            string dateRangeStr = _dateFrom.ToShortDateString() + " - " + _dateTo.ToShortDateString();

            if (_dateFrom.Date == _dateTo.Date)
            {
                dateRangeStr = _dateFrom.ToShortDateString();              //Do not show a date range for the same day...
            }
            report.AddSubTitle("Date", dateRangeStr);
            report.AddSubTitle("Providers", Lan.g(this, "All Providers"));
            report.AddSubTitle("Clinics", Lan.g(this, "All Clinics"));
            QueryObject query = null;
            //Per connection, add each table and split on clinic.  We also need to make a totals table that will be total per clinic per connection.
            DataTable connectionTotals = new DataTable("Totals");

            connectionTotals.Columns.Add(new DataColumn("Connection"));
            connectionTotals.Columns.Add(new DataColumn("Clinic"));
            connectionTotals.Columns.Add(new DataColumn("Production"));
            connectionTotals.Columns.Add(new DataColumn("Adjust"));
            connectionTotals.Columns.Add(new DataColumn("Writeoff"));
            connectionTotals.Columns.Add(new DataColumn("Pt Income"));
            connectionTotals.Columns.Add(new DataColumn("Ins Income"));
            for (int i = 0; i < listProdData.Count; i++)                               //Per connection
            {
                DataTable tableDailyProdForConn = listProdData[i].Tables["DailyProd"]; //Includes multiple clinics.
                for (int j = 0; j < tableDailyProdForConn.Rows.Count; j++)             //Go through the rows
                {
                    DataRow connRow = tableDailyProdForConn.Rows[j];
                    bool    isFound = false;
                    for (int k = 0; k < connectionTotals.Rows.Count; k++)               //Attempt to find an existing totals row that matches.
                    {
                        DataRow connTotalsRow = connectionTotals.Rows[k];
                        if (connRow["Clinic"] == connTotalsRow["Clinic"] && listServerNames[i] == connTotalsRow["Connection"].ToString()) //Totals row already exists. Add to it.
                        {
                            DataRow totalRow = connectionTotals.NewRow();                                                                 //Need to make a new row, can't just modify old table values.  Sadly.
                            double  prod     = PIn.Double(connTotalsRow["Production"].ToString());
                            double  adjust   = PIn.Double(connTotalsRow["Adjust"].ToString());
                            double  writeoff = PIn.Double(connTotalsRow["Writeoff"].ToString());
                            double  ptInc    = PIn.Double(connTotalsRow["Pt Income"].ToString());
                            double  insInc   = PIn.Double(connTotalsRow["Ins Income"].ToString());
                            totalRow[0] = connTotalsRow["Connection"];
                            totalRow[1] = connTotalsRow["Clinic"];
                            totalRow[2] = (prod + PIn.Double(connRow["Production"].ToString()));
                            totalRow[3] = (adjust + PIn.Double(connRow["Adjust"].ToString()));
                            totalRow[4] = (writeoff + PIn.Double(connRow["Writeoff"].ToString()));
                            totalRow[5] = (ptInc + PIn.Double(connRow["Pt Income"].ToString()));
                            totalRow[6] = (insInc + PIn.Double(connRow["Ins Income"].ToString()));
                            connectionTotals.Rows.RemoveAt(k);
                            connectionTotals.Rows.Add(totalRow);
                            isFound = true;
                            break;
                        }
                    }
                    if (!isFound)                    //Totals row for this connection and clinic combination doesn't exist yet.
                    {
                        DataRow totalRow = connectionTotals.NewRow();
                        totalRow[0] = listServerNames[i];
                        totalRow[1] = connRow["Clinic"];
                        totalRow[2] = connRow["Production"];
                        totalRow[3] = connRow["Adjust"];
                        totalRow[4] = connRow["Writeoff"];
                        totalRow[5] = connRow["Pt Income"];
                        totalRow[6] = connRow["Ins Income"];
                        connectionTotals.Rows.Add(totalRow);
                    }
                }
                query = report.AddQuery(tableDailyProdForConn, listServerNames[i], "Clinic", SplitByKind.Value, 1, true);
                // add columns to report
                query.AddColumn("Date", 75, FieldValueType.String, new Font("Tahoma", 8));
                query.AddColumn("Patient Name", 130, FieldValueType.String, new Font("Tahoma", 8));
                query.AddColumn("Description", 220, FieldValueType.String, new Font("Tahoma", 8));
                query.AddColumn("Prov", 65, FieldValueType.String, new Font("Tahoma", 8));
                query.AddColumn("Clinic", 130, FieldValueType.String, new Font("Tahoma", 8));
                query.AddColumn("Production", 75, FieldValueType.Number, new Font("Tahoma", 8));
                query.AddColumn("Adjust", 75, FieldValueType.Number, new Font("Tahoma", 8));
                query.AddColumn("Writeoff", 75, FieldValueType.Number, new Font("Tahoma", 8));
                query.AddColumn("Pt Income", 75, FieldValueType.Number, new Font("Tahoma", 8));
                query.AddColumn("Ins Income", 75, FieldValueType.Number, new Font("Tahoma", 8));
            }
            if (connectionTotals.Rows.Count == 0)
            {
                //MsgBox.Show(this,"This report returned no values.");//We don't want to do this, it hides behind the progress bar!
                return;
            }
            connectionTotals = connectionTotals.AsEnumerable().OrderBy(r => r.Field <string>("Connection"))
                               .ThenBy(r => r.Field <string>("Clinic")).CopyToDataTable();
            query = report.AddQuery(connectionTotals, "Totals", "", SplitByKind.None, 2, true);
            query.AddColumn("Connection", 250, FieldValueType.String, new Font("Tahoma", 8));
            query.AddColumn("Clinic", 250, FieldValueType.String, new Font("Tahoma", 8));
            query.AddColumn("Production", 75, FieldValueType.Number, new Font("Tahoma", 8));
            query.AddColumn("Adjust", 75, FieldValueType.Number, new Font("Tahoma", 8));
            query.AddColumn("Writeoff", 75, FieldValueType.Number, new Font("Tahoma", 8));
            query.AddColumn("Pt Income", 75, FieldValueType.Number, new Font("Tahoma", 8));
            query.AddColumn("Ins Income", 75, FieldValueType.Number, new Font("Tahoma", 8));
            //Calculate the total production and total income and add them to the bottom of the report:
            double totalProduction = 0;
            double totalIncome     = 0;

            for (int i = 0; i < connectionTotals.Rows.Count; i++)
            {
                //Total production is (Production + Adjustments - Writeoffs)
                totalProduction += PIn.Double(connectionTotals.Rows[i]["Production"].ToString());
                totalProduction += PIn.Double(connectionTotals.Rows[i]["Adjust"].ToString());
                totalProduction += PIn.Double(connectionTotals.Rows[i]["Writeoff"].ToString());              //Writeoffs stored as negative number
                //Total income is (Pt Income + Ins Income)
                totalIncome += PIn.Double(connectionTotals.Rows[i]["Pt Income"].ToString());
                totalIncome += PIn.Double(connectionTotals.Rows[i]["Ins Income"].ToString());
            }
            //Add the Total Production and Total Income to the bottom of the report if there were any rows present.
            if (connectionTotals.Rows.Count > 0)
            {
                //Use a custom table and add it like it is a "query" to the report because using a group summary would be more complicated due
                //to the need to add and subtract from multiple columns at the same time.
                DataTable tableTotals = new DataTable("TotalProdAndInc");
                tableTotals.Columns.Add("Summary");
                tableTotals.Rows.Add(Lan.g(this, "Total Production (Production + Adjustments - Writeoffs):") + " " + totalProduction.ToString("c"));
                tableTotals.Rows.Add(Lan.g(this, "Total Income (Pt Income + Ins Income):") + " " + totalIncome.ToString("c"));
                //Add tableTotals to the report.
                //No column name and no header because we want to display this table to NOT look like a table.
                query = report.AddQuery(tableTotals, "", "", SplitByKind.None, 2, false);
                query.AddColumn("", 785, FieldValueType.String, new Font("Tahoma", 8, FontStyle.Bold));
            }
            report.AddPageNum();
            // execute query
            if (!report.SubmitQueries())
            {
                return;
            }
            // display report
            FormReportComplex FormR = new FormReportComplex(report);

            FormR.ShowDialog();
            DialogResult = DialogResult.OK;
        }
Пример #9
0
        ///<summary>Generic function that launches different thread methods depending on how isSyncUsers and isSyncLocks are set.  Set only one or the other to true.</summary>
        private static string SyncAll(List <CentralConnection> listConns, bool isSyncUsers, bool isSyncLocks)
        {
            //Get CEMT users, groups, and associated permissions
            ListSyncErrors       = new List <string>();
            _listCEMTUsers       = Userods.GetUsersForCEMT();
            _securityLockDate    = PrefC.GetDate(PrefName.SecurityLockDate).ToShortDateString();
            _securityLockDays    = PrefC.GetInt(PrefName.SecurityLockDays);
            _securityLockAdmin   = PrefC.GetBool(PrefName.SecurityLockIncludesAdmin);
            _securityCentralLock = PrefC.GetBool(PrefName.CentralManagerSecurityLock);
            _syncCode            = PrefC.GetString(PrefName.CentralManagerSyncCode);
            _listAlertSubs       = AlertSubs.GetAll();
            List <CentralUserData> listCentralUserData = new List <CentralUserData>();
            List <UserGroup>       listUserGroups      = UserGroups.GetCEMTGroups();

            foreach (UserGroup userGroup in listUserGroups)             //for each CEMT user group
            //get all usergroupattaches, userods, and grouppermissions.
            {
                List <UserGroupAttach> listUserGroupAttaches = UserGroupAttaches.GetForUserGroup(userGroup.UserGroupNum);
                List <Userod>          listUserOds           = Userods.GetForGroup(userGroup.UserGroupNum);
                List <GroupPermission> listGroupPermissions  = GroupPermissions.GetPerms(userGroup.UserGroupNum);
                //then create a new CentralUserData and add it to the list.
                listCentralUserData.Add(new CentralUserData(userGroup, listUserOds, listGroupPermissions, listUserGroupAttaches));
            }
            string failedConns     = "";
            string nameConflicts   = "";
            string failedSyncCodes = "";

            for (int i = 0; i < listConns.Count; i++)
            {
                List <CentralUserData> listCentralDataForThreads = new List <CentralUserData>();
                for (int j = 0; j < listCentralUserData.Count; j++)
                {
                    listCentralDataForThreads.Add(listCentralUserData[j].Copy());
                }
                ODThread odThread = null;
                if (isSyncUsers)
                {
                    odThread = new ODThread(ConnectAndSyncUsers, new object[] { listConns[i], listCentralDataForThreads });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                else if (isSyncLocks)
                {
                    odThread = new ODThread(ConnectAndSyncLocks, new object[] { listConns[i] });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                else
                {
                    odThread = new ODThread(ConnectAndSyncAll, new object[] { listConns[i], listCentralDataForThreads });
                    odThread.AddExceptionHandler(new ODThread.ExceptionDelegate(SyncExceptionHelper));
                }
                odThread.GroupName = "Sync";
                odThread.Start(false);
            }
            ODThread.JoinThreadsByGroupName(Timeout.Infinite, "Sync");
            List <ODThread> listComplThreads = ODThread.GetThreadsByGroupName("Sync");

            for (int i = 0; i < listComplThreads.Count; i++)
            {
                if (listComplThreads[i].Tag == null)
                {
                    continue;                    //Failed due to lacking credentials
                }
                failedConns     += ((List <string>)listComplThreads[i].Tag)[0];
                nameConflicts   += ((List <string>)listComplThreads[i].Tag)[1];
                failedSyncCodes += ((List <string>)listComplThreads[i].Tag)[2];
                listComplThreads[i].QuitAsync();
            }
            string errorText = "";

            if (failedConns == "" && nameConflicts == "" && failedSyncCodes == "")
            {
                errorText += "Done";
            }
            if (failedConns != "")
            {
                errorText = "Failed Connections:\r\n" + failedConns + "Please try these connections again.\r\n";
            }
            if (nameConflicts != "")
            {
                errorText += "Name Conflicts:\r\n" + nameConflicts + "Please rename users and try again.\r\n";
            }
            if (failedSyncCodes != "")
            {
                errorText += "Incorrect Sync Codes:\r\n" + failedSyncCodes + "\r\n";
            }
            return(errorText);
        }