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); }
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); } } } } }
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); } } }