public static List <IPowerOfAttorney> GetActivePowerOfAttorneys(Company.IEmployee employee, DateTime?date)
 {
     return(PowerOfAttorneys
            .GetAll(p => Equals(p.IssuedTo, employee) && (p.RegistrationDate == null || p.RegistrationDate <= date) && date <= p.ValidTill &&
                    (p.LifeCycleState == LifeCycleState.Draft || p.LifeCycleState == LifeCycleState.Active))
            .ToList());
 }
示例#2
0
        /// <summary>
        /// Агент рассылки уведомления об окончании срока действия доверенностей.
        /// </summary>
        public virtual void SendNotificationForExpiringPowerOfAttorney()
        {
            var createTableCommand = Queries.Module.CreateTableForExpiringPowerOfAttorney;

            Sungero.Docflow.PublicFunctions.Module.ExecuteSQLCommand(createTableCommand);

            var notifyParams = PublicFunctions.Module.GetDefaultExpiringDocsNotificationParams(Constants.Module.ExpiringPowerOfAttorneyLastNotificationKey,
                                                                                               Constants.Module.ExpiringPowerOfAttorneyTableName);

            var alreadySentDocs = PublicFunctions.Module.GetDocumentsWithSendedTask(notifyParams.ExpiringDocTableName);

            var powerOfAttorneyIds = PowerOfAttorneys.GetAll()
                                     .Where(p => !alreadySentDocs.Contains(p.Id))
                                     .Where(p => p.LifeCycleState == Sungero.Docflow.PowerOfAttorney.LifeCycleState.Active ||
                                            p.LifeCycleState == Sungero.Docflow.PowerOfAttorney.LifeCycleState.Draft)
                                     .Where(p => p.IssuedTo != null || p.PreparedBy != null)
                                     .Where(p => notifyParams.LastNotificationReserve.AddDays(p.DaysToFinishWorks.HasValue ? p.DaysToFinishWorks.Value : 0) < p.ValidTill &&
                                            p.ValidTill <= notifyParams.TodayReserve.AddDays(p.DaysToFinishWorks.HasValue ? p.DaysToFinishWorks.Value : 0))
                                     .Where(p => p.DaysToFinishWorks == null || p.DaysToFinishWorks <= Constants.Module.MaxDaysToFinish)
                                     .Select(p => p.Id)
                                     .ToList();

            Logger.DebugFormat("Powers of Attorney to send notification count = {0}.", powerOfAttorneyIds.Count());

            for (int i = 0; i < powerOfAttorneyIds.Count(); i = i + notifyParams.BatchCount)
            {
                var result = Transactions.Execute(
                    () =>
                {
                    var powerOfAttorneyPart = PowerOfAttorneys.GetAll(p => powerOfAttorneyIds.Contains(p.Id)).Skip(i).Take(notifyParams.BatchCount).ToList();
                    powerOfAttorneyPart     = powerOfAttorneyPart.Where(p => notifyParams.LastNotification.ToUserTime(p.PreparedBy ?? p.IssuedTo).AddDays(p.DaysToFinishWorks.HasValue ? p.DaysToFinishWorks.Value : 0) < p.ValidTill &&
                                                                        p.ValidTill <= Calendar.GetUserToday(p.PreparedBy ?? p.IssuedTo).AddDays(p.DaysToFinishWorks.HasValue ? p.DaysToFinishWorks.Value : 0))
                                              .ToList();

                    if (!powerOfAttorneyPart.Any())
                    {
                        return;
                    }

                    PublicFunctions.Module.ClearIdsFromExpiringDocsTable(notifyParams.ExpiringDocTableName,
                                                                         powerOfAttorneyPart.Select(x => x.Id).ToList());
                    PublicFunctions.Module.AddExpiringDocumentsToTable(notifyParams.ExpiringDocTableName,
                                                                       powerOfAttorneyPart.Select(x => x.Id).ToList());

                    foreach (var powerOfAttorney in powerOfAttorneyPart)
                    {
                        var subject = Docflow.PublicFunctions.Module.TrimQuotes(Resources.ExpiringPowerOfAttorneySubjectFormat(powerOfAttorney.DisplayValue));
                        if (subject.Length > Workflow.SimpleTasks.Info.Properties.Subject.Length)
                        {
                            subject = subject.Substring(0, Workflow.SimpleTasks.Info.Properties.Subject.Length);
                        }

                        var activeText = Docflow.PublicFunctions.Module.TrimQuotes(Resources.ExpiringPowerOfAttorneyTextFormat(powerOfAttorney.ValidTill.Value.ToShortDateString(),
                                                                                                                               powerOfAttorney.DisplayValue));

                        var performers = Functions.Module.GetNotificationPerformers(powerOfAttorney);
                        performers     = performers.Where(p => p != null).Distinct().ToList();

                        var attachments = new List <Sungero.Content.IElectronicDocument>();
                        attachments.Add(powerOfAttorney);

                        notifyParams.TaskParams.Document    = powerOfAttorney;
                        notifyParams.TaskParams.Subject     = subject;
                        notifyParams.TaskParams.ActiveText  = activeText;
                        notifyParams.TaskParams.Performers  = performers;
                        notifyParams.TaskParams.Attachments = attachments;
                        PublicFunctions.Module.TrySendExpiringDocNotifications(notifyParams);
                    }
                });
            }

            if (PublicFunctions.Module.IsAllNotificationsStarted(notifyParams.ExpiringDocTableName))
            {
                PublicFunctions.Module.UpdateLastNotificationDate(notifyParams);
                PublicFunctions.Module.ClearExpiringTable(notifyParams.ExpiringDocTableName, false);
            }
        }