public async Task <ProcessingVoucherError> ProcessPaymentRequestAsync(Guid paymentRequestId)
        {
            var voucherShortCode = await _paymentRequestsRepository.GetVoucherShortCodeAsync(paymentRequestId);

            var voucher = await _vouchersRepository.GetByShortCodeAsync(voucherShortCode);

            if (voucher == null)
            {
                return(ProcessingVoucherError.VoucherNotFound);
            }

            if (voucher.OwnerId == null)
            {
                _log.Error(message: "Reserved voucher with missing owner", context: voucher);
                throw new InvalidOperationException("Reserved voucher with missing owner");
            }

            var voucherCampaign = await _campaignsRepository.GetByIdAsync(voucher.CampaignId, false);

            if (voucherCampaign == null)
            {
                return(ProcessingVoucherError.VoucherCampaignNotFound);
            }

            voucher.Status = VoucherStatus.Sold;
            await _vouchersRepository.UpdateAsync(voucher);

            await PublishVoucherSoldEvent(paymentRequestId, voucherCampaign, voucher);

            return(ProcessingVoucherError.None);
        }
Exemplo n.º 2
0
        public async Task <UpdateCampaignError> UpdateAsync(VoucherCampaign campaign)
        {
            var oldCampaign = await _campaignsRepository.GetByIdAsync(campaign.Id, true);

            if (oldCampaign == null)
            {
                _log.Error($"Campaign {campaign.Id} not found for update");
                return(UpdateCampaignError.VoucherCampaignNotFound);
            }

            if (oldCampaign.State == CampaignState.Published && oldCampaign.FromDate <= DateTime.UtcNow)
            {
                return(UpdateCampaignError.CampaignAlreadyStarted);
            }

            if (campaign.VouchersTotalCount < oldCampaign.BoughtVouchersCount)
            {
                return(UpdateCampaignError.TotalCountMustBeGreaterThanBoughtVouchersCount);
            }

            campaign.CreatedBy    = oldCampaign.CreatedBy;
            campaign.CreationDate = oldCampaign.CreationDate;
            if (campaign.LocalizedContents != null)
            {
                for (int i = 0; i < campaign.LocalizedContents.Count; ++i)
                {
                    if (!string.IsNullOrWhiteSpace(campaign.LocalizedContents[i].Value))
                    {
                        continue;
                    }

                    campaign.LocalizedContents.RemoveAt(i);
                    --i;
                }
            }

            var contentsToRemove = oldCampaign.LocalizedContents
                                   .Where(c1 => campaign.LocalizedContents.All(c2 => c1.Id != c2.Id))
                                   .ToList();
            await _campaignContentsRepository.DeleteAsync(contentsToRemove);

            foreach (var content in contentsToRemove)
            {
                if (content.ContentType == CampaignContentType.ImageUrl)
                {
                    await _fileService.DeleteAsync(content.Id);
                }
            }

            await _campaignsRepository.UpdateAsync(campaign);

            _log.Info("Campaign was updated", context: campaign);

            return(UpdateCampaignError.None);
        }
Exemplo n.º 3
0
        public async Task <ProcessingVoucherError> ProcessPaymentRequestAsync(Guid paymentRequestId)
        {
            var voucherShortCode = await _paymentRequestsRepository.GetVoucherShortCodeAsync(paymentRequestId);

            var voucher = await _vouchersRepository.GetByShortCodeAsync(voucherShortCode);

            if (voucher == null)
            {
                return(ProcessingVoucherError.VoucherNotFound);
            }

            if (voucher.OwnerId == null)
            {
                _log.Error(message: "Reserved voucher with missing owner", context: voucher);
                throw new InvalidOperationException("Reserved voucher with missing owner");
            }

            var voucherCampaign = await _campaignsRepository.GetByIdAsync(voucher.CampaignId, false);

            if (voucherCampaign == null)
            {
                return(ProcessingVoucherError.VoucherCampaignNotFound);
            }

            voucher.Status = VoucherStatus.Sold;
            await _vouchersRepository.UpdateAsync(voucher);

            await _voucherSoldPublisher.PublishAsync(new SmartVoucherSoldEvent
            {
                Amount           = voucherCampaign.VoucherPrice,
                Currency         = voucherCampaign.Currency,
                CustomerId       = voucher.OwnerId.Value,
                PartnerId        = voucherCampaign.PartnerId,
                Timestamp        = DateTime.UtcNow,
                CampaignId       = voucher.CampaignId,
                VoucherShortCode = voucher.ShortCode,
                PaymentRequestId = paymentRequestId.ToString(),
            });

            return(ProcessingVoucherError.None);
        }