CRM zawiera własny typ danych definiujący pieniądze – Money. Nie należy ona do najmilszych z korzystania, oczywiście dla chcącego nic trudnego, ale Money to po prostu decimal tylko, że opakowany w klasę.
Kod rozszerzeń konwertujących int, int?, decimal, decimal? do Money, i Money do decimal?:
using Microsoft.Xrm.Sdk; namespace Gutek.Utils.Crm { public static class MoneyExtensions { public static Money ToMoney(this decimal? @this) { if([email protected]) { return null; } return @this.Value.ToMoney(); } public static Money ToMoney(this int? @this) { if([email protected]) { return null; } return @this.Value.ToMoney(); } public static Money ToMoney(this decimal @this) { return new Money(@this); } public static Money ToMoney(this int @this) { return new Money(@this); } public static decimal? ToDecimal(this Money @this) { if(@this == null) { return null; } return @this.Value; } } }
Kod testów:
using System; using Gutek.Utils.Crm; using Microsoft.Xrm.Sdk; using Xunit; namespace Gutek.Utils.Tests.Crm { public class money_extensions_tests { protected decimal? _nullDecimal = default(Nullable<decimal>); protected int? _nullInt = default(Nullable<int>); protected decimal? _notNullDecimal = 10; protected int? _notNullInt = 10; protected int _valueInt = 10; protected decimal _valueDecimal = 10; protected Money _nullMoney = null; protected Money _valueMoney = new Money(10); } public class to_money_tests : money_extensions_tests { [Fact] public void should_return_null_for_null_number_values() { Assert.Null(_nullDecimal.ToMoney()); Assert.Null(_nullInt.ToMoney()); } [Fact] public void should_return_money_type_for_not_null_nullable_number_values() { var dec = _notNullDecimal.ToMoney(); var i = _notNullInt.ToMoney(); Assert.NotNull(dec); Assert.NotNull(i); Assert.Equal(_notNullDecimal.Value, dec.Value); Assert.Equal(_notNullInt.Value, dec.Value); } [Fact] public void should_return_money_type_for_not_null_number_values() { var dec = _valueDecimal.ToMoney(); var i = _valueInt.ToMoney(); Assert.NotNull(dec); Assert.NotNull(i); Assert.Equal(_valueDecimal, dec.Value); Assert.Equal(_valueInt, dec.Value); } } public class to_decimal_tests : money_extensions_tests { [Fact] public void should_return_null_for_null_money() { Assert.Null(_nullMoney.ToDecimal()); } [Fact] public void should_return_decimal_for_not_null_money() { var dec = _valueMoney.ToDecimal(); Assert.NotNull(dec); Assert.Equal(_valueMoney.Value, dec.Value); } } }