Ejemplo n.º 1
0
        public virtual void StartBlock7(Sungero.Docflow.Server.FreeApprovalNotificationArguments e)
        {
            // Синхронизировать группу приложений документа.
            var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault();

            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }

            e.Block.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.NewApprovalLapSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name);

            var approvalReworkAssignments = FreeApprovalReworkAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId);

            if (approvalReworkAssignments.Any())
            {
                var lastApprovalReworkAssignments = approvalReworkAssignments.OrderByDescending(asg => asg.Created).First();

                foreach (var recipient in lastApprovalReworkAssignments.Approvers.Where(apr => apr.Action == Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendNotice))
                {
                    e.Block.Performers.Add(recipient.Approver);
                }
            }
        }
Ejemplo n.º 2
0
        public virtual void SendForApproval(Sungero.Domain.Client.ExecuteActionArgs e)
        {
            // Проверить заполненность обязательных полей во всех документах комплекта.
            var attachments = _obj.AllAttachments.Select(a => Content.ElectronicDocuments.As(a)).Distinct().ToList();

            if (attachments.Cast <Docflow.IOfficialDocument>().Any(x => Sungero.Docflow.PublicFunctions.OfficialDocument.HasEmptyRequiredProperties(x)))
            {
                e.AddError(VerificationAssignments.Resources.InvalidDocumentWhenSendInWork,
                           _obj.Info.Actions.ShowInvalidDocuments);
                return;
            }

            // Определить главный документ.
            var suitableDocuments = Docflow.PublicFunctions.OfficialDocument.GetSuitableDocuments(attachments,
                                                                                                  Docflow.OfficialDocuments.Info.Actions.SendForApproval);
            var probablyMainDocument = Content.ElectronicDocuments.As(Functions.Module.GetLeadingDocument(suitableDocuments.Cast <IOfficialDocument>().ToList()));
            var mainDocument         = Docflow.PublicFunctions.OfficialDocument.ChooseMainDocument(suitableDocuments,
                                                                                                   new List <Content.IElectronicDocument> {
                probablyMainDocument
            });

            if (mainDocument == null)
            {
                return;
            }
            var mainOfficialDocument = OfficialDocuments.As(mainDocument);

            // Если по главному документу ранее были запущены задачи, то вывести соответствующий диалог.
            if (!Docflow.PublicFunctions.OfficialDocument.NeedCreateApprovalTask(mainOfficialDocument))
            {
                return;
            }

            var approvalTask = Docflow.PublicFunctions.Module.Remote.CreateApprovalTask(mainOfficialDocument);

            // Проверить наличие регламента.
            if (approvalTask.ApprovalRule != null)
            {
                // Добавить вложения.
                foreach (var attachment in attachments.Where(att => !Equals(att, mainDocument)))
                {
                    if (!Docflow.PublicFunctions.OfficialDocument.NeedToAttachDocument(attachment, mainOfficialDocument))
                    {
                        continue;
                    }
                    else
                    {
                        approvalTask.OtherGroup.All.Add(attachment);
                    }
                }

                approvalTask.Show();
            }
            else
            {
                // Если по документу нет регламента, вывести сообщение.
                Dialogs.ShowMessage(Docflow.OfficialDocuments.Resources.NoApprovalRuleWarning, MessageType.Warning);
                return;
            }
        }
Ejemplo n.º 3
0
        public virtual IQueryable <IOfficialDocument> GetOtherDocumentsInPeriodBySections(IOfficialDocument doc, DateTime registrationDate)
        {
            var periodBegin = Functions.DocumentRegister.GetBeginPeriod(_obj, registrationDate);
            var periodEnd   = Functions.DocumentRegister.GetEndPeriod(_obj, registrationDate);

            var documents = OfficialDocuments.GetAll()
                            .Where(l => !periodBegin.HasValue || l.RegistrationDate >= periodBegin)
                            .Where(l => !periodEnd.HasValue || l.RegistrationDate <= periodEnd)
                            .Where(l => l.DocumentRegister != null && Equals(l.DocumentRegister, _obj))
                            .Where(l => l.Id != doc.Id);

            if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.LeadingDocument)
            {
                documents = documents.Where(d => Equals(d.LeadingDocument, doc.LeadingDocument));
            }

            if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.Department)
            {
                documents = documents.Where(d => Equals(d.Department, doc.Department));
            }

            if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.BusinessUnit)
            {
                documents = documents.Where(d => Equals(d.BusinessUnit, doc.BusinessUnit));
            }

            return(documents);
        }
Ejemplo n.º 4
0
        public virtual void DocumentForReviewGroupAdded(Sungero.Workflow.Interfaces.AttachmentAddedEventArgs e)
        {
            var document = OfficialDocuments.As(e.Attachment);

            // Задать тему.
            using (TenantInfo.Culture.SwitchTo())
                _obj.Subject = Docflow.PublicFunctions.Module.TrimSpecialSymbols(DocumentReviewTasks.Resources.Consideration, document.Name);

            // Задать адресата.
            if (IncomingDocumentBases.Is(document))
            {
                _obj.Addressee = IncomingDocumentBases.As(document).Addressee;
            }
            if (Memos.Is(document))
            {
                _obj.Addressee = Memos.As(document).Addressee;
            }

            // Задать срок рассмотрения.
            var addressee = _obj.Addressee ?? Users.Current;

            _obj.Deadline = Docflow.PublicFunctions.DocumentKind.GetConsiderationDate(document.DocumentKind, addressee) ??
                            Calendar.Now.AddWorkingDays(addressee, Functions.Module.Remote.GetDocumentReviewDefaultDays());
            if (!_obj.State.IsCopied)
            {
                Docflow.PublicFunctions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, _obj.DocumentForReviewGroup.OfficialDocuments.FirstOrDefault());
            }

            Docflow.PublicFunctions.OfficialDocument.DocumentAttachedInMainGroup(document, _obj);

            // Добавить вложения.
            Docflow.PublicFunctions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(document, _obj.OtherGroup);
        }
Ejemplo n.º 5
0
        public virtual void SetDocumentStorage(Sungero.Docflow.Server.AsyncHandlerInvokeArgs.SetDocumentStorageInvokeArgs args)
        {
            int documentId = args.DocumentId;
            int storageId  = args.StorageId;

            Logger.DebugFormat("SetDocumentStorage: start set storage to document {0}.", documentId);

            var document = OfficialDocuments.GetAll(d => d.Id == documentId).FirstOrDefault();

            if (document == null)
            {
                Logger.DebugFormat("SetDocumentStorage: not found document with id {0}.", documentId);
                return;
            }

            var storage = Storages.GetAll(s => s.Id == storageId).FirstOrDefault();

            if (storage == null)
            {
                Logger.DebugFormat("SetDocumentStorage: not found storage with id {0}.", storageId);
                return;
            }

            if (Locks.GetLockInfo(document).IsLockedByOther)
            {
                Logger.DebugFormat("SetDocumentStorage: cannot change storage, document {0} is locked.", documentId);
                args.Retry = true;
                return;
            }
            try
            {
                foreach (var version in document.Versions.Where(v => !Equals(v.Body.Storage, storage) || !Equals(v.PublicBody.Storage, storage)))
                {
                    if (!Equals(version.Body.Storage, storage))
                    {
                        version.Body.SetStorage(storage);
                    }

                    if (!Equals(version.PublicBody.Storage, storage))
                    {
                        version.PublicBody.SetStorage(storage);
                    }
                }

                document.Storage = storage;

                ((Domain.Shared.IExtendedEntity)document).Params[Docflow.PublicConstants.OfficialDocument.DontUpdateModified] = true;
                document.Save();
            }
            catch (Exception ex)
            {
                Logger.Error("SetDocumentStorage: cannot change storage.", ex);
                args.Retry = true;
                return;
            }
            Logger.DebugFormat("SetDocumentStorage: set storage to document {0} successfully.", documentId);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Синхронизировать группу приложений документа.
        /// </summary>
        public virtual void SynchronizeAddendaAndAttachmentsGroup()
        {
            var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault();

            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }
        }
Ejemplo n.º 7
0
 public static IQueryable <IOfficialDocument> GetOfficialCorrespondenceWithCounterparty(
     Parties.ICounterparty counterparty, DateTime?periodBegin, DateTime?periodEnd)
 {
     return(OfficialDocuments.GetAll()
            .Where(l => l.RegistrationState == Docflow.OfficialDocument.RegistrationState.Reserved ||
                   l.RegistrationState == Docflow.OfficialDocument.RegistrationState.Registered)
            .Where(l => periodBegin == null || l.RegistrationDate >= periodBegin)
            .Where(l => periodEnd == null || l.RegistrationDate <= periodEnd)
            .Where(l => (IncomingDocumentBases.Is(l) && Equals(IncomingDocumentBases.As(l).Correspondent, counterparty)) ||
                   (OutgoingDocumentBases.Is(l) && OutgoingDocumentBases.As(l).Addressees.Select(x => x.Correspondent).Any(y => Equals(y, counterparty)))));
 }
Ejemplo n.º 8
0
        /// <summary>
        /// Получить документ игнорируя права доступа.
        /// </summary>
        /// <param name="documentId">ИД документа.</param>
        /// <returns>Документ.</returns>
        public static IOfficialDocument GetOfficialDocumentIgnoreAccessRights(int documentId)
        {
            // HACK Котегов: использование внутренней сессии для обхода прав доступа.
            Logger.DebugFormat("GetOfficialDocumentIgnoreAccessRights: documentId {0}", documentId);
            using (var session = new Sungero.Domain.Session())
            {
                var innerSession = (Sungero.Domain.ISession)session.GetType()
                                   .GetField("InnerSession", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(session);

                return(OfficialDocuments.As((Sungero.Domain.Shared.IEntity)innerSession.Get(typeof(IOfficialDocument), documentId)));
            }
        }
Ejemplo n.º 9
0
        public virtual void ForApprovalGroupDeleted(Sungero.Workflow.Interfaces.AttachmentDeletedEventArgs e)
        {
            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, null);
            // Очистить группу "Дополнительно".
            var document = OfficialDocuments.As(e.Attachment);

            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.RemoveRelatedDocumentsFromAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }

            _obj.Subject = Docflow.Resources.AutoformatTaskSubject;
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Сконвертировать документы в pdf.
        /// </summary>
        /// <param name="args">Параметры вызова асинхронного обработчика.</param>
        public virtual void ConvertDocumentToPdf(Sungero.Docflow.Server.AsyncHandlerInvokeArgs.ConvertDocumentToPdfInvokeArgs args)
        {
            int documentId = args.DocumentId;
            int versionId  = args.VersionId;

            Logger.DebugFormat("ConvertDocumentToPdf: start convert document to pdf. Document id - {0}.", documentId);

            var document = OfficialDocuments.GetAll(x => x.Id == documentId).FirstOrDefault();

            if (document == null)
            {
                Logger.DebugFormat("ConvertDocumentToPdf: not found document with id {0}.", documentId);
                return;
            }

            var version = document.Versions.SingleOrDefault(v => v.Id == versionId);

            if (version == null)
            {
                Logger.DebugFormat("ConvertDocumentToPdf: not found version. Document id - {0}, version number - {1}.", documentId, versionId);
                return;
            }

            if (!Locks.TryLock(version.Body))
            {
                Logger.DebugFormat("ConvertDocumentToPdf: version is locked. Document id - {0}, version number - {1}.", documentId, versionId);
                args.Retry = true;
                return;
            }

            var result = Docflow.Functions.OfficialDocument.ConvertToPdfAndAddSignatureMark(document, version.Id);

            Locks.Unlock(version.Body);

            if (result.HasErrors)
            {
                Logger.DebugFormat("ConvertDocumentToPdf: {0}", result.ErrorMessage);
                if (result.HasLockError)
                {
                    args.Retry = true;
                }
                else
                {
                    var operation = new Enumeration(Constants.OfficialDocument.Operation.ConvertToPdf);
                    document.History.Write(operation, operation, string.Empty, version.Number);
                    document.Save();
                }
            }

            Logger.DebugFormat("ConvertDocumentToPdf: convert document {0} to pdf successfully.", documentId);
        }
Ejemplo n.º 11
0
        public virtual void StartBlock6(Sungero.Docflow.Server.FreeApprovalNotificationArguments e)
        {
            // Синхронизировать группу приложений документа.
            var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault();

            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }

            e.Block.Performers.Add(_obj.Author);
            e.Block.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.ApprovalCompletedSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Создать и отправить письмо по почте.
        /// </summary>
        /// <param name="task">Задача.</param>
        public static void SendByMail(IApprovalTask task)
        {
            var doc = task.DocumentGroup.OfficialDocuments.FirstOrDefault();

            var addenda = task.AddendaGroup.OfficialDocuments.Where(x => !Equals(x, OfficialDocuments.Null) && x.HasVersions).ToList();
            var other   = task.OtherGroup.All.Where(x => OfficialDocuments.Is(x)).Cast <IOfficialDocument>().ToList();

            other = other.Where(x => !Equals(x, OfficialDocuments.Null) && x.HasVersions).ToList();

            var relatedDocuments = new List <IOfficialDocument>();

            relatedDocuments.AddRange(addenda);
            relatedDocuments.AddRange(other);

            Sungero.Docflow.Functions.OfficialDocument.SelectRelatedDocumentsAndCreateEmail(doc, relatedDocuments);
        }
Ejemplo n.º 13
0
        private static List <IOfficialDocument> GetAddendums(IOfficialDocument document)
        {
            var addendaList = new List <IOfficialDocument>()
            {
            };
            var leadingDocuments = new List <IOfficialDocument>()
            {
                document
            };

            while (Addendums.GetAll(a => leadingDocuments.Contains(a.LeadingDocument)).Any())
            {
                leadingDocuments = OfficialDocuments.GetAll(a => Addendums.Is(a) && leadingDocuments.Contains(a.LeadingDocument)).ToList();
                addendaList.AddRange(leadingDocuments);
            }

            return(addendaList);
        }
Ejemplo n.º 14
0
        public virtual void StartBlock11(Sungero.Docflow.Server.FreeApprovalNotificationArguments e)
        {
            // Синхронизировать группу приложений документа.
            var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault();

            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }

            e.Block.Performers.Add(_obj.Author);
            var lastIterationId         = Functions.FreeApprovalTask.GetApprovalAssignmentLastIterationId(_obj);
            var firstApprovalAssignment = Functions.FreeApprovalTask.GetLastAssignmentWithoutNotice(_obj, lastIterationId).First();

            e.Block.LinkedFreeApprovalAssignment = firstApprovalAssignment;
            e.Block.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.ReworkNoticeSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name);
        }
Ejemplo n.º 15
0
        public virtual bool IsRegistrationNumberUnique(IOfficialDocument document, string registrationNumber, int index,
                                                       DateTime registrationDate, string departmentCode, string businessUnitCode,
                                                       string caseFileIndex, string docKindCode, string counterpartyCode, int leadDocumentId)
        {
            var checkRegistrationNumberUnique = Functions.OfficialDocument.CheckRegistrationNumberUnique(document);

            // У финансовых документов и договоров явно отключаем требование уникальности рег. номера.
            if (!checkRegistrationNumberUnique)
            {
                return(true);
            }

            var result        = true;
            var leadDoc       = OfficialDocuments.GetAll().FirstOrDefault(x => x.Id == leadDocumentId);
            var leadDocNumber = leadDoc == null ? string.Empty : leadDoc.RegistrationNumber;

            AccessRights.AllowRead(
                () =>
            {
                if (index == 0)
                {
                    // Параметр функции "Искать корректировочный постфикс" = true, если необходимо проверять рег. номер на уникальность.
                    index = Functions.DocumentRegister.GetIndexFromRegistrationNumber(_obj, registrationDate, registrationNumber, departmentCode,
                                                                                      businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
                                                                                      checkRegistrationNumberUnique);
                }

                var equalsIndexes = Functions.DocumentRegister.GetSameNumberDocuments(_obj, document, registrationDate, index).ToList();

                foreach (var equalsIndex in equalsIndexes)
                {
                    // Параметр функции "Искать корректировочный постфикс" = true, если необходимо проверять рег. номер на уникальность.
                    if (Functions.DocumentRegister.IsEqualsRegistrationNumbers(_obj, registrationDate, equalsIndex.RegistrationNumber,
                                                                               departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
                                                                               registrationNumber, checkRegistrationNumberUnique))
                    {
                        result = false;
                    }
                }
            });

            return(result);
        }
Ejemplo n.º 16
0
        /// <summary>
        /// Получить документы по правилу.
        /// </summary>
        /// <param name="rule">Правило.</param>
        /// <returns>Документы по правилу.</returns>
        private static IEnumerable <int> GetDocumentsByRule(IAccessRightsRule rule)
        {
            var documentKinds = rule.DocumentKinds.Select(t => t.DocumentKind).ToList();
            var businessUnits = rule.BusinessUnits.Select(t => t.BusinessUnit).ToList();
            var departments   = rule.Departments.Select(t => t.Department).ToList();

            var documents = OfficialDocuments.GetAll()
                            .Where(d => !documentKinds.Any() || documentKinds.Contains(d.DocumentKind))
                            .Where(d => !businessUnits.Any() || businessUnits.Contains(d.BusinessUnit))
                            .Where(d => !departments.Any() || departments.Contains(d.Department));

            if (rule.DocumentGroups.Any())
            {
                return(FilterDocumentsByGroups(rule, documents));
            }
            else
            {
                return(documents.Select(d => d.Id));
            }
        }
Ejemplo n.º 17
0
        public override void SendByMail(Sungero.Domain.Client.ExecuteActionArgs e)
        {
            if (this.Entities.Count() != 1)
            {
                base.SendByMail(e);
                return;
            }

            var document  = OfficialDocuments.As(_objs.FirstOrDefault());
            var relations = Functions.OfficialDocument.GetRelatedDocumentsWithVersions(document);

            if (relations.Count > 0)
            {
                Functions.OfficialDocument.SelectRelatedDocumentsAndCreateEmail(document, relations);
            }
            else
            {
                base.SendByMail(e);
            }
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Выдать права на документ и приложения к нему.
        /// </summary>
        /// <param name="queueItem">Элемент очереди.</param>
        /// <param name="allRules">Действующие правила выдачи прав.</param>
        /// <returns>True, если элемент очереди был успешно обработан.</returns>
        protected virtual bool GrantRightsToDocumentByRules(IDocumentGrantRightsQueueItem queueItem, List <IAccessRightsRule> allRules)
        {
            var document = OfficialDocuments.GetAll(d => d.Id == queueItem.DocumentId.Value).FirstOrDefault();

            if (document == null)
            {
                return(true);
            }

            var rule = queueItem.AccessRightsRule;

            // Права на документ.
            if (GetAvailableRules(document, allRules).Any(s => Equals(s, rule)))
            {
                if (!TryGrantRightsToDocument(document, rule))
                {
                    return(false);
                }

                // Права на дочерние документы от ведущего.
                if (rule.GrantRightsOnLeadingDocument == true)
                {
                    var childDocumentIds = GetChildDocuments(document);
                    foreach (var childDocumentId in childDocumentIds)
                    {
                        var childDocument = OfficialDocuments.GetAll(d => d.Id == childDocumentId).FirstOrDefault();
                        if (childDocument == null)
                        {
                            continue;
                        }

                        if (!TryGrantRightsToDocument(childDocument, rule))
                        {
                            return(false);
                        }
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Получить ведомые документы.
        /// </summary>
        /// <param name="document">Документ.</param>
        /// <returns>Ведомые документы.</returns>
        private static List <int> GetChildDocuments(IOfficialDocument document)
        {
            var documents = new List <int>()
            {
                document.Id
            };
            var allChildDocuments = new List <int>();
            var childDocuments    = OfficialDocuments.GetAll(d => d.LeadingDocument != null && documents.Contains(d.LeadingDocument.Id) && !documents.Contains(d.Id))
                                    .Select(d => d.Id)
                                    .ToList();

            while (childDocuments.Any())
            {
                documents.AddRange(childDocuments);
                allChildDocuments.AddRange(childDocuments);
                childDocuments = OfficialDocuments.GetAll(d => d.LeadingDocument != null && documents.Contains(d.LeadingDocument.Id) && !documents.Contains(d.Id))
                                 .Select(d => d.Id)
                                 .ToList();
            }
            return(allChildDocuments);
        }
Ejemplo n.º 20
0
        public static IQueryable <IOfficialDocument> GetFilteredRegisteredDocuments(
            string registrationNumber, DateTime?registrationDateFrom, DateTime?registrationDateTo, IDocumentRegister documentRegister, ICaseFile caseFile, Company.IEmployee registeredBy)
        {
            var documents = OfficialDocuments.GetAll();

            if (registrationNumber != null)
            {
                documents = documents.Where(l => l.RegistrationNumber.Contains(registrationNumber));
            }

            if (registrationDateFrom != null)
            {
                documents = documents.Where(l => l.RegistrationDate >= registrationDateFrom);
            }

            if (registrationDateTo != null)
            {
                registrationDateTo = registrationDateTo.Value.Date.EndOfDay();
                documents          = documents.Where(l => l.RegistrationDate <= registrationDateTo);
            }

            if (documentRegister != null)
            {
                documents = documents.Where(l => Equals(l.DocumentRegister, documentRegister));
            }

            if (caseFile != null)
            {
                documents = documents.Where(l => Equals(l.CaseFile, caseFile));
            }

            if (registeredBy != null)
            {
                // TODO Zamerov: ересь с операциями.
                var regitrationOperation = new Enumeration(Docflow.PublicFunctions.OfficialDocument.GetRegistrationOperation());
                documents = documents.WhereDocumentHistory(h => Equals(h.User, registeredBy) && h.Operation == regitrationOperation);
            }

            return(documents);
        }
        /// <summary>
        /// Установить доступность свойств.
        /// </summary>
        /// <param name="refreshParameters">Информация по этапам для обновления формы задачи на согласование по регламенту.</param>
        public virtual void SetEnabledProperties(Structures.ApprovalTask.RefreshParameters refreshParameters)
        {
            var taskProperties = _obj.State.Properties;

            taskProperties.Addressee.IsEnabled    = false;
            taskProperties.ReqApprovers.IsEnabled = false;

            if (_obj.ApprovalRule != null)
            {
                taskProperties.Addressee.IsEnabled = refreshParameters.AddresseeIsEnabled;
            }

            var isExchange = _obj.DeliveryMethod != null && _obj.DeliveryMethod.Sid == Constants.MailDeliveryMethod.Exchange;

            taskProperties.ExchangeService.IsEnabled = refreshParameters.ExchangeServiceIsEnabled;
            var document = _obj.DocumentGroup.OfficialDocuments.FirstOrDefault();

            if (isExchange && OfficialDocuments.Is(document))
            {
                if (document.Versions.Any())
                {
                    var isIncomingDocument   = Docflow.PublicFunctions.OfficialDocument.Remote.CanSendAnswer(document);
                    var isFormalizedDocument = Docflow.AccountingDocumentBases.Is(document) && Docflow.AccountingDocumentBases.As(document).IsFormalized == true;
                    taskProperties.DeliveryMethod.IsEnabled  = refreshParameters.DeliveryMethodIsEnabled;
                    taskProperties.ExchangeService.IsEnabled = refreshParameters.ExchangeServiceIsEnabled;
                }
            }

            // Не давать менять адресата в согласовании служебных записок.
            if (Memos.Is(document))
            {
                taskProperties.Addressee.IsEnabled = false;
            }

            // Не давать изменять способ доставки для исходящих писем на несколько адресатов.
            if (OutgoingDocumentBases.Is(document) && OutgoingDocumentBases.As(document).IsManyAddressees == true)
            {
                taskProperties.DeliveryMethod.IsEnabled = false;
            }
        }
Ejemplo n.º 22
0
        public virtual void ForApprovalGroupAdded(Sungero.Workflow.Interfaces.AttachmentAddedEventArgs e)
        {
            var document = _obj.ForApprovalGroup.ElectronicDocuments.First();

            // Получить ресурсы в культуре тенанта.
            using (TenantInfo.Culture.SwitchTo())
                _obj.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.TaskSubject, document.Name);

            if (!_obj.State.IsCopied)
            {
                Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
                if (OfficialDocuments.Is(document))
                {
                    Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
                }
            }

            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.DocumentAttachedInMainGroup(OfficialDocuments.As(document), _obj);
            }
        }
Ejemplo n.º 23
0
 public IQueryable <IOfficialDocument> GetRegisteredDocuments()
 {
     return(OfficialDocuments.GetAll(x => Equals(x.DocumentRegister, _obj)));
 }
Ejemplo n.º 24
0
        public virtual void StartBlock3(Sungero.Docflow.Server.FreeApprovalReworkAssignmentArguments e)
        {
            // Синхронизировать группу приложений документа.
            var document = _obj.ForApprovalGroup.ElectronicDocuments.FirstOrDefault();

            Functions.Module.SynchronizeAddendaAndAttachmentsGroup(_obj.AddendaGroup, document);
            if (OfficialDocuments.Is(document))
            {
                Functions.OfficialDocument.AddRelatedDocumentsToAttachmentGroup(OfficialDocuments.As(document), _obj.OtherGroup);
            }

            e.Block.Performers.Add(_obj.Author);
            e.Block.RelativeDeadlineDays = 3;
            e.Block.Subject = Functions.Module.TrimSpecialSymbols(FreeApprovalTasks.Resources.RevisionAsgSubject, _obj.ForApprovalGroup.ElectronicDocuments.First().Name);
            if (_obj.MaxDeadline.HasValue)
            {
                e.Block.NewDeadline = _obj.MaxDeadline;
            }

            var approvalAssignments = FreeApprovalAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId);
            var reworkAssignments   = FreeApprovalReworkAssignments.GetAll(asg => asg.Task.Equals(_obj) && asg.TaskStartId == _obj.StartId);
            var lastIterationId     = Functions.FreeApprovalTask.GetApprovalAssignmentLastIterationId(_obj);

            // Если заданий на доработку не было, то заполняем всю таблицу из заданий по задаче,
            // если были - то исполнителей берем из последнего задания на доработку, а результат и действие заполняем по последним заданиям на согласование.
            if (!reworkAssignments.Any())
            {
                foreach (var aprAssignment in approvalAssignments.Where(asg => asg.IterationId == lastIterationId).OrderBy(i => i.Created))
                {
                    Functions.FreeApprovalTask.AddToReworkAssigneeNewApprover(e, aprAssignment);
                }
            }
            else
            {
                var approvalReworkAssignmentFromLastIteration = reworkAssignments.OrderByDescending(asg => asg.Created).First();
                foreach (var asgApprover in approvalReworkAssignmentFromLastIteration.Approvers.OrderBy(asg => asg.Id))
                {
                    // Копируем все значения.
                    var newApprover = e.Block.Approvers.FirstOrDefault(a => Equals(a.Approver, asgApprover.Approver)) ?? e.Block.Approvers.AddNew();
                    newApprover.Approver = asgApprover.Approver;
                    newApprover.Approved = asgApprover.Approved;
                    newApprover.Action   = asgApprover.Action;

                    // Если результат согласования изменился \ согласование не было выполнено - перебиваем данные.
                    var lastApprovalAsg = approvalAssignments.Where(asg => asg.Performer.Equals(asgApprover.Approver)).OrderByDescending(asg => asg.IterationId).ThenByDescending(asg => asg.Modified).FirstOrDefault();
                    if (lastApprovalAsg != null)
                    {
                        if (lastApprovalAsg.Result == Sungero.Docflow.FreeApprovalAssignment.Result.Approved)
                        {
                            newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.IsApproved;
                            newApprover.Action   = newApprover.Action == Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendForApproval ?
                                                   Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendNotice : Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.DoNotSend;
                        }
                        else if (lastApprovalAsg.Result == Sungero.Docflow.FreeApprovalAssignment.Result.Forward)
                        {
                            newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.NotApproved;
                            newApprover.Action   = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.DoNotSend;
                        }
                        else
                        {
                            newApprover.Approved = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Approved.NotApproved;
                            newApprover.Action   = Sungero.Docflow.FreeApprovalReworkAssignmentApprovers.Action.SendForApproval;
                        }
                    }
                }
                foreach (var newApproval in approvalAssignments.Where(a => a.IterationId == lastIterationId).OrderBy(i => i.Created))
                {
                    Functions.FreeApprovalTask.AddToReworkAssigneeNewApprover(e, newApproval);
                }
            }
        }
Ejemplo n.º 25
0
        /// <summary>
        /// Автоматическая выдача прав на документы.
        /// </summary>
        public virtual void GrantAccessRightsToDocuments()
        {
            // Отключение ФП для проверки тестов.
            if (PublicFunctions.Module.GetGrantRightMode() != Constants.Module.GrantRightsModeByJob)
            {
                return;
            }

            var startDate     = Calendar.Now;
            var lastStartDate = PublicFunctions.Module.GetLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate);

            var allRules = AccessRightsRules.GetAll(s => s.Status == Docflow.AccessRightsRule.Status.Active).ToList();

            if (!allRules.Any())
            {
                PublicFunctions.Module.UpdateLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate, startDate);
                return;
            }

            var hasRuleWithLeadingDocuments = allRules.Any(s => s.GrantRightsOnLeadingDocument == true);

            // Измененные документы.
            var queue = new List <Structures.DocumentGrantRightsQueueItem.ProxyQueueItem>();
            var changedDocumentIds = OfficialDocuments.GetAll(d => d.Modified >= lastStartDate && d.Modified <= startDate).Select(d => d.Id);

            foreach (var documentId in changedDocumentIds)
            {
                var document = OfficialDocuments.GetAll(d => d.Id == documentId).FirstOrDefault();
                if (document == null)
                {
                    continue;
                }

                var documentRules = GetAvailableRules(document, allRules);
                foreach (var documentRule in documentRules)
                {
                    queue.Add(CreateAccessRightsQueueItem(documentId, documentRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Document));
                }

                // Проверить наличие правил для ведущих документов, если есть хотя бы одно такое правило.
                if (hasRuleWithLeadingDocuments)
                {
                    var leadingDocumentIds = GetLeadingDocuments(document);
                    foreach (var leadingDocumentId in leadingDocumentIds)
                    {
                        var leadingDocument   = OfficialDocuments.GetAll(d => d.Id == leadingDocumentId).FirstOrDefault();
                        var leadDocumentRules = GetAvailableRules(leadingDocument, allRules);
                        foreach (var leadDocumentRule in leadDocumentRules)
                        {
                            queue.Add(CreateAccessRightsQueueItem(leadingDocument.Id, leadDocumentRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Document));
                        }

                        leadingDocument = leadingDocument.LeadingDocument;
                    }
                }
            }

            // Измененные настройки.
            var changedRules = allRules.Where(s =>
                                              s.Modified >= lastStartDate &&
                                              s.Modified <= startDate &&
                                              s.GrantRightsOnExistingDocuments == true);

            foreach (var changedRule in changedRules)
            {
                foreach (var ruleDocument in GetDocumentsByRule(changedRule))
                {
                    queue.Add(CreateAccessRightsQueueItem(ruleDocument, changedRule, Docflow.DocumentGrantRightsQueueItem.ChangedEntityType.Rule));
                }
            }

            var table = DocumentGrantRightsQueueItems.Info.DBTableName;
            var ids   = Sungero.Domain.IdentifierGenerator.GenerateIdentifiers(table, queue.Count).ToList();

            for (int i = 0; i < queue.Count; i++)
            {
                queue[i].Id = ids[i];
            }
            Docflow.PublicFunctions.Module.WriteStructuresToTable(table, queue);
            Logger.DebugFormat("GrantAccessRightsToDocuments: Added to queue {0} documents.", queue.Count);

            // Обновить дату запуска агента в базе.
            PublicFunctions.Module.UpdateLastAgentRunDate(Constants.Module.LastAccessRightsUpdateDate, startDate);

            // Выдать права на документы.
            var step    = 5;
            var error   = 0;
            var isEmpty = false;

            for (int i = 0; i < 10000; i = i + step)
            {
                // Если элементов больше нет - заканчиваем.
                if (isEmpty)
                {
                    break;
                }

                var result = Transactions.Execute(
                    () =>
                {
                    Logger.DebugFormat("GrantAccessRightsToDocuments: Start process queue from {0}.", i);

                    // Т.к. в конце транзакции элементы удаляются, в Take берем просто N новых элементов.
                    var queueItemPart = DocumentGrantRightsQueueItems.GetAll().Skip(error).Take(step).ToList();
                    if (!queueItemPart.Any())
                    {
                        // Завершаем транзакцию, если больше нечего обрабатывать.
                        isEmpty = true;
                        return;
                    }

                    var accessRightsGranted = queueItemPart
                                              .Where(q => this.GrantRightsToDocumentByRules(q, allRules))
                                              .ToList();
                    if (accessRightsGranted.Any())
                    {
                        Functions.Module.FastDeleteQueueItems(accessRightsGranted.Select(a => a.Id).ToList());
                    }
                    error += queueItemPart.Count - accessRightsGranted.Count;
                });
                if (!result)
                {
                    error += step;
                }
            }
        }
Ejemplo n.º 26
0
 public IQueryable <IOfficialDocument> ShowCaseDocuments()
 {
     return(OfficialDocuments.GetAll().Where(d => Equals(d.CaseFile, _obj)));
 }
Ejemplo n.º 27
0
        public IQueryable <IOfficialDocument> GetProjectDocuments()
        {
            var query = OfficialDocuments.GetAll().Where(d => Equals(d.Project, _obj));

            return(query);
        }