public override IzmenenieNaznachVypl Map(ChangeAppointmentPayment source, IzmenenieNaznachVypl dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.DataNaznacheniia = (NullableDateTime)source.AppointmentDate;
            dest.DataOtmeny       = (NullableDateTime)source.CancellationDate;
            dest.TipVypl          = (tTipVyplaty)EnumCaption.GetValueFor(source.PaymentType.ToString(), typeof(tTipVyplaty));
            dest.PeriodPredost    =
                (tTipPerioda)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.Period), typeof(tTipPerioda));
            dest.Summa       = (NullableDecimal)source.Amount;
            dest.Primechanie = source.Note;
            dest.OrganSZ     = source.SocialProtectionAuthority == null
                ? null
                : PKHelper.CreateDataObject <OrganSZ>(source.SocialProtectionAuthority.Guid);
            dest.LgKatLeechnosti = source.BeneficiaryPreferentialCategory == null
                ? null
                : PKHelper.CreateDataObject <LgKatLeechnosti>(source.BeneficiaryPreferentialCategory.Guid);
            dest.Poluchatel = source.Recipient == null
                ? null
                : PKHelper.CreateDataObject <Leechnost>(source.Recipient.Guid);
            dest.Naznachenie = source.PaymentAppointment == null
                ? null
                : PKHelper.CreateDataObject <NaznachenieVyplaty>(source.PaymentAppointment.Guid);

            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;

            return(dest);
        }
        public override Invalidnost Map(Disability source, Invalidnost dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.Gruppa =
                (tGruppaInvalidnosti)EnumCaption.GetValueFor(source.Group.ToString(), typeof(tGruppaInvalidnosti));
            dest.NomerSpravkiVTEK      = source.ReferenceNumberVTEK;
            dest.DataVydSpravVTEK      = (NullableDateTime)source.IssueDateVTEK;
            dest.OrganVydSprav         = source.OrgName;
            dest.StepenOgranichTrudosp =
                (tGruppaInvalidnosti)EnumCaption.GetValueFor(source.DisabilityDegree.ToString(),
                                                             typeof(tGruppaInvalidnosti));
            dest.KemVydSprMSE = source.ReferenceIssuedBy == null
                ? null
                : PKHelper.CreateDataObject <OrganVydDok>(source.ReferenceIssuedBy?.Guid);
            dest.LgKatLeechnosti = source.BeneficiaryPreferentialCategory == null
                ? null
                : PKHelper.CreateDataObject <LgKatLeechnosti>(source.BeneficiaryPreferentialCategory?.Guid);
            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;
            return(dest);
        }
        /// <summary>
        /// Преобразовать значение.
        /// </summary>
        /// <param name="value">Значение для преобразования.</param>
        /// <param name="toType">Тип, в который надо преобразовать.</param>
        /// <returns>Преобразованное значение.</returns>
        public static object Convert(object value, Type toType)
        {
            lock (TypeToTypeMethods)
            {
                Type fromType = value.GetType();

                if (fromType == toType)
                {
                    return(value);
                }

                if (fromType == typeof(string) && toType.IsEnum)
                {
                    return(EnumCaption.GetValueFor((string)value, toType));
                }

                if (fromType.IsEnum && toType == typeof(string))
                {
                    return(EnumCaption.GetCaptionFor(value));
                }

                if (fromType == typeof(int) && toType.IsEnum)
                {
                    return(Enum.Parse(toType, Enum.GetName(toType, value)));
                }

                if (fromType.IsEnum && toType == typeof(int))
                {
                    return((int)value);
                }

                TypeTypePair key = new TypeTypePair(fromType, toType);
                if (!ParsedTypes.Contains(fromType))
                {
                    AddTypeOperator(fromType);
                }

                if (!ParsedTypes.Contains(toType))
                {
                    AddTypeOperator(toType);
                }

                if (TypeToTypeMethods.ContainsKey(key))
                {
                    MethodInfo mi = TypeToTypeMethods[key];
                    return(mi.Invoke(null, new[] { value }));
                }

                if (toType == typeof(string))
                {
                    return(value.ToString());
                }

                return(System.Convert.ChangeType(value, toType));
            }
        }
Пример #4
0
        public void EnumCaptionGetValueForNullTest()
        {
            // Arrange.
            Type enumType = typeof(NumberedYear);

            // Act.
            object actual = EnumCaption.GetValueFor(null, enumType);

            // Assert.
            Assert.Equal(NumberedYear.Year2014, actual);
        }
Пример #5
0
        public void EnumCaptionGetValueForValueCaseInsensitiveTest()
        {
            // Arrange.
            Type enumType = typeof(NumberedYear);

            // Act.
            object actual = EnumCaption.GetValueFor("YeAr2012", enumType);

            // Assert.
            Assert.Equal(NumberedYear.Year2012, actual);
        }
Пример #6
0
        public void EnumCaptionGetValueForNotEnumTest()
        {
            // Arrange.
            Type enumType = typeof(DateTime);

            // Act.
            object actual = EnumCaption.GetValueFor("Now", enumType);

            // Assert.
            Assert.Null(actual);
        }
Пример #7
0
        public void EnumCaptionGetValueForNumberTest()
        {
            // Arrange.
            Type enumType = typeof(NumberedYear);

            // Act.
            // Входные параметры:  заголовок элемента перечисления "2013", тип элемента перечисления.
            object actual = EnumCaption.GetValueFor("2013", enumType);

            // Assert.
            Assert.Equal(NumberedYear.Year2013, actual);
        }
Пример #8
0
        public void EnumCaptionGetValueForSwappedCaptionTest()
        {
            // Arrange.
            Type enumType = typeof(SwappedEnum);

            // Act.
            // Входные параметры: заголовок элемента перечисления "SwappedVal", тип элемента перечисления.
            object actual = EnumCaption.GetValueFor("SwappedVal", enumType);

            // Assert.
            Assert.Equal(SwappedEnum.Val, actual);
        }
Пример #9
0
        public void EnumCaptionGetValueForCaseInsensitive4Test()
        {
            // Arrange.
            Type enumType = typeof(CaseSensitiveEnum);

            // Act.
            // Входные параметры:  заголовок элемента перечисления "CaseINSENSITIVEVAL", тип элемента перечисления.
            object actual = EnumCaption.GetValueFor("CASEINSENSITIVEVAL", enumType);

            // Assert.
            Assert.Equal(CaseSensitiveEnum.CASEINSENSITIVEVAL, actual);
        }
Пример #10
0
        public void EnumCaptionGetValueForCaseInsensitiveTest()
        {
            // Arrange.
            Type enumType = typeof(CaseSensitiveEnum);

            // Act.
            // Входные параметры:  заголовок элемента перечисления "Last day", тип элемента перечисления.
            object actual = EnumCaption.GetValueFor("Last day", enumType);

            // Assert.
            Assert.Equal(CaseSensitiveEnum.Year9999, actual);
        }
Пример #11
0
        public void EnumCaptionGetValueForEmptyTest()
        {
            // Arrange.
            Type enumType = typeof(NumberedYear);

            // Act.
            // Входные параметры: пустая строка, тип данных NumberedYear.
            object actual = EnumCaption.GetValueFor(string.Empty, enumType);

            // Assert.
            Assert.Equal(NumberedYear.Year2014, actual);
        }
Пример #12
0
        public override NaznachenieVyplaty Map(PaymentAppointment source, NaznachenieVyplaty dest, List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }

            if (attrs.Contains(PaymentAppointment.ConstConfirmed))
            {
                dest.Podtverzhdeno =
                    (tLogicheskii)EnumCaption.GetValueFor(source.Confirmed.ToString(), typeof(tLogicheskii));
            }

            if (attrs.Contains(PaymentAppointment.ConstBenefit))
            {
                dest.Lgota = source.Benefit == null ? null : PKHelper.CreateDataObject <Lgota>(source.Benefit.Guid);
            }

            if (attrs.Contains(PaymentAppointment.ConstMedium))
            {
                dest.Nositel = source.Medium == null ? null : PKHelper.CreateDataObject <Leechnost>(source.Medium.Guid);
            }

            if (attrs.Contains(PaymentAppointment.ConstDependent))
            {
                dest.Izhdivenetc = source.Dependent == null
                    ? null
                    : PKHelper.CreateDataObject <Leechnost>(source.Dependent.Guid);
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
            {
                dest.CreateTime = source.CreateTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreator))
            {
                dest.Creator = source.Creator;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
            {
                dest.EditTime = source.EditTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditor))
            {
                dest.Editor = source.Editor;
            }

            return(dest);
        }
        public override IQueryable <DataObject> GetAltKey(ChangeAppointmentPayment dobj, IDataService defDS,
                                                          IDataService syncDS, Source source, ref List <DataObject> arrToUpd,
                                                          ref Dictionary <string, List <DataObject> > arrConformity)
        {
            var naznachenie = MapperHelper.GetMaster(typeof(NaznachenieVyplaty), dobj.PaymentAppointment.Guid,
                                                     defDS.Query <NaznachenieVyplaty>(NaznachenieVyplaty.Views.NaznachenieVyplatyE), syncDS, source,
                                                     ref arrToUpd, ref arrConformity);
            var date        = (NullableDateTime)dobj.AppointmentDate;
            var paymentType = (tTipVyplaty)EnumCaption.GetValueFor(dobj.PaymentType.ToString(), typeof(tTipVyplaty));

            return(defDS.Query <IzmenenieNaznachVypl>(IzmenenieNaznachVypl.Views.AuditView).Where(x =>
                                                                                                  x.DataNaznacheniia == date &&
                                                                                                  x.TipVypl == paymentType &&
                                                                                                  x.Naznachenie.__PrimaryKey.Equals(naznachenie.__PrimaryKey)));
        }
Пример #14
0
        public void EnumCaptionGetValueForNotExistTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                // Arrange.
                Type enumType = typeof(NumberedYear);

                // Act.
                EnumCaption.GetValueFor("notexist", enumType);

                // Assert.
                // Ожидаем исключения.
            });

            Assert.IsType(typeof(ArgumentException), exception);
        }
        public override IQueryable <DataObject> GetAltKey(Movement dobj, IDataService defDS, IDataService syncDS,
                                                          Source source, ref List <DataObject> arrToUpd, ref Dictionary <string, List <DataObject> > arrConformity)
        {
            var leechnost = MapperHelper.GetMaster(typeof(Leechnost), dobj.Beneficiary.Guid,
                                                   defDS.Query <Leechnost>(Leechnost.Views.LeechnostE), syncDS, source, ref arrToUpd, ref arrConformity);
            var address = Helper.GetProzhivanie(dobj.DepatureAddress, defDS, syncDS, source, ref arrToUpd,
                                                ref arrConformity);
            var typeAddress = (tTipAdresa)EnumCaption.GetValueFor(dobj.AddressType.ToString(), typeof(tTipAdresa));
            var date        = (NullableDateTime)dobj.DepatureDate;

            return(defDS.Query <Peremeshchenie>(Peremeshchenie.Views.PeremeshchenieE).Where(x =>
                                                                                            x.DataUbytiia == date &&
                                                                                            x.TipAdresa == typeAddress &&
                                                                                            x.AdresUbytiia.__PrimaryKey.Equals(address.__PrimaryKey) &&
                                                                                            x.Leechnost.__PrimaryKey.Equals(leechnost.__PrimaryKey)));
        }
Пример #16
0
        public void EnumCaptionGetValueForPositionNumberTest()
        {
            var exception = Xunit.Record.Exception(() =>
            {
                // Arrange.
                Type enumType = typeof(NumberedYear);

                // Act.
                // Enum.Parse вернул бы 1ый элемент enum, а GetValueFor должен бросить exception.
                EnumCaption.GetValueFor("1", enumType);

                // Assert.
                // Ожидаем исключения.
            });

            Assert.IsType(typeof(ArgumentException), exception);
        }
Пример #17
0
        public override NaznachenieVyplaty Map(PaymentAppointment source, NaznachenieVyplaty dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.Podtverzhdeno =
                (tLogicheskii)EnumCaption.GetValueFor(source.Confirmed.ToString(), typeof(tLogicheskii));
            dest.Lgota       = source.Benefit == null ? null : PKHelper.CreateDataObject <Lgota>(source.Benefit.Guid);
            dest.Nositel     = source.Medium == null ? null : PKHelper.CreateDataObject <Leechnost>(source.Medium.Guid);
            dest.Izhdivenetc = source.Dependent == null
                ? null
                : PKHelper.CreateDataObject <Leechnost>(source.Dependent.Guid);

            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;

            return(dest);
        }
        public override FaktLgot Map(FactBenefits source, FaktLgot dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.DataNachisleniia = (NullableDateTime)source.AccrualDate;
            dest.DataPolucheniia  = (NullableDateTime)source.ReceiveDate;
            dest.Summa            = (NullableDecimal)source.Amount;
            dest.SummaSotcPaketa  = (NullableDecimal)source.AmountSocialPackage;
            dest.Kommentarii      = source.Comments;
            dest.SposobOplaty     = (tSposobOplaty)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.PaymentMethod),
                                                                           typeof(tSposobOplaty));
            dest.DataPereplS  = (NullableDateTime)source.OverpaymentDateFrom;
            dest.DataPereplPo = (NullableDateTime)source.OverpaymentDateTo;
            dest.NositelLgoty = source.MediumBenefit == null
                ? null
                : PKHelper.CreateDataObject <LgKatLeechnosti>(source.MediumBenefit.Guid);
            dest.Izhdivenetc = source.Dependent == null
                ? null
                : PKHelper.CreateDataObject <Leechnost>(source.Dependent.Guid);
            dest.Poluchatel = source.Recipient == null
                ? null
                : PKHelper.CreateDataObject <Leechnost>(source.Recipient.Guid);
            dest.Lgota   = source.Benefit == null ? null : PKHelper.CreateDataObject <Lgota>(source.Benefit.Guid);
            dest.OrganSZ = source.SocialProtectionAuthority == null
                ? null
                : PKHelper.CreateDataObject <OrganSZ>(source.SocialProtectionAuthority.Guid);
            dest.Period = source.Period == null ? null : PKHelper.CreateDataObject <Period>(source.Period.Guid);

            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;

            return(dest);
        }
Пример #19
0
        public override Stroenie Map(Structure source, Stroenie dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.KodFIAS       = source.FIAS;
            dest.VidStroeniia  = (tVidStroeniia)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.TypeStructure), typeof(tVidStroeniia));
            dest.Nomer         = source.Number == null ? 0 : (uint)source.Number;
            dest.PochtIndeks   = source.PostIndex;
            dest.DopStroenie   = source.Additional;
            dest.KodPodtverzhd = source.VerificationCode == null ? 0 : (uint)source.VerificationCode;
            dest.Raion         = source.Area == null ? null : PKHelper.CreateDataObject <Territoriia>(source.Area.Guid);
            dest.Ulitca        = source.Street == null ? null : PKHelper.CreateDataObject <Ulitca>(source.Street.Guid);

            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;

            return(dest);
        }
        public override Peremeshchenie Map(Movement source, Peremeshchenie dest)
        {
            if (dest.GetStatus() == ObjectStatus.Created)
            {
                dest.__PrimaryKey = source.Guid;
            }

            dest.DataUbytiia  = (NullableDateTime)source.DepatureDate;
            dest.TipAdresa    = (tTipAdresa)EnumCaption.GetValueFor(source.AddressType.ToString(), typeof(tTipAdresa));
            dest.AdresUbytiia = source.DepatureAddress == null
                ? null
                : PKHelper.CreateDataObject <Prozhivanie>(source.DepatureAddress?.Guid);
            dest.Leechnost = source.Beneficiary == null
                ? null
                : PKHelper.CreateDataObject <Leechnost>(source.Beneficiary?.Guid);
            dest.PrichinaPeremeshcheniia = source.MovementCause == null
                ? null
                : PKHelper.CreateDataObject <PrichinaPeremeshcheniia>(source.MovementCause?.Guid);
            dest.CreateTime = source.CreateTime;
            dest.Creator    = source.Creator;
            dest.EditTime   = source.EditTime;
            dest.Editor     = source.Editor;
            return(dest);
        }
        public override Peremeshchenie Map(Movement source, Peremeshchenie dest, List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }

            if (attrs.Contains(Movement.ConstDepatureDate))
            {
                dest.DataUbytiia = (NullableDateTime)source.DepatureDate;
            }

            if (attrs.Contains(Movement.ConstAddressType))
            {
                dest.TipAdresa =
                    (tTipAdresa)EnumCaption.GetValueFor(source.AddressType.ToString(), typeof(tTipAdresa));
            }

            if (attrs.Contains(Movement.ConstDepatureAddress))
            {
                dest.AdresUbytiia = source.DepatureAddress == null
                    ? null
                    : PKHelper.CreateDataObject <Prozhivanie>(source.DepatureAddress?.Guid);
            }

            if (attrs.Contains(Movement.ConstBeneficiary))
            {
                dest.Leechnost = source.Beneficiary == null
                    ? null
                    : PKHelper.CreateDataObject <Leechnost>(source.Beneficiary?.Guid);
            }

            if (attrs.Contains(Movement.ConstMovementCause))
            {
                dest.PrichinaPeremeshcheniia = source.MovementCause == null
                    ? null
                    : PKHelper.CreateDataObject <PrichinaPeremeshcheniia>(source.MovementCause?.Guid);
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
            {
                dest.CreateTime = source.CreateTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreator))
            {
                dest.Creator = source.Creator;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
            {
                dest.EditTime = source.EditTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditor))
            {
                dest.Editor = source.Editor;
            }

            return(dest);
        }
Пример #22
0
        /// <summary>
        /// Получить объект на заданную дату.
        /// </summary>
        /// <param name="date">Дата на которую следует откатить состояние объекта</param>
        /// <param name="obj">Объект, который откатываем на заданную дату.</param>
        /// <param name="onlySelfObj">Откатывать только сам объект, т.е. в обратное состояния вернутся все собственные поля объекта и все собственные ссылочные объекты(мастра и детейлы) только ключи</param>
        /// <param name="forceNullAgregator">Объект вернётся в состояние сразу после заданной даты.
        ///  Если откатываем создание объекта, то возвращаем путой объект с первичным ключом.
        ///  Если объект был удалён и ведётся аудит удаления, то он будет восстановлен со всеми своими собственными полями, иначе если аудит удаления отключен, у удаленного объекта будет проинициализирован только первичный ключ.
        /// </param>
        public static void GetObjForDate(DateTime date, ref DataObject obj, bool onlySelfObj = true,
                                         bool forceNullAgregator = false)
        {
            if (obj != null)
            {
                var objType = obj.GetType();
                try
                {
                    obj.DisableInitDataCopy();
                    // Не кидается исключение о не существовании объекта, если объект был удалён и ведётся аудит удаления, то он будет восстановлен со всеми своими собственными полями, иначе если аудит удаления отключен, у удаленного объекта будет проинициализирован только первичный ключ.
                    DataServiceFactory.AppDataService.LoadObject(new View(objType, View.ReadType.WithRelated), obj,
                                                                 true, false);
                }
                catch (Exception ex)
                {
                    throw new Exception($"Ошибка при попытке вычитать изменнённый объект из БД. {ex.Message}");
                }

                List <AuditEntity> changedAuditEntity;
                try
                {
                    var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(AuditEntity),
                                                                         AuditEntity.Views.AuditEntityE);
                    lcs.LimitFunction = FunctionBuilder.BuildAnd(
                        #pragma warning disable CS0618 // Используем не дженерик вариант, иначе не работает вычитка
                        FunctionBuilder.BuildEquals(nameof(AuditEntity.ObjectPrimaryKey), obj.__PrimaryKey),
                        #pragma warning restore CS0618 // Тип или член устарел
                        FunctionBuilder.BuildGreater <AuditEntity>(x => x.OperationTime, date));
                    // Загружаем изменения строго больше даты на которую хотим откатить => получаем объект в состоянии сразу после этой даты.
                    lcs.ColumnsSort    = new[] { new ColumnsSortDef(nameof(AuditEntity.OperationTime), SortOrder.Desc) };
                    changedAuditEntity =
                        DataServiceFactory.AppDataService.LoadObjects(lcs).Cast <AuditEntity>().ToList();
                }
                catch (Exception ex)
                {
                    throw new Exception(
                              $"Ошибка при попытке загрузить операции изменения {nameof(AuditEntity)} для объекта({obj.__PrimaryKey}). {ex.Message}");
                }

                var auditFieldsLcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(AuditField), ViewForField);
                foreach (var changeEntity in changedAuditEntity)
                {
                    if (changeEntity.OperationType != OperationCreateType)
                    {
                        List <AuditField> changedFields;
                        try
                        {
                            // Загружаем набор изменившихся полей из аудита
                            auditFieldsLcs.LimitFunction =
                                FunctionBuilder.BuildEquals <AuditField>(x => x.AuditEntity, changeEntity);
                            changedFields = DataServiceFactory.AppDataService.LoadObjects(auditFieldsLcs)
                                            .Cast <AuditField>().ToList();
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(
                                      $"Произошла ошибка при попытке получить набор изменений полей для операции аудита:{PKHelper.GetGuidByObject(changeEntity)}. {ex.Message}");
                        }

                        //Берём только изменения, вспомогательные объекты LinkedPrimaryKey остаются в основном списке.
                        var onlySelfChangedFields = changedFields.Where(y => y.MainChange == null);
                        foreach (var changedField in onlySelfChangedFields)
                        {
                            var mainChange =
                                changedFields.FirstOrDefault(x => PKHelper.EQPK(x.MainChange, changedField));
                            if (mainChange == null)
                            {
                                //Если основного изменения нет, то это обычное поле
                                var propertyInfo = objType.GetProperty(changedField.Field);
                                if (propertyInfo != null)
                                {
                                    var    typeprop = propertyInfo.PropertyType;
                                    object value    = null;
                                    try
                                    {
                                        if (changedField.OldValue != null)
                                        {
                                            if (typeprop.IsEnum)
                                            {
                                                value = EnumCaption.GetValueFor(changedField.OldValue, typeprop);
                                            }
                                            else if (typeprop == typeof(NullableDateTime))
                                            {
                                                value = NullableDateTime.Parse(changedField.OldValue);
                                            }
                                            else if (typeprop == typeof(NullableInt))
                                            {
                                                value = NullableInt.Parse(changedField.OldValue);
                                            }
                                            else
                                            {
                                                value = Convert.ChangeType(changedField.OldValue, typeprop, CultureInfo.InvariantCulture);
                                            }
                                        }

                                        propertyInfo.SetValue(obj, value);
                                    }
                                    catch (Exception ex)
                                    {
                                        var errorText = value != null
                                            ? $"AuditField:{PKHelper.GetGuidByObject(changedField)} Ошибка при попытке установить значение поля {value} в объект {objType.Name}:{PKHelper.GetGuidByObject(obj)} поле {changedField.Field}"
                                            : $"AuditField:{PKHelper.GetGuidByObject(changedField)} Ошибка при попытке преобразовать значение поля {changedField.OldValue} в тип {typeprop.Name}";
                                        throw new Exception($"{errorText}. {ex.Message}");
                                    }
                                }
                                else
                                {
                                    throw new Exception(
                                              $"Ошибка - не найдено поле {changedField.Field} в объекте {objType.Name}.");
                                }
                            }
                            else
                            {
                                // Есть основное изменение, значит это изменение ссылочного объекта.
                                // Только если изменилась ссылка
                                if (mainChange.OldValue != mainChange.NewValue)
                                {
                                    // В аудите детейл отличается от мастера тем, что у него приписывается в скобках позиция
                                    if (Regex.IsMatch(changedField.Field, "[ ][(][0-9]+[)]$"))
                                    {
                                        // Это изменение детейла объекта.
                                        var separateIndex       = changedField.Field.IndexOf(" ", StringComparison.Ordinal);
                                        var detailNameFromField = changedField.Field.Substring(0, separateIndex);
                                        var propertyInfo        = objType.GetProperty(detailNameFromField);
                                        if (propertyInfo != null)
                                        {
                                            if (propertyInfo.GetValue(obj) is DetailArray detailValue)
                                            {
                                                if (changedField.OldValue == "-NULL-")
                                                {
                                                    var key = new KeyGuid(mainChange.NewValue);
                                                    try
                                                    {
                                                        detailValue.RemoveByKey(key);
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        throw new Exception(
                                                                  $"Ошибка при попытке удалить объект с ключом {key} из детейла {detailNameFromField} в объекте {objType.Name}. {ex.Message}");
                                                    }
                                                }
                                                else
                                                {
                                                    var detailItemType = detailValue.ItemType;
                                                    var oldDetailObj   = Helper.CreateDataObject(detailItemType,
                                                                                                 mainChange.OldValue);
                                                    try
                                                    {
                                                        detailValue.AddObject(oldDetailObj);
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        throw new Exception(
                                                                  $"Ошибка при добавить объект с ключом {PKHelper.GetGuidByObject(oldDetailObj)} в детейл {detailNameFromField} в объекте {objType.Name}. {ex.Message}");
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(
                                                      $"Ошибка - не найден детейл {detailNameFromField} в объекте {objType.Name}.");
                                        }
                                    }
                                    else
                                    {
                                        // Это изменение мастера объекта.
                                        var propertyInfo = objType.GetProperty(changedField.Field);
                                        if (propertyInfo != null)
                                        {
                                            //Это свойство является агрегатором, для детейла
                                            var itIsAgregator =
                                                propertyInfo.GetCustomAttribute <AgregatorAttribute>() != null;
                                            if (changedField.OldValue == "-NULL-" ||
                                                forceNullAgregator && itIsAgregator)
                                            {
                                                //Если свойство является агрегатором для детейла, то в последующих витках рекурсии всегда возвращаем нулл для такого поля, во избежание циклических ссылок.
                                                propertyInfo.SetValue(obj, null);
                                            }
                                            else
                                            {
                                                var typeprop     = propertyInfo.PropertyType;
                                                var oldMasterObj =
                                                    Helper.CreateDataObject(typeprop, mainChange.OldValue);
                                                try
                                                {
                                                    propertyInfo.SetValue(obj, oldMasterObj);
                                                }
                                                catch (Exception ex)
                                                {
                                                    throw new Exception(
                                                              $"Ошибка при попытке установить свойство мастера {changedField.Field} в объекте {objType.Name}. {ex.Message}");
                                                }
                                            }
                                        }
                                        else
                                        {
                                            throw new Exception(
                                                      $"Ошибка - не найден мастер {changedField.Field} в объекте {objType.Name}.");
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        // Если откатываем создание объекта, то возвращаем путой объект с первичным ключом.
                        obj = Helper.CreateDataObject(objType, obj.__PrimaryKey);
                    }
                }

                // На этом этапе основной объект и все его собственные поля и зависимые сущности возвращены на дату
                // Получаем мастера и откатываем их поля, рекурсивно вызывая этот метод
                // Получаем детейлы объекта и откатываем их поля, рекурсивно вызывая этот метод
                if (!onlySelfObj && changedAuditEntity.Any())
                {
                    var objProperties = objType.GetProperties();
                    foreach (var property in objProperties)
                    {
                        var typeprop = property.PropertyType;
                        if (typeprop.IsSubclassOf(typeof(DataObject)))
                        {
                            //Перебираем все мастера
                            var masterValue = property.GetValue(obj) as DataObject;
                            GetObjForDate(date, ref masterValue, false, true);
                        }
                        else if (typeprop.IsSubclassOf(typeof(DetailArray)))
                        {
                            //Перебираем все детейлы
                            if (property.GetValue(obj) is DetailArray detailValue)
                            {
                                var detailObjects = detailValue.GetAllObjects();
                                foreach (var dataObject in detailObjects)
                                {
                                    var currentObj = dataObject;
                                    GetObjForDate(date, ref currentObj, false, true);
                                }
                            }
                        }
                    }
                }
            }
        }
        public override FaktLgot Map(FactBenefits source, FaktLgot dest, List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }

            if (attrs.Contains(FactBenefits.ConstAccrualDate))
            {
                dest.DataNachisleniia = (NullableDateTime)source.AccrualDate;
            }

            if (attrs.Contains(FactBenefits.ConstReceiveDate))
            {
                dest.DataPolucheniia = (NullableDateTime)source.ReceiveDate;
            }

            if (attrs.Contains(FactBenefits.ConstAmount))
            {
                dest.Summa = (NullableDecimal)source.Amount;
            }

            if (attrs.Contains(FactBenefits.ConstAmountSocialPackage))
            {
                dest.SummaSotcPaketa = (NullableDecimal)source.AmountSocialPackage;
            }

            if (attrs.Contains(FactBenefits.ConstComments))
            {
                dest.Kommentarii = source.Comments;
            }

            if (attrs.Contains(FactBenefits.ConstPaymentMethod))
            {
                dest.SposobOplaty =
                    (tSposobOplaty)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.PaymentMethod),
                                                           typeof(tSposobOplaty));
            }

            if (attrs.Contains(FactBenefits.ConstOverpaymentDateFrom))
            {
                dest.DataPereplS = (NullableDateTime)source.OverpaymentDateFrom;
            }

            if (attrs.Contains(FactBenefits.ConstOverpaymentDateTo))
            {
                dest.DataPereplPo = (NullableDateTime)source.OverpaymentDateTo;
            }

            if (attrs.Contains(FactBenefits.ConstMediumBenefit))
            {
                dest.NositelLgoty = source.MediumBenefit == null
                    ? null
                    : PKHelper.CreateDataObject <LgKatLeechnosti>(source.MediumBenefit.Guid);
            }

            if (attrs.Contains(FactBenefits.ConstDependent))
            {
                dest.Izhdivenetc = source.Dependent == null
                    ? null
                    : PKHelper.CreateDataObject <Leechnost>(source.Dependent.Guid);
            }

            if (attrs.Contains(FactBenefits.ConstRecipient))
            {
                dest.Poluchatel = source.Recipient == null
                    ? null
                    : PKHelper.CreateDataObject <Leechnost>(source.Recipient.Guid);
            }

            if (attrs.Contains(FactBenefits.ConstBenefit))
            {
                dest.Lgota = source.Benefit == null ? null : PKHelper.CreateDataObject <Lgota>(source.Benefit.Guid);
            }

            if (attrs.Contains(FactBenefits.ConstSocialProtectionAuthority))
            {
                dest.OrganSZ = source.SocialProtectionAuthority == null
                    ? null
                    : PKHelper.CreateDataObject <OrganSZ>(source.SocialProtectionAuthority.Guid);
            }

            if (attrs.Contains(FactBenefits.ConstPeriod))
            {
                dest.Period = source.Period == null ? null : PKHelper.CreateDataObject <Period>(source.Period.Guid);
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
            {
                dest.CreateTime = source.CreateTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreator))
            {
                dest.Creator = source.Creator;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
            {
                dest.EditTime = source.EditTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditor))
            {
                dest.Editor = source.Editor;
            }

            return(dest);
        }
Пример #24
0
        public override Stroenie Map(Structure source, Stroenie dest, List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }
            else
            {
                if (attrs.Contains(Structure.ConstFIAS))
                {
                    dest.KodFIAS = source.FIAS;
                }
                if (attrs.Contains(Structure.ConstType))
                {
                    dest.VidStroeniia = (tVidStroeniia)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.TypeStructure), typeof(tVidStroeniia));
                }
                if (attrs.Contains(Structure.ConstNumber))
                {
                    dest.Nomer = (uint)source.Number;
                }
                if (attrs.Contains(Structure.ConstPostIndex))
                {
                    dest.PochtIndeks = source.PostIndex;
                }
                if (attrs.Contains(Structure.ConstAdditional))
                {
                    dest.DopStroenie = source.Additional;
                }
                if (attrs.Contains(Structure.ConstVerificationCode))
                {
                    dest.KodPodtverzhd = source.VerificationCode == null ? 0 : (uint)source.VerificationCode;
                }
                if (attrs.Contains(Structure.ConstArea))
                {
                    dest.Raion = source.Area == null ? null : PKHelper.CreateDataObject <Territoriia>(source.Area.Guid);
                }
                if (attrs.Contains(Structure.ConstStreet))
                {
                    dest.Ulitca = source.Street == null ? null : PKHelper.CreateDataObject <Ulitca>(source.Street.Guid);
                }

                if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
                {
                    dest.CreateTime = source.CreateTime;
                }
                if (attrs.Contains(SyncXMLDataObject.ConstCreator))
                {
                    dest.Creator = source.Creator;
                }
                if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
                {
                    dest.EditTime = source.EditTime;
                }
                if (attrs.Contains(SyncXMLDataObject.ConstEditor))
                {
                    dest.Editor = source.Editor;
                }

                return(dest);
            }
        }
        public override IzmenenieNaznachVypl Map(ChangeAppointmentPayment source, IzmenenieNaznachVypl dest,
                                                 List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstAppointmentDate))
            {
                dest.DataNaznacheniia = (NullableDateTime)source.AppointmentDate;
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstCancellationDate))
            {
                dest.DataOtmeny = (NullableDateTime)source.CancellationDate;
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstPaymentType))
            {
                dest.TipVypl =
                    (tTipVyplaty)EnumCaption.GetValueFor(source.PaymentType.ToString(), typeof(tTipVyplaty));
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstPeriod))
            {
                dest.PeriodPredost =
                    (tTipPerioda)EnumCaption.GetValueFor(EnumCaption.GetCaptionFor(source.Period),
                                                         typeof(tTipPerioda));
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstAmount))
            {
                dest.Summa = (NullableDecimal)source.Amount;
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstNote))
            {
                dest.Primechanie = source.Note;
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstSocialProtectionAuthority))
            {
                dest.OrganSZ = source.SocialProtectionAuthority == null
                    ? null
                    : PKHelper.CreateDataObject <OrganSZ>(source.SocialProtectionAuthority.Guid);
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstBeneficiaryPreferentialCategory))
            {
                dest.LgKatLeechnosti = source.BeneficiaryPreferentialCategory == null
                    ? null
                    : PKHelper.CreateDataObject <LgKatLeechnosti>(source.BeneficiaryPreferentialCategory.Guid);
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstRecipient))
            {
                dest.Poluchatel = source.Recipient == null
                    ? null
                    : PKHelper.CreateDataObject <Leechnost>(source.Recipient.Guid);
            }

            if (attrs.Contains(ChangeAppointmentPayment.ConstPaymentAppointment))
            {
                dest.Naznachenie = source.PaymentAppointment == null
                    ? null
                    : PKHelper.CreateDataObject <NaznachenieVyplaty>(source.PaymentAppointment.Guid);
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
            {
                dest.CreateTime = source.CreateTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreator))
            {
                dest.Creator = source.Creator;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
            {
                dest.EditTime = source.EditTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditor))
            {
                dest.Editor = source.Editor;
            }

            return(dest);
        }
        public override Invalidnost Map(Disability source, Invalidnost dest, List <string> attrs)
        {
            if (dest.GetStatus() == ObjectStatus.Created || attrs == null)
            {
                return(Map(source, dest));
            }

            if (attrs.Contains(Disability.ConstGroup))
            {
                dest.Gruppa =
                    (tGruppaInvalidnosti)EnumCaption.GetValueFor(source.Group.ToString(), typeof(tGruppaInvalidnosti));
            }

            if (attrs.Contains(Disability.ConstReferenceNumberVTEK))
            {
                dest.NomerSpravkiVTEK = source.ReferenceNumberVTEK;
            }

            if (attrs.Contains(Disability.ConstIssueDateVTEK))
            {
                dest.DataVydSpravVTEK = (NullableDateTime)source.IssueDateVTEK;
            }

            if (attrs.Contains(Disability.ConstOrgName))
            {
                dest.OrganVydSprav = source.OrgName;
            }

            if (attrs.Contains(Disability.ConstDisabilityDegree))
            {
                dest.StepenOgranichTrudosp =
                    (tGruppaInvalidnosti)EnumCaption.GetValueFor(source.DisabilityDegree.ToString(),
                                                                 typeof(tGruppaInvalidnosti));
            }

            if (attrs.Contains(Disability.ConstReferenceIssuedBy))
            {
                dest.KemVydSprMSE = source.ReferenceIssuedBy == null
                    ? null
                    : PKHelper.CreateDataObject <OrganVydDok>(source.ReferenceIssuedBy?.Guid);
            }

            if (attrs.Contains(Disability.ConstBeneficiaryPreferentialCategory))
            {
                dest.LgKatLeechnosti = source.BeneficiaryPreferentialCategory == null
                    ? null
                    : PKHelper.CreateDataObject <LgKatLeechnosti>(source.BeneficiaryPreferentialCategory?.Guid);
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreateTime))
            {
                dest.CreateTime = source.CreateTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstCreator))
            {
                dest.Creator = source.Creator;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditTime))
            {
                dest.EditTime = source.EditTime;
            }

            if (attrs.Contains(SyncXMLDataObject.ConstEditor))
            {
                dest.Editor = source.Editor;
            }

            return(dest);
        }