/// <summary> /// Сохранение сущности в RX. /// </summary> /// <param name="shift">Сдвиг по горизонтали в XLSX документе. Необходим для обработки документов, составленных из элементов разных сущностей.</param> /// <param name="logger">Логировщик.</param> /// <returns>Число запрашиваемых параметров.</returns> public override IEnumerable <Structures.ExceptionsStruct> SaveToRX(NLog.Logger logger, bool supplementEntity, int shift = 0) { var exceptionList = new List <Structures.ExceptionsStruct>(); using (var session = new Session()) { var regNumber = this.Parameters[shift + 0]; var regDate = DateTime.MinValue; var style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; var culture = CultureInfo.CreateSpecificCulture("en-GB"); var regDateDouble = 0.0; if (!string.IsNullOrWhiteSpace(this.Parameters[shift + 1]) && !double.TryParse(this.Parameters[shift + 1].Trim(), style, culture, out regDateDouble)) { var message = string.Format("Не удалось обработать дату регистрации \"{0}\".", this.Parameters[shift + 1]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } else { if (!string.IsNullOrEmpty(this.Parameters[shift + 1].ToString())) { regDate = DateTime.FromOADate(regDateDouble); } } var counterparty = BusinessLogic.GetConterparty(session, this.Parameters[shift + 2], exceptionList, logger); if (counterparty == null) { var message = string.Format("Не найден контрагент \"{0}\".", this.Parameters[shift + 2]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } var documentKind = BusinessLogic.GetDocumentKind(session, this.Parameters[shift + 3], exceptionList, logger); if (documentKind == null) { var message = string.Format("Не найден вид документа \"{0}\".", this.Parameters[shift + 3]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } var subject = this.Parameters[shift + 4]; var department = BusinessLogic.GetDepartment(session, this.Parameters[shift + 5], exceptionList, logger); if (department == null) { var message = string.Format("Не найдено подразделение \"{0}\".", this.Parameters[shift + 5]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } var filePath = this.Parameters[shift + 6]; var dated = DateTime.MinValue; var datedDouble = 0.0; if (!string.IsNullOrWhiteSpace(this.Parameters[shift + 7]) && !double.TryParse(this.Parameters[shift + 7].Trim(), style, culture, out datedDouble)) { var message = string.Format("Не удалось обработать значение в поле \"Письмо от\" \"{0}\".", this.Parameters[shift + 7]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } else { if (!string.IsNullOrEmpty(this.Parameters[shift + 7].ToString())) { dated = DateTime.FromOADate(datedDouble); } } var inNumber = this.Parameters[shift + 8]; var addressee = BusinessLogic.GetEmployee(session, this.Parameters[shift + 9].Trim(), exceptionList, logger); if (!string.IsNullOrEmpty(this.Parameters[shift + 9].Trim()) && addressee == null) { var message = string.Format("Не найден Адресат \"{2}\". Входящее письмо: \"{0} {1}\". ", regNumber, regDate.ToString(), this.Parameters[shift + 9].Trim()); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Warn, Message = message }); logger.Warn(message); } var deliveryMethod = BusinessLogic.GetMailDeliveryMethod(session, this.Parameters[shift + 10].Trim(), exceptionList, logger); if (!string.IsNullOrEmpty(this.Parameters[shift + 10].Trim()) && deliveryMethod == null) { var message = string.Format("Не найден Способ доставки \"{2}\". Входящее письмо: \"{0} {1}\". ", regNumber, regDate.ToString(), this.Parameters[shift + 10].Trim()); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Warn, Message = message }); logger.Warn(message); } var note = this.Parameters[shift + 11]; try { var incomingLetters = Enumerable.ToList(session.GetAll <Sungero.RecordManagement.IIncomingLetter>().Where(x => x.RegistrationNumber == regNumber && regDate != DateTime.MinValue && x.RegistrationDate == regDate)); var incomingLetter = (Enumerable.FirstOrDefault <Sungero.RecordManagement.IIncomingLetter>(incomingLetters)); if (incomingLetter != null) { var message = string.Format("Входящее письмо не может быть импортировано. Найден дубль с такими же реквизитами \"Дата документа\" {0} и \"Рег. №\" {1}.", regDate.ToString("d"), regNumber); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } incomingLetter = session.Create <Sungero.RecordManagement.IIncomingLetter>(); if (regDate != DateTime.MinValue) { incomingLetter.RegistrationDate = regDate; } incomingLetter.RegistrationNumber = regNumber; incomingLetter.Correspondent = counterparty; incomingLetter.DocumentKind = documentKind; incomingLetter.Subject = subject; incomingLetter.Department = department; if (department != null) { incomingLetter.BusinessUnit = department.BusinessUnit; } if (dated != DateTime.MinValue) { incomingLetter.Dated = dated; } incomingLetter.InNumber = inNumber; incomingLetter.Addressee = addressee; incomingLetter.DeliveryMethod = deliveryMethod; incomingLetter.Note = note; incomingLetter.Save(); if (!string.IsNullOrWhiteSpace(filePath)) { exceptionList.Add(BusinessLogic.ImportBody(session, incomingLetter, filePath, logger)); } var documentRegisterId = 0; if (ExtraParameters.ContainsKey("doc_register_id")) { if (int.TryParse(ExtraParameters["doc_register_id"], out documentRegisterId)) { exceptionList.AddRange(BusinessLogic.RegisterDocument(session, incomingLetter, documentRegisterId, regNumber, regDate, Constants.RolesGuides.RoleIncomingDocumentsResponsible, logger)); } else { var message = string.Format("Не удалось обработать параметр \"doc_register_id\". Полученное значение: {0}.", ExtraParameters["doc_register_id"]); exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = message }); logger.Error(message); return(exceptionList); } } } catch (Exception ex) { exceptionList.Add(new Structures.ExceptionsStruct { ErrorType = Constants.ErrorTypes.Error, Message = ex.Message }); return(exceptionList); } session.SubmitChanges(); } return(exceptionList); }