Exemplo n.º 1
0
        /// <summary>
        /// Получить сравнение рег.номера с шаблоном.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="date">Дата.</param>
        /// <param name="registrationNumber">Рег. номер.</param>
        /// <param name="indexTemplate">Шаблон номера.</param>
        /// <param name="departmentCode">Код подразделения.</param>
        /// <param name="businessUnitCode">Код нашей организации.</param>
        /// <param name="caseFileIndex">Индекс дела.</param>
        /// <param name="docKindCode">Код вида документа.</param>
        /// <param name="counterpartyCode">Код контрагента.</param>
        /// <param name="leadDocNumber">Номер ведущего документа.</param>
        /// <param name="numberPostfix">Постфикс номера.</param>
        /// <param name="additionalPrefix">Дополнительный префикс номера.</param>
        /// <returns>Индекс.</returns>
        internal static Match GetRegexMatchFromRegistrationNumber(IDocumentRegister documentRegister, DateTime date, string registrationNumber,
                                                                  string indexTemplate, string departmentCode, string businessUnitCode,
                                                                  string caseFileIndex, string docKindCode, string counterpartyCode, string leadDocNumber,
                                                                  string numberPostfix, string additionalPrefix)
        {
            var prefixAndPostfix = Functions.DocumentRegister.GenerateRegistrationNumberPrefixAndPostfix(documentRegister, date, leadDocNumber, departmentCode,
                                                                                                         businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, true);
            var template = string.Format("{0}{1}{2}{3}", Regex.Escape(prefixAndPostfix.Prefix),
                                         indexTemplate,
                                         Regex.Escape(prefixAndPostfix.Postfix),
                                         numberPostfix);

            // Заменить метасимвол для кода контрагента на соответствующее регулярное выражение.
            var metaCounterpartyCode = Regex.Escape(DocumentRegisters.Resources.NumberFormatCounterpartyCode);

            template = template.Replace(metaCounterpartyCode, Constants.DocumentRegister.CounterpartyCodeRegex);

            // Совпадение в начале строки.
            var numberTemplate = string.Format("^{0}", template);
            var match          = Regex.Match(registrationNumber, numberTemplate);

            if (match.Success)
            {
                return(match);
            }

            // Совпадение в конце строки.
            numberTemplate = string.Format("{0}{1}$", additionalPrefix, template);
            return(Regex.Match(registrationNumber, numberTemplate));
        }
Exemplo n.º 2
0
 /// <summary>
 /// Сформировать ошибку валидации.
 /// </summary>
 /// <param name="documentRegister">Журнал регистрации.</param>
 /// <param name="errorModel">Шаблон ошибки.</param>
 /// <returns>Ошибка валидации.</returns>
 public static string CreateValidationError(IDocumentRegister documentRegister, string errorModel)
 {
     if (documentRegister.RegisterType == Docflow.DocumentRegister.RegisterType.Numbering)
     {
         return(string.Format(errorModel, Docflow.Resources.numberWord));
     }
     else
     {
         return(string.Format(errorModel, Docflow.Resources.registerWord));
     }
 }
Exemplo n.º 3
0
        public static bool HasRegisteredDocuments(IDocumentRegister documentRegister)
        {
            var command = string.Format(Queries.DocumentRegister.HasRegisteredDocuments, documentRegister.Id);

            var executionResult = Docflow.PublicFunctions.Module.ExecuteScalarSQLCommand(command);
            var result          = 0;

            if (!(executionResult is DBNull) && executionResult != null)
            {
                int.TryParse(executionResult.ToString(), out result);
            }

            return(result != 0);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Проверить совпадение рег.номеров.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="date">Дата.</param>
        /// <param name="registrationNumber">Рег. номер.</param>
        /// <param name="departmentCode">Код подразделения.</param>
        /// <param name="businessUnitCode">Код нашей организации.</param>
        /// <param name="caseFileIndex">Индекс дела.</param>
        /// <param name="docKindCode">Код вида документа.</param>
        /// <param name="counterpartyCode">Код контрагента.</param>
        /// <param name="leadDocNumber">Номер ведущего документа.</param>
        /// <param name="registrationNumberSample">Пример рег. номера.</param>
        /// <param name="searchCorrectingPostfix">Искать корректировочный постфикс.</param>
        /// <returns>True, если совпадают.</returns>
        /// <remarks>Пример: 5/1-П/2020, где 5 - порядковый номер, П - индекс журнала, 2020 - год, /1 - корректировочный постфикс.</remarks>
        public static bool IsEqualsRegistrationNumbers(IDocumentRegister documentRegister, DateTime date, string registrationNumber,
                                                       string departmentCode, string businessUnitCode, string caseFileIndex, string docKindCode, string counterpartyCode,
                                                       string leadDocNumber, string registrationNumberSample,
                                                       bool searchCorrectingPostfix)
        {
            var indexAndPostfix = ParseRegistrationNumber(documentRegister, date, registrationNumberSample, departmentCode, businessUnitCode,
                                                          caseFileIndex, docKindCode, counterpartyCode, leadDocNumber, searchCorrectingPostfix);
            var maxLeadZeroIndexCount = 9 - indexAndPostfix.Index.ToString().Count();
            var indexRegexTemplate    = "[0]{0," + maxLeadZeroIndexCount + "}" + indexAndPostfix.Index + Regex.Escape(indexAndPostfix.CorrectingPostfix);

            return(GetRegexMatchFromRegistrationNumber(documentRegister, date, registrationNumber, indexRegexTemplate, departmentCode,
                                                       businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
                                                       indexAndPostfix.Postfix + "$", "^").Success);
        }
Exemplo n.º 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)));
 }
        public string[] GetPeriods(IDocumentRegister documentRegister)
        {
            var currentPeriods = new List <string>
            {
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.CurrentYear,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.CurrentQuarter,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.CurrentMonth,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.CurrentWeek
            };
            var previousPeriods = new List <string>
            {
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.PreviousYear,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.PreviousQuarter,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.PreviousMonth,
                Sungero.Docflow.Reports.Resources.SkippedNumbersReport.PreviousWeek
            };

            var skipPeriods = 0;
            var takePeriods = 3;

            if (documentRegister != null &&
                documentRegister.NumberingPeriod.Value == Sungero.Docflow.DocumentRegister.NumberingPeriod.Month)
            {
                skipPeriods = 2;
                takePeriods = 2;
            }

            if (documentRegister != null &&
                documentRegister.NumberingPeriod.Value == Sungero.Docflow.DocumentRegister.NumberingPeriod.Quarter)
            {
                skipPeriods = 1;
            }

            var result = new List <string>();

            result.AddRange(currentPeriods.Skip(skipPeriods).Take(takePeriods));
            result.AddRange(previousPeriods.Skip(skipPeriods).Take(takePeriods));

            return(result.ToArray());
        }
Exemplo n.º 7
0
        /// <summary>
        /// Проверить заполненность дела.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="document">Документ.</param>
        /// <returns>Текст ошибки, либо string.Empty.</returns>
        public static string GetCaseFileValidationError(IDocumentRegister documentRegister, IOfficialDocument document)
        {
            // Проверить необходимость дела.
            if (documentRegister == null || !documentRegister.NumberFormatItems.Any(n => n.Element == DocumentRegisterNumberFormatItems.Element.CaseFile))
            {
                return(string.Empty);
            }

            // Проверить наличие дела.
            if (document.CaseFile == null)
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillCaseFile));
            }

            // Проверить наличие кода у дела.
            if (string.IsNullOrEmpty(document.CaseFile.Index))
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillCaseFileCode));
            }

            return(string.Empty);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Проверить заполненность кода вида документа.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="document">Документ.</param>
        /// <returns>Текст ошибки, либо string.Empty.</returns>
        public static string GetDocumentKindValidationError(IDocumentRegister documentRegister, IOfficialDocument document)
        {
            // Проверить необходимость кода вида документа.
            if (documentRegister == null || !documentRegister.NumberFormatItems.Any(n => n.Element == DocumentRegisterNumberFormatItems.Element.DocKindCode))
            {
                return(string.Empty);
            }

            // Проверить наличие вида документа.
            if (document.DocumentKind == null)
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillDocumentKind));
            }

            // Проверить наличие кода у вида документа.
            if (string.IsNullOrWhiteSpace(document.DocumentKind.Code))
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillDocumentKindCode));
            }

            return(string.Empty);
        }
Exemplo n.º 9
0
        /// <summary>
        /// Проверить заполненность НОР и кода НОР.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="document">Документ.</param>
        /// <returns>Текст ошибки, либо string.Empty.</returns>
        public static string GetBusinessUnitValidationError(IDocumentRegister documentRegister, IOfficialDocument document)
        {
            // Проверить необходимость кода НОР.
            if (documentRegister == null || !documentRegister.NumberFormatItems.Any(n => n.Element == DocumentRegisterNumberFormatItems.Element.BUCode))
            {
                return(string.Empty);
            }

            // Проверить наличие НОР.
            if (document.BusinessUnit == null)
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillBusinessUnit));
            }

            // Проверить наличие кода у НОР.
            if (string.IsNullOrWhiteSpace(document.BusinessUnit.Code))
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillBusinessUnitCode));
            }

            return(string.Empty);
        }
Exemplo n.º 10
0
        /// <summary>
        /// Проверить заполненность подразделения и кода подразделения.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="document">Документ.</param>
        /// <returns>Текст ошибки, либо string.Empty.</returns>
        public static string GetDepartmentValidationError(IDocumentRegister documentRegister, IOfficialDocument document)
        {
            // Проверить необходимость кода подразделения.
            if (documentRegister == null || !documentRegister.NumberFormatItems.Any(n => n.Element == DocumentRegisterNumberFormatItems.Element.DepartmentCode))
            {
                return(string.Empty);
            }

            // Проверить наличие подразделения.
            if (document.Department == null)
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillDepartment));
            }

            // Проверить наличие кода у подразделения.
            if (string.IsNullOrWhiteSpace(document.Department.Code))
            {
                return(CreateValidationError(documentRegister, Docflow.Resources.FillDepartmentCode));
            }

            return(string.Empty);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Диалог с запросом параметров для отчетов по журналам регистрации.
        /// </summary>
        /// <param name="reportName">Наименование отчета.</param>
        /// <param name="direction">Направление документопотока журнала.</param>
        /// <param name="documentRegisterValue">Журнал.</param>
        /// <param name="helpCode">Код справки.</param>
        /// <returns>Возвращает структуру формата - запустить отчет, дата начала, дата окончания, журнал.</returns>
        public static Structures.Module.DocumentRegisterReportParametrs ShowDocumentRegisterReportDialog(string reportName, Enumeration direction,
                                                                                                         IDocumentRegister documentRegisterValue,
                                                                                                         string helpCode)
        {
            var personalSettings = Docflow.PublicFunctions.PersonalSetting.GetPersonalSettings(Employees.Current);
            var dialog           = Dialogs.CreateInputDialog(reportName);

            dialog.HelpCode = helpCode;

            var settingsBeginDate = Docflow.PublicFunctions.PersonalSetting.GetStartDate(personalSettings);
            var beginDate         = dialog.AddDate(Resources.StartDate, true, settingsBeginDate ?? Calendar.UserToday);
            var settingsEndDate   = Docflow.PublicFunctions.PersonalSetting.GetEndDate(personalSettings);
            var endDate           = dialog.AddDate(Resources.EndDate, true, settingsEndDate ?? Calendar.UserToday);

            INavigationDialogValue <IDocumentRegister> documentRegister = null;

            if (documentRegisterValue == null)
            {
                var documentRegisters = Functions.Module.Remote.GetFilteredDocumentRegistersForReport(direction);
                IDocumentRegister defaultDocumentRegister = null;
                if (personalSettings != null)
                {
                    if (direction == Docflow.DocumentRegister.DocumentFlow.Incoming)
                    {
                        defaultDocumentRegister = personalSettings.IncomingDocRegister;
                    }
                    else if (direction == Docflow.DocumentRegister.DocumentFlow.Outgoing)
                    {
                        defaultDocumentRegister = personalSettings.OutgoingDocRegister;
                    }
                    else
                    {
                        defaultDocumentRegister = personalSettings.InnerDocRegister;
                    }
                }

                if (documentRegisters.Count == 1)
                {
                    documentRegister = dialog.AddSelect(Docflow.Resources.DocumentRegister, true, documentRegisters.FirstOrDefault()).From(documentRegisters);
                }
                else
                {
                    documentRegister = dialog.AddSelect(Docflow.Resources.DocumentRegister, true, defaultDocumentRegister).From(documentRegisters);
                }
            }

            dialog.SetOnButtonClick((args) =>
            {
                Docflow.PublicFunctions.Module.CheckReportDialogPeriod(args, beginDate, endDate);
            });

            dialog.Buttons.AddOkCancel();
            dialog.Buttons.Default = DialogButtons.Ok;
            if (dialog.Show() == DialogButtons.Ok)
            {
                if (documentRegisterValue == null)
                {
                    documentRegisterValue = documentRegister.Value;
                }
                return(Structures.Module.DocumentRegisterReportParametrs.Create(true, beginDate.Value, endDate.Value, documentRegisterValue));
            }
            else
            {
                documentRegisterValue = null;
                return(Structures.Module.DocumentRegisterReportParametrs.Create(false, null, null, null));
            }
        }
Exemplo n.º 12
0
 public static List <IRegistrationSetting> GetByDocumentRegister(IDocumentRegister documentRegister)
 {
     return(RegistrationSettings.GetAllCached(s => s.Status == CoreEntities.DatabookEntry.Status.Active && Equals(s.DocumentRegister, documentRegister)).ToList());
 }
Exemplo n.º 13
0
        /// <summary>
        /// Выделить составные части рег.номера.
        /// </summary>
        /// <param name="documentRegister">Журнал.</param>
        /// <param name="date">Дата.</param>
        /// <param name="registrationNumber">Рег. номер.</param>
        /// <param name="departmentCode">Код подразделения.</param>
        /// <param name="businessUnitCode">Код нашей организации.</param>
        /// <param name="caseFileIndex">Индекс дела.</param>
        /// <param name="docKindCode">Код вида документа.</param>
        /// <param name="counterpartyCode">Код контрагента.</param>
        /// <param name="leadDocNumber">Номер ведущего документа.</param>
        /// <param name="searchCorrectingPostfix">Искать корректировочный постфикс.</param>
        /// <returns>Индекс рег.номера.</returns>
        /// <remarks>Пример: 5/1-П/2020, где 5 - порядковый номер, П - индекс журнала, 2020 - год, /1 - корректировочный постфикс.</remarks>
        public static Structures.DocumentRegister.RegistrationNumberIndex ParseRegistrationNumber(IDocumentRegister documentRegister, DateTime date, string registrationNumber,
                                                                                                  string departmentCode, string businessUnitCode, string caseFileIndex, string docKindCode, string counterpartyCode,
                                                                                                  string leadDocNumber, bool searchCorrectingPostfix)
        {
            // "(.*?)" определяет место, в котором находятся искомые данные.
            var releasingExpression = "(.*?)$";
            // Регулярное выражение для рег. индекса.
            // "([0-9]+)" определяет, где искать индекс в номере.
            // "([\.\/-][0-9]+)?" определяет, где искать корректировочный постфикс в номере.
            // Пустые скобки в выражении @"([0-9]+)()" означают корректировочный постфикс,
            // чтобы количество групп в результате регулярного выражения было всегда одинаковым, независимо от того, нужно искать корректировочный постфикс или нет.
            var indexExpression = searchCorrectingPostfix ? @"([0-9]+)([\.\/-][0-9]+)?" : @"([0-9]+)()";

            // Распарсить рег.номер на составляющие.
            var registrationNumberMatch = GetRegexMatchFromRegistrationNumber(documentRegister, date, registrationNumber, indexExpression,
                                                                              departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
                                                                              releasingExpression, string.Empty);
            var indexOfNumber     = registrationNumberMatch.Groups[1].Value;
            var correctingPostfix = registrationNumberMatch.Groups[2].Value;
            var postfix           = registrationNumberMatch.Groups[3].Value;

            int index;

            index = int.TryParse(indexOfNumber, out index) ? index : 0;
            return(Structures.DocumentRegister.RegistrationNumberIndex.Create(index, postfix, correctingPostfix));
        }
Exemplo n.º 14
0
 /// <summary>
 /// Получить индекс рег. номера.
 /// </summary>
 /// <param name="documentRegister">Журнал.</param>
 /// <param name="date">Дата.</param>
 /// <param name="registrationNumber">Рег. номер.</param>
 /// <param name="departmentCode">Код подразделения.</param>
 /// <param name="businessUnitCode">Код нашей организации.</param>
 /// <param name="caseFileIndex">Индекс дела.</param>
 /// <param name="docKindCode">Код вида документа.</param>
 /// <param name="counterpartyCode">Код контрагента.</param>
 /// <param name="leadDocNumber">Номер ведущего документа.</param>
 /// <param name="searchCorrectingPostfix">Искать корректировочный постфикс.</param>
 /// <returns>Индекс.</returns>
 /// <remarks>Пример: 5/1-П/2020, где 5 - порядковый номер, П - индекс журнала, 2020 - год, /1 - корректировочный постфикс.</remarks>
 public static int GetIndexFromRegistrationNumber(IDocumentRegister documentRegister, DateTime date, string registrationNumber,
                                                  string departmentCode, string businessUnitCode, string caseFileIndex, string docKindCode, string counterpartyCode,
                                                  string leadDocNumber, bool searchCorrectingPostfix)
 {
     return(ParseRegistrationNumber(documentRegister, date, registrationNumber, departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber, searchCorrectingPostfix).Index);
 }
Exemplo n.º 15
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);
        }