/// <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); } }
/// <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); } }
/// <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); } }
/// <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); } } } }