public static void FillContractFromLeadingDocument(Docflow.IOfficialDocument convertedDoc,
                                                    Docflow.IContractualDocumentBase contract)
 {
     if (ContractualDocuments.Is(contract) && IncomingInvoices.Is(convertedDoc))
     {
         IncomingInvoices.As(convertedDoc).Contract = ContractualDocuments.As(contract);
     }
 }
        /// <summary>
        /// Получить договорной документ игнорируя права доступа.
        /// </summary>
        /// <param name="documentId">ИД документа.</param>
        /// <returns>Договорной документ.</returns>
        public static IContractualDocument GetIgnoreAccessRights(int documentId)
        {
            // HACK Котегов: использование внутренней сессии для обхода прав доступа.
            Logger.DebugFormat("GetIgnoreAccessRights: contractId {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(ContractualDocuments.As((Sungero.Domain.Shared.IEntity)innerSession.Get(typeof(IContractualDocument), documentId)));
            }
        }
示例#3
0
 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);
 }
示例#4
0
        public static IQueryable <IContractualDocument> GetContractualDocsWithCounterparty(Parties.ICounterparty counterparty,
                                                                                           DateTime?dateFrom, DateTime?dateTo)
        {
            if (dateTo != null)
            {
                dateTo = dateTo.Value.AddDays(1);
            }

            return(ContractualDocuments.GetAll()
                   .Where(r => dateFrom == null || r.RegistrationDate >= dateFrom)
                   .Where(r => dateTo == null || r.RegistrationDate < dateTo)
                   .Where(r => r.Counterparty.Equals(counterparty)));
        }
示例#5
0
 public static IQueryable <IContractualDocument> GetFilteredRegisteredDocuments(
     string number, DateTime?dateFrom, DateTime?dateTo,
     IDocumentRegister documentRegister, ICaseFile caseFile, IEmployee responsibleEmployee)
 {
     if (dateTo != null)
     {
         dateTo = dateTo.Value.AddDays(1);
     }
     return(ContractualDocuments.GetAll()
            .Where(l => number == null || l.RegistrationNumber.Contains(number))
            .Where(l => dateFrom == null || l.RegistrationDate >= dateFrom)
            .Where(l => dateTo == null || l.RegistrationDate < dateTo)
            .Where(l => documentRegister == null || l.DocumentRegister.Equals(documentRegister))
            .Where(l => caseFile == null || l.CaseFile.Equals(caseFile))
            .Where(l => responsibleEmployee == null || l.ResponsibleEmployee.Equals(responsibleEmployee)));
 }
示例#6
0
        /// <summary>
        /// Агент создания задач по завершению контрольных точек договоров.
        /// </summary>
        public virtual void SendTaskForContractMilestones()
        {
            var contracts = ContractualDocuments.GetAll().Where(c => c.Milestones.Any());

            foreach (var contract in contracts)
            {
                if (!Locks.GetLockInfo(contract).IsLocked)
                {
                    foreach (var milestone in contract.Milestones)
                    {
                        // Создание задач.
                        var daysToFinishWorks = milestone.DaysToFinishWorks != null ? milestone.DaysToFinishWorks.Value : 3;
                        if (milestone.IsCompleted == false && milestone.Deadline < Calendar.Now.AddWorkingDays(milestone.Performer, daysToFinishWorks) &&
                            (milestone.Task == null || milestone.Task.Status == Workflow.SimpleTask.Status.Aborted || milestone.Task.Status == Workflow.SimpleTask.Status.Suspended))
                        {
                            var subject = string.Format(Sungero.Contracts.Resources.ContractMilestoneTaskSubject, milestone.Name, contract.Name);
                            if (subject.Length > Workflow.SimpleTasks.Info.Properties.Subject.Length)
                            {
                                subject = subject.Substring(0, Workflow.SimpleTasks.Info.Properties.Subject.Length);
                            }
                            subject = Docflow.PublicFunctions.Module.TrimQuotes(subject);

                            var attachments = new List <IContractualDocument>()
                            {
                                contract
                            };
                            if (SupAgreements.Is(contract))
                            {
                                attachments.Add(ContractualDocuments.As(contract.LeadingDocument));
                            }

                            var milestoneDeadline = milestone.Deadline.Value.Date < Calendar.GetUserToday(milestone.Performer) ? Calendar.Now.AddWorkingDays(milestone.Performer, 1) : milestone.Deadline.Value;
                            var task = Workflow.SimpleTasks.Create(subject, milestoneDeadline, new IUser[] { milestone.Performer }, attachments);
                            task.NeedsReview = false;

                            var contractTypeName = contract.DocumentKind.DocumentType.Name.ToLower();
                            task.ActiveText = Sungero.Contracts.Resources.ContractMilestoneTaskTextFormat(CaseConverter.ConvertJobTitleToTargetDeclension(contractTypeName, DeclensionCase.Dative));

                            if (!string.IsNullOrEmpty(milestone.Note))
                            {
                                task.ActiveText += "\n" + string.Format(Sungero.Contracts.Resources.ContractMilestoneTaskTextNote, milestone.Note);
                            }

                            var observers = new List <IUser>();
                            // Проверка на наличие дублей наблюдателей.
                            if (contract.ResponsibleEmployee != null && !Equals(contract.ResponsibleEmployee, milestone.Performer))
                            {
                                if (Docflow.PublicFunctions.PersonalSetting.GetPersonalSettings(contract.ResponsibleEmployee).MyContractsNotification == true)
                                {
                                    observers.Add(contract.ResponsibleEmployee);
                                }
                                var responsibleManager = Docflow.PublicFunctions.Module.Remote.GetManager(contract.ResponsibleEmployee);
                                if (responsibleManager != null && !Equals(responsibleManager, milestone.Performer) && !Equals(responsibleManager, contract.ResponsibleEmployee) &&
                                    Docflow.PublicFunctions.PersonalSetting.GetPersonalSettings(responsibleManager).MySubordinatesContractsNotification == true)
                                {
                                    observers.Add(responsibleManager);
                                }
                            }
                            var performerManager = Docflow.PublicFunctions.Module.Remote.GetManager(milestone.Performer);
                            if (performerManager != null && !Equals(performerManager, milestone.Performer) &&
                                Docflow.PublicFunctions.PersonalSetting.GetPersonalSettings(performerManager).MySubordinatesContractsNotification == true &&
                                !observers.Contains(performerManager))
                            {
                                observers.Add(performerManager);
                            }

                            foreach (var observer in observers)
                            {
                                task.Observers.AddNew().Observer = observer;
                            }

                            foreach (var attachment in attachments)
                            {
                                if (!attachment.AccessRights.IsGrantedDirectly(DefaultAccessRightsTypes.Read, milestone.Performer))
                                {
                                    attachment.AccessRights.Grant(milestone.Performer, DefaultAccessRightsTypes.Read);
                                }
                                if (performerManager != null && !attachment.AccessRights.IsGrantedDirectly(DefaultAccessRightsTypes.Read, performerManager))
                                {
                                    attachment.AccessRights.Grant(performerManager, DefaultAccessRightsTypes.Read);
                                }
                            }

                            task.Save();
                            task.Start();
                            milestone.Task = task;
                        }

                        if (milestone.Task != null)
                        {
                            // Проставление признака завершенности.
                            if (milestone.Task.Status == Workflow.SimpleTask.Status.Completed)
                            {
                                milestone.IsCompleted = true;
                            }

                            // Актуализация сроков заданий.
                            if (milestone.Deadline > milestone.Task.Deadline)
                            {
                                milestone.Task.Deadline = milestone.Deadline;
                                var assignment = Workflow.SimpleAssignments.GetAll().Where(a => Equals(a.Task, milestone.Task)).FirstOrDefault();
                                if (assignment != null)
                                {
                                    assignment.Deadline = milestone.Deadline;
                                }
                                assignment.Save();
                            }

                            // Прекращение задачи
                            if (milestone.IsCompleted == true)
                            {
                                milestone.Task.Abort();
                                milestone.Task = null;
                            }
                        }
                    }
                    if (contract.State.IsChanged)
                    {
                        contract.Save();
                    }
                }
            }
        }
示例#7
0
        public static List <IContractualDocument> FindContract(string uuid, string number, string date,
                                                               string businessUnitTIN, string businessUnitTRRC,
                                                               string counterpartyUuid, string counterpartyTIN, string counterpartyTRRC,
                                                               string sysid)
        {
            // Найти документ среди синхронизированных ранее.
            if (!string.IsNullOrWhiteSpace(uuid) && !string.IsNullOrWhiteSpace(sysid))
            {
                // Получить GUID типа Договор и доп.соглашение из разработки.
                var etalonContractTypeGuid     = Sungero.Metadata.Services.MetadataSearcher.FindEntityMetadata(typeof(IContract).GetFinalType()).NameGuid.ToString();
                var etalonSubAgreementTypeGuid = Sungero.Metadata.Services.MetadataSearcher.FindEntityMetadata(typeof(ISupAgreement).GetFinalType()).NameGuid.ToString();

                var extLinks = Commons.PublicFunctions.Module.GetExternalEntityLinks(uuid, sysid)
                               .Where(x => x.EntityType == etalonContractTypeGuid || x.EntityType == etalonSubAgreementTypeGuid)
                               .ToList();
                var contractIds = extLinks.Where(x => x.EntityType.ToUpper() == etalonContractTypeGuid.ToUpper()).Select(x => x.EntityId).ToList();
                var supAgreeIds = extLinks.Where(x => x.EntityType.ToUpper() == etalonSubAgreementTypeGuid.ToUpper()).Select(x => x.EntityId).ToList();

                var existDocuments = new List <IContractualDocument>();
                existDocuments.AddRange(Contracts.GetAll().Where(x => contractIds.Contains(x.Id)));
                existDocuments.AddRange(SupAgreements.GetAll().Where(x => supAgreeIds.Contains(x.Id)));

                if (existDocuments.Any())
                {
                    return(existDocuments);
                }
            }

            var result = ContractualDocuments.GetAll();

            // Фильтр по НОР.
            if (string.IsNullOrWhiteSpace(businessUnitTIN) || string.IsNullOrWhiteSpace(businessUnitTRRC))
            {
                return(new List <IContractualDocument>());
            }

            var businessUnit = Sungero.Company.BusinessUnits.GetAll().FirstOrDefault(x => x.TIN == businessUnitTIN && x.TRRC == businessUnitTRRC);

            if (businessUnit == null)
            {
                return(new List <IContractualDocument>());
            }
            else
            {
                result = result.Where(x => Equals(x.BusinessUnit, businessUnit));
            }

            // Фильтр по номеру.
            if (string.IsNullOrEmpty(number))
            {
                var emptyNumberSynonyms = new List <string> {
                    "б/н", "бн", "б-н", "б.н.", "б\\н"
                };
                result = result.Where(x => emptyNumberSynonyms.Contains(x.RegistrationNumber.ToLower()));
            }
            else
            {
                result = result.Where(x => x.RegistrationNumber == number);
            }

            // Фильтр по дате.
            DateTime parsedDate;

            if (!string.IsNullOrWhiteSpace(date) && DateTime.TryParseExact(date,
                                                                           "dd'.'MM'.'yyyy",
                                                                           System.Globalization.CultureInfo.InvariantCulture,
                                                                           System.Globalization.DateTimeStyles.None,
                                                                           out parsedDate))
            {
                result = result.Where(x => x.RegistrationDate == parsedDate);
            }

            // Фильтр по контрагенту.
            var counterparties = Sungero.Parties.PublicFunctions.Module.Remote.FindCounterparty(counterpartyUuid, counterpartyTIN, counterpartyTRRC, sysid);

            if (counterparties.Any())
            {
                result = result.Where(x => counterparties.Contains(x.Counterparty));
            }

            return(result.ToList());
        }