public PriceForSubscriptionMustBeDefinedRule(
     string countryCode,
     SubscriptionPeriod subscriptionPeriod,
     IList <PriceListItemData> priceListItems,
     PriceListItemCategory category)
 {
     _countryCode        = countryCode;
     _subscriptionPeriod = subscriptionPeriod;
     _priceListItems     = priceListItems;
     _category           = category;
 }
        public MoneyValue GetPrice(
            string countryCode,
            SubscriptionPeriod subscriptionPeriod,
            PriceListItemCategory category)
        {
            var priceListItem = _items.Single(x =>
                                              x.CountryCode == countryCode && x.SubscriptionPeriod == subscriptionPeriod &&
                                              x.Category == category);

            return(priceListItem.Value);
        }
        public Task <Guid> Handle(CreatePriceListItemCommand command, CancellationToken cancellationToken)
        {
            var priceListItem = PriceListItem.Create(
                command.CountryCode,
                SubscriptionPeriod.Of(command.SubscriptionPeriodCode),
                PriceListItemCategory.Of(command.CategoryCode),
                MoneyValue.Of(command.PriceValue, command.PriceCurrency));

            _aggregateStore.AppendChanges(priceListItem);

            return(Task.FromResult(priceListItem.Id));
        }
        public async Task <Unit> Handle(ChangePriceListItemAttributesCommand command, CancellationToken cancellationToken)
        {
            var priceListItem = await _aggregateStore.Load(new PriceListItemId(command.PriceListItemId));

            priceListItem.ChangeAttributes(
                command.CountryCode,
                SubscriptionPeriod.Of(command.SubscriptionPeriodCode),
                PriceListItemCategory.Of(command.CategoryCode),
                MoneyValue.Of(command.PriceValue, command.PriceCurrency));

            _aggregateStore.AppendChanges(priceListItem);
            return(Unit.Value);
        }
        public static async Task <PriceList> GetPriceList(IDbConnection connection)
        {
            var priceListItemList = await GetPriceListItems(connection);

            return(PriceList.CreateFromItems(
                       priceListItemList
                       .Select(x =>
                               new PriceListItemData(
                                   x.CountryCode,
                                   SubscriptionPeriod.Of(x.SubscriptionPeriodCode),
                                   MoneyValue.Of(x.MoneyValue, x.MoneyCurrency),
                                   PriceListItemCategory.Of(x.CategoryCode)))
                       .ToList()));
        }
        public async Task <Unit> Handle(ChangePriceListItemAttributesCommand command, CancellationToken cancellationToken)
        {
            var priceListItem = await _aggregateStore.Load(new PriceListItemId(command.PriceListItemId));

            if (priceListItem == null)
            {
                throw new InvalidCommandException(new List <string> {
                    "Pricelist item for changing must exist."
                });
            }

            priceListItem.ChangeAttributes(
                command.CountryCode,
                SubscriptionPeriod.Of(command.SubscriptionPeriodCode),
                PriceListItemCategory.Of(command.CategoryCode),
                MoneyValue.Of(command.PriceValue, command.PriceCurrency));

            _aggregateStore.AppendChanges(priceListItem);
            return(Unit.Value);
        }
        public static async Task <PriceList> CreatePriceList(IDbConnection connection)
        {
            var priceListItemList = await GetPriceListItems(connection);

            var priceListItems = priceListItemList
                                 .Select(x =>
                                         new PriceListItemData(
                                             x.CountryCode,
                                             SubscriptionPeriod.Of(x.SubscriptionPeriodCode),
                                             MoneyValue.Of(x.MoneyValue, x.MoneyCurrency),
                                             PriceListItemCategory.Of(x.CategoryCode)))
                                 .ToList();

            // This is place for selecting pricing strategy based on provided data and the system state.
            IPricingStrategy pricingStrategy = new DirectValueFromPriceListPricingStrategy(priceListItems);

            return(PriceList.Create(
                       priceListItems,
                       pricingStrategy));
        }
 public MoneyValue GetPrice(string countryCode, SubscriptionPeriod subscriptionPeriod, PriceListItemCategory category)
 {
     return(_directValue);
 }