Example #1
0
        private static string GetFormattedValueLabel(XrmDb db, AttributeMetadata metadataAtt, object value, Entity entity)
        {
            if (metadataAtt is PicklistAttributeMetadata)
            {
                var optionset = (metadataAtt as PicklistAttributeMetadata).OptionSet.Options
                                .Where(opt => opt.Value == (value as OptionSetValue).Value).FirstOrDefault();
                return(optionset.Label.UserLocalizedLabel.Label);
            }

            if (metadataAtt is BooleanAttributeMetadata)
            {
                var booleanOptions = (metadataAtt as BooleanAttributeMetadata).OptionSet;
                var label          = (bool)value ? booleanOptions.TrueOption.Label : booleanOptions.FalseOption.Label;
                return(label.UserLocalizedLabel.Label);
            }

            if (metadataAtt is MoneyAttributeMetadata)
            {
                var currencysymbol =
                    db.GetEntity(
                        db.GetEntity(entity.ToEntityReference())
                        .GetAttributeValue <EntityReference>("transactioncurrencyid"))
                    .GetAttributeValue <string>("currencysymbol");

                return(currencysymbol + (value as Money).Value.ToString());
            }

            if (metadataAtt is LookupAttributeMetadata)
            {
                try
                {
                    return((value as EntityReference).Name);
                }
                catch (NullReferenceException e)
                {
                    Console.WriteLine("No lookup entity exists: " + e.Message);
                }
            }

            if (metadataAtt is IntegerAttributeMetadata ||
                metadataAtt is DateTimeAttributeMetadata ||
                metadataAtt is MemoAttributeMetadata ||
                metadataAtt is DoubleAttributeMetadata ||
                metadataAtt is DecimalAttributeMetadata)
            {
                return(value.ToString());
            }

            return(null);
        }
Example #2
0
        private static void HandleBaseCurrencies(MetadataSkeleton metadata, XrmDb db, Entity entity)
        {
            if (entity.LogicalName == LogicalNames.TransactionCurrency)
            {
                return;
            }
            var transAttr = "transactioncurrencyid";

            if (!entity.Attributes.ContainsKey(transAttr))
            {
                return;
            }
            var currency           = db.GetEntity(LogicalNames.TransactionCurrency, entity.GetAttributeValue <EntityReference>(transAttr).Id);
            var attributesMetadata = metadata.EntityMetadata.GetMetadata(entity.LogicalName).Attributes.Where(a => a is MoneyAttributeMetadata);

            if (!currency.GetAttributeValue <decimal?>("exchangerate").HasValue)
            {
                throw new FaultException($"No exchangerate specified for transactioncurrency '{entity.GetAttributeValue<EntityReference>(transAttr)}'");
            }

            var baseCurrency = GetBaseCurrency(metadata);

            foreach (var attr in entity.Attributes.ToList())
            {
                if (attributesMetadata.Any(a => a.LogicalName == attr.Key) && !attr.Key.EndsWith("_base"))
                {
                    if (entity.GetAttributeValue <EntityReference>(transAttr) == baseCurrency)
                    {
                        entity[attr.Key + "_base"] = attr.Value;
                    }
                    else
                    {
                        if (attr.Value is Money money)
                        {
                            var value = money.Value / currency.GetAttributeValue <decimal?>("exchangerate").Value;
                            entity[attr.Key + "_base"] = new Money(value);
                        }
                    }
                }
            }
        }
Example #3
0
        internal static void HandlePrecision(MetadataSkeleton metadata, XrmDb db, Entity entity)
        {
            if (entity.LogicalName == LogicalNames.TransactionCurrency)
            {
                return;
            }
            var transAttr = "transactioncurrencyid";

            if (!entity.Attributes.ContainsKey(transAttr))
            {
                return;
            }
            var currency              = db.GetEntity(LogicalNames.TransactionCurrency, entity.GetAttributeValue <EntityReference>(transAttr).Id);
            var attributesMetadata    = metadata.EntityMetadata.GetMetadata(entity.LogicalName).Attributes.Where(a => a is MoneyAttributeMetadata);
            var baseCurrencyPrecision = GetBaseCurrencyPrecision(metadata);

            foreach (var attr in entity.Attributes.ToList())
            {
                if (attributesMetadata.Any(a => a.LogicalName == attr.Key) && attr.Value != null)
                {
                    var attributeMetadata = attributesMetadata.First(m => m.LogicalName == attr.Key) as MoneyAttributeMetadata;
                    int?precision         = null;
                    switch (attributeMetadata.PrecisionSource)
                    {
                    case 0:
                        precision = attributeMetadata.Precision;
                        break;

                    case 1:
                        precision = baseCurrencyPrecision;
                        break;

                    case 2:
                        precision = currency.GetAttributeValue <int?>("currencyprecision");
                        break;
                    }

                    if (!precision.HasValue)
                    {
                        switch (attributeMetadata.PrecisionSource)
                        {
                        case 0:
                            throw new MockupException($"No precision set for field '{attr.Key}' on entity '{entity.LogicalName}'");

                        case 1:
                            throw new MockupException($"No precision set for organization. Please check you have the correct metadata");

                        case 2:
                            throw new MockupException($"No precision set for currency. Make sure you set the precision for your own currencies");
                        }
                    }

                    var rounded = Math.Round(((Money)attr.Value).Value, precision.Value);
                    if (rounded < (decimal)attributeMetadata.MinValue.Value || rounded > (decimal)attributeMetadata.MaxValue.Value)
                    {
                        throw new FaultException($"'{attr.Key}' was outside the ranges '{attributeMetadata.MinValue}','{attributeMetadata.MaxValue}' with value '{rounded}' ");
                    }
                    entity[attr.Key] = new Money(rounded);
                }
            }
        }