Exemplo n.º 1
0
        public static PromoCode MapFromModel(ReceivingPromoCodeRequest request, PreferenceDto preference,
                                             Partner partner)
        {
            var promocode = new PromoCode
            {
                PartnerId        = partner.Id,
                Partner          = partner,
                Code             = request.PromoCode,
                ServiceInfo      = request.ServiceInfo,
                BeginDate        = DateTime.Now,
                EndDate          = DateTime.Now.AddDays(30),
                PreferenceId     = preference.Id,
                PartnerManagerId = request.PartnerManagerId
            };

            return(promocode);
        }
        public static PromoCode MapFromModel(ReceivingPromoCodeRequest request, Preference preference, Partner partner)
        {
            var promocode = new PromoCode();

            promocode.PartnerId   = partner.Id;
            promocode.Partner     = partner;
            promocode.Code        = request.PromoCode;
            promocode.ServiceInfo = request.ServiceInfo;

            promocode.BeginDate = DateTime.Now;
            promocode.EndDate   = DateTime.Now.AddDays(30);

            promocode.Preference   = preference;
            promocode.PreferenceId = preference.Id;

            promocode.PartnerManagerId = request.PartnerManagerId;

            return(promocode);
        }
        public async Task <IActionResult> ReceivePromoCodeFromPartnerWithPreferenceAsync(Guid id,
                                                                                         ReceivingPromoCodeRequest request)
        {
            var partner = await _partnersRepository.GetByIdAsync(id);

            if (partner == null)
            {
                return(BadRequest("Партнер не найден"));
            }

            var activeLimit = partner.PartnerLimits.FirstOrDefault(x
                                                                   => !x.CancelDate.HasValue && x.EndDate > DateTime.Now);

            if (activeLimit == null)
            {
                return(BadRequest("Нет доступного лимита на предоставление промокодов"));
            }

            if (partner.NumberIssuedPromoCodes + 1 > activeLimit.Limit)
            {
                return(BadRequest("Лимит на выдачу промокодов превышен"));
            }

            if (partner.PromoCodes.Any(x => x.Code == request.PromoCode))
            {
                return(BadRequest("Данный промокод уже был выдан ранее"));
            }

            //Получаем предпочтение по имени
            var preference = await _preferencesRepository.GetByIdAsync(request.PreferenceId);

            if (preference == null)
            {
                return(BadRequest("Предпочтение не найдено"));
            }

            PromoCode promoCode = PromoCodeMapper.MapFromModel(request, preference, partner);

            partner.PromoCodes.Add(promoCode);
            partner.NumberIssuedPromoCodes++;

            await _partnersRepository.UpdateAsync(partner);

            //TODO: Чтобы информация о том, что промокод был выдан парнером была отправлена
            //в микросервис рассылки клиентам нужно либо вызвать его API, либо отправить событие в очередь
            _givingPromoCodeToCustomerNotifier.GivePromoCodeToCustomer(promoCode);

            //TODO: Чтобы информация о том, что промокод был выдан парнером была отправлена
            //в микросервис администрирования нужно либо вызвать его API, либо отправить событие в очередь

            if (request.PartnerManagerId.HasValue)
            {
                _administrationNotifier.NotifyAdminAboutPartnerManagerPromoCode(request.PartnerManagerId.Value);
            }

            return(CreatedAtAction(nameof(GetPartnerPromoCodeAsync),
                                   new { id = partner.Id, promoCodeId = promoCode.Id }, null));
        }