コード例 #1
0
        /// <summary>
        /// Processes Visa clearing transactions.
        /// </summary>
        /// <returns></returns>
        public async Task Process()
        {
            var outstandingRedeemedDeals = WorkerActions.RetrieveOutstandingPartnerRedeemedDealRecords(Partner.Visa, RedeemedDealOperations, Context);

            if (outstandingRedeemedDeals != null && outstandingRedeemedDeals.Any())
            {
                foreach (var outstandingDeal in outstandingRedeemedDeals)
                {
                    try
                    {
                        var partnerUserId = WorkerActions.RetrieveUserId(outstandingDeal.GlobalUserId, Partner.Visa, UserOperations, Context);

                        Context[Key.CardToken]                 = outstandingDeal.Token;
                        Context[Key.DealDiscountAmount]        = outstandingDeal.DiscountAmount;
                        Context[Key.Transaction]               = outstandingDeal.PartnerRedeemedDealScopeId;
                        Context[Key.TransactionSettlementDate] = outstandingDeal.TransactionDate;
                        Context[Key.PartnerUserId]             = partnerUserId;

                        UpdatePendingRedeemedDeals(outstandingDeal, CreditStatus.SendingStatementCreditRequest);

                        ResultCode resultCode;
                        try
                        {
                            IVisaClient client = new CardLink.Visa(Context);
                            resultCode = await client.SaveStatementCreditAsync();
                        }
                        catch (Exception ex)
                        {
                            Context.Log.Error("Error submitting statement of credit to Visa for outstanding redeemed dealId {0}.", ex, outstandingDeal.DealId);
                            UpdatePendingRedeemedDeals(outstandingDeal, CreditStatus.SendingStatementCreditRequestFailed);
                            continue;
                        }

                        if (resultCode == ResultCode.Created)
                        {
                            UpdatePendingRedeemedDeals(outstandingDeal, CreditStatus.StatementCreditRequested);
                        }
                        else
                        {
                            UpdatePendingRedeemedDeals(outstandingDeal, CreditStatus.RejectedByPartner);
                        }
                    }
                    catch (Exception ex)
                    {
                        Context.Log.Error("Error processing outstanding redeemed dealId {0}.", ex, outstandingDeal.DealId);
                        UpdatePendingRedeemedDeals(outstandingDeal, CreditStatus.GeneratingStatementCreditRequestFailed);
                    }
                }

                //outstandingRedeemedDeals = WorkerActions.RetrieveOutstandingPartnerRedeemedDealRecords(Partner.Visa, RedeemedDealOperations, Context);
            }
        }
コード例 #2
0
        /// <summary>
        /// Processes the PTS file.
        /// </summary>
        public async Task Process()
        {
            // Get the list of MasterCard redemptions marked ReadyForSettlement.
            Collection <OutstandingRedeemedDealInfo> redeemedDealRecords = WorkerActions.RetrieveOutstandingPartnerRedeemedDealRecords(Partner.MasterCard,
                                                                                                                                       RedeemedDealOperations, Context);

            // Build contents of the rebate file from the list of ReadyForSettlement redemptions.
            string rebateFileContents = RebateBuilder.Build(MasterCard.MarshalOutstandingRedeemedDeals(redeemedDealRecords), DateTime.UtcNow);

            // Upload the file to the blob store and to MasterCard, and then mark the redemptions as SettledAsRedeemed.
            // NOTE: Status is immediately marked SettledAsRedeemed, because, unlike other partners, MasterCard only tells us which rebates it rejects.
            if (UploadRebateFile != null)
            {
                await UploadRebateFile(rebateFileContents).ConfigureAwait(false);

                WorkerActions.MarkSettledAsRedeemed(redeemedDealRecords, RedeemedDealOperations, Context);
            }
        }
コード例 #3
0
        /// <summary>
        /// Build the string representation of the file.
        /// </summary>
        /// <returns>
        /// String representation of the file or null
        /// </returns>
        public async Task Build(Func <string, Task> onStatementCreditFileBuildFunc)
        {
            Collection <OutstandingRedeemedDealInfo> redeemedDealRecords = WorkerActions.RetrieveOutstandingPartnerRedeemedDealRecords(Partner.Amex,
                                                                                                                                       RedeemedDealOperations, Context);

            if (onStatementCreditFileBuildFunc != null)
            {
                // this will ftp the data and store it in blob
                StatementCreditFile file = BuildCreditFile(redeemedDealRecords);
                string result            = ConvertFileToString(file);
                await onStatementCreditFileBuildFunc(result).ConfigureAwait(false);

                // Commenting the earlier implementation of marking the transactions as StatementCreditRequested
                //WorkerActions.UpdatePendingRedeemedDeals(redeemedDealRecords, CreditStatus.StatementCreditRequested, RedeemedDealOperations, Context);

                // follow the master card pattern to mark as settled unless we get an error from amex
                WorkerActions.MarkSettledAsRedeemed(redeemedDealRecords, RedeemedDealOperations, Context);
            }
        }
コード例 #4
0
        /// <summary>
        /// Processes the PTS file.
        /// </summary>
        public async Task Process()
        {
            Collection <OutstandingRedeemedDealInfo> result = WorkerActions.RetrieveOutstandingPartnerRedeemedDealRecords(Partner.FirstData,
                                                                                                                          RedeemedDealOperations, Context);

            if (OnPtsBuild != null)
            {
                // FDC requires EST.
                TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
                DateTime     estNow      = TimeZoneInfo.ConvertTime(DateTime.UtcNow, easternZone);

                // this will ftp the data and store it in blob
                // Always construct file as sequence number of 1, because FDC PTS job runs first each day.
                string ptsFileContents = PtsBuilder.Build(result, estNow, 1);
                await OnPtsBuild(ptsFileContents).ConfigureAwait(false);

                // now update db
                UpdatePendingRedeemedDeals(result, CreditStatus.StatementCreditRequested);

                if (TransactionPublisher != null)
                {
                    foreach (OutstandingRedeemedDealInfo outstandingRedeemedDealInfo in result)
                    {
                        TransactionDetail transactionDetail = new TransactionDetail()
                        {
                            TransactionDate  = outstandingRedeemedDealInfo.TransactionDate.ToString("yyMMdd-HHmmss"),
                            DealId           = outstandingRedeemedDealInfo.DealId,
                            DiscountId       = outstandingRedeemedDealInfo.DiscountId,
                            DiscountAmount   = outstandingRedeemedDealInfo.DiscountAmount,
                            SettlementAmount = outstandingRedeemedDealInfo.SettlementAmount
                        };

                        await TransactionPublisher.PublishTransactionAsync(transactionDetail).ConfigureAwait(false);
                    }
                }
            }
        }