public void EnqueueDistributions(System.DateTime Date)
        {
            FI.Common.Data.FIDataTable            table      = new FI.Common.Data.FIDataTable();
            FI.Common.DataAccess.IDistributionsDA dacObj     = DataAccessFactory.Instance.GetDistributionsDA();
            FI.Common.Data.FIDataTable            distrTable = dacObj.ReadDistributions(_owner.ID);

            if (distrTable == null || distrTable.Rows.Count == 0)
            {
                return;
            }

            for (int i = 0; i < distrTable.Rows.Count; i++)
            {
                Distribution distr = _owner.DistributionSystem.GetDistribution((decimal)distrTable.Rows[i]["DistributionId"], true);
                if (distr.IsScheduledFor(Date))
                {
                    try
                    {
                        dacObj.EnqueueDistribution(distr.ID, "");
                    }
                    catch
                    {
                        // do nothing , exception is logged
                    }
                }
            }
        }
        public void SendQueuedDistributions(string CompanyNameShort)
        {
            lock (this)
            {
                // check if already being handled
                if (_sendingRequests.Contains(CompanyNameShort))
                {
                    return;
                }
                _sendingRequests.Add(CompanyNameShort);
            }

            Exception lastExc            = null;
            decimal   lastExcQueueItemId = -1;

            try
            {
                FI.Common.DataAccess.IDistributionsDA distrDao = DataAccessFactory.Instance.GetDistributionsDA();
                FI.Common.DataAccess.IUsersDA         userDao  = DataAccessFactory.Instance.GetUsersDA();

                decimal companyId = userDao.GetCompanyIdByShortName(CompanyNameShort);
                if (companyId > 0)
                {
                    while (true)
                    {
                        decimal queueItemId = distrDao.ReadNextQueuedDistribution(companyId);
                        if (queueItemId <= 0)
                        {
                            break;
                        }

                        try
                        {
                            SendQueuedDistribution(queueItemId);
                        }
                        catch (Exception exc)
                        {
                            // throw if exception occured twice for same queue item
                            if (lastExcQueueItemId == queueItemId)
                            {
                                throw exc;
                            }

                            lastExcQueueItemId = queueItemId;
                        }
                    }
                }
            }
            finally
            {
                _sendingRequests.Remove(CompanyNameShort);
            }

            if (lastExc != null)
            {
                throw lastExc;
            }
        }
        public void DeleteDistribution(decimal distributionId)
        {
            // cancel distribution items first
            CancelDistributionQueueItems(distributionId);

            // delete distribution
            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            dacObj.DeleteDistribution(distributionId);
        }
        public FI.Common.Data.FIDataTable GetDistributionQueuePage(int CurrentPage, int RowCount, string FilterExpression, string SortExpression)
        {
            int StartIndex = (CurrentPage - 1) * RowCount;

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            FI.Common.Data.FIDataTable            table  = null;

            table = dacObj.ReadDistributionQueue(_owner.CompanyId, StartIndex, RowCount, FilterExpression, SortExpression);

            return(table);
        }
        public FI.Common.Data.FIDataTable GetDistributionsWithContactsPage(Report report, int CurrentPage, int RowCount, string FilterExpression, string SortExpression)
        {
            int StartIndex = (CurrentPage - 1) * RowCount;

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            FI.Common.Data.FIDataTable            table  = new FI.Common.Data.FIDataTable();

            table = dacObj.ReadDistributionsWithContactsPage(_owner.ID, report.ID, report.GetTypeCode(), StartIndex, RowCount, FilterExpression, SortExpression);
            ConvertEnums(ref table);
            return(table);
        }
 public void CancelDistributionQueueItems(decimal distributionId)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     decimal[] items = dacObj.GetActiveDistributionQueueItems(distributionId);
     if (items != null)
     {
         foreach (decimal itemId in items)
         {
             CancelQueuedItem(itemId);
         }
     }
 }
Esempio n. 7
0
        internal Distribution(User Owner, Report report, Contact contact, Report.ExportFormat format)
        {
            _owner       = Owner;
            this.Report  = report;
            this.Contact = contact;
            this.Format  = format;

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            _id = dacObj.InsertDistribution(_owner.ID, report.ID, contact.ID, report.GetTypeCode(), this.FrequencyType.ToString(), this.FrequencyValue.ToString(), (int)this.Format);

            _isProxy = false;
            _isDirty = false;
        }
Esempio n. 8
0
        public void Save()
        {
            this.Validate(true);
            if (this.IsProxy)
            {
                throw new Exception("Cannot save proxy");
            }

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            dacObj.UpdateDistribution(this.Owner.ID, this.ID, this.Report.ID, this.Contact.ID, this.Report.GetTypeCode(), this.FrequencyType.ToString(), this.FrequencyValue.ToString(), (int)this.Format);

            this._isDirty = false;
        }
        public void DeleteDistribution(Distribution distribution)
        {
            distribution.Validate(true);

            if (BeforeDeleteDistribution != null)
            {
                BeforeDeleteDistribution(distribution, EventArgs.Empty);
            }

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            dacObj.DeleteDistribution(distribution.ID);

            distribution = null;
        }
        /*
         * public FI.Common.Data.FIDataTable GetMasterDistributionQueuePage(int CurrentPage , int RowCount , string FilterExpression , string SortExpression)
         * {
         *  int StartIndex=(CurrentPage-1)*RowCount;
         *
         *  FI.Common.DataAccess.IDistributionsDA dacObj=DataAccessFactory.Instance.GetDistributionsDA();
         *  FI.Common.Data.FIDataTable table=null;
         *
         *  table=dacObj.ReadMasterDistributionQueue(StartIndex , RowCount , FilterExpression , SortExpression);
         *
         *  return table;
         * }
         */

        public FI.Common.Data.FIDataTable GetDistributionInfo(bool checkOnly)
        {
            // get from DA
            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            FI.Common.Data.FIDataTable            ret    = dacObj.GetDistributionInfo(false);

            // resolve distributions not sent according to schedule
            DataColumn checkStatusCol = ret.Columns["CheckStatus"];
            DataColumn timeCol        = ret.Columns["LastTimestamp"];
            DataColumn statusCol      = ret.Columns["LastStatus"];
            DataColumn freqTypeCol    = ret.Columns["ScheduleType"];
            DataColumn freqValCol     = ret.Columns["ScheduleValue"];

            foreach (DataRow r in ret.Rows)
            {
                if ((string)r[checkStatusCol] != string.Empty)
                {
                    continue; // already has check status
                }
                if ((string)r[timeCol] == string.Empty)
                {
                    continue; // no time to iterate from
                }
                if ((string)r[statusCol] != "Ok")
                {
                    continue; // last status is not ok
                }
                DateTime date = DateTime.Parse(r[timeCol].ToString());
                date = date.AddDays(1);
                DateTime now = DateTime.Now;
                bool     ok  = true;
                while (date <= now)
                {
                    string reqType = r[freqTypeCol].ToString();
                    string reqVal  = r[freqValCol].ToString();
                    if (Distribution.IsScheduledForDate(reqType, reqVal, date))
                    {
                        ok = false;
                        break;
                    }
                    date = date.AddDays(1);
                }

                if (!ok)
                {
                    r[checkStatusCol] = "Schedule Failed";
                }
            }
            return(ret);
        }
        public void SendDistribution(decimal distributionId, DateTime getCacheFrom, Guid olapTaskGuid, out bool isFromCache)
        {
            try
            {
                isFromCache = false;

                FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
                decimal userId = dacObj.GetDistributionOwnerId(distributionId);
                if (userId <= 0)
                {
                    return;
                }

                User         user   = new User(userId, true);
                Distribution distr  = user.DistributionSystem.GetDistribution(distributionId, true);
                Report       report = distr.Report;

                if (report.IsProxy)
                {
                    report.Open();
                }

                if (report.State == Report.StateEnum.Open)
                {
                    OlapReport olapRpt = report as OlapReport;
                    if (olapRpt != null)
                    {
                        olapRpt.Execute(olapTaskGuid);
                    }
                    else
                    {
                        report.Execute();
                    }
                }

                Contact contact = distr.Contact;
                if (contact.IsProxy)
                {
                    contact.Fetch();
                }


                SendReport(report, new Contact[] { contact }, distr.Format, getCacheFrom, out isFromCache);
            }
            catch (Exception exc)
            {
                Common.LogWriter.Instance.WriteEventLogEntry(exc);
                throw exc;
            }
        }
Esempio n. 12
0
        public void Fetch()
        {
            this.Validate(true);

            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
            System.Data.DataRow row = dacObj.ReadDistribution(this._owner.ID, this.ID).Rows[0];
            this._contact       = _owner.ContactSystem.GetContact(int.Parse(row["ContactId"].ToString()), false);
            this._report        = _owner.ReportSystem.GetReport(int.Parse(row["ReportId"].ToString()), _owner.ReportSystem.GetReportType(int.Parse(row["ReportType"].ToString())), false);
            this.FrequencyType  = (Distribution.FrequencyTypeEnum)System.Enum.Parse(typeof(Distribution.FrequencyTypeEnum), row["FrequencyType"].ToString());
            this.FrequencyValue = (Distribution.FrequencyValueEnum)System.Enum.Parse(typeof(Distribution.FrequencyValueEnum), row["FrequencyValue"].ToString());
            this.Format         = (Report.ExportFormat)((int)(byte)row["Format"]);

            this._isProxy = false;
            this._isDirty = false;
        }
        public void SendQueuedDistribution(decimal queueItemId)
        {
            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();

            decimal  distributionId = 0;
            bool     isFromCache    = false;
            DateTime timestamp      = DateTime.MinValue;
            string   status         = null;

            try
            {
                dacObj.GetQueueItemInfo(queueItemId, out distributionId, out status, out timestamp);
                if (distributionId <= 0)
                {
                    throw new Exception("Invalid DistributionId");
                }
                if (timestamp == DateTime.MinValue)
                {
                    timestamp = DateTime.MaxValue; // means no cache will be taken
                }
                Guid olapTaskGuid = Guid.NewGuid();
                dacObj.WriteDistributionQueueExecuting(queueItemId, olapTaskGuid);
                SendDistribution(distributionId, timestamp, olapTaskGuid, out isFromCache);
            }
            catch (Exception exc)
            {
                // check if not already canceled (cause it's being cnaceled forcibly, which might cause this exceptino (connection closed)
                dacObj.GetQueueItemInfo(queueItemId, out distributionId, out status, out timestamp);
                if (status != "Canceled")
                {
                    Common.LogWriter.Instance.WriteEventLogEntry(exc);
                    dacObj.WriteDistributionQueueError(queueItemId, exc.Message);

                    //					// todo: check last 3 statuses, if not failed, requeue
                    //					bool requeue=!dacObj.HaveAllDistributionAttemptsFailed(distributionId, 3);
                    //					if(requeue)
                    //						dacObj.EnqueueDistribution(distributionId, "Requeue after error");
                }

                throw exc;
            }

            dacObj.WriteDistributionQueueOk(queueItemId, isFromCache);
        }
Esempio n. 14
0
        public void EnqueueDistributions(System.DateTime Date)
        {
            Common.LogWriter.Instance.WriteEventLogEntry(
                string.Format("Start EnqueueDistributions. User={0}, Company={1}", _owner.Logon, _owner.CompanyNameShort));

            FI.Common.Data.FIDataTable            table      = new FI.Common.Data.FIDataTable();
            FI.Common.DataAccess.IDistributionsDA dacObj     = DataAccessFactory.Instance.GetDistributionsDA();
            FI.Common.Data.FIDataTable            distrTable = dacObj.ReadDistributions(_owner.ID);

            int count = 0;

            if (distrTable != null && distrTable.Rows.Count > 0)
            {
                for (int i = 0; i < distrTable.Rows.Count; i++)
                {
                    Distribution distr = _owner.DistributionSystem.GetDistribution((decimal)distrTable.Rows[i]["DistributionId"], true);
                    if (distr.IsScheduledFor(Date))
                    {
                        try
                        {
                            dacObj.EnqueueDistribution(distr.ID, "");
                            count++;
                        }
                        catch (Exception exc)
                        {
                            // do nothing , exception is logged
                            Common.LogWriter.Instance.WriteEventLogEntry(string.Format("Error EnqueueDistributions. User={0}, Company={1}, Count={2}\r\n{3}\r\n{4}",
                                                                                       _owner.Logon, _owner.CompanyNameShort, count, exc.Message, exc.StackTrace));
                        }
                    }
                }
            }


            Common.LogWriter.Instance.WriteEventLogEntry(
                string.Format("End EnqueueDistributions. User={0}, Company={1}", _owner.Logon, _owner.CompanyNameShort));
        }
 public void EnqueueReportDistributions(decimal reportId, int reportType)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     dacObj.EnqueueReportDistributions(reportId, reportType);
 }
 public bool CancelQueuedItem(decimal queueItemId)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     return(dacObj.CancelQueuedItem(queueItemId, "Canceled manually"));
 }
 public void DeleteDistributions(Contact contact)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     dacObj.DeleteDistributionsByContact(_owner.ID, contact.ID);
 }
 public void EnqueueDistribution(decimal distributionId)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     dacObj.EnqueueDistribution(distributionId, "");
 }
        public void SendQueuedDistributions(string CompanyNameShort, bool force)
        {
            int count = 0;

            try
            {
                Common.LogWriter.Instance.WriteEventLogEntry("Start SendQueuedDistributions. Company=" + CompanyNameShort);

                FI.Common.DataAccess.IDistributionsDA distrDao = DataAccessFactory.Instance.GetDistributionsDA();
                FI.Common.DataAccess.IUsersDA         userDao  = DataAccessFactory.Instance.GetUsersDA();

                bool alreadyExecuting = _sendingRequests.Contains(CompanyNameShort);
                lock (typeof(DistributionManager))
                {
                    // check if already being handled
                    if (!_sendingRequests.Contains(CompanyNameShort))
                    {
                        _sendingRequests.Add(CompanyNameShort);
                    }
                    else if (!force)
                    {
                        // check whether executing
                        Common.LogWriter.Instance.WriteEventLogEntry("Already processing SendQueuedDistributions. Company=" + CompanyNameShort,
                                                                     System.Diagnostics.EventLogEntryType.Warning);
                        return;
                    }
                }

                decimal companyId = userDao.GetCompanyIdByShortName(CompanyNameShort);
                if (companyId <= 0)
                {
                    Common.LogWriter.Instance.WriteEventLogEntry(String.Format("Unable to find by short name SendQueuedDistributions. Company={0}", CompanyNameShort),
                                                                 System.Diagnostics.EventLogEntryType.Warning);
                }

                int toSend = distrDao.GetQueuedDistributionsCount(companyId);
                //Common.LogWriter.Instance.WriteEventLogEntry(String.Format("Items to send SendQueuedDistribution. Company={0}, Count={1}", CompanyNameShort, toSend));

                int retryCount = 2;
                int retry      = 0;
                if (companyId > 0)
                {
                    while (true)
                    {
                        decimal queueItemId = 0;
                        try
                        {
                            queueItemId = distrDao.ReadNextQueuedDistribution(companyId);
                            if (queueItemId <= 0)
                            {
                                break;
                            }

                            Common.LogWriter.Instance.WriteEventLogEntry(String.Format("Start send distibution SendQueuedDistributions. Company={0}, Id={1}", CompanyNameShort, queueItemId));
                            SendQueuedDistribution(queueItemId);
                            Common.LogWriter.Instance.WriteEventLogEntry(String.Format("End send distibution SendQueuedDistributions. Company={0}, Id={1}", CompanyNameShort, queueItemId));

                            count++;
                            retry = 0; // reset retry on success
                        }
                        catch (Exception exc)
                        {
                            Common.LogWriter.Instance.WriteEventLogEntry(String.Format("Error SendQueuedDistribution. Company={0}, Id={1}\r\n{2}\r\n{3}", CompanyNameShort, queueItemId, exc.Message, exc.StackTrace),
                                                                         System.Diagnostics.EventLogEntryType.Error);

                            retry++;
                            // throw if retry count exceeded
                            if (retry >= retryCount)
                            {
                                throw exc;
                            }
                            else
                            {
                                // retry
                                Common.LogWriter.Instance.WriteEventLogWarning("Exception, retry follows\r\n" + exc.Message);
                                System.Threading.Thread.Sleep(15000); // wait 15 seconds
                            }
                        }
                    }
                }
            }
            catch (Exception exc)
            {
                _sendingRequests.Remove(CompanyNameShort);
                Common.LogWriter.Instance.WriteEventLogEntry(String.Format("Error SendQueuedDistributions. Company={0} \r\n{1}\r\n{2}", CompanyNameShort, exc.Message, exc.StackTrace),
                                                             System.Diagnostics.EventLogEntryType.Error);
            }
            finally
            {
                _sendingRequests.Remove(CompanyNameShort);
                Common.LogWriter.Instance.WriteEventLogEntry(string.Format("End SendQueuedDistributions: Company={0}, Count={1}", CompanyNameShort, count));
            }
        }
        public void SendQueuedDistribution(decimal queueItemId)
        {
            FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();

            decimal  distributionId     = 0;
            bool     isFromCache        = false;
            DateTime queueItemTimestamp = DateTime.MinValue;
            string   status             = null;

            try
            {
                dacObj.GetQueueItemInfo(queueItemId, out distributionId, out status, out queueItemTimestamp);
                if (distributionId <= 0)
                {
                    throw new  Exception("Invalid DistributionId");
                }
                if (queueItemTimestamp == DateTime.MinValue)
                {
                    queueItemTimestamp = DateTime.MaxValue;                   // means no cache will be taken
                }
                // user
                dacObj = DataAccessFactory.Instance.GetDistributionsDA();
                decimal userId = dacObj.GetDistributionOwnerId(distributionId);
                if (userId <= 0)
                {
                    return;
                }

                // status executing
                Guid olapTaskGuid = Guid.NewGuid();
                dacObj.WriteDistributionQueueExecuting(queueItemId, olapTaskGuid);

                // send report
                User         user             = new User(userId, true);
                Distribution distr            = user.DistributionSystem.GetDistribution(distributionId, true);
                Report       report           = distr.Report;
                DateTime     currentTimestamp = dacObj.GetCurrentTimestamp();
                SendReport(report, olapTaskGuid, new Contact[] { distr.Contact }, distr.Format, queueItemTimestamp, currentTimestamp, out isFromCache);

                // status ok
                dacObj.WriteDistributionQueueOk(queueItemId, isFromCache);
            }
            catch (Exception exc)
            {
                // check if not already canceled (cause it's being cnaceled forcibly, which might cause this exceptino (connection closed)
                dacObj.GetQueueItemInfo(queueItemId, out distributionId, out status, out queueItemTimestamp);
                if (status != "Canceled")
                {
                    Common.LogWriter.Instance.WriteEventLogEntry(exc);

                    // status error
                    dacObj.WriteDistributionQueueError(queueItemId, exc.Message);

//					// todo: check last 3 statuses, if not failed, requeue
//					bool requeue=!dacObj.HaveAllDistributionAttemptsFailed(distributionId, 3);
//					if(requeue)
//						dacObj.EnqueueDistribution(distributionId, "Requeue after error");
                }

                // throw
                throw exc;
            }
        }
 public void DeleteDistributions(Report report)
 {
     FI.Common.DataAccess.IDistributionsDA dacObj = DataAccessFactory.Instance.GetDistributionsDA();
     dacObj.DeleteDistributionsByReport(report.ID, report.GetTypeCode());
 }