/// <summary> /// Отправка документа, либо ответа контрагенту с учетом выбранного сервиса обмена и приложений в задаче на согласование. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача.</param> public static void SendToCounterparty(IOfficialDocument document, Workflow.ITask task) { var approvalTask = ApprovalTasks.As(task); var addenda = approvalTask.AddendaGroup.OfficialDocuments.ToList(); Exchange.PublicFunctions.Module.SendResultToCounterparty(document, approvalTask.ExchangeService, addenda); }
/// <summary> /// Запросить подтверждение на выполнение задания. /// </summary> /// <param name="attachedDocument">Документ.</param> /// <param name="confirmationMessage">Сообщение с подтверждением.</param> /// <param name="dialogId">Ид диалога.</param> /// <param name="isSigning">Признак того, что документ проходит этап подписания.</param> /// <returns>True, если запрос был подтверждён.</returns> /// <remarks>Делает remote запрос.</remarks> public static bool ConfirmCompleteAssignment(IOfficialDocument attachedDocument, string confirmationMessage, string dialogId, bool isSigning = false) { var changed = Functions.ApprovalTask.Remote.DocumentHasBodyUpdateAfterLastView(attachedDocument); var viewed = Functions.ApprovalTask.Remote.DocumenHasBeenViewed(attachedDocument); return(ConfirmCompleteAssignment(changed, viewed, confirmationMessage, dialogId, isSigning)); }
/// <summary> /// Проверка, относится ли документ к проекту. /// </summary> /// <param name="document">Документ.</param> /// <param name="project">Проект.</param> /// <returns>Если документ относится к проекту, то true, иначе - false.</returns> public static bool IsDocumentBelongProject(IOfficialDocument document, IProject project) { var documentProject = Docflow.PublicFunctions.OfficialDocument.GetProject(document); var projects = GetProjectAndSubProjects(project); return(documentProject != null?projects.Contains(documentProject) : false); }
/// <summary> /// Проверить контрагента на резидент/нерезидент. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия (true, если контрагент нерезидент), сообщение об ошибке.</returns> private Structures.ConditionBase.ConditionResult CheckNonresident(IOfficialDocument document, IApprovalTask task) { if (OutgoingDocumentBases.Is(document)) { var outgoingDocument = OutgoingDocumentBases.As(document); // Если хоть один адресат нерезидент, идем по ветке с нерезидентом. var isNonResident = outgoingDocument.Addressees.Any(x => x.Correspondent.Nonresident == true); return(Structures.ConditionBase.ConditionResult.Create(isNonResident, string.Empty)); } if (ContractualDocumentBases.Is(document)) { var counterparty = ContractualDocumentBases.As(document).Counterparty; var nonresident = counterparty != null ? counterparty.Nonresident : true; return(Structures.ConditionBase.ConditionResult.Create(nonresident, string.Empty)); } if (AccountingDocumentBases.Is(document)) { var counterparty = AccountingDocumentBases.As(document).Counterparty; var nonresident = counterparty != null ? counterparty.Nonresident : true; return(Structures.ConditionBase.ConditionResult.Create(nonresident, string.Empty)); } return(Structures.ConditionBase.ConditionResult.Create(null, ConditionBases.Resources.DocumentNotContainsFieldCounterpartyOrCorrespondent)); }
/// <summary> /// Проверить доп. соглашение на дубли. /// </summary> /// <param name="supAgreement">Доп. соглашение.</param> /// <param name="businessUnit">НОР.</param> /// <param name="registrationNumber">Рег. номер.</param> /// <param name="registrationDate">Дата регистрации.</param> /// <param name="counterparty">Контрагент.</param> /// <param name="contract">Договор.</param> /// <returns>Признак дублей.</returns> public static bool HaveDuplicates(ISupAgreement supAgreement, Sungero.Company.IBusinessUnit businessUnit, string registrationNumber, DateTime?registrationDate, Sungero.Parties.ICounterparty counterparty, IOfficialDocument contract) { if (supAgreement == null || businessUnit == null || string.IsNullOrWhiteSpace(registrationNumber) || registrationDate == null || counterparty == null || contract == null) { return(false); } return(Functions.SupAgreement.Remote.GetDuplicates(supAgreement, businessUnit, registrationNumber, registrationDate, counterparty, contract) .Any()); }
/// <summary> /// Проверить способ доставки документа. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия (true, если способ доставки документа в списке).</returns> private Structures.ConditionBase.ConditionResult CheckDeliveryMethod(IOfficialDocument document, IApprovalTask task) { var deliveryMethod = task != null ? task.DeliveryMethod : document.DeliveryMethod; return(Structures.ConditionBase.ConditionResult .Create(_obj.DeliveryMethods.Any(d => Equals(d.DeliveryMethod, deliveryMethod)), string.Empty)); }
public virtual string GetNextNumber(DateTime date, int leadDocumentId, IOfficialDocument document, string leadingDocumentNumber, int departmentId, int businessUnitId, string caseFileIndex, string docKindCode, string indexLeadingSymbol) { var index = Functions.DocumentRegister.GetNextIndex(_obj, date, leadDocumentId, departmentId, businessUnitId, document).ToString(); var departmentCode = string.Empty; if (departmentId != 0) { var department = Departments.Get(departmentId); if (department != null) { departmentCode = department.Code ?? string.Empty; } } var businessUnitCode = string.Empty; if (businessUnitId != 0) { var businessUnit = BusinessUnits.Get(businessUnitId); if (businessUnit != null) { businessUnitCode = businessUnit.Code ?? string.Empty; } } var counterpartyCode = Functions.OfficialDocument.GetCounterpartyCode(document); var number = Functions.DocumentRegister.GenerateRegistrationNumber(_obj, date, index, leadingDocumentNumber, departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, indexLeadingSymbol); return(number); }
/// <summary> /// Выдать права на документ по правилу. /// </summary> /// <param name="document">Документ.</param> /// <param name="rule">Правило.</param> /// <returns>Возвращает true, если права удалось выдать, false - если надо повторить позже.</returns> public static bool TryGrantRightsToDocument(IOfficialDocument document, IAccessRightsRule rule) { Logger.DebugFormat("TryGrantRightsToDocument: document {0}, rule {1}", document.Id, rule.Id); var isChanged = false; foreach (var member in rule.Members) { if (!document.AccessRights.IsGrantedDirectly(Docflow.PublicFunctions.Module.GetRightTypeGuid(member.RightType), member.Recipient)) { if (Locks.GetLockInfo(document).IsLockedByOther) { return(false); } document.AccessRights.Grant(member.Recipient, Docflow.PublicFunctions.Module.GetRightTypeGuid(member.RightType)); isChanged = true; } } if (isChanged) { ((Domain.Shared.IExtendedEntity)document).Params[Constants.OfficialDocument.DontUpdateModified] = true; document.Save(); } return(true); }
/// <summary> /// Проверить возможность построения номера по разрезам журнала. /// </summary> /// <param name="document">Документ.</param> /// <returns>Сообщение об ошибке. Пустая строка, если возможно сформировать номер.</returns> public virtual string CheckDocumentRegisterSections(IOfficialDocument document) { var departmentValidationErrors = Functions.DocumentRegister.GetDepartmentValidationError(_obj, document); if (!Equals(departmentValidationErrors, string.Empty)) { return(departmentValidationErrors); } var businessUnitValidationErrors = Functions.DocumentRegister.GetBusinessUnitValidationError(_obj, document); if (!Equals(businessUnitValidationErrors, string.Empty)) { return(businessUnitValidationErrors); } var docKindCodeValidationErrors = Functions.DocumentRegister.GetDocumentKindValidationError(_obj, document); if (!Equals(docKindCodeValidationErrors, string.Empty)) { return(docKindCodeValidationErrors); } var docCaseFileValidationErrors = Functions.DocumentRegister.GetCaseFileValidationError(_obj, document); if (!Equals(docCaseFileValidationErrors, string.Empty)) { return(docCaseFileValidationErrors); } return(string.Empty); }
public virtual Sungero.Reporting.IReport GetAcquaintanceReport(IOfficialDocument document) { var report = Reports.GetAcquaintanceReport(); report.Document = document; return(report); }
/// <summary> /// Проверить наличие проекта в документе. /// </summary> /// <param name="document">Документ.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия (true, если проект указан в документе), сообщение об ошибке.</returns> private Structures.ConditionBase.ConditionResult CheckProjectDocument(IOfficialDocument document) { if (document != null) { return(Structures.ConditionBase.ConditionResult.Create(Functions.OfficialDocument.IsProjectDocument(document), string.Empty)); } return(Structures.ConditionBase.ConditionResult.Create(null, string.Empty)); }
/// <summary> /// Проверить наличие вложения в группу приложений с нужным видом. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия (true, если вложен документ с нужным видом).</returns> public virtual Structures.ConditionBase.ConditionResult CheckHasAddenda(IOfficialDocument document, IApprovalTask task) { if (task != null) { return(Structures.ConditionBase.ConditionResult.Create(task.AddendaGroup.OfficialDocuments.Any(a => Equals(a.DocumentKind, _obj.AddendaDocumentKind)), string.Empty)); } return(Structures.ConditionBase.ConditionResult.Create(null, string.Empty)); }
/// <summary> /// Проверить условие. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>True, если условие выполняется, и false, если не выполняется.</returns> public override Structures.ConditionBase.ConditionResult CheckCondition(IOfficialDocument document, IApprovalTask task) { if (_obj.ConditionType == ConditionType.Addressee) { return(this.CheckAddressee(document, task)); } return(base.CheckCondition(document, task)); }
/// <summary> /// Проверить вид документа. /// </summary> /// <param name="document">Документ.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия (true, если вид документа в списке), сообщение об ошибке.</returns> private Structures.ConditionBase.ConditionResult CheckDocumentKind(IOfficialDocument document) { if (document != null) { return(Structures.ConditionBase.ConditionResult.Create(_obj.ConditionDocumentKinds.Any(d => Equals(d.DocumentKind, document.DocumentKind)), string.Empty)); } return(Structures.ConditionBase.ConditionResult.Create(null, string.Empty)); }
/// <summary> /// Определять, содержит ли правило условие. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <param name="condition">Тип условия.</param> /// <returns>True, если содержит, иначе false.</returns> public bool HasApprovalCondition(IOfficialDocument document, IApprovalTask task, Enumeration condition) { if (_obj == null) { return(false); } var conditions = this.GetConditions(document, task); return(conditions.Any(c => c.Condition.ConditionType == condition)); }
/// <summary> /// Определять, содержит ли правило этап согласования. /// </summary> /// <param name="stage">Этап согласования.</param> /// <param name="document">Документ.</param> /// <param name="stages">Этапы согласования в правильном порядке.</param> /// <returns>True, если содержит, иначе false.</returns> public bool HasApprovalStage(Enumeration stage, IOfficialDocument document, System.Collections.Generic.List <Structures.Module.DefinedApprovalStageLite> stages) { if (_obj == null) { return(false); } var hasStage = stages.Where(s => s.Stage.StageType == stage).Any(); return(hasStage); }
private static string GetOriginalExchangeServiceNameByDocument(IOfficialDocument document) { var task = Exchange.ExchangeDocumentProcessingTasks.GetAll().FirstOrDefault(t => t.AttachmentDetails.Any(a => a.AttachmentId == document.Id)); if (task == null) { return(string.Empty); } return(task.ExchangeService.Name); }
/// <summary> /// Получить из списка правил подходящие для документа. /// </summary> /// <param name="document">Документ.</param> /// <param name="rules">Правила.</param> /// <returns>Подходящие правила.</returns> public static List <IAccessRightsRule> GetAvailableRules(IOfficialDocument document, List <IAccessRightsRule> rules) { var documentGroup = Functions.OfficialDocument.GetDocumentGroup(document); return(rules .Where(s => s.Status == Docflow.AccessRightsRule.Status.Active) .Where(s => !s.DocumentKinds.Any() || s.DocumentKinds.Any(k => Equals(k.DocumentKind, document.DocumentKind))) .Where(s => !s.BusinessUnits.Any() || s.BusinessUnits.Any(u => Equals(u.BusinessUnit, document.BusinessUnit))) .Where(s => !s.Departments.Any() || s.Departments.Any(k => Equals(k.Department, document.Department))) .Where(s => !s.DocumentGroups.Any() || s.DocumentGroups.Any(k => Equals(k.DocumentGroup, documentGroup))).ToList()); }
/// <summary> /// Проверить условие. /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>Результат проверки условия. Структуру формата - выполнение условия, сообщение об ошибке.</returns> public virtual Structures.ConditionBase.ConditionResult CheckCondition(IOfficialDocument document, IApprovalTask task) { if (_obj.ConditionType == ConditionType.AmountIsMore) { return(this.CheckAmountIsMore(document, task)); } if (_obj.ConditionType == ConditionType.Nonresident) { return(this.CheckNonresident(document, task)); } if (_obj.ConditionType == ConditionType.Currency) { return(this.CheckCurrency(document, task)); } if (_obj.ConditionType == ConditionType.ProjectDocument) { return(this.CheckProjectDocument(document)); } if (_obj.ConditionType == ConditionType.DocumentKind) { return(this.CheckDocumentKind(document)); } if (_obj.ConditionType == ConditionType.RolesComparer) { return(Functions.ConditionBase.Remote.CompareRoles(_obj, task)); } if (_obj.ConditionType == ConditionType.RoleEmpComparer) { return(Functions.ConditionBase.Remote.CompareRoleAndRecipient(_obj, task)); } if (_obj.ConditionType == ConditionType.DeliveryMethod) { return(this.CheckDeliveryMethod(document, task)); } if (_obj.ConditionType == ConditionType.SignedByCParty) { return(this.CheckSignedByCounterparty(document, task)); } if (_obj.ConditionType == ConditionType.HasAddenda) { return(this.CheckHasAddenda(document, task)); } return(Structures.ConditionBase.ConditionResult.Create(null, ConditionBases.Resources.CannotPerformConditionCheck)); }
/// <summary> /// Получить права участников проекта. /// </summary> /// <param name="queueItem">Элемент очереди.</param> /// <param name="document">Документ.</param> /// <param name="project">Проект.</param> /// <returns>Список прав в виде реципиент-тип прав.</returns> internal List <Structures.Module.RecipientRights> GetProjectRecipientRights(IProjectDocumentRightsQueueItem queueItem, IOfficialDocument document, IProjectBase project) { var result = new List <Structures.Module.RecipientRights>(); // Выдать права на сам документ. this.AddRecipientRightsForProject(document, project, document.DocumentKind.GrantRightsToProject.Value, result); this.GrantRightsOnDocumentToLeadingProgect(document, result); return(result); }
public virtual IEmployee GetPerformerContractResponsible(IOfficialDocument document) { if (ContractualDocuments.Is(document)) { return(ContractualDocuments.As(document).ResponsibleEmployee); } else if (Docflow.AccountingDocumentBases.Is(document)) { return(Docflow.AccountingDocumentBases.As(document).ResponsibleEmployee); } return(null); }
/// <summary> /// Отфильтровать шаблоны по критериям. /// </summary> /// <param name="documentTemplates">Коллекция шаблонов.</param> /// <param name="document">Документ, который создается из шаблона.</param> /// <param name="documentKind">Вид документа.</param> /// <param name="businessUnit">Наша организация.</param> /// <param name="department">Подразделение.</param> /// <param name="isCalledFromDocument">True - вызывается из документа, false - вызывается из списка.</param> /// <returns>Коллекция отфильтрованных шаблонов.</returns> public static IQueryable <T> FilterTemplatesByCriteria(IQueryable <T> documentTemplates, IOfficialDocument document, IDocumentKind documentKind, Company.IBusinessUnit businessUnit, Company.IDepartment department, bool isCalledFromDocument) { // Вид документа. var allDocumentTypeGuid = Guid.Parse(Docflow.PublicConstants.DocumentTemplate.AllDocumentTypeGuid); if (documentKind != null) { var typeGuid = Guid.Parse(documentKind.DocumentType.DocumentTypeGuid); documentTemplates = documentTemplates.Where(d => !d.DocumentKinds.Any() && (d.DocumentType == allDocumentTypeGuid || d.DocumentType == typeGuid) || d.DocumentKinds.Any(k => Equals(k.DocumentKind, documentKind))); } else if (isCalledFromDocument) { var typeGuid = document.TypeDiscriminator; var availableKinds = PublicFunctions.DocumentKind.GetAvailableDocumentKinds(document); documentTemplates = documentTemplates.Where(d => !d.DocumentKinds.Any() && (d.DocumentType == allDocumentTypeGuid || d.DocumentType == typeGuid) || availableKinds.Any(x => string.Equals(x.DocumentType.DocumentTypeGuid, typeGuid.ToString(), StringComparison.InvariantCultureIgnoreCase))); } // НОР. if (businessUnit != null) { documentTemplates = documentTemplates.Where(d => !d.BusinessUnits.Any() || d.BusinessUnits.Any(t => Equals(t.BusinessUnit, businessUnit))); } else if (isCalledFromDocument) { documentTemplates = documentTemplates.Where(d => !d.BusinessUnits.Any()); } // Подразделение. if (department != null) { documentTemplates = documentTemplates.Where(d => !d.Departments.Any() || d.Departments.Any(t => Equals(t.Department, department))); } else if (isCalledFromDocument) { documentTemplates = documentTemplates.Where(d => !d.Departments.Any()); } return(documentTemplates); }
/// <summary> /// Выдать права на документ вышестоящим проектам. /// </summary> /// <param name="document">Документ.</param> /// <param name="result">Результат.</param> private void GrantRightsOnDocumentToLeadingProgect(IOfficialDocument document, List <RecipientRights> result) { var grantRightsDocument = document; while (document.LeadingDocument != null) { var leadingProjectBase = document.LeadingDocument.Project; var leadingProject = leadingProjectBase != null?Projects.GetAll(p => p.Id == leadingProjectBase.Id).FirstOrDefault() : Projects.Null; this.AddRecipientRightsForProject(grantRightsDocument, leadingProject, document.LeadingDocument.DocumentKind.GrantRightsToProject.Value, result); document = document.LeadingDocument; } }
/// <summary> /// Проверка, зарегистрирован ли входящий документ. /// </summary> /// <param name="document">Документ.</param> /// <returns>True, если документ зарегистрирован, либо документ не входящий.</returns> public static bool IncomingDocumentRegistered(IOfficialDocument document) { if (document == null || document.DocumentKind == null) { return(true); } var documentKind = document.DocumentKind; return(documentKind.DocumentFlow != Docflow.DocumentKind.DocumentFlow.Incoming || documentKind.NumberingType != Docflow.DocumentKind.NumberingType.Registrable || document.RegistrationState == Docflow.OfficialDocument.RegistrationState.Registered); }
public virtual int?GetSenderSignatureId(IOfficialDocument document, Sungero.Content.IElectronicDocumentVersions version) { var info = Exchange.PublicFunctions.ExchangeDocumentInfo.Remote.GetExDocumentInfoFromVersion(document, version.Id); var senderSignature = Signatures.Get(version).Where(x => x.Id == info.SenderSignId).SingleOrDefault(); if (senderSignature != null) { return(senderSignature.Id); } else { return(null); } }
/// <summary> /// Получить ведущие документы. /// </summary> /// <param name="document">Документ.</param> /// <returns>Ведущие документы.</returns> private static List <int> GetLeadingDocuments(IOfficialDocument document) { var documents = new List <int>() { document.Id }; var leadingDocuments = new List <int>(); while (document.LeadingDocument != null && !documents.Contains(document.LeadingDocument.Id)) { documents.Add(document.LeadingDocument.Id); leadingDocuments.Add(document.LeadingDocument.Id); } return(leadingDocuments); }
public static IQueryable <ISupAgreement> GetDuplicates(ISupAgreement supAgreement, Sungero.Company.IBusinessUnit businessUnit, string registrationNumber, DateTime?registrationDate, Sungero.Parties.ICounterparty counterparty, IOfficialDocument contract) { return(SupAgreements.GetAll() .Where(l => Equals(supAgreement.DocumentKind, l.DocumentKind)) .Where(l => Equals(businessUnit, l.BusinessUnit)) .Where(l => registrationDate == l.RegistrationDate) .Where(l => registrationNumber == l.RegistrationNumber) .Where(l => Equals(counterparty, l.Counterparty)) .Where(l => Equals(contract, l.LeadingDocument)) .Where(l => !Equals(supAgreement, l))); }
/// <summary> /// Проверить условие "Типовой". /// </summary> /// <param name="document">Документ.</param> /// <param name="task">Задача на согласование.</param> /// <returns>True, если документ типовой.</returns> private Docflow.Structures.ConditionBase.ConditionResult CheckStandard(IOfficialDocument document, IApprovalTask task) { if (Sungero.Contracts.ContractualDocuments.Is(document)) { var contractualDocument = Sungero.Contracts.ContractualDocuments.As(document); if (!contractualDocument.IsStandard.HasValue) { return(Docflow.Structures.ConditionBase.ConditionResult.Create(null, ContractConditions.Resources.TheStandardIsNotFilledInContractCard)); } return(Docflow.Structures.ConditionBase.ConditionResult.Create(contractualDocument.IsStandard.Value, string.Empty)); } return(Docflow.Structures.ConditionBase.ConditionResult.Create(null, ContractConditions.Resources.StandardFormPropertyCanBeCheckedOnlyForContracts)); }
/// <summary> /// Подобрать для документа подходящее хранилище. /// </summary> /// <param name="document">Документ.</param> /// <returns>Наиболее подходящее хранилище для документа.</returns> public virtual IStorage GetStorageByPolicies(IOfficialDocument document) { var policies = StoragePolicies.GetAllCached().Where(r => r.Status == Docflow.StoragePolicyBase.Status.Active && (document.DocumentKind == null || !r.DocumentKinds.Any() || r.DocumentKinds.Any(k => Equals(k.DocumentKind, document.DocumentKind)))); var policy = policies.OrderByDescending(p => p.Priority).FirstOrDefault(); if (policy != null) { return(policy.Storage); } return(null); }
public static IQueryable <IDocumentKind> GetAvailableDocumentKinds(IOfficialDocument document) { var documentKinds = DocumentKinds.GetAll(r => r.Status == CoreEntities.DatabookEntry.Status.Active); var type = document.GetType(); var typeProperty = type.GetProperty("TypeGuid"); if (typeProperty != null) { var typeGuid = ((Guid)typeProperty.GetValue(document)).GetOriginalTypeGuid().ToString(); documentKinds = documentKinds.Where(k => k.DocumentType.DocumentTypeGuid == typeGuid); } return(documentKinds); }