public void MapChangeOfChargesMessageToCharge_WhenMessageWithProperties_ThenReturnsChargeWithPropertiesSet()
        {
            // Arrange
            var changeOfChargesMessage = GetValidChangeOfChargesMessage();

#pragma warning disable CS8602 // Dereference of a possibly null reference.
            changeOfChargesMessage.MktActivityRecord.ValidityEndDate = Instant.MaxValue;
#pragma warning restore CS8602 // Dereference of a possibly null reference.
            var chargeType = new ChargeType {
                Code = changeOfChargesMessage.Type, Id = 1, Name = "Name"
            };
            var chargeTypeOwnerMRid = new Ingestion.Infrastructure.ChangeOfCharges.Context.Model.MarketParticipant {
                Id = 1, MRid = changeOfChargesMessage.ChargeTypeOwnerMRid
            };
            var resolutionType = new ResolutionType {
                Id = 1, Name = changeOfChargesMessage.Period?.Resolution
            };
            var vatPayerType = new VatPayerType {
                Id = 1, Name = changeOfChargesMessage.MktActivityRecord?.ChargeType?.VATPayer
            };

            // When
            var result = ChangeOfChargesMapper.MapChangeOfChargesMessageToCharge(changeOfChargesMessage, chargeType, chargeTypeOwnerMRid, resolutionType, vatPayerType);

            var properties = result.GetType().GetProperties();
            foreach (var property in properties)
            {
                Assert.NotNull(property.GetValue(result));
            }
        }
        public static Charge MapChangeOfChargesMessageToCharge(
            ChangeOfChargesMessage chargeMessage,
            ChargeType chargeType,
            MarketParticipant chargeTypeOwnerMRid,
            ResolutionType resolutionType,
            VatPayerType vatPayerType)
        {
            if (string.IsNullOrWhiteSpace(chargeMessage.ChargeTypeMRid))
            {
                throw new ArgumentException($"{nameof(chargeMessage.ChargeTypeMRid)} must have value");
            }
            if (string.IsNullOrWhiteSpace(chargeMessage.CorrelationId))
            {
                throw new ArgumentException($"{nameof(chargeMessage.CorrelationId)} must have value");
            }
            if (string.IsNullOrWhiteSpace(chargeMessage.LastUpdatedBy))
            {
                throw new ArgumentException($"{nameof(chargeMessage.LastUpdatedBy)} must have value");
            }
            if (chargeMessage.MktActivityRecord?.ChargeType == null)
            {
                throw new ArgumentException($"{nameof(chargeMessage.MktActivityRecord.ChargeType)} can't be null");
            }
            if (string.IsNullOrWhiteSpace(chargeMessage.MktActivityRecord.ChargeType.Name))
            {
                throw new ArgumentException($"{nameof(chargeMessage.MktActivityRecord.ChargeType.Name)} must have value");
            }
            if (string.IsNullOrWhiteSpace(chargeMessage.MktActivityRecord.ChargeType.Description))
            {
                throw new ArgumentException($"{nameof(chargeMessage.MktActivityRecord.ChargeType.Description)} must have value");
            }
            if (chargeMessage.Period == null)
            {
                throw new ArgumentException($"{nameof(chargeMessage.Period)} can't be null");
            }
            if (chargeMessage.Period.Points == null)
            {
                throw new ArgumentException($"{nameof(chargeMessage.Period.Points)} can't be null");
            }

            var charge = new Charge
            {
                ChargePrices               = new List <ChargePrice>(),
                ChargeType                 = chargeType,
                ChargeTypeOwner            = chargeTypeOwnerMRid,
                Description                = chargeMessage.MktActivityRecord.ChargeType.Description,
                LastUpdatedBy              = chargeMessage.LastUpdatedBy,
                LastUpdatedByCorrelationId = chargeMessage.CorrelationId,
                LastUpdatedByTransactionId = chargeMessage.Transaction.MRID,
                Name                 = chargeMessage.MktActivityRecord.ChargeType.Name,
                RequestDateTime      = chargeMessage.RequestDate.ToUnixTimeTicks(),
                ResolutionType       = resolutionType,
                StartDate            = chargeMessage.MktActivityRecord.ValidityStartDate.ToUnixTimeTicks(),
                EndDate              = chargeMessage.MktActivityRecord.ValidityEndDate?.ToUnixTimeTicks(),
                Status               = (int)chargeMessage.MktActivityRecord.Status,
                TaxIndicator         = chargeMessage.MktActivityRecord.ChargeType.TaxIndicator,
                TransparentInvoicing = chargeMessage.MktActivityRecord.ChargeType.TransparentInvoicing,
                VatPayer             = vatPayerType,
                MRid                 = chargeMessage.ChargeTypeMRid,
                Currency             = "DKK",
            };

            foreach (var point in chargeMessage.Period.Points)
            {
                var newChargePrice = new ChargePrice
                {
                    Time   = point.Time.ToUnixTimeTicks(),
                    Amount = point.PriceAmount,
                    LastUpdatedByCorrelationId = chargeMessage.CorrelationId,
                    LastUpdatedByTransactionId = chargeMessage.Transaction.MRID,
                    LastUpdatedBy   = chargeMessage.LastUpdatedBy,
                    RequestDateTime = chargeMessage.RequestDate.ToUnixTimeTicks(),
                };

                charge.ChargePrices.Add(newChargePrice);
            }

            return(charge);
        }