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); } } }
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; } }
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); }
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); }
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); }
/// <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); } }
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))))); }
/// <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))); } }
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; }
/// <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); }
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); }
/// <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); }
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); }
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); }
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); }
/// <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)); } }
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); } }
/// <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); }
/// <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); }
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; } }
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); } }
public IQueryable <IOfficialDocument> GetRegisteredDocuments() { return(OfficialDocuments.GetAll(x => Equals(x.DocumentRegister, _obj))); }
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); } } }
/// <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; } } }
public IQueryable <IOfficialDocument> ShowCaseDocuments() { return(OfficialDocuments.GetAll().Where(d => Equals(d.CaseFile, _obj))); }
public IQueryable <IOfficialDocument> GetProjectDocuments() { var query = OfficialDocuments.GetAll().Where(d => Equals(d.Project, _obj)); return(query); }