From b5677c54918d446b4eac32c9ed5c36b264a824cf Mon Sep 17 00:00:00 2001 From: estebantan Date: Mon, 26 Oct 2020 21:54:32 +0800 Subject: [PATCH] Ingenico updates with Pay@Table module | .NET SDK v1.0.6 --- GlobalPayments.Api.sln | 7 +- .../Builders/AuthorizationBuilder.cs | 101 +- .../Builders/ManagementBuilder.cs | 110 +- .../Builders/TransactionBuilder.cs | 22 +- src/GlobalPayments.Api/Entities/Address.cs | 13 +- .../Entities/BatchSummary.cs | 39 +- .../Entities/CommercialData.cs | 19 +- .../Entities/CommercialLineItem.cs | 4 +- src/GlobalPayments.Api/Entities/Enums.cs | 209 +- .../Entities/Enums/CreditDebitIndicator.cs | 4 +- .../Entities/Enums/ServiceEndpoints.cs | 4 +- .../Enums/StoredCredentialInitiator.cs | 9 +- src/GlobalPayments.Api/Entities/Exceptions.cs | 17 +- .../Entities/Payroll/PayrollEncoder.cs | 9 +- .../Entities/ThreeDSecure.cs | 4 - .../Entities/Transaction.cs | 252 +- src/GlobalPayments.Api/Gateways/Gateway.cs | 28 +- .../Gateways/GatewayResponse.cs | 3 +- .../Gateways/GeniusConnector.cs | 2 +- .../Gateways/GpEcomConnector.cs | 16 +- .../Gateways/PorticoConnector.cs | 47 +- .../Gateways/TransitConnector.cs | 195 +- .../GlobalPayments.Api.csproj | 12 +- .../Network/Enums/CardDataInputCapability.cs | 41 +- .../Network/Enums/CardDataOutputCapability.cs | 6 +- .../CardHolderAuthenticationCapability.cs | 13 +- .../Enums/CardHolderAuthenticationEntity.cs | 10 +- .../Network/Enums/OperatingEnvironment.cs | 10 +- .../Network/Enums/PinCaptureCapability.cs | 13 +- .../Network/Enums/TerminalOutputCapability.cs | 8 +- .../PaymentMethods/Credit.cs | 20 +- .../PaymentMethods/CreditCardData.cs | 14 +- .../PaymentMethods/CreditTrackData.cs | 2 - .../PaymentMethods/Debit.cs | 12 +- src/GlobalPayments.Api/PaymentMethods/EBT.cs | 50 - .../PaymentMethods/EBTCardData.cs | 8 +- .../PaymentMethods/EBTTrackData.cs | 3 - .../PaymentMethods/GiftCard.cs | 133 +- .../PaymentMethods/PaymentInterfaces.cs | 84 + .../PaymentMethods/RecurringPaymentMethod.cs | 7 +- .../PaymentMethods/TransactionReference.cs | 24 +- .../ServiceConfigs/Configuration.cs | 5 - .../ServiceConfigs/Gateways/AcceptorConfig.cs | 47 +- .../ServiceConfigs/Gateways/GatewayConfig.cs | 6 +- .../ServiceConfigs/Gateways/PorticoConfig.cs | 6 +- .../ServiceConfigs/Gateways/TransitConfig.cs | 3 +- .../Services/BatchService.cs | 118 - .../Services/TableService.cs | 2 +- .../Abstractions/IDeviceCommInterface.cs | 4 + .../Abstractions/IDeviceInterface.cs | 90 +- .../Terminals/Builders/TerminalAuthBuilder.cs | 102 +- .../Builders/TerminalManageBuilder.cs | 40 +- .../Builders/TerminalReportBuilder.cs | 11 + .../Terminals/ConnectionConfig.cs | 30 +- .../Terminals/ControlCodes.cs | 5 + .../Terminals/DeviceController.cs | 10 + .../Terminals/DeviceInterface.cs | 67 +- .../Genius/Interfaces/GeniusHttpInterface.cs | 6 +- .../Terminals/HPA/HpaInterface.cs | 3 +- .../HPA/Interfaces/HpaTcpInterface.cs | 2 + .../HPA/Responses/SipBaseResponse.cs | 2 +- .../Terminals/INGENICO/IngenicoController.cs | 310 +++ .../Terminals/INGENICO/IngenicoEnums.cs | 306 +++ .../Terminals/INGENICO/IngenicoInterface.cs | 151 ++ .../Interfaces/IngenicoSerialInterface.cs | 269 ++ .../Interfaces/IngenicoTcpInterface.cs | 326 +++ .../INGENICO/Interfaces/TcpListenerEx.cs | 12 + .../Terminals/INGENICO/Requests/PATRequest.cs | 115 + .../Requests/TransactionOutcomeRequest.cs | 33 + .../INGENICO/Responses/BroadcastMessage.cs | 60 + .../INGENICO/Responses/CancelResponse.cs | 18 + .../INGENICO/Responses/DataResponse.cs | 106 + .../INGENICO/Responses/DeviceResponse.cs | 141 + .../Responses/POSIdentifierResponse.cs | 18 + .../INGENICO/Responses/ReportResponse.cs | 11 + .../INGENICO/Responses/ReverseResponse.cs | 18 + .../INGENICO/Responses/StateResponse.cs | 55 + .../Messaging/BroadcastMessageEventHandler.cs | 2 +- .../PayAtTableRequestEventHandler.cs | 5 + .../PAX/Interfaces/PaxHttpInterface.cs | 2 + .../PAX/Interfaces/PaxTcpInterface.cs | 7 +- .../Terminals/PAX/PaxController.cs | 4 +- .../Terminals/PAX/PaxInterface.cs | 4 +- .../Terminals/TerminalUtilities.cs | 79 +- src/GlobalPayments.Api/Utils/CardUtils.cs | 132 +- src/GlobalPayments.Api/Utils/EnumUtils.cs | 30 - src/GlobalPayments.Api/Utils/Extensions.cs | 16 +- .../Utils/TypeLengthValue.cs | 68 + .../Certifications/AutoSubCertification.cs | 721 +++++ .../Certifications/CheckCertification.cs | 345 +++ .../Certifications/EcomCertification.cs | 1499 +++++++++++ .../Certifications/EcomCheckCertification.cs | 122 + .../Certifications/LodgingCertification.cs | 2392 +++++++++++++++++ .../Certifications/MotoCertification.cs | 1496 +++++++++++ .../Certifications/MotoCheckCertification.cs | 121 + .../Certifications/RecurringCertification.cs | 480 ++++ .../Certifications/RetailCertification.cs | 1835 +++++++++++++ .../Genius/GeniusTests.cs | 4 +- .../Portico/PorticoAchTests.cs | 61 +- .../Portico/PorticoCreditTests.cs | 93 - .../Portico/PorticoRecurringTests.cs | 30 - .../Ingenico/IngenicoTransactionTests.cs | 175 ++ .../Ingenico/PayAtTableRequestTests.cs | 73 + .../Ingenico/SaleTransactionManagement.cs | 141 + .../Ingenico/SerialPaymentTransactions.cs | 180 ++ .../Ingenico/TerminalManagementTest.cs | 87 + .../Terminals/Ingenico/TransactionTest.cs | 86 + .../Terminals/Pax/PaxBatchTests.cs | 2 +- .../Terminals/Pax/PaxCreditTests.cs | 1 - .../Terminals/Pax/PaxDebitTests.cs | 5 +- .../Terminals/Pax/PaxEbtTests.cs | 2 +- .../Terminals/Pax/PaxGiftTests.cs | 2 +- .../Terminals/Pax/PaxLevel2Tests.cs | 2 +- .../Terminals/Pax/PaxReportTests.cs | 3 +- .../Terminals/RequestIdProviders.cs | 2 +- .../TestData/TestCards.cs | 202 +- .../TransIT/TransitAuthenticationTests.cs | 10 +- .../TransIT/TransitCreditTests.cs | 13 +- 118 files changed, 12845 insertions(+), 1781 deletions(-) create mode 100644 src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs create mode 100644 src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs create mode 100644 src/GlobalPayments.Api/Utils/TypeLengthValue.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs create mode 100644 tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs diff --git a/GlobalPayments.Api.sln b/GlobalPayments.Api.sln index b6c47e35..c22ff196 100644 --- a/GlobalPayments.Api.sln +++ b/GlobalPayments.Api.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28922.388 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{9876175E-E3D9-4F53-B8D3-6FEB12CD64A8}" EndProject @@ -32,7 +32,4 @@ Global {F17FCB7C-D151-42A3-92F0-D07C6BAEBE1E} = {9876175E-E3D9-4F53-B8D3-6FEB12CD64A8} {B6046949-26BA-4F0C-A6AD-5836ADAF479F} = {8E5CBF7F-AF5F-462D-9C3B-3660C36D0C4A} EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {092A21D0-A224-4A40-9C9C-F4D9EB8751B0} - EndGlobalSection EndGlobal diff --git a/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs b/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs index 4b8618f7..00c17cd8 100644 --- a/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs +++ b/src/GlobalPayments.Api/Builders/AuthorizationBuilder.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Network.Entities; using GlobalPayments.Api.PaymentMethods; namespace GlobalPayments.Api.Builders { @@ -16,12 +15,10 @@ public class AuthorizationBuilder : TransactionBuilder { internal bool AllowDuplicates { get; set; } internal bool AllowPartialAuth { get; set; } internal decimal? Amount { get; set; } - internal bool AmountEstimated { get; set; } internal decimal? AuthAmount { get; set; } internal AutoSubstantiation AutoSubstantiation { get; set; } internal InquiryType? BalanceInquiryType { get; set; } internal Address BillingAddress { get; set; } - internal string CardBrandTransactionId { get; set; } internal decimal? CashBackAmount { get; set; } internal string ClientTransactionId { get; set; } internal CommercialData CommercialData { get; set; } @@ -65,19 +62,12 @@ public class AuthorizationBuilder : TransactionBuilder { internal Dictionary> SupplementaryData { get; set; } internal string TagData { get; set; } internal string Timestamp { get; set; } - internal decimal FeeAmount { get; set; } - internal FeeType FeeType { get; set; } - internal string ShiftNumber { get; set; } - internal string ClerkId { get; set; } - internal string TransportData { get; set; } - internal StoredCredentialInitiator? TransactionInitiator { get; set; } internal bool HasEmvFallbackData { get { return (EmvFallbackCondition != null || EmvLastChipRead != null || !string.IsNullOrEmpty(PaymentApplicationVersion)); } } - internal EmvLastChipRead EmvChipCondition { get; set; } /// /// Indicates the type of account provided; see the associated Type enumerations for specific values supported. @@ -145,11 +135,6 @@ public AuthorizationBuilder WithAmount(decimal? value) { return this; } - public AuthorizationBuilder WithAmountEstimated(bool value) { - AmountEstimated = value; - return this; - } - /// /// Sets the transaction's authorization amount; where applicable. /// @@ -178,8 +163,8 @@ public AuthorizationBuilder WithAutoSubstantiation(AutoSubstantiation value) { /// Sets the Multicapture value as true/false. /// /// AuthorizationBuilder - public AuthorizationBuilder WithMultiCapture(bool value = true) { - MultiCapture = value; + public AuthorizationBuilder WithMultiCapture(bool value) { + MultiCapture = value; return this; } @@ -188,12 +173,6 @@ internal AuthorizationBuilder WithBalanceInquiryType(InquiryType? value) { return this; } - public AuthorizationBuilder WithCardBrandStorage(StoredCredentialInitiator transactionInitiator, string value = null) { - TransactionInitiator = transactionInitiator; - CardBrandTransactionId = value; - return this; - } - /// /// Sets the cash back amount. /// @@ -392,7 +371,8 @@ public AuthorizationBuilder WithGratuity(decimal? value) { /// /// The Convenience amount /// AuthorizationBuilder - public AuthorizationBuilder WithConvenienceAmount(decimal? value) { + public AuthorizationBuilder WithConvenienceAmount(decimal? value) + { ConvenienceAmount = value; return this; } @@ -402,7 +382,8 @@ public AuthorizationBuilder WithConvenienceAmount(decimal? value) { /// /// The Shipping amount /// AuthorizationBuilder - public AuthorizationBuilder WithShippingAmt(decimal? value) { + public AuthorizationBuilder WithShippingAmt(decimal? value) + { ShippingAmt = value; return this; } @@ -776,73 +757,5 @@ protected override void SetupValidations() { Validations.For(PaymentMethodType.Recurring).Check(() => ShippingAmt).IsNull(); } - - public AuthorizationBuilder WithForceGatewayTimeout(bool value) { - ForceGatewayTimeout = value; - return this; - } - - public AuthorizationBuilder WithFee(FeeType feeType, decimal feeAmount) { - FeeType = feeType; - FeeAmount = feeAmount; - - return this; - } - - public AuthorizationBuilder WithUniqueDeviceId(string value) { - UniqueDeviceId = value; - return this; - } - - public AuthorizationBuilder WithClerkId(string value) { - ClerkId = value; - return this; - } - - public AuthorizationBuilder WithShiftNumber(string value) { - ShiftNumber = value; - return this; - } - public AuthorizationBuilder WithTransportData(string value) { - TransportData = value; - return this; - } - public AuthorizationBuilder WithBatchNumber(int value) { - BatchNumber = value; - return this; - } - public AuthorizationBuilder WithBatchNumber(int batchNumber, int sequenceNumber) { - BatchNumber = batchNumber; - SequenceNumber = sequenceNumber; - return this; - } - public AuthorizationBuilder WithCompanyId(string value) { - CompanyId = value; - return this; - } - public AuthorizationBuilder WithFleetData(FleetData value) { - FleetData = value; - return this; - } - public AuthorizationBuilder WithIssuerData(Dictionary value) { - IssuerData = value; - return this; - } - public AuthorizationBuilder WithSystemTraceAuditNumber(int value) { - SystemTraceAuditNumber = value; - return this; - } - public AuthorizationBuilder WithTransactionMatchingData(TransactionMatchingData value) { - TransactionMatchingData = value; - return this; - } - public AuthorizationBuilder WithChipCondition(EmvLastChipRead value) { - EmvChipCondition = value; - return this; - } - public AuthorizationBuilder WithProductData(ProductData value) { - ProductData = value; - return this; - } } -} \ No newline at end of file +} diff --git a/src/GlobalPayments.Api/Builders/ManagementBuilder.cs b/src/GlobalPayments.Api/Builders/ManagementBuilder.cs index cd7f1af7..9fca16bb 100644 --- a/src/GlobalPayments.Api/Builders/ManagementBuilder.cs +++ b/src/GlobalPayments.Api/Builders/ManagementBuilder.cs @@ -1,5 +1,4 @@ using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Network.Entities; using GlobalPayments.Api.PaymentMethods; using System.Collections.Generic; @@ -35,8 +34,6 @@ internal string ClientTransactionId { internal decimal? Gratuity { get; set; } internal string InvoiceNumber { get; set; } internal LodgingData LodgingData { get; set; } - internal int? MultiCapturePaymentCount { get; set; } - internal int? MultiCaptureSequence { get; set; } internal string OrderId { get { if (PaymentMethod is TransactionReference) { @@ -56,18 +53,6 @@ internal string TransactionId { return null; } } - internal int TransactionCount { get; set; } - internal decimal TotalCredits { get; set; } - internal decimal TotalDebits { get; set; } - internal string ReferenceNumber { get; set; } - internal BatchCloseType BatchCloseType { get; set; } - internal decimal? CashBackAmount { get; set; } - internal bool ForcedReversal { get; set; } - internal bool CustomerInitiated { get; set; } - internal string TransportData { get; set; } - internal string Timestamp { get; set; } - internal VoidReason? VoidReason { get; set; } - internal bool AllowDuplicates { get; set; } /// /// Sets the current transaction's amount. @@ -93,16 +78,8 @@ public ManagementBuilder WithAuthAmount(decimal? value) { /// Sets the Multicapture value as true/false. /// /// ManagementBuilder - //public ManagementBuilder WithMultiCapture(bool value) { - // MultiCapture = value; - // return this; - //} - - public ManagementBuilder WithMultiCapture(int sequence = 1, int paymentCount = 1) { - MultiCapture = true; - MultiCaptureSequence = sequence; - MultiCapturePaymentCount = paymentCount; - + public ManagementBuilder WithMultiCapture(bool value) { + MultiCapture = value; return this; } @@ -239,50 +216,7 @@ internal ManagementBuilder WithModifier(TransactionModifier value) { /// /// public ManagementBuilder WithAlternativePaymentType(AlternativePaymentType value) { - AlternativePaymentType = value; - return this; - } - public ManagementBuilder WithCashBackAmount(decimal? value) { - CashBackAmount = value; - return this; - } - public ManagementBuilder WithBatchNumber(int batchNumber, int sequenceNumber = 0) { - BatchNumber = batchNumber; - SequenceNumber = sequenceNumber; - return this; - } - public ManagementBuilder WithBatchCloseType(BatchCloseType value) { - BatchCloseType = value; - return this; - } - public ManagementBuilder WithBatchTotals(int transactionCount, decimal totalDebits, decimal totalCredits) { - TransactionCount = transactionCount; - TotalDebits = totalDebits; - TotalCredits = totalCredits; - - return this; - } - public ManagementBuilder WithTransportData(string value) { - TransportData = value; - return this; - } - public ManagementBuilder WithTimestamp(string value) { - Timestamp = value; - return this; - } - public ManagementBuilder WithReferenceNumber(string value) { - ReferenceNumber = value; - return this; - } - - /// - /// Allows duplicate transactions by skipping the - /// gateway's duplicate checking. - /// - /// The duplicate skip flag - /// ManagementBuilder - public ManagementBuilder WithAllowDuplicates(bool value) { - AllowDuplicates = value; + this.AlternativePaymentType = value; return this; } @@ -296,11 +230,6 @@ public ManagementBuilder WithLodgingData(LodgingData value) { return this; } - public ManagementBuilder WithVoidReason(VoidReason? value) { - VoidReason = value; - return this; - } - internal ManagementBuilder(TransactionType type) : base(type) {} /// @@ -316,7 +245,7 @@ public override Transaction Execute(string configName = "default") { protected override void SetupValidations() { Validations.For(TransactionType.Capture | TransactionType.Edit | TransactionType.Hold | TransactionType.Release) - .Check(() => PaymentMethod).IsNotNull(); + .Check(() => TransactionId).IsNotNull(); // TODO: Need level validations //Validations.For(TransactionType.Edit).With(TransactionModifier.Level_II) @@ -338,37 +267,6 @@ protected override void SetupValidations() { Validations.For(TransactionType.TokenUpdate) .Check(() => PaymentMethod).Is(); - - Validations.For( - TransactionType.Capture | - TransactionType.Edit | - TransactionType.Hold | - TransactionType.Release | - TransactionType.TokenUpdate | - TransactionType.TokenDelete | - TransactionType.VerifySignature | - TransactionType.Refund) - .Check(() => VoidReason).IsNull(); - } - public ManagementBuilder WithForcedReversal(bool value) { - ForcedReversal = value; - return this; - } - public ManagementBuilder WithProductData(ProductData value) { - ProductData = value; - return this; - } - public ManagementBuilder WithFleetData(FleetData value) { - FleetData = value; - return this; - } - public ManagementBuilder WithCustomerInitiated(bool value) { - CustomerInitiated = value; - return this; - } - public ManagementBuilder WithForceGatewayTimeout(bool value) { - ForceGatewayTimeout = value; - return this; } } } diff --git a/src/GlobalPayments.Api/Builders/TransactionBuilder.cs b/src/GlobalPayments.Api/Builders/TransactionBuilder.cs index d16ba272..aa813df3 100644 --- a/src/GlobalPayments.Api/Builders/TransactionBuilder.cs +++ b/src/GlobalPayments.Api/Builders/TransactionBuilder.cs @@ -1,9 +1,8 @@ using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Network.Entities; using GlobalPayments.Api.PaymentMethods; -using System.Collections.Generic; -namespace GlobalPayments.Api.Builders { +namespace GlobalPayments.Api.Builders +{ public abstract class TransactionBuilder : BaseBuilder { internal TransactionType TransactionType { get; set; } internal TransactionModifier TransactionModifier { get; set; } @@ -11,25 +10,8 @@ public abstract class TransactionBuilder : BaseBuilder { internal bool MultiCapture { get; set; } internal DccRateData DccRateData { get; set; } - //network fields - internal int BatchNumber{ get; set; } - internal string CompanyId{ get; set; } - internal FleetData FleetData{ get; set; } - internal Dictionary IssuerData{ get; set; } - internal PriorMessageInformation PriorMessageInformation{ get; set; } - internal ProductData ProductData{ get; set; } - internal int SequenceNumber{ get; set; } - internal int SystemTraceAuditNumber{ get; set; } - internal string UniqueDeviceId{ get; set; } - internal TransactionMatchingData TransactionMatchingData{ get; set; } - // network fields - internal bool ForceGatewayTimeout { get; set; } public TransactionBuilder(TransactionType type) : base() { TransactionType = type; } - public TransactionBuilder(TransactionType type, IPaymentMethod paymentMethod) : base() { - this.TransactionType = type; - this.PaymentMethod = paymentMethod; - } } } diff --git a/src/GlobalPayments.Api/Entities/Address.cs b/src/GlobalPayments.Api/Entities/Address.cs index 89e708d8..3ed3ec72 100644 --- a/src/GlobalPayments.Api/Entities/Address.cs +++ b/src/GlobalPayments.Api/Entities/Address.cs @@ -1,10 +1,12 @@ using GlobalPayments.Api.Utils; -namespace GlobalPayments.Api.Entities { +namespace GlobalPayments.Api.Entities +{ /// /// Represents a billing or shipping address for the consumer. /// - public class Address { + public class Address + { private string province; internal AddressType Type { get; set; } @@ -86,12 +88,5 @@ public string CountryCode { public bool IsCountry(string countryCode) { return CountryUtils.IsCountry(this, countryCode); } - - public string Name { get; set; } - - public Address(string streetAddress1 = null, string code = null) { - this.StreetAddress1 = streetAddress1; - this.PostalCode = code; - } } } diff --git a/src/GlobalPayments.Api/Entities/BatchSummary.cs b/src/GlobalPayments.Api/Entities/BatchSummary.cs index 30ad5ae2..fcd16352 100644 --- a/src/GlobalPayments.Api/Entities/BatchSummary.cs +++ b/src/GlobalPayments.Api/Entities/BatchSummary.cs @@ -1,5 +1,4 @@ -using GlobalPayments.Api.Builders; -using System; +using System; using System.Collections.Generic; namespace GlobalPayments.Api.Entities { @@ -23,44 +22,10 @@ public class BatchSummary { public decimal? SaleAmount { get; set; } public int SaleCount { get; set; } public string SequenceNumber { get; set; } - public string SicCode { get; set; } public string SiteId { get; set; } public string Status { get; set; } public decimal? TotalAmount { get; set; } public int TransactionCount { get; set; } public string TransactionToken { get; set; } - public bool IsBalanced { - get { - if (ResponseCode != null) { - return ResponseCode.Equals("500"); - } - return false; - } - set { } - } - - public BatchSummary ResubmitTransactions(List transactionTokens, String configName) { - if(!ResponseCode.Equals("580")) { - throw new BuilderException("Batch recovery has not been requested for this batch."); - } - - // resubmit the tokens - LinkedList responses = new LinkedList(); - foreach(string token in transactionTokens) { - Transaction response = new ResubmitBuilder(TransactionType.DataCollect) - .WithTransactionToken(token) - .Execute(configName); - responses.AddLast(response); - } - ResentTransactions = responses; - - // resubmit the batch summary - Transaction batchResponse = new ResubmitBuilder(TransactionType.BatchClose) - .WithTransactionToken(TransactionToken) - .Execute(configName); - ResentBatchClose = batchResponse; - ResponseCode = batchResponse.ResponseCode; - return this; - } } -} \ No newline at end of file +} diff --git a/src/GlobalPayments.Api/Entities/CommercialData.cs b/src/GlobalPayments.Api/Entities/CommercialData.cs index d535259d..20b3774c 100644 --- a/src/GlobalPayments.Api/Entities/CommercialData.cs +++ b/src/GlobalPayments.Api/Entities/CommercialData.cs @@ -1,21 +1,14 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; namespace GlobalPayments.Api.Entities { public class CommercialData { - public AdditionalTaxDetails AdditionalTaxDetails { get; set; } - public CommercialIndicator CommercialIndicator { get; private set; } - public string CustomerVAT_Number { get; set; } - - public string CustomerReferenceId { get; set; } - public string Description { get; set; } public decimal? DiscountAmount { get; set; } - public decimal? DutyAmount { get; set; } + public decimal DutyAmount { get; set; } public string DestinationPostalCode { get; set; } @@ -25,22 +18,14 @@ public class CommercialData { public List LineItems { get; private set; } - public DateTime? OrderDate { get; set; } - public string OriginPostalCode { get; set; } public string PoNumber { get; set; } - public string SupplierReferenceNumber { get; set; } - - public string SummaryCommodityCode { get; set; } - public decimal? TaxAmount { get; set; } public TaxType TaxType { get; private set; } - public string VAT_InvoiceNumber { get; set; } - public CommercialData(TaxType taxType, CommercialIndicator level = CommercialIndicator.Level_II) { TaxType = taxType; CommercialIndicator = level; diff --git a/src/GlobalPayments.Api/Entities/CommercialLineItem.cs b/src/GlobalPayments.Api/Entities/CommercialLineItem.cs index 4c82c900..d6895300 100644 --- a/src/GlobalPayments.Api/Entities/CommercialLineItem.cs +++ b/src/GlobalPayments.Api/Entities/CommercialLineItem.cs @@ -1,12 +1,10 @@ namespace GlobalPayments.Api.Entities { public class CommercialLineItem { - public string AlternateTaxId { get; set; } public string CommodityCode { get; set; } public CreditDebitIndicator CreditDebitIndicator { get; set; } public string Description { get; set; } - public DiscountDetails DiscountDetails { get; set; } + public decimal? DiscountAmount { get; set; } public decimal? ExtendedAmount { get; set; } - public string Name { get; set; } public NetGrossIndicator NetGrossIndicator { get; set; } public string ProductCode { get; set; } public decimal? Quantity { get; set; } diff --git a/src/GlobalPayments.Api/Entities/Enums.cs b/src/GlobalPayments.Api/Entities/Enums.cs index 3378a05a..78224b89 100644 --- a/src/GlobalPayments.Api/Entities/Enums.cs +++ b/src/GlobalPayments.Api/Entities/Enums.cs @@ -55,7 +55,27 @@ public enum DeviceType { /// /// Indicates a genius terminal /// - GENIUS + GENIUS, + + /// + /// Indicates an Ingenico Desk/5000 terminal underlying in Epos software package. + /// + Ingenico_EPOS_Desk5000, + + /// + /// Indicates an Ingenico Lane/3000 terminal underlying in Epos software package. + /// + Ingenico_EPOS_Lane3000, + + /// + /// Indicates an Ingenico Move/3500 terminal underlying in Epos software package. + /// + Ingenico_EPOS_Move3500, + + /// + /// Indicates an Ingenico Move/5000 terminal underlying in Epos software package. + /// + Ingenico_EPOS_Move5000 } /// @@ -181,7 +201,181 @@ public enum GiftEntryMethod { /// Indicates manual entry. /// Manual - } + } + + /// + /// Indicates the transaction type. + /// + [Flags] + public enum TransactionType : long{ + /// + /// Indicates a decline. + /// + Decline = 0, + + /// + /// Indicates an account verify. + /// + Verify = 1 << 0, + + /// + /// Indicates a capture/add to batch. + /// + Capture = 1 << 1, + + /// + /// Indicates an authorization without capture. + /// + Auth = 1 << 2, + + /// + /// Indicates a refund/return. + /// + Refund = 1 << 3, + + /// + /// Indicates a reversal. + /// + Reversal = 1 << 4, + + /// + /// Indicates a sale/charge/authorization with capture. + /// + Sale = 1 << 5, + + /// + /// Indicates an edit. + /// + Edit = 1 << 6, + + /// + /// Indicates a void. + /// + Void = 1 << 7, + + /// + /// Indicates value should be added. + /// + AddValue = 1 << 8, + + /// + /// Indicates a balance inquiry. + /// + Balance = 1 << 9, + + /// + /// Indicates an activation. + /// + Activate = 1 << 10, + + /// + /// Indicates an alias should be added. + /// + Alias = 1 << 11, + + /// + /// Indicates the payment method should be replaced. + /// + Replace = 1 << 12, + + /// + /// Indicates a reward. + /// + Reward = 1 << 13, + + /// + /// Indicates a deactivation. + /// + Deactivate = 1 << 14, + + /// + /// Indicates a batch close. + /// + BatchClose = 1 << 15, + + /// + /// Indicates a resource should be created. + /// + Create = 1 << 16, + + /// + /// Indicates a resource should be deleted. + /// + Delete = 1 << 17, + + /// + /// Indicates a benefit withdrawal. + /// + BenefitWithdrawal = 1 << 18, + + /// + /// Indicates a resource should be fetched. + /// + Fetch = 1 << 19, + + /// + /// Indicates a resource type should be searched. + /// + Search = 1 << 20, + + /// + /// Indicates a hold. + /// + Hold = 1 << 21, + + /// + /// Indicates a release. + /// + Release = 1 << 22, + + /// + /// Indicates a verify 3d Secure enrollment transaction + /// + VerifyEnrolled = 1 << 23, + + /// + /// Indicates a verify 3d secure verify signature transaction + /// + VerifySignature = 1 << 24, + + /// + /// Indcates a TokenUpdateExpiry Transaction + /// + TokenUpdate = 1 << 25, + + /// + /// Indicates a Token Delete Transaction + /// + TokenDelete = 1 << 26, + + /// + /// Indicates a verify authentication 3DS2 call + /// + VerifyAuthentication = 1 << 27, + + /// + /// Indicates an Initiate Authentication 3DS2 call + /// + InitiateAuthentication = 1 << 28, + + /// + /// Indicates a DataCollect. + /// + DataCollect = 1 << 29, + + /// + /// Indicates a PreAuthCompletion. + /// + PreAuthCompletion = 1 << 30, + + /// + /// Indicates a DccRateLookup. + /// + DccRateLookup = 1 << 31, + + Increment = 1L << 32, + PayAtTable = 1L << 33 + } /// /// Indicates if a transaction should be specialized. @@ -937,15 +1131,4 @@ public enum Secure3dVersion { Two, Any } - - public enum EbtCardType { - CashBenefit, - FoodStamp - } - - public enum BatchCloseType { - Forced, - EndOfShift, - //EndOfDay - } } diff --git a/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs b/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs index dbfc670b..a66efbf3 100644 --- a/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs +++ b/src/GlobalPayments.Api/Entities/Enums/CreditDebitIndicator.cs @@ -1,6 +1,6 @@ namespace GlobalPayments.Api.Entities { public enum CreditDebitIndicator { - Debit, - Credit + Credit, + Debit } } diff --git a/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs b/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs index cd29d31c..bedc6b43 100644 --- a/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs +++ b/src/GlobalPayments.Api/Entities/Enums/ServiceEndpoints.cs @@ -12,8 +12,8 @@ public static class ServiceEndpoints { public const string TABLE_SERVICE_TEST = "https://www.freshtxt.com/api31/"; public const string GENIUS_API_PRODUCTION = ""; public const string GENIUS_API_TEST = "https://ps1.merchantware.net/Merchantware/ws/RetailTransaction/v45/Credit.asmx"; - public const string GENIUS_TERMINAL_PRODUCTION = ""; - public const string GENIUS_TERMINAL_TEST = "https://transport.merchantware.net/v4/transportService.asmx"; + public const string GENIUS_TERMIAL_PRODUCTION = ""; + public const string GENIUS_TERMIAL_TEST = "https://transport.merchantware.net/v4/transportService.asmx"; public const string TRANSIT_MULTIPASS_PRODUCTION = "https://gateway.transit-pass.com/servlets/TransNox_API_Server"; public const string TRANSIT_MULTIPASS_TEST = "https://stagegw.transnox.com/servlets/TransNox_API_Server"; } diff --git a/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs b/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs index b04219f3..04297098 100644 --- a/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs +++ b/src/GlobalPayments.Api/Entities/Enums/StoredCredentialInitiator.cs @@ -1,12 +1,7 @@ -using GlobalPayments.Api.Utils; - -namespace GlobalPayments.Api.Entities { - [MapTarget(Target.Portico)] +namespace GlobalPayments.Api.Entities { public enum StoredCredentialInitiator { - [Map(Target.Portico, "C")] CardHolder, - [Map(Target.Portico, "M")] - Merchant, + Merchant, Scheduled } } diff --git a/src/GlobalPayments.Api/Entities/Exceptions.cs b/src/GlobalPayments.Api/Entities/Exceptions.cs index c2662cf4..d8d3349c 100644 --- a/src/GlobalPayments.Api/Entities/Exceptions.cs +++ b/src/GlobalPayments.Api/Entities/Exceptions.cs @@ -1,8 +1,8 @@ -using GlobalPayments.Api.Gateways.Events; -using System; +using System; using System.Collections.Generic; -namespace GlobalPayments.Api.Entities { +namespace GlobalPayments.Api.Entities +{ /// /// A general error occurred. /// @@ -41,7 +41,6 @@ public class GatewayException : ApiException { /// The gateway response message. /// public string ResponseMessage { get; private set; } - public List GatewayEvents { get; set; } internal GatewayException(string message, string responseCode = null, string responseMessage = null) : base(message) { ResponseCode = responseCode; @@ -74,14 +73,4 @@ public class ValidationException : ApiException { ValidationErrors = validationErrors; } } - public class GatewayTimeoutException : GatewayException { - public string Host { get; set; } - public string MessageTypeIndicator { get; set; } - public string ProcessingCode { get; set; } - public int ReversalCount { get; set; } - public string ReversalResponseCode { get; set; } - public string ReversalResponseText { get; set; } - public GatewayTimeoutException() : base("The gateway did not respond within the given timeout.") { } - public GatewayTimeoutException(Exception innerException) : base("The gateway did not respond within the given timeout.", innerException) { } - } } diff --git a/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs b/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs index bb4e5e79..60336cb7 100644 --- a/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs +++ b/src/GlobalPayments.Api/Entities/Payroll/PayrollEncoder.cs @@ -9,17 +9,12 @@ internal class PayrollEncoder : IRequestEncoder { public string Username { get; set; } public string ApiKey { get; set; } - public PayrollEncoder(string username = null, string apiKey = null) { - this.Username = username; - this.ApiKey = apiKey; - } - public string Encode(object value) { if (value == null) return null; using (var aes = Aes.Create()) { - var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username.PadRight(8, ' ')), 1000); + var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username), 1000); var ems = new MemoryStream(); using (var encrypt = new CryptoStream(ems, aes.CreateEncryptor(key.GetKey(), key.GetVector()), CryptoStreamMode.Write)) { @@ -36,7 +31,7 @@ public string Decode(object value) { return null; using (var aes = Aes.Create()) { - var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username.PadRight(8, ' ')), 1000); + var key = new Rfc2898DeriveBytes(ApiKey, Encoding.UTF8.GetBytes(Username), 1000); var dms = new MemoryStream(); using (var decrypt = new CryptoStream(dms, aes.CreateDecryptor(key.GetKey(), key.GetVector()), CryptoStreamMode.Write)) { diff --git a/src/GlobalPayments.Api/Entities/ThreeDSecure.cs b/src/GlobalPayments.Api/Entities/ThreeDSecure.cs index 647eb768..5eafcaaf 100644 --- a/src/GlobalPayments.Api/Entities/ThreeDSecure.cs +++ b/src/GlobalPayments.Api/Entities/ThreeDSecure.cs @@ -149,8 +149,6 @@ public string OrderId { public IEnumerable SdkUiType { get; set; } - public string SecureCode { get; set; } - public string ServerTransactionId { get; set; } /// @@ -160,8 +158,6 @@ public string OrderId { public string StatusReason { get; set; } - public UCAFIndicator UCAFIndicator { get; set; } - public Secure3dVersion? _version; public Secure3dVersion? Version { get { return _version; } diff --git a/src/GlobalPayments.Api/Entities/Transaction.cs b/src/GlobalPayments.Api/Entities/Transaction.cs index eb629934..5a0417f1 100644 --- a/src/GlobalPayments.Api/Entities/Transaction.cs +++ b/src/GlobalPayments.Api/Entities/Transaction.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using GlobalPayments.Api.Builders; -using GlobalPayments.Api.Gateways.Events; -using GlobalPayments.Api.Network.Entities; using GlobalPayments.Api.PaymentMethods; namespace GlobalPayments.Api.Entities { @@ -21,15 +19,13 @@ public class Transaction { /// public string AuthorizationCode { get { - if (TransactionReference != null) { + if (TransactionReference != null) return TransactionReference.AuthCode; - } return null; } set { - if (TransactionReference == null) { + if (TransactionReference == null) TransactionReference = new TransactionReference(); - } TransactionReference.AuthCode = value; } } @@ -59,8 +55,6 @@ public string AuthorizationCode { /// public BatchSummary BatchSummary { get; set; } - public string CardBrandTransactionId { get; set; } - /// /// The type of card used in the transaction. /// @@ -83,75 +77,17 @@ public string AuthorizationCode { /// public string ClientTransactionId { get { - if (TransactionReference != null) { + if (TransactionReference != null) return TransactionReference.ClientTransactionId; - } return null; } set { - if (TransactionReference == null) { + if (TransactionReference == null) TransactionReference = new TransactionReference(); - } TransactionReference.ClientTransactionId = value; } } - public NtsData NTSData { - get { - if (TransactionReference != null) { - return TransactionReference.NtsData; - } - return null; - } - set { - if (TransactionReference == null) { - TransactionReference = new TransactionReference(); - } - TransactionReference.NtsData = value; - } - } - public string MessageTypeIndicator { - get { - if (TransactionReference != null) { - return TransactionReference.MessageTypeIndicator; - } - return null; - } - set { - if (TransactionReference == null) { - TransactionReference = new TransactionReference(); - } - TransactionReference.MessageTypeIndicator = value; - } - } - public string SystemTraceAuditNumber { - get { - if (TransactionReference != null) { - return TransactionReference.SystemTraceAuditNumber; - } - return null; - } - set { - if (TransactionReference == null) { - TransactionReference = new TransactionReference(); - } - TransactionReference.SystemTraceAuditNumber = value; - } - } - public string OriginalTransactionTime { - get { - if (TransactionReference != null) { - return TransactionReference.OriginalTransactionTime; - } - return null; - } - set { - if (TransactionReference == null) { - TransactionReference = new TransactionReference(); - } - TransactionReference.OriginalTransactionTime = value; - } - } /// /// The commercial indicator for Level II/III. /// @@ -184,26 +120,20 @@ public string OriginalTransactionTime { /// /// The Auto settle Flag which comes in response /// - public bool MultiCapture { get { return (MultiCapturePaymentCount != null && MultiCapturePaymentCount != null); } } - - public int? MultiCapturePaymentCount { get; set; } - - public int? MultiCaptureSequence { get; set; } + public bool MultiCapture { get; set; } /// /// The order ID supplied in the request. /// public string OrderId { get { - if (TransactionReference != null) { + if (TransactionReference != null) return TransactionReference.OrderId; - } return null; } set { - if (TransactionReference == null) { + if (TransactionReference == null) TransactionReference = new TransactionReference(); - } TransactionReference.OrderId = value; } } @@ -213,15 +143,13 @@ public string OrderId { /// public PaymentMethodType PaymentMethodType { get { - if (TransactionReference != null) { + if (TransactionReference != null) return TransactionReference.PaymentMethodType; - } return PaymentMethodType.Credit; } set { - if (TransactionReference == null) { + if (TransactionReference == null) TransactionReference = new TransactionReference(); - } TransactionReference.PaymentMethodType = value; } } @@ -275,32 +203,16 @@ public PaymentMethodType PaymentMethodType { /// public string TransactionId { get { - if (TransactionReference != null) { + if (TransactionReference != null) return TransactionReference.TransactionId; - } return null; } set { - if (TransactionReference == null) { + if (TransactionReference == null) TransactionReference = new TransactionReference(); - } TransactionReference.TransactionId = value; } } - public string ProcessingCode { - get { - if (TransactionReference != null) { - return TransactionReference.OriginalProcessingCode; - } - return null; - } - set { - if (TransactionReference == null) { - TransactionReference = new TransactionReference(); - } - TransactionReference.OriginalProcessingCode = value; - } - } /// /// The payment token returned in the transaction. @@ -310,9 +222,48 @@ public string ProcessingCode { internal GiftCard GiftCard { get; set; } internal TransactionReference TransactionReference { get; set; } - public PriorMessageInformation MessageInformation { get; set; } - public string TransactionToken { get; set; } - public List GatewayEvents { get; set; } + + /// + /// Creates a `Transaction` object from a stored transaction ID. + /// + /// + /// Used to expose management requests on the original transaction + /// at a later date/time. + /// + /// The original transaction ID + /// + /// The original payment method type. Defaults to `PaymentMethodType.Credit`. + /// + public static Transaction FromId(string transactionId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) { + return new Transaction { + TransactionReference = new TransactionReference { + TransactionId = transactionId, + PaymentMethodType = paymentMethodType + } + }; + } + + /// + /// Creates a `Transaction` object from a stored transaction ID. + /// + /// + /// Used to expose management requests on the original transaction + /// at a later date/time. + /// + /// The original transaction ID + /// The original transaction's order ID + /// + /// The original payment method type. Defaults to `PaymentMethodType.Credit`. + /// + public static Transaction FromId(string transactionId, string orderId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) { + return new Transaction { + TransactionReference = new TransactionReference { + TransactionId = transactionId, + PaymentMethodType = paymentMethodType, + OrderId = orderId + } + }; + } /// /// Creates an additional authorization against the original transaction. @@ -324,26 +275,15 @@ public ManagementBuilder AdditionalAuth(decimal? amount = null) { .WithAmount(amount); } - public ManagementBuilder Cancel(decimal? amount = null) { - return new ManagementBuilder(TransactionType.Void) - .WithPaymentMethod(TransactionReference) - .WithCustomerInitiated(true) - .WithAmount(amount); - } - /// /// Captures the original transaction. /// /// The amount to capture public ManagementBuilder Capture(decimal? amount = null) { - var builder = new ManagementBuilder(TransactionType.Capture) + return new ManagementBuilder(TransactionType.Capture) + .WithMultiCapture(MultiCapture) .WithPaymentMethod(TransactionReference) .WithAmount(amount); - - if (MultiCapture) { - builder.WithMultiCapture(MultiCaptureSequence.Value, MultiCapturePaymentCount.Value); - } - return builder; } /// @@ -360,12 +300,6 @@ public ManagementBuilder Hold() { return new ManagementBuilder(TransactionType.Hold).WithPaymentMethod(TransactionReference); } - public ManagementBuilder PreAuthCompletion(decimal? amount = null) { - return new ManagementBuilder(TransactionType.PreAuthCompletion) - .WithPaymentMethod(TransactionReference) - .WithAmount(amount); - } - /// /// Refunds/returns the original transaction. /// @@ -396,84 +330,12 @@ public ManagementBuilder Reverse(decimal? amount = null) { /// /// Voids the original transaction. /// - public ManagementBuilder Void(VoidReason? reason = null, decimal? amount = null, bool force = false) { - return new ManagementBuilder(TransactionType.Void) - .WithPaymentMethod(TransactionReference) - .WithVoidReason(reason) - .WithAmount(amount) - .WithForcedReversal(force); + public ManagementBuilder Void() { + return new ManagementBuilder(TransactionType.Void).WithPaymentMethod(TransactionReference); } public ManagementBuilder Increment(decimal? amount = null) { return new ManagementBuilder(TransactionType.Increment).WithAmount(amount).WithPaymentMethod(TransactionReference); } - - /// - /// Creates a `Transaction` object from a stored transaction ID. - /// - /// - /// Used to expose management requests on the original transaction - /// at a later date/time. - /// - /// The original transaction ID - /// - /// The original payment method type. Defaults to `PaymentMethodType.Credit`. - /// - public static Transaction FromId(string transactionId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) - { - return new Transaction - { - TransactionReference = new TransactionReference - { - TransactionId = transactionId, - PaymentMethodType = paymentMethodType - } - }; - } - - /// - /// Creates a `Transaction` object from a stored transaction ID. - /// - /// - /// Used to expose management requests on the original transaction - /// at a later date/time. - /// - /// The original transaction ID - /// The original transaction's order ID - /// - /// The original payment method type. Defaults to `PaymentMethodType.Credit`. - /// - public static Transaction FromId(string transactionId, string orderId, PaymentMethodType paymentMethodType = PaymentMethodType.Credit) - { - return new Transaction - { - TransactionReference = new TransactionReference - { - TransactionId = transactionId, - PaymentMethodType = paymentMethodType, - OrderId = orderId - } - }; - } - - public static Transaction FromNetwork(decimal? amount, string authCode, NtsData originalNtsCode, IPaymentMethod originalPaymentMethod, string messageTypeIndicator = null, string stan = null, string originalTransactionTime = null, string originalProcessingCode = null, string acquirerId = null) - { - TransactionReference reference = new TransactionReference(); - reference.OriginalAmount = amount; - reference.AcquiringInstitutionId = acquirerId; - reference.AuthCode = authCode; - reference.MessageTypeIndicator = messageTypeIndicator; - reference.NtsData = originalNtsCode; - reference.OriginalPaymentMethod = originalPaymentMethod; - reference.OriginalTransactionTime = originalTransactionTime; - reference.SystemTraceAuditNumber = stan; - reference.OriginalProcessingCode = originalProcessingCode; - - Transaction trans = new Transaction(); - trans.TransactionReference = reference; - - return trans; - } - } } \ No newline at end of file diff --git a/src/GlobalPayments.Api/Gateways/Gateway.cs b/src/GlobalPayments.Api/Gateways/Gateway.cs index a61366b5..ef082204 100644 --- a/src/GlobalPayments.Api/Gateways/Gateway.cs +++ b/src/GlobalPayments.Api/Gateways/Gateway.cs @@ -5,16 +5,11 @@ using System.Text; using GlobalPayments.Api.Entities; using System.Threading.Tasks; -using System.Diagnostics; -using GlobalPayments.Api.Logging; -using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Gateways { internal abstract class Gateway { private string _contentType; - //public bool EnableLogging { get; set; } - public IRequestLogger RequestLogger { get; set; } public Dictionary Headers { get; set; } public int Timeout { get; set; } public string ServiceUrl { get; set; } @@ -39,17 +34,12 @@ protected GatewayResponse SendRequest(HttpMethod verb, string endpoint, string d try { if (verb != HttpMethod.Get && data != null) { request.Content = new StringContent(data, Encoding.UTF8, contentType ?? _contentType); - RequestLogger?.RequestSent(data); } response = httpClient.SendAsync(request).Result; - - string rawResponse = response.Content.ReadAsStringAsync().Result; - RequestLogger?.ResponseReceived(rawResponse); - return new GatewayResponse { StatusCode = response.StatusCode, RequestUrl = response.RequestMessage.RequestUri.ToString(), - RawResponse = rawResponse + RawResponse = response.Content.ReadAsStringAsync().Result }; } catch (Exception exc) { @@ -66,18 +56,12 @@ protected async Task SendRequestAsync(string endpoint, Multipar HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ServiceUrl + endpoint); HttpResponseMessage response = null; try { - RequestLogger?.RequestSent(content.ToString()); - request.Content = content; response = await httpClient.SendAsync(request); - - string rawResponse = response.Content.ReadAsStringAsync().Result; - RequestLogger?.ResponseReceived(rawResponse); - return new GatewayResponse { StatusCode = response.StatusCode, RequestUrl = response.RequestMessage.RequestUri.ToString(), - RawResponse = rawResponse + RawResponse = response.Content.ReadAsStringAsync().Result }; } catch (Exception exc) { @@ -93,18 +77,12 @@ protected GatewayResponse SendRequest(string endpoint, MultipartFormDataContent HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, ServiceUrl + endpoint); HttpResponseMessage response = null; try { - RequestLogger?.RequestSent(content.ToString()); - request.Content = content; response = httpClient.SendAsync(request).Result; - - string rawResponse = response.Content.ReadAsStringAsync().Result; - RequestLogger?.ResponseReceived(rawResponse); - return new GatewayResponse { StatusCode = response.StatusCode, RequestUrl = response.RequestMessage.RequestUri.ToString(), - RawResponse = rawResponse + RawResponse = response.Content.ReadAsStringAsync().Result }; } catch (Exception exc) { diff --git a/src/GlobalPayments.Api/Gateways/GatewayResponse.cs b/src/GlobalPayments.Api/Gateways/GatewayResponse.cs index 6f5b46ab..20c9e5ef 100644 --- a/src/GlobalPayments.Api/Gateways/GatewayResponse.cs +++ b/src/GlobalPayments.Api/Gateways/GatewayResponse.cs @@ -1,6 +1,7 @@ using System.Net; -namespace GlobalPayments.Api.Gateways { +namespace GlobalPayments.Api.Gateways +{ internal class GatewayResponse { public string RawResponse { get; set; } public string RequestUrl { get; set; } diff --git a/src/GlobalPayments.Api/Gateways/GeniusConnector.cs b/src/GlobalPayments.Api/Gateways/GeniusConnector.cs index 90df1b8b..717eb424 100644 --- a/src/GlobalPayments.Api/Gateways/GeniusConnector.cs +++ b/src/GlobalPayments.Api/Gateways/GeniusConnector.cs @@ -116,7 +116,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { et.SubElement(lineItem, "Quantity", item.Quantity); et.SubElement(lineItem, "UnitOfMeasure", item.UnitOfMeasure); et.SubElement(lineItem, "UnitCost", item.UnitCost); - et.SubElement(lineItem, "DiscountAmount", item.DiscountDetails?.DiscountAmount); + et.SubElement(lineItem, "DiscountAmount", item.DiscountAmount); et.SubElement(lineItem, "TotalAmount", item.TotalAmount); et.SubElement(lineItem, "TaxAmount", item.TaxAmount); et.SubElement(lineItem, "ExtendedAmount", item.ExtendedAmount); diff --git a/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs b/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs index ecced69a..6fb17221 100644 --- a/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs +++ b/src/GlobalPayments.Api/Gateways/GpEcomConnector.cs @@ -661,11 +661,11 @@ private Transaction MapResponse(string rawResponse, TransactionBuilder(); - if (builder is AuthorizationBuilder authBuilder) { - acceptedCodes = MapAcceptedCodes(MapAuthRequestType(authBuilder)); + if (builder is AuthorizationBuilder) { + acceptedCodes = MapAcceptedCodes(MapAuthRequestType(builder as AuthorizationBuilder)); } - else if (builder is ManagementBuilder managementBuilder) { - acceptedCodes = MapAcceptedCodes(MapManageRequestType(managementBuilder)); + else if (builder is ManagementBuilder) { + acceptedCodes = MapAcceptedCodes(MapManageRequestType(builder as ManagementBuilder)); } CheckResponse(root, acceptedCodes); @@ -682,14 +682,10 @@ private Transaction MapResponse(string rawResponse, TransactionBuilder("pasref"), AlternativePaymentType = root.GetValue("paymentmethod"), BatchNumber = root.GetValue("batchid") - } + }, + MultiCapture = builder.MultiCapture }; - if (builder is ManagementBuilder mb && mb.MultiCapture) { - result.MultiCapturePaymentCount = mb.MultiCapturePaymentCount; - result.MultiCaptureSequence = mb.MultiCaptureSequence; - } - // dccinfo if (root.Has("dccinfo")) { DccRateData dccRateData = new DccRateData(); diff --git a/src/GlobalPayments.Api/Gateways/PorticoConnector.cs b/src/GlobalPayments.Api/Gateways/PorticoConnector.cs index 822f7f37..fb976ed2 100644 --- a/src/GlobalPayments.Api/Gateways/PorticoConnector.cs +++ b/src/GlobalPayments.Api/Gateways/PorticoConnector.cs @@ -53,8 +53,8 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { } #region card holder - if (builder.PaymentMethod.PaymentMethodType != PaymentMethodType.Recurring) { - var isCheck = (builder.PaymentMethod.PaymentMethodType == PaymentMethodType.ACH); + var isCheck = (builder.PaymentMethod.PaymentMethodType == PaymentMethodType.ACH); + if (isCheck || builder.BillingAddress != null) { var holder = et.SubElement(block1, isCheck ? "ConsumerInfo" : "CardHolderData"); if (builder.BillingAddress != null) { @@ -83,15 +83,9 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { } } else { - var card = builder.PaymentMethod as CreditCardData; - if (!string.IsNullOrEmpty(card.CardHolderName)) { - var names = card.CardHolderName.Split(new char[] {' '}, 2); - et.SubElement(holder, "CardHolderFirstName", names[0]); - et.SubElement(holder, "CardHolderLastName", names[1]); - } + // TODO: card holder name } } - #endregion // card data @@ -108,13 +102,6 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { if (builder.PaymentMethod is ICardData) { var card = builder.PaymentMethod as ICardData; - //credential on file - if (builder.TransactionInitiator != null) { - Element cardOnFileData = et.SubElement(block1, "CardOnFileData"); - et.SubElement(cardOnFileData, "CardOnFile", EnumConverter.GetMapping(Target.Portico, builder.TransactionInitiator)); - et.SubElement(cardOnFileData, "CardBrandTxnId", builder.CardBrandTransactionId); - } - var manualEntry = et.SubElement(cardData, hasToken ? "TokenData" : "ManualEntry"); et.SubElement(manualEntry, hasToken ? "TokenValue" : "CardNbr").Text(tokenValue ?? card.Number); et.SubElement(manualEntry, "ExpMonth", card.ExpMonth?.ToString()); @@ -135,7 +122,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { et.SubElement(secureEcommerce, "ECommerceIndicator", secureEcom.Eci); et.SubElement(secureEcommerce, "XID", secureEcom.Xid); } - } + } // recurring data if (builder.TransactionModifier == TransactionModifier.Recurring) { @@ -205,17 +192,17 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { // check action et.SubElement(block1, "CheckAction").Text("SALE"); - var accountInfo = et.SubElement(block1, "AccountInfo"); // account info if (string.IsNullOrEmpty(check.Token)) { + var accountInfo = et.SubElement(block1, "AccountInfo"); et.SubElement(accountInfo, "RoutingNumber", check.RoutingNumber); et.SubElement(accountInfo, "AccountNumber", check.AccountNumber); et.SubElement(accountInfo, "CheckNumber", check.CheckNumber); et.SubElement(accountInfo, "MICRData", check.MicrNumber); + et.SubElement(accountInfo, "AccountType", check.AccountType.ToString()); } else et.SubElement(block1, "TokenValue").Text(tokenValue); - et.SubElement(accountInfo, "AccountType", check.AccountType.ToString()); et.SubElement(block1, "DataEntryMode", check.EntryMode.ToString().ToUpper()); et.SubElement(block1, "CheckType", check.CheckType.ToString()); et.SubElement(block1, "SECCode", check.SecCode); @@ -236,12 +223,6 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { #region RecurringPaymentMethod if (builder.PaymentMethod is RecurringPaymentMethod) { var method = builder.PaymentMethod as RecurringPaymentMethod; - //credential on file - if (builder.TransactionInitiator != null) { - Element cardOnFileData = et.SubElement(block1, "CardOnFileData"); - et.SubElement(cardOnFileData, "CardOnFile", EnumConverter.GetMapping(Target.Portico, builder.TransactionInitiator)); - et.SubElement(cardOnFileData, "CardBrandTxnId", builder.CardBrandTransactionId); - } // check action if (method.PaymentType == "ACH") { @@ -335,7 +316,7 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { var amountNode = et.SubElement(autoSub, fieldNames[index++] + "AdditionalAmtInfo"); et.SubElement(amountNode, "AmtType", amount.Key); - et.SubElement(amountNode, "Amt", amount.Value?.ToString()); + et.SubElement(amountNode, "Amt", amount.Value?.ToNumericString()); } } @@ -422,10 +403,6 @@ public Transaction ManageTransaction(ManagementBuilder builder) { et.SubElement(root, "ClientTxnId", builder.ClientTransactionId); } - if (builder.AllowDuplicates) { - et.SubElement(root, "AllowDup", "Y"); - } - // Level II Data if (builder.CommercialData != null) { var cpc = et.SubElement(root, "CPCData"); @@ -609,7 +586,6 @@ private Transaction MapResponse(string rawResponse, IPaymentMethod payment) { result.PointsBalanceAmount = root.GetValue("PointsBalanceAmt"); result.RecurringDataCode = root.GetValue("RecurringDataCode"); result.ReferenceNumber = root.GetValue("RefNbr"); - result.CardBrandTransactionId = root.GetValue("CardBrandTxnId"); result.ResponseCode = NormalizeResponse(root.GetValue("RspCode")) ?? gatewayRspCode; result.ResponseMessage = root.GetValue("RspText", "RspMessage") ?? gatewayRspText; result.TransactionDescriptor = root.GetValue("TxnDescriptor"); @@ -621,7 +597,7 @@ private Transaction MapResponse(string rawResponse, IPaymentMethod payment) { AuthCode = root.GetValue("AuthCode") }; } - + // gift card create data if (root.Has("CardData")) { result.GiftCard = new GiftCard { @@ -748,7 +724,7 @@ private T MapReportResponse(string rawResponse, ReportType reportType) where }; // card holder data - + // lodging data if (root.Has("LodgingData")) { summary.LodgingData = new LodgingData { @@ -1015,11 +991,6 @@ private bool HasToken(IPaymentMethod paymentMethod, out string tokenValue) { tokenValue = ((ITokenizable)paymentMethod).Token; return true; } - - if (paymentMethod is eCheck && !string.IsNullOrEmpty(((eCheck)paymentMethod).Token)) { - tokenValue = ((eCheck)paymentMethod).Token; - return true; - } return false; } #endregion diff --git a/src/GlobalPayments.Api/Gateways/TransitConnector.cs b/src/GlobalPayments.Api/Gateways/TransitConnector.cs index faad4fb2..419cf66a 100644 --- a/src/GlobalPayments.Api/Gateways/TransitConnector.cs +++ b/src/GlobalPayments.Api/Gateways/TransitConnector.cs @@ -6,13 +6,88 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Gateways { - internal class TransitConnector : XmlGateway, IPaymentGateway, ISecure3dProvider { + internal class TransitRequest { + private string _root; + private Dictionary _values; + + private string this[string key] { + get { + if (_values.ContainsKey(key)) { + return _values[key]; + } + return null; + } + } + + public TransitRequest(string root) { + _root = root; + _values = new Dictionary(); + } + + public TransitRequest Set(string key, string value) { + if (value != null) { + _values.Add(key, value); + } + return this; + } + + public string BuildRequest(T builder) where T : TransactionBuilder { + var et = new ElementTree(); + + Element transaction = et.Element(_root); + foreach (var element in BuildRequestMap(builder)) { + et.SubElement(transaction, element, this[element]); + } + + return et.ToString(transaction); + } + + private LinkedList BuildRequestMap(T builder) where T : TransactionBuilder { + IPaymentMethod paymentMethod = builder.PaymentMethod; + + switch (builder.TransactionType) { + case TransactionType.Auth: + case TransactionType.Sale: { + if (paymentMethod is Debit) { + return BuildList("deviceID|transactionKey|manifest|cardDataSource|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|currencyCode|track2Data|track3Data|emulatedTrackData|emvTags|emvFallbackCondition|lastChipRead|paymentAppVersion|emcContactlessToContactChip|pin|pinKsn|secureCode|paymentAccountReference|panReferenceIdentifier|nfcTags|ksn|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|tokenRequired|healthCareAccountType|prescriptionAmount|visionAmount|dentalAmount|clinicAmount|isQualifiedIIAS|rxNumber|couponID|providerID|providerToken|locationID|notifyEmailID|customerCode|firstName|lastName|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDiscountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modifierPrice|productNotes|softDescriptor|developerID|registeredUserIndicator|lastRegisteredChangeDate|laneID|authorizationIndicator|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|splitTenderPayment|splitTenderID|splitTenderConsolidatedReceipt|noIndividualTransactionReceipt"); + } + return BuildList("deviceID|transactionKey|manifest|cardDataSource|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|taxCategory|shippingCharges|dutyCharges|surcharge|additionalAmountType|additionalAmount|additionalAmountSign|currencyCode|cardNumber|expirationDate|cvv2|track1Data|track2Data|track3Data|emulatedTrackData|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|cardOnFileTransactionIdentifier|emvTags|pin|pinKsn|emvFallbackCondition|lastChipRead|paymentAppVersion|emvContactlessToContactChip|nfcTags|walletSource|checkOutID|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|healthCareAccountType|prescriptionAmount|visionAmount|dentalAmount|clinicAmount|isQualifiedIIAS|rxNumber|couponID|providerID|providerToken|locationID|notifyEmailID|orderID|customerCode|firstName|lastName|customerPhone|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDicsountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modifierPrice|productNotes|productDiscountIndicator|productCommodityCode|alternateTaxID|creditIndicator|orderNotes|orderServiceTimestamp|commercialCardLevel|purchaseOrder|chargeDescriptor|customerVATNumber|customerRefID|orderDate|summaryCommodityCode|vatInvoice|chargeDescriptor2|chargeDescriptor3|chargeDescriptor4|supplierReferenceNumber|shipFromZip|shipToZip|destinationCountryCode|orderID|tokenRequesterID|softDescriptor|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType|developerID|paymentFacilitatorIdentifier|paymentFacilitatorName|subMerchantIdentifier|subMerchantName|subMerchantCountryCode|subMerchantStateCode|subMerchantCity|subMerchantPostalCode|subMerchantEmailId|subMerchantPhone|isoIdentifier|isRecurring|billingType|paymentCount|currentPaymentCount|isoIdentifier|registeredUserIndicator|lastRegisteredChangeDate|laneID|authorizationIndicator|splitTenderPayment|splitTenderID|splitTenderConsolidatedReceipt|noIndividualTransactionReceipt"); + } + case TransactionType.Balance: + return BuildList("deviceID|transactionKey|manifest|cardDataSource|currencyCode|track1Data|track2Data|track3Data|emulatedTrackData|cardNumber|expirationDate|cvv2|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|cardOnFileTransactionIdentifier|nfcTags|walletSource|checkOutID|dtvv|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|customerPhone|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType"); + case TransactionType.Capture: + return BuildList("deviceID|transactionKey|manifest|transactionAmount|tip|salesTax|taxType|taxAmount|taxRate|taxCategory|shippingCharges|dutyCharges|surcharge|additionalAmountType|additionalAmount|additionalAmountSign|transactionID|externalReferenceID|operatorID|isPartialShipment|currentPaymentSequenceNumber|totalPaymentCount|softDescriptor|merchantReportID|customerCode|firstName|lastName|transTotalDiscountAmount|transDiscountName|transDiscountAmount|transDiscountPercentage|priority|stackable|productCode|productName|price|quantity|measurementUnit|productDiscountName|productDiscountAmount|productDicsountPercentage|productDiscountType|priority|stackable|productTaxName|productTaxAmount|productTaxPercentage|productTaxType|productVariation|modifierName|modifierValue|modiferPrice|productNotes|productDiscountIndicator|productCommodityCode|alternateTaxID|creditIndicator|orderNotes|orderServiceTimestamp|commercialCardLevel|purchaseOrder|chargeDescriptor|customerVATNumber|customerRefID|orderDate|summaryCommodityCode|vatInvoice|chargeDescriptor2|chargeDescriptor3|chargeDescriptor4|supplierReferenceNumber|shipFromZip|shipToZip|destinationCountryCode|developerID|paymentFacilitatorIdentifier|paymentFacilitatorName|subMerchantIdentifier|subMerchantName|subMerchantCountryCode|subMerchantStateCode|subMerchantCity|subMerchantPostalCode|subMerchantEmailId|subMerchantPhone"); + case TransactionType.Verify: { + /* This is the list for the zero dollar authorization */ + return BuildList("deviceID|transactionKey|manifest|cardDataSource|currencyCode|track1Data|track2Data|track3Data|emulatedTrackData|cardNumber|expirationDate|cvv2|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|nfcTags|walletSource|checkOutID|addressLine1|zip|transactionMID|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType"); + + /* This is the list for the card AVS and CVV check */ + //return BuildList("deviceID|transactionKey|manifest|cardDataSource|emulatedTrackData|cardNumber|expirationDate|cvv2|walletSource|checkOutID|cardHolderName|secureCode|securityProtocol|ucafCollectionIndicator|paymentAccountReference|panReferenceIdentifier|eciIndicator|nfcTags|addressLine1|zip|externalReferenceID|operatorID|orderNumber|cardOnFile|merchantReportID|encryptionType|ksn|tokenRequired|customerCode|firstName|lastName|tokenRequesterID|softDescriptor|developerID|laneID|terminalCapability|terminalOperatingEnvironment|cardholderAuthenticationMethod|terminalAuthenticationCapability|terminalOutputCapability|maxPinLength|terminalCardCaptureCapability|cardholderPresentDetail|cardPresentDetail|cardDataInputMode|cardholderAuthenticationEntity|cardDataOutputCapability|mPosAcceptanceDeviceType"); + } + default: throw new UnsupportedTransactionException(); + } + } + + private LinkedList BuildList(string str) { + var list = new LinkedList(); + + string[] values = str.Split('|'); + foreach (string value in values) { + if (!string.IsNullOrEmpty(value)) { + list.AddLast(value); + } + } + + return list; + } + } + + internal class TransitConnector : XmlGateway, IPaymentGateway { public AcceptorConfig AcceptorConfig { get; set; } public string DeviceId { get; set; } public string DeveloperId { get; set; } public string MerchantId { get; set; } public string TransactionKey { get; set; } - public Secure3dVersion Version { get; set; } public bool SupportsHostedPayments { get { return false; } } @@ -46,42 +121,28 @@ private string GenerateManifest(decimal amount, string timestamp) { } public Transaction ProcessAuthorization(AuthorizationBuilder builder) { - var request = new TransitRequestBuilder(MapTransactionType(builder)) + var request = new TransitRequest(MapTransactionType(builder)) .Set("developerID", DeveloperId) .Set("deviceID", DeviceId) .Set("transactionKey", TransactionKey) - .Set("transactionAmount", builder.Amount.ToCurrencyString()) - .Set("tokenRequired", builder.RequestMultiUseToken ? "Y" : "N") - .Set("externalReferenceID", builder.ClientTransactionId); + .Set("transactionAmount", builder.Amount.ToCurrencyString()); request.Set("cardDataSource", MapCardDataSource(builder)); if (builder.PaymentMethod is ICardData card) { - string cardNumber = card.Number; - string cardDataInputMode = "ELECTRONIC_COMMERCE_NO_SECURITY_CHANNEL_ENCRYPTED_SET_WITHOUT_CARDHOLDER_CERTIFICATE"; - if (card.CardType.Equals("Amex") && !string.IsNullOrEmpty(card.Cvn)) { - cardDataInputMode = "MANUALLY_ENTERED_WITH_KEYED_CID_AMEX_JCB"; - } - - if (card is ITokenizable token && token.Token != null) { - cardNumber = token.Token; - //cardDataInputMode = "MERCHANT_INITIATED_TRANSACTION_CARD_CREDENTIAL_STORED_ON_FILE"; - } - - request.Set("cardNumber", cardNumber) + request.Set("cardNumber", card.Number) .Set("expirationDate", card.ShortExpiry) .Set("cvv2", card.Cvn) .Set("cardPresentDetail", card.CardPresent ? "CARD_PRESENT" : "CARD_NOT_PRESENT") .Set("cardholderPresentDetail", card.CardPresent ? "CARDHOLDER_PRESENT" : "CARDHOLDER_NOT_PRESENT_ELECTRONIC_COMMERCE") - .Set("cardDataInputMode", cardDataInputMode) - .Set("cardholderAuthenticationMethod", "NOT_AUTHENTICATED") - .Set("authorizationIndicator", builder.AmountEstimated ? "PREAUTH" : "FINAL"); + .Set("cardDataInputMode", card.CardPresent ? "KEY_ENTERED_INPUT" : "PAN_ENTRY_ELECTRONIC_COMMERCE_INCLUDING_REMOTE_CHIP") + .Set("cardholderAuthenticationMethod", "UNKNOWN"); } else if (builder.PaymentMethod is ITrackData track) { request.Set(track.TrackNumber.Equals(TrackNumber.TrackTwo) ? "track2Data" : "track1Data", track.TrackData); request.Set("cardPresentDetail", "CARD_PRESENT") .Set("cardholderPresentDetail", "CARDHOLDER_PRESENT") .Set("cardDataInputMode", "MAGNETIC_STRIPE_READER_INPUT") - .Set("cardholderAuthenticationMethod", "NOT_AUTHENTICATED"); + .Set("cardholderAuthenticationMethod", "UNKNOWN"); if (builder.HasEmvFallbackData) { request.Set("emvFallbackCondition", EnumConverter.GetMapping(Target.Transit, builder.EmvFallbackCondition)) @@ -90,67 +151,12 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { } } - // AVS - if (builder.BillingAddress != null) { - request.Set("addressLine1", builder.BillingAddress.StreetAddress1) - .Set("zip", builder.BillingAddress.PostalCode); - } - // PIN Debit if (builder.PaymentMethod is IPinProtected pinProtected) { request.Set("pin", pinProtected.PinBlock.Substring(0, 16)) .Set("pinKsn", pinProtected.PinBlock.Substring(16)); } - #region 3DS 1/2 - if (builder.PaymentMethod is ISecure3d secure && secure.ThreeDSecure != null) { - if (secure.ThreeDSecure.Version.Equals(Secure3dVersion.One)) { - request.Set("programProtocol", "1"); - } - else { - request.Set("programProtocol", "2") - .Set("directoryServerTransactionID", secure.ThreeDSecure.DirectoryServerTransactionId); - } - - request.Set("eciIndicator", secure.ThreeDSecure.Eci) - .Set("secureCode", secure.ThreeDSecure.SecureCode) - .Set("digitalPaymentCryptogram", secure.ThreeDSecure.AuthenticationValue) - .Set("securityProtocol", secure.ThreeDSecure.AuthenticationType) - .Set("ucafCollectionIndicator", EnumConverter.GetMapping(Target.Transit, secure.ThreeDSecure.UCAFIndicator)); - - } - #endregion - - #region Commercial Card Requests - if (builder.CommercialData != null) { - var cd = builder.CommercialData; - - if (cd.CommercialIndicator.Equals(CommercialIndicator.Level_II)) { - request.Set("commercialCardLevel", "LEVEL2"); - } - else { - request.Set("commercialCardLevel", "LEVEL3"); - request.SetProductDetails(cd.LineItems); - } - - request.Set("salesTax", cd.TaxAmount.ToCurrencyString()) - .Set("chargeDescriptor", cd.Description) - .Set("customerRefID", cd.CustomerReferenceId) - .Set("purchaseOrder", cd.PoNumber) - .Set("shipToZip", cd.DestinationPostalCode) - .Set("shipFromZip", cd.OriginPostalCode) - .Set("supplierReferenceNumber", cd.SupplierReferenceNumber) - .Set("customerVATNumber", cd.CustomerVAT_Number) - .Set("summaryCommodityCode", cd.SummaryCommodityCode) - .Set("shippingCharges", cd.FreightAmount.ToCurrencyString()) - .Set("dutyCharges", cd.DutyAmount.ToCurrencyString()) - .Set("destinationCountryCode", cd.DestinationCountryCode) - .Set("vatInvoice", cd.VAT_InvoiceNumber) - .Set("orderDate", cd.OrderDate?.ToString("dd/MM/yyyy")) - .SetAdditionalTaxDetails(cd.AdditionalTaxDetails); - } - #endregion - // Acceptor Config request.Set("terminalCapability", EnumConverter.GetMapping(Target.Transit, AcceptorConfig.CardDataInputCapability)) .Set("terminalCardCaptureCapability", AcceptorConfig.CardCaptureCapability ? "CARD_CAPTURE_CAPABILITY" : "NO_CAPABILITY") @@ -166,17 +172,14 @@ public Transaction ProcessAuthorization(AuthorizationBuilder builder) { } public Transaction ManageTransaction(ManagementBuilder builder) { - var request = new TransitRequestBuilder(MapTransactionType(builder)) + var request = new TransitRequest(MapTransactionType(builder)) .Set("developerID", DeveloperId) .Set("deviceID", DeviceId) .Set("transactionKey", TransactionKey) .Set("transactionAmount", builder.Amount.ToCurrencyString()) .Set("tip", builder.Gratuity.ToCurrencyString()) .Set("transactionID", builder.TransactionId) - .Set("isPartialShipment", builder.MultiCapture ? "Y" : null) - .SetPartialShipmentData(builder.MultiCaptureSequence, builder.MultiCapturePaymentCount) - .Set("externalReferenceID", builder.ClientTransactionId) - .Set("voidReason", EnumConverter.GetMapping(Target.Transit, builder.VoidReason)); + .Set("isPartialShipment", builder.MultiCapture ? "Y" : null); string response = DoTransaction(request.BuildRequest(builder)); return MapResponse(builder, response); @@ -186,10 +189,6 @@ public string SerializeRequest(AuthorizationBuilder builder) { throw new UnsupportedTransactionException(); } - public Transaction ProcessSecure3d(Secure3dBuilder builder) { - throw new NotImplementedException(); - } - private Transaction MapResponse(T builder, string rawResponse) where T : TransactionBuilder { string rootName = "{0}Response".FormatWith(MapTransactionType(builder)); @@ -227,7 +226,7 @@ private Transaction MapResponse(T builder, string rawResponse) where T : Tran // cardHolderVerificationCode CardType = root.GetValue("cardType"), CardLast4 = root.GetValue("maskedCardNumber"), - Token = root.GetValue("token"), + // token // expirationDate // accountUpdaterResponseCode CommercialIndicator = root.GetValue("commercialCard"), @@ -262,20 +261,6 @@ private Transaction MapResponse(T builder, string rawResponse) where T : Tran // additionalAmountAndAccountType }; - // batch response - if (root.Has("batchInfo")) { - Element batchInfo = root.Get("batchInfo"); - - trans.BatchSummary = new BatchSummary { - ResponseCode = responseCode, - SicCode = batchInfo.GetValue("SICCODE"), - SaleCount = batchInfo.GetValue("saleCount"), - SaleAmount = batchInfo.GetValue("saleAmount"), - ReturnCount = batchInfo.GetValue("returnCount"), - ReturnAmount = batchInfo.GetValue("returnAmount") - }; - } - return trans; } @@ -292,20 +277,12 @@ private string MapTransactionType(T builder) where T : TransactionBuilder 3.0.0 - netstandard1.3 + netstandard2.0 GlobalPayments.Api GlobalPayments.Api 1.6.1 @@ -15,13 +15,13 @@ false false false - 7 - + + + - @@ -31,4 +31,8 @@ + + + + diff --git a/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs index 445e5955..f3e44fbc 100644 --- a/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs +++ b/src/GlobalPayments.Api/Network/Enums/CardDataInputCapability.cs @@ -1,159 +1,124 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum CardDataInputCapability { [Map(Target.VAPS, "0")] [Map(Target.Transit, "UNKNOWN")] - [Map(Target.NWS, "0")] Unknown, [Map(Target.VAPS, "1")] [Map(Target.Transit, "NO_TERMINAL_MANUAL")] - [Map(Target.NWS, "1")] Manual, [Map(Target.VAPS, "2")] [Map(Target.Transit, "MAGSTRIPE_READ_ONLY")] - [Map(Target.NWS, "2")] MagStripe, [Map(Target.VAPS, "3")] - [Map(Target.NWS, "3")] BarCode, [Map(Target.VAPS, "4")] [Map(Target.Transit, "OCR")] - [Map(Target.NWS, "4")] OCR, [Map(Target.VAPS, "5")] [Map(Target.Transit, "ICC_CHIP_READ_ONLY")] - [Map(Target.NWS, "5")] ContactEmv, [Map(Target.VAPS, "6")] [Map(Target.Transit, "KEYED_ENTRY_ONLY")] - [Map(Target.NWS, "6")] KeyEntry, [Map(Target.VAPS, "9")] [Map(Target.Transit, "ICC_CONTACTLESS_ONLY")] - [Map(Target.NWS, "9")] ContactlessEmv, [Map(Target.VAPS, "A")] [Map(Target.Transit, "MAGSTRIPE_CONTACTLESS_ONLY")] - [Map(Target.NWS, "A")] ContactlessMsd, [Map(Target.VAPS, "B")] [Map(Target.Transit, "MAGSTRIPE_KEYED_ENTRY_ONLY")] - [Map(Target.NWS, "B")] MagStripe_KeyEntry, [Map(Target.VAPS, "C")] - [Map(Target.NWS, "C")] ContactEmv_MagStripe_KeyEntry, [Map(Target.VAPS, "D")] [Map(Target.Transit, "MAGSTRIPE_ICC_ONLY")] - [Map(Target.NWS, "D")] ContactEmv_MagStripe, [Map(Target.VAPS, "E")] [Map(Target.Transit, "ICC_KEYED_ENTRY_ONLY")] - [Map(Target.NWS, "E")] ContactEmv_KeyEntry, [Map(Target.VAPS, "F")] - [Map(Target.NWS, "F")] ContactlessMsd_KeyEntry, [Map(Target.VAPS, "G")] - [Map(Target.NWS, "G")] ContactlessMsd_MagStripe, [Map(Target.VAPS, "H")] - [Map(Target.NWS, "H")] ContactlessMsd_MagStripe_KeyEntry, [Map(Target.VAPS, "I")] - [Map(Target.NWS, "I")] ContactEmv_ContactlessMsd, [Map(Target.VAPS, "J")] - [Map(Target.NWS, "J")] ContactEmv_ContactlessMsd_KeyEntry, [Map(Target.VAPS, "K")] - [Map(Target.NWS, "K")] ContactEmv_ContactlessMsd_MagStripe, [Map(Target.VAPS, "L")] - [Map(Target.NWS, "L")] ContactEmv_ContactlessMsd_MagStripe_KeyEntry, [Map(Target.VAPS, "M")] - [Map(Target.NWS, "M")] ContactlessEmv_KeyEntry, [Map(Target.VAPS, "N")] - [Map(Target.NWS, "N")] ContactlessEmv_MagStripe, [Map(Target.VAPS, "O")] - [Map(Target.NWS, "O")] ContactlessEmv_ContactlessMsd, [Map(Target.VAPS, "P")] - [Map(Target.NWS, "P")] ContactlessEmv_ContactlessMsd_KeyEntry, [Map(Target.VAPS, "Q")] - [Map(Target.NWS, "Q")] ContactlessEmv_ContactlessMsd_MagStripe, [Map(Target.VAPS, "R")] - [Map(Target.NWS, "R")] ContactlessEmv_ContactlessMsd_MagStripe_KeyEntry, [Map(Target.VAPS, "S")] - [Map(Target.NWS, "S")] - [Map(Target.Transit, "MAGSTRIPE_ICC_KEYED_ENTRY_ONLY")] + [Map(Target.Transit, "MAGSTRIPE_ICC_KEYED_ENTRY_ONLY")] ContactlessEmv_MagStripe_KeyEntry, [Map(Target.VAPS, "T")] - [Map(Target.NWS, "T")] - [Map(Target.Transit, "ICC_CHIP_CONTACT_CONTACTLESS")] + [Map(Target.Transit, "ICC_CHIP_CONTACT_CONTACTLESS")] ContactlessEmv_ContactEmv, [Map(Target.VAPS, "U")] - [Map(Target.NWS, "U")] ContactlessEmv_ContactEmv_KeyEntry, [Map(Target.VAPS, "V")] - [Map(Target.NWS, "V")] ContactlessEmv_ContactEmv_MagStripe, [Map(Target.VAPS, "W")] - [Map(Target.NWS, "W")] ContactlessEmv_ContactEmv_MagStripe_KeyEntry, [Map(Target.VAPS, "X")] - [Map(Target.NWS, "X")] ContactlessEmv_ContactEmv_ContactlessMsd, [Map(Target.VAPS, "Y")] - [Map(Target.NWS, "Y")] ContactlessEmv_ContactEmv_ContactlessMsd_KeyEntry, [Map(Target.VAPS, "Z")] - [Map(Target.NWS, "Z")] ContactlessEmv_ContactEmv_ContactlessMsd_MagStripe, [Map(Target.VAPS, "a")] - [Map(Target.NWS, "a")] ContactlessEmv_ContactEmv_ContactlessMsd_MagStripe_KeyEntry } } diff --git a/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs index c7dbd1c2..2eabf920 100644 --- a/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs +++ b/src/GlobalPayments.Api/Network/Enums/CardDataOutputCapability.cs @@ -1,26 +1,22 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum CardDataOutputCapability { [Map(Target.VAPS, "0")] [Map(Target.Transit, "OTHER")] - [Map(Target.NWS, "0")] Unknown, [Map(Target.VAPS, "1")] [Map(Target.Transit, "NONE")] - [Map(Target.NWS, "1")] None, [Map(Target.VAPS, "2")] [Map(Target.Transit, "MAGNETIC_STRIPE_WRITE")] - [Map(Target.NWS, "2")] MagStripe_Write, [Map(Target.VAPS, "3")] [Map(Target.Transit, "ICC")] - [Map(Target.NWS, "3")] ICC } } diff --git a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs index d6bc838f..381cc006 100644 --- a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs +++ b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationCapability.cs @@ -1,47 +1,38 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum CardHolderAuthenticationCapability { [Map(Target.VAPS, "0")] [Map(Target.Transit, "NO_CAPABILITY")] - [Map(Target.NWS, "0")] None, [Map(Target.VAPS, "1")] [Map(Target.Transit, "PIN_ENTRY")] - [Map(Target.NWS, "1")] PIN, [Map(Target.VAPS, "2")] [Map(Target.Transit, "SIGNATURE_ANALYSIS")] - [Map(Target.NWS, "2")] ElectronicSignature, [Map(Target.VAPS, "3")] - [Map(Target.NWS, "3")] Biometrics, [Map(Target.VAPS, "4")] - [Map(Target.NWS, "4")] Biographic, [Map(Target.VAPS, "5")] - [Map(Target.NWS, "5")] [Map(Target.Transit, "SIGNATURE_ANALYSIS_INOPERATIVE")] ElectronicAuthenticationInoperable, [Map(Target.VAPS, "6")] - [Map(Target.NWS, "6")] - [Map(Target.Transit, "OTHER")] + [Map(Target.Transit, "OTHER")] Other, [Map(Target.VAPS, "9")] - [Map(Target.NWS, "9")] OnCardSecurityCode, [Map(Target.VAPS, "S")] - [Map(Target.NWS, "S")] ElectronicAuthentication, [Map(Target.Transit, "UNKNOWN")] diff --git a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs index b45e6457..5521b797 100644 --- a/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs +++ b/src/GlobalPayments.Api/Network/Enums/CardHolderAuthenticationEntity.cs @@ -1,44 +1,36 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum CardHolderAuthenticationEntity { [Map(Target.VAPS, "0")] [Map(Target.Transit, "NOT_AUTHENTICATED")] - [Map(Target.NWS, "0")] NotAuthenticated, [Map(Target.VAPS, "1")] [Map(Target.Transit, "ICC_OFFLINE_PIN")] - [Map(Target.NWS, "1")] ICC, [Map(Target.VAPS, "2")] [Map(Target.Transit, "CARD_ACCEPTANCE_DEVICE")] - [Map(Target.NWS, "2")] CAD, [Map(Target.VAPS, "3")] [Map(Target.Transit, "AUTHORIZING_AGENT_ONLINE_PIN")] - [Map(Target.NWS, "3")] AuthorizingAgent, [Map(Target.VAPS, "4")] [Map(Target.Transit, "MERCHANT_CARD_ACCEPTOR_SIGNATURE")] - [Map(Target.NWS, "4")] ByMerchant, [Map(Target.VAPS, "5")] [Map(Target.Transit, "OTHER")] - [Map(Target.NWS, "5")] Other, [Map(Target.VAPS, "8")] - [Map(Target.NWS, "8")] CallCenter, [Map(Target.VAPS, "9")] - [Map(Target.NWS, "9")] CardIssuer } } diff --git a/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs b/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs index d486b238..85cd7a87 100644 --- a/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs +++ b/src/GlobalPayments.Api/Network/Enums/OperatingEnvironment.cs @@ -1,36 +1,30 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum OperatingEnvironment { [Map(Target.VAPS, "0")] [Map(Target.Transit, "NO_TERMINAL")] - [Map(Target.NWS, "0")] NoTerminalUsed, [Map(Target.VAPS, "1")] [Map(Target.Transit, "ON_MERCHANT_PREMISES_ATTENDED")] - [Map(Target.NWS, "1")] OnPremises_CardAcceptor_Attended, [Map(Target.VAPS, "2")] [Map(Target.Transit, "ON_MERCHANT_PREMISES_UNATTENDED")] - [Map(Target.NWS, "2")] OnPremises_CardAcceptor_Unattended, [Map(Target.VAPS, "3")] [Map(Target.Transit, "OFF_MERCHANT_PREMISES_ATTENDED")] - [Map(Target.NWS, "3")] OffPremises_CardAcceptor_Attended, [Map(Target.VAPS, "4")] [Map(Target.Transit, "OFF_MERCHANT_PREMISES_UNATTENDED")] - [Map(Target.NWS, "4")] OffPremises_CardAcceptor_Unattended, [Map(Target.VAPS, "5")] [Map(Target.Transit, "ON_CUSTOMER_PREMISES_UNATTENDED")] - [Map(Target.NWS, "0")] OnPremises_CardHolder_Unattended, [Map(Target.Transit, "OFF_MERCHANT_PREMISES_MPOS")] @@ -38,7 +32,6 @@ public enum OperatingEnvironment { [Map(Target.VAPS, "9")] [Map(Target.Transit, "ON_MERCHANT_PREMISES_MPOS")] - [Map(Target.NWS, "9")] OnPremises_CardAcceptor_Unattended_Mobile, [Map(Target.Transit, "OFF_MERCHANT_PREMISES_CUSTOMER_POS")] @@ -60,7 +53,6 @@ public enum OperatingEnvironment { AMEX_Physical_Delivery, [Map(Target.VAPS, "S")] - [Map(Target.NWS, "S")] Internet_With_SSL, [Map(Target.VAPS, "T")] diff --git a/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs b/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs index e85fd351..9773e3de 100644 --- a/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs +++ b/src/GlobalPayments.Api/Network/Enums/PinCaptureCapability.cs @@ -1,61 +1,50 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum PinCaptureCapability { [Map(Target.VAPS, "0")] [Map(Target.Transit, "NOT_SUPPORTED")] - [Map(Target.NWS, "0")] None, [Map(Target.VAPS, "1")] [Map(Target.Transit, "UNKNOWN")] - [Map(Target.NWS, "1")] Unknown, [Map(Target.VAPS, "4")] [Map(Target.Transit, "4")] - [Map(Target.NWS, "4")] FourCharacters, [Map(Target.VAPS, "5")] [Map(Target.Transit, "5")] - [Map(Target.NWS, "5")] FiveCharacters, [Map(Target.VAPS, "6")] [Map(Target.Transit, "6")] - [Map(Target.NWS, "6")] SixCharacters, [Map(Target.VAPS, "7")] [Map(Target.Transit, "7")] - [Map(Target.NWS, "7")] SevenCharacters, [Map(Target.VAPS, "8")] [Map(Target.Transit, "8")] - [Map(Target.NWS, "8")] EightCharacters, [Map(Target.VAPS, "9")] [Map(Target.Transit, "9")] - [Map(Target.NWS, "9")] NineCharacters, [Map(Target.VAPS, "A")] [Map(Target.Transit, "10")] - [Map(Target.NWS, "A")] TenCharacters, [Map(Target.VAPS, "B")] [Map(Target.Transit, "11")] - [Map(Target.NWS, "B")] ElevenCharacters, [Map(Target.VAPS, "C")] [Map(Target.Transit, "12")] - [Map(Target.NWS, "C")] TwelveCharacters } } diff --git a/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs b/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs index 84458d3e..dd58a8a5 100644 --- a/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs +++ b/src/GlobalPayments.Api/Network/Enums/TerminalOutputCapability.cs @@ -1,35 +1,29 @@ using GlobalPayments.Api.Utils; namespace GlobalPayments.Api.Entities { - [MapTarget(Target.VAPS | Target.Transit | Target.NWS)] + [MapTarget(Target.VAPS | Target.Transit)] public enum TerminalOutputCapability { [Map(Target.VAPS, "0")] [Map(Target.Transit, "UNKNOWN")] - [Map(Target.NWS, "0")] Unknown, [Map(Target.VAPS, "1")] [Map(Target.Transit, "NONE")] - [Map(Target.NWS, "1")] None, [Map(Target.VAPS, "2")] [Map(Target.Transit, "PRINT_ONLY")] - [Map(Target.NWS, "2")] Printing, [Map(Target.VAPS, "3")] [Map(Target.Transit, "DISPLAY_ONLY")] - [Map(Target.NWS, "3")] Display, [Map(Target.VAPS, "4")] [Map(Target.Transit, "PRINT_AND_DISPLAY")] - [Map(Target.NWS, "4")] Printing_Display, [Map(Target.VAPS, "9")] - [Map(Target.NWS, "9")] Coupon_Printing } } diff --git a/src/GlobalPayments.Api/PaymentMethods/Credit.cs b/src/GlobalPayments.Api/PaymentMethods/Credit.cs index 7194b8f9..6bcaa941 100644 --- a/src/GlobalPayments.Api/PaymentMethods/Credit.cs +++ b/src/GlobalPayments.Api/PaymentMethods/Credit.cs @@ -5,7 +5,7 @@ namespace GlobalPayments.Api.PaymentMethods { /// /// Use credit as a payment method. /// - public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChargable, IAuthable, IRefundable, IReversable, IVerifiable, IPrePaid, IBalanceable, ISecure3d { + public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChargable, IAuthable, IRefundable, IReversable, IVerifiable, IPrePayable, IBalanceable, ISecure3d { /// /// The card type of the manual entry data. /// @@ -41,8 +41,6 @@ public abstract class Credit : IPaymentMethod, IEncryptable, ITokenizable, IChar public bool FleetCard { get; set; } - public bool PurchaseCard { get; set; } - public Credit() { CardType = "Unknown"; } @@ -52,13 +50,12 @@ public Credit() { /// /// The amount of the transaction /// AuthorizationBuilder - public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = false) { + public AuthorizationBuilder Authorize(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.Auth, this) .WithAmount(amount ?? ThreeDSecure?.Amount) .WithCurrency(ThreeDSecure?.Currency) - .WithOrderId(ThreeDSecure?.OrderId) - .WithAmountEstimated(isEstimated); - } + .WithOrderId(ThreeDSecure?.OrderId); + } /// /// Creates a charge (sale) against the payment method. @@ -122,13 +119,8 @@ public AuthorizationBuilder Verify() { /// /// AuthorizationBuilder public string Tokenize(string configName = "default") { - return Tokenize(true, configName); - } - public string Tokenize(bool verifyCard, string configName = "default") { - TransactionType type = verifyCard ? TransactionType.Verify : TransactionType.Tokenize; - - var response = new AuthorizationBuilder(type, this) - .WithRequestMultiUseToken(verifyCard) + var response = new AuthorizationBuilder(TransactionType.Verify, this) + .WithRequestMultiUseToken(true) .Execute(configName); return response.Token; } diff --git a/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs b/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs index e2254720..82b86b7c 100644 --- a/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs +++ b/src/GlobalPayments.Api/PaymentMethods/CreditCardData.cs @@ -60,7 +60,6 @@ public string Number { try { CardType = CardUtils.MapCardType(_number); FleetCard = CardUtils.IsFleet(CardType, _number); - PurchaseCard = CardUtils.IsPurchase(CardType, _number); } catch (Exception) { CardType = "Unknown"; @@ -73,21 +72,10 @@ public string Number { /// public int? ExpMonth { get; set; } - internal int? _expYear; - /// /// The card's expiration year. /// - public int? ExpYear { - get { return _expYear; } - set { - if (value.HasValue && (int)Math.Floor(Math.Log10(value.Value)) + 1 == 2) { - _expYear = value + 2000; - } else { - _expYear = value; - } - } - } + public int? ExpYear { get; set; } public string ShortExpiry { get { diff --git a/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs b/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs index 609b5e9f..185125ca 100644 --- a/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs +++ b/src/GlobalPayments.Api/PaymentMethods/CreditTrackData.cs @@ -31,14 +31,12 @@ public string Value { CardUtils.ParseTrackData(this); CardType = CardUtils.MapCardType(Pan); FleetCard = CardUtils.IsFleet(CardType, Pan); - PurchaseCard = CardUtils.IsPurchase(CardType, Pan); if (CardType.Equals("WexFleet") && DiscretionaryData != null && DiscretionaryData.Length >= 8) { PurchaseDeviceSequenceNumber = DiscretionaryData.Substring(3, 5); } } } - public string PinBlock { get; set; } public CreditTrackData() : base() { } } diff --git a/src/GlobalPayments.Api/PaymentMethods/Debit.cs b/src/GlobalPayments.Api/PaymentMethods/Debit.cs index 24fe89fc..97243cdb 100644 --- a/src/GlobalPayments.Api/PaymentMethods/Debit.cs +++ b/src/GlobalPayments.Api/PaymentMethods/Debit.cs @@ -2,11 +2,12 @@ using GlobalPayments.Api.Builders; using GlobalPayments.Api.Entities; -namespace GlobalPayments.Api.PaymentMethods { +namespace GlobalPayments.Api.PaymentMethods +{ /// /// Use PIN debit as a payment method. /// - public abstract class Debit : IPaymentMethod, IPrePaid, IRefundable, IReversable, IChargable, IEncryptable, IPinProtected { + public abstract class Debit : IPaymentMethod, IPrePayable, IRefundable, IReversable, IChargable, IEncryptable, IPinProtected { public string CardType { get; set; } public EncryptionData EncryptionData { get; set; } @@ -37,10 +38,5 @@ public AuthorizationBuilder Refund(decimal? amount = null) { public AuthorizationBuilder Reverse(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.Reversal, this).WithAmount(amount); } - public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = true) { - return new AuthorizationBuilder(TransactionType.Auth, this) - .WithAmount(amount) - .WithAmountEstimated(true); - } - } + } } diff --git a/src/GlobalPayments.Api/PaymentMethods/EBT.cs b/src/GlobalPayments.Api/PaymentMethods/EBT.cs index 5b68781e..63c98100 100644 --- a/src/GlobalPayments.Api/PaymentMethods/EBT.cs +++ b/src/GlobalPayments.Api/PaymentMethods/EBT.cs @@ -9,7 +9,6 @@ public abstract class EBT : IPaymentMethod, IBalanceable, IChargable, IRefundabl /// /// Set to `PaymentMethodType.EBT` for internal methods. /// - public EbtCardType EbtCardType { get; set; } public PaymentMethodType PaymentMethodType { get { return PaymentMethodType.EBT; } } public string PinBlock { get; set; } @@ -28,54 +27,5 @@ public AuthorizationBuilder Charge(decimal? amount = null) { public AuthorizationBuilder Refund(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.Refund, this).WithAmount(amount); } - public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = true) { - return new AuthorizationBuilder(TransactionType.Auth, this) - .WithAmount(amount) - .WithAmountEstimated(true); - } } - - ///// - ///// Use EBT manual entry data as a payment method. - ///// - //public class EBTCardData : EBT, ICardData { - // public string ApprovalCode { get; set; } - // public bool CardPresent { get; set; } - // public string Cvn { get; set; } - // public CvnPresenceIndicator CvnPresenceIndicator { get; set; } - // public int? ExpMonth { get; set; } - // public int? ExpYear { get; set; } - // public string Number { get; set; } - // public bool ReaderPresent { get; set; } - // public string SerialNumber { get; set; } - // public string ShortExpiry { - // get { - // var month = (ExpMonth.HasValue) ? ExpMonth.ToString().PadLeft(2, '0') : string.Empty; - // var year = (ExpYear.HasValue) ? ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty; - // return month + year; - // } - // } - // public EBTCardData() { } - // public EBTCardData(EbtCardType cardType) { - // EbtCardType = cardType; - // } - //} - - ///// - ///// Use EBT track data as a payment method. - ///// - //public class EBTTrackData : EBT, ITrackData, IEncryptable { - // public EncryptionData EncryptionData { get; set; } - // public EntryMethod EntryMethod { get; set; } - // public string Value { get; set; } - // public TrackNumber TrackNumber { get; set; } - // public string TrackData { get; set; } - // public string Pan { get; set; } - // public string DiscretionaryData { get; set; } - // public string Expiry { get; set; } - // public EBTTrackData() { } - // public EBTTrackData(EbtCardType cardType) { - // EbtCardType = cardType; - // } - //} } diff --git a/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs b/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs index 91de0ee0..19bad7a4 100644 --- a/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs +++ b/src/GlobalPayments.Api/PaymentMethods/EBTCardData.cs @@ -7,7 +7,6 @@ namespace GlobalPayments.Api.PaymentMethods { public class EBTCardData : EBT, ICardData { public string ApprovalCode { get; set; } public bool CardPresent { get; set; } - public string CardType { get; set; } public string Cvn { get; set; } public CvnPresenceIndicator CvnPresenceIndicator { get; set; } public int? ExpMonth { get; set; } @@ -19,13 +18,8 @@ public string ShortExpiry { get { var month = (ExpMonth.HasValue) ? ExpMonth.ToString().PadLeft(2, '0') : string.Empty; var year = (ExpYear.HasValue) ? ExpYear.ToString().PadLeft(4, '0').Substring(2, 2) : string.Empty; - return year + month; + return month + year; } } - public EBTCardData() { - } - public EBTCardData(EbtCardType cardType) { - EbtCardType = cardType; - } } } diff --git a/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs b/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs index ab1048c0..41d0c38a 100644 --- a/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs +++ b/src/GlobalPayments.Api/PaymentMethods/EBTTrackData.cs @@ -35,8 +35,5 @@ public string Value { } public EBTTrackData() : base() { } - public EBTTrackData(EbtCardType cardType) { - EbtCardType = cardType; - } } } diff --git a/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs b/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs index 6e8f31dc..cff5060b 100644 --- a/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs +++ b/src/GlobalPayments.Api/PaymentMethods/GiftCard.cs @@ -1,26 +1,22 @@ -using GlobalPayments.Api.Builders; +using System; +using GlobalPayments.Api.Builders; using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Utils; -namespace GlobalPayments.Api.PaymentMethods { +namespace GlobalPayments.Api.PaymentMethods +{ /// /// Use gift/loyaly/stored value account as a payment method. /// - public class GiftCard : IPaymentMethod, IPrePaid, IBalanceable, IReversable, IChargable, IAuthable, IRefundable { - private string _token; - private string _trackData; - private string _number; - private string _alias; - + public class GiftCard : IPaymentMethod, IPrePayable, IBalanceable, IReversable, IChargable { /// /// The gift card's alias. /// public string Alias { get { - return _alias; + return Value; } set { - _alias = value; + Value = value; ValueType = "Alias"; } } @@ -30,16 +26,11 @@ public string Alias { /// public string Number { get { - return _number; + return Value; } set { - if (string.IsNullOrEmpty(Value)) { - SetValue(value); - } - else { - _number = value; - ValueType = "CardNbr"; - } + Value = value; + ValueType = "CardNbr"; } } @@ -58,10 +49,10 @@ public string Number { /// public string Token { get { - return _token; + return Value; } set { - _token = value; + Value = value; ValueType = "TokenValue"; } } @@ -71,42 +62,34 @@ public string Token { /// public string TrackData { get { - return _trackData; + return Value; } set { - if (string.IsNullOrEmpty(Value)) { - SetValue(value); - } - else { - _trackData = value; - ValueType = "TrackData"; - } + Value = value; + ValueType = "TrackData"; } } internal string Value { get; set; } + internal string ValueType { get; private set; } - internal TrackNumber TrackNumber { get; set; } - internal string Pan { get; set; } - internal string Expiry { get; set; } - internal string CardType { get; set; } /// - /// Activates an existing gift card. + /// Adds an alias to to an existing gift card. /// - /// The amount of the transaction + /// The phone number to add as an alias /// AuthorizationBuilder - public AuthorizationBuilder Activate(decimal? amount = null) { - return new AuthorizationBuilder(TransactionType.Activate, this).WithAmount(amount); + public AuthorizationBuilder AddAlias(string phoneNumber) { + return new AuthorizationBuilder(TransactionType.Alias, this).WithAlias(AliasAction.ADD, phoneNumber); } /// - /// Adds an alias to to an existing gift card. + /// Activates an existing gift card. /// - /// The phone number to add as an alias + /// The amount of the transaction /// AuthorizationBuilder - public AuthorizationBuilder AddAlias(string phoneNumber) { - return new AuthorizationBuilder(TransactionType.Alias, this).WithAlias(AliasAction.ADD, phoneNumber); + public AuthorizationBuilder Activate(decimal? amount = null) { + return new AuthorizationBuilder(TransactionType.Activate, this).WithAmount(amount); } /// @@ -118,13 +101,6 @@ public AuthorizationBuilder AddValue(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.AddValue, this).WithAmount(amount); } - public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimate = false) - { - return new AuthorizationBuilder(TransactionType.Auth, this) - .WithAmount(amount) - .WithAmountEstimated(isEstimate); - } - /// /// Completes a balance inquiry (lookup) on an activated gift card. /// @@ -134,11 +110,6 @@ public AuthorizationBuilder BalanceInquiry(InquiryType? inquiry = null) { return new AuthorizationBuilder(TransactionType.Balance, this); } - public AuthorizationBuilder CashOut() - { - return new AuthorizationBuilder(TransactionType.CashOut, this); - } - /// /// Creates a charge (sale) transaction against an activated gift card. /// @@ -148,30 +119,6 @@ public AuthorizationBuilder Charge(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.Sale, this).WithAmount(amount); } - /// - /// Creates a gift card with an alias. - /// - /// - /// Thrown when the gift card cannot be created. - /// - /// The phone number to be used as the alias - /// GiftCard - public static GiftCard Create(string phoneNumber) - { - var card = new GiftCard { }; - - var response = new AuthorizationBuilder(TransactionType.Alias, card) - .WithAlias(AliasAction.CREATE, phoneNumber) - .Execute(); - - // if success return a card - if (response.ResponseCode == "00") - { - return response.GiftCard; - } - else throw new GatewayException("Failed to create gift card.", response.ResponseCode, response.ResponseMessage); - } - /// /// Deactivates a gift card. /// @@ -180,11 +127,6 @@ public AuthorizationBuilder Deactivate() { return new AuthorizationBuilder(TransactionType.Deactivate, this); } - public AuthorizationBuilder Refund(decimal? amount = null) { - return new AuthorizationBuilder(TransactionType.Refund, this) - .WithAmount(amount); - } - /// /// Removes an alias from an existing gift card. /// @@ -197,7 +139,7 @@ public AuthorizationBuilder RemoveAlias(string phoneNumber) { /// /// Replaces an existing gift card with a new one, /// transferring the balance from the old card to - /// the new card in the process. + // the new card in the process. /// /// The replacement gift card /// AuthorizationBuilder @@ -223,15 +165,26 @@ public AuthorizationBuilder Rewards(decimal? amount = null) { return new AuthorizationBuilder(TransactionType.Reward, this).WithAmount(amount); } - public void SetValue(string value) { - Value = value; + /// + /// Creates a gift card with an alias. + /// + /// + /// Thrown when the gift card cannot be created. + /// + /// The phone number to be used as the alias + /// GiftCard + public static GiftCard Create(string phoneNumber) { + var card = new GiftCard { }; + + var response = new AuthorizationBuilder(TransactionType.Alias, card) + .WithAlias(AliasAction.CREATE, phoneNumber) + .Execute(); - CardUtils.ParseTrackData(this); - if (string.IsNullOrEmpty(TrackData)) { - Number = value; - Pan = value; + // if success return a card + if (response.ResponseCode == "00") { + return response.GiftCard; } - CardType = CardUtils.MapCardType(Pan); + else throw new GatewayException("Failed to create gift card.", response.ResponseCode, response.ResponseMessage); } } } diff --git a/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs b/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs new file mode 100644 index 00000000..81ddaab8 --- /dev/null +++ b/src/GlobalPayments.Api/PaymentMethods/PaymentInterfaces.cs @@ -0,0 +1,84 @@ +using System; +using GlobalPayments.Api.Builders; +using GlobalPayments.Api.Entities; + +namespace GlobalPayments.Api.PaymentMethods +{ + public interface IPaymentMethod { + PaymentMethodType PaymentMethodType { get; } + } + + public interface ICardData { + bool CardPresent { get; set; } + string Cvn { get; set; } + CvnPresenceIndicator CvnPresenceIndicator { get; set; } + string Number { get; set; } + int? ExpMonth { get; set; } + int? ExpYear { get; set; } + bool ReaderPresent { get; set; } + string ShortExpiry { get; } + } + + public interface ITrackData { + string Expiry { get; set; } + string Pan { get; set; } + TrackNumber TrackNumber { get; set; } + string TrackData { get; set; } + string DiscretionaryData { get; set; } + string Value { get; set; } + EntryMethod EntryMethod { get; set; } + } + + interface IAuthable { + AuthorizationBuilder Authorize(decimal? amount = null); + } + + interface IChargable { + AuthorizationBuilder Charge(decimal? amount = null); + } + + interface IBalanceable { + AuthorizationBuilder BalanceInquiry(InquiryType? inquiry); + } + + interface IEditable { + ManagementBuilder Edit(decimal? amount = null); + } + + interface IEncryptable { + EncryptionData EncryptionData { get; set; } + } + + interface IPinProtected { + string PinBlock { get; set; } + } + + interface IPrePayable { + AuthorizationBuilder AddValue(decimal? amount = null); + } + + interface IRefundable { + AuthorizationBuilder Refund(decimal? amount = null); + } + + interface IReversable { + AuthorizationBuilder Reverse(decimal? amount = null); + } + + interface ITokenizable { + string Token { get; set; } + string Tokenize(string configName = "default"); + bool UpdateTokenExpiry(string configName = "default"); + bool DeleteToken(string configName = "default"); + } + + interface IVerifiable { + AuthorizationBuilder Verify(); + } + + interface ISecure3d { + ThreeDSecure ThreeDSecure { get; set; } + } + + interface IVoidable { } +} diff --git a/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs b/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs index 3e1211a8..1e43339e 100644 --- a/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs +++ b/src/GlobalPayments.Api/PaymentMethods/RecurringPaymentMethod.cs @@ -81,11 +81,8 @@ public RecurringPaymentMethod(string customerId, string paymentId) { /// /// The amount of the transaction /// AuthorizationBuilder - public AuthorizationBuilder Authorize(decimal? amount = null, bool isEstimated = false) { - return new AuthorizationBuilder(TransactionType.Auth, this) - .WithAmount(amount) - .WithOneTimePayment(true) - .WithAmountEstimated(isEstimated); + public AuthorizationBuilder Authorize(decimal? amount = null) { + return new AuthorizationBuilder(TransactionType.Auth, this).WithAmount(amount).WithOneTimePayment(true); } /// diff --git a/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs b/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs index abdb558c..7b20db36 100644 --- a/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs +++ b/src/GlobalPayments.Api/PaymentMethods/TransactionReference.cs @@ -1,35 +1,13 @@ using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Network.Entities; namespace GlobalPayments.Api.PaymentMethods { internal class TransactionReference : IPaymentMethod { - internal PaymentMethodType _paymentMethodType; - public PaymentMethodType PaymentMethodType { - get { - if (OriginalPaymentMethod != null) { - return OriginalPaymentMethod.PaymentMethodType; - } - return _paymentMethodType; - } - set { _paymentMethodType = value; } - } + public PaymentMethodType PaymentMethodType { get; set; } public string AuthCode { get; set; } public string BatchNumber { get; set; } public string OrderId { get; set; } public string TransactionId { get; set; } public string ClientTransactionId { get; set; } public string AlternativePaymentType { get; set; } - public string AcquiringInstitutionId{ get; set; } - public string MessageTypeIndicator{ get; set; } - public decimal? OriginalAmount{ get; set; } - public IPaymentMethod OriginalPaymentMethod{ get; set; } - public string OriginalProcessingCode{ get; set; } - public string OriginalTransactionTime{ get; set; } - public int SequenceNumber{ get; set; } - public string SystemTraceAuditNumber{ get; set; } - public NtsData NtsData { get; set; } - public void SetNtsData(string value) { - this.NtsData = NtsData.FromString(value); - } } } diff --git a/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs b/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs index 090681b8..97e1a1a4 100644 --- a/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs +++ b/src/GlobalPayments.Api/ServiceConfigs/Configuration.cs @@ -1,5 +1,4 @@ using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Logging; namespace GlobalPayments.Api { public abstract class Configuration { @@ -8,8 +7,6 @@ public abstract class Configuration { public Environment Environment { get { return _environment; } set { _environment = value; } } - public IRequestLogger RequestLogger { get; set; } - /// /// Gateway service URL /// @@ -23,8 +20,6 @@ public abstract class Configuration { internal bool Validated { get; private set; } internal abstract void ConfigureContainer(ConfiguredServices services); - public bool EnableLogging { get; set; } - public bool ForceGatewayTimeout { get; set; } internal virtual void Validate() { Validated = true; diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs index 0f8e8ef5..f2e1fe00 100644 --- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs +++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/AcceptorConfig.cs @@ -1,7 +1,5 @@ -using System; -using System.Reflection; +using System.Reflection; using GlobalPayments.Api.Entities; -using GlobalPayments.Api.Network.Entities; using GlobalPayments.Api.Utils; namespace GlobalPayments.Api { @@ -14,20 +12,6 @@ public class AcceptorConfig { public CardDataOutputCapability CardDataOutputCapability { get; set; } public TerminalOutputCapability TerminalOutputCapability { get; set; } public PinCaptureCapability PinCaptureCapability { get; set; } - public string HardwareLevel { get; set; } - public string SoftwareLevel { get; set; } - public string OperatingSystemLevel { get; set; } - public string Timezone { get; set; } - public bool? SupportsPartialApproval { get; set; } - public bool? SupportsReturnBalance { get; set; } - public bool? SupportsCashOver { get; set; } - public bool? MobileDevice { get; set; } - public bool? SupportsShutOffAmount { get; set; } - public bool? SupportsDiscoverNetworkReferenceId { get; set; } - public bool? SupportsAvsCnvVoidReferrals { get; set; } - public bool? SupportsEmvPin { get; set; } - public EncryptionType SupportedEncryptionType { get; set; } - public Address Address { get; set; } public AcceptorConfig() { CardDataInputCapability = CardDataInputCapability.MagStripe_KeyEntry; @@ -37,7 +21,6 @@ public AcceptorConfig() { CardDataOutputCapability = CardDataOutputCapability.None; TerminalOutputCapability = TerminalOutputCapability.None; PinCaptureCapability = PinCaptureCapability.TwelveCharacters; - SupportedEncryptionType = EncryptionType.TEP2; } public void Validate(Target target) { @@ -54,33 +37,5 @@ public void Validate(Target target) { } } } - public bool HasPosConfiguration_MessageControl() { - return (!string.IsNullOrEmpty(Timezone) - || SupportsPartialApproval != null - || SupportsReturnBalance != null - || SupportsCashOver != null - || MobileDevice != null); - } - public bool HasPosConfiguration_IssuerData() { - return (SupportsPartialApproval != null - || SupportsShutOffAmount != null - || SupportsReturnBalance != null - || SupportsDiscoverNetworkReferenceId != null - || SupportsAvsCnvVoidReferrals != null - || SupportsEmvPin != null - || MobileDevice != null); - } - public string GetPosConfigForIssuerData() { - string rvalue = SupportsPartialApproval != null ? (bool)SupportsPartialApproval ? "Y" : "N" : "N"; - rvalue = string.Concat(rvalue, (SupportsShutOffAmount != null ? (bool)SupportsShutOffAmount ? "Y" : "N" : "N") - , ("N") - , (SupportsReturnBalance != null ? (bool)SupportsReturnBalance ? "Y" : "N" : "N") - , (SupportsDiscoverNetworkReferenceId != null ? (bool)SupportsDiscoverNetworkReferenceId ? "Y" : "N" : "N") - , (SupportsAvsCnvVoidReferrals != null ? (bool)SupportsAvsCnvVoidReferrals ? "Y" : "N" : "N") - , (SupportsEmvPin != null ? (bool)SupportsEmvPin ? "Y" : "N" : "N") - , (MobileDevice != null ? (bool)MobileDevice ? "Y" : "N" : "N") - , ("N")); - return rvalue; - } } } diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs index 74bcae73..ddd0e50e 100644 --- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs +++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/GatewayConfig.cs @@ -48,12 +48,10 @@ internal override void Validate() { // data client if (!string.IsNullOrEmpty(DataClientId) || !string.IsNullOrEmpty(DataClientSecret)) { - if (string.IsNullOrEmpty(DataClientId) || string.IsNullOrEmpty(DataClientSecret)) { + if (string.IsNullOrEmpty(DataClientId) || string.IsNullOrEmpty(DataClientSecret)) throw new ConfigurationException("Both \"DataClientID\" and \"DataClientSecret\" are required for data client services."); - } - if (string.IsNullOrEmpty(DataClientUserId)) { + if (string.IsNullOrEmpty(DataClientUserId)) throw new ConfigurationException("DataClientUserId required for data client services."); - } } } } diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs index 35c35a02..a27f15c2 100644 --- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs +++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/PorticoConfig.cs @@ -88,8 +88,7 @@ internal override void ConfigureContainer(ConfiguredServices services) { VersionNumber = VersionNumber, Timeout = Timeout, ServiceUrl = ServiceUrl + "/Hps.Exchange.PosGateway/PosGatewayService.asmx", - UniqueDeviceId = UniqueDeviceId, - RequestLogger = RequestLogger + UniqueDeviceId = UniqueDeviceId }; services.GatewayConnector = gateway; @@ -101,8 +100,7 @@ internal override void ConfigureContainer(ConfiguredServices services) { var payplan = new PayPlanConnector { SecretApiKey = SecretApiKey, Timeout = Timeout, - ServiceUrl = ServiceUrl + PayPlanEndpoint, - RequestLogger = RequestLogger + ServiceUrl = ServiceUrl + PayPlanEndpoint }; services.RecurringConnector = payplan; } diff --git a/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs b/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs index 71ad9598..d5a9aa61 100644 --- a/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs +++ b/src/GlobalPayments.Api/ServiceConfigs/Gateways/TransitConfig.cs @@ -28,8 +28,7 @@ internal override void ConfigureContainer(ConfiguredServices services) { MerchantId = MerchantId, TransactionKey = TransactionKey, ServiceUrl = ServiceUrl, - Timeout = Timeout, - RequestLogger = RequestLogger + Timeout = Timeout }; services.GatewayConnector = gateway; diff --git a/src/GlobalPayments.Api/Services/BatchService.cs b/src/GlobalPayments.Api/Services/BatchService.cs index 094aa593..3b457dd4 100644 --- a/src/GlobalPayments.Api/Services/BatchService.cs +++ b/src/GlobalPayments.Api/Services/BatchService.cs @@ -7,123 +7,5 @@ public static BatchSummary CloseBatch() { var response = new ManagementBuilder(TransactionType.BatchClose).Execute(); return response.BatchSummary; } - public static BatchSummary CloseBatch(BatchCloseType closeType) { - return CloseBatch(closeType, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(int batchNumber) { - return CloseBatch(batchNumber, "default"); - } - public static BatchSummary CloseBatch(int batchNumber, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber) { - return CloseBatch(batchNumber, sequenceNumber, "default"); - } - public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber, sequenceNumber) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber) { - return CloseBatch(closeType, batchNumber, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber) { - return CloseBatch(closeType, batchNumber, sequenceNumber, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber, sequenceNumber) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(BatchCloseType closeType, int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(closeType, transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(batchNumber, transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(batchNumber, sequenceNumber, transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber, sequenceNumber) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(closeType, batchNumber, transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } - - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits) { - return CloseBatch(closeType, batchNumber, sequenceNumber, transactionTotal, totalCredits, totalDebits, "default"); - } - public static BatchSummary CloseBatch(BatchCloseType closeType, int batchNumber, int sequenceNumber, int transactionTotal, decimal totalCredits, decimal totalDebits, string configName) { - Transaction response = new ManagementBuilder(TransactionType.BatchClose) - .WithBatchNumber(batchNumber, sequenceNumber) - .WithBatchTotals(transactionTotal, totalDebits, totalCredits) - .WithBatchCloseType(closeType) - .Execute(configName); - return response.BatchSummary; - } } } diff --git a/src/GlobalPayments.Api/Services/TableService.cs b/src/GlobalPayments.Api/Services/TableService.cs index f77bd8d8..b883de1a 100644 --- a/src/GlobalPayments.Api/Services/TableService.cs +++ b/src/GlobalPayments.Api/Services/TableService.cs @@ -9,7 +9,7 @@ public class TableService { private readonly string _configName; /// - /// string array of the bump statuses as reported by the table service API. + /// String array of the bump statuses as reported by the table service API. /// public string[] BumpStatuses { get { diff --git a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs index 2113d5bb..2200cb9b 100644 --- a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs +++ b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceCommInterface.cs @@ -9,5 +9,9 @@ public interface IDeviceCommInterface { byte[] Send(IDeviceMessage message); event MessageSentEventHandler OnMessageSent; + + event BroadcastMessageEventHandler OnBroadcastMessage; + + event PayAtTableRequestEventHandler OnPayAtTableRequest; } } diff --git a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs index 17ec5cf4..8f566fb7 100644 --- a/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs +++ b/src/GlobalPayments.Api/Terminals/Abstractions/IDeviceInterface.cs @@ -2,14 +2,23 @@ using GlobalPayments.Api.Entities; using GlobalPayments.Api.Terminals.Abstractions; using GlobalPayments.Api.Terminals.Builders; +using GlobalPayments.Api.Terminals.Ingenico; using GlobalPayments.Api.Terminals.Messaging; namespace GlobalPayments.Api.Terminals { public interface IDeviceInterface : IDisposable { event MessageSentEventHandler OnMessageSent; + event BroadcastMessageEventHandler OnBroadcastMessage; + event PayAtTableRequestEventHandler OnPayAtTableRequest; #region Admin Calls - void Cancel(); + + /// + /// A method to Cancel a live transaction. + /// + /// Amount to be passed for cancel request. + /// TerminalManageBuilder + IDeviceResponse Cancel(); IDeviceResponse CloseLane(); IDeviceResponse DisableHostResponseBeep(); ISignatureResponse GetSignatureFile(); @@ -24,10 +33,44 @@ public interface IDeviceInterface : IDisposable { ISAFResponse SendStoreAndForward(); IDeviceResponse SetStoreAndForwardMode(bool enabled); IDeviceResponse StartCard(PaymentMethodType paymentMethodType); + + /// + /// The terminal immediately initiates a duplicate of the last completed transaction + /// + /// IDeviceResponse + IDeviceResponse Duplicate(); + + /// + /// Command used to gain feedback as to the status of the terminal. + /// + /// + IDeviceResponse GetTerminalStatus(); + + /// + /// Command used to request for CALL TMS in the terminal. + /// + /// IDeviceResponse + IDeviceResponse GetTerminalConfiguration(); + + IDeviceResponse TestConnection(); #endregion #region reporting TerminalReportBuilder LocalDetailReport(); + /// + /// Used to request the XML data for the last completed report that is stored in the terminal’s memory + /// + /// Receipt Type + /// + TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET); + + /// + /// Instruct the terminal to initiate report and stores it in terminal's memory. + /// GetLastReceipt can be used to extract XML data after. + /// + /// Report Type + /// + TerminalReportBuilder GetReport(Ingenico.ReportType type); #endregion #region Batch Calls @@ -65,14 +108,59 @@ public interface IDeviceInterface : IDisposable { #region Generic Calls TerminalAuthBuilder AddValue(decimal? amount = null); + + /// + /// Instructs the terminal to transact a pre-authorization transaction. + /// + /// Amount + /// TerminalAuthBuilder Authorize(decimal? amount = null); TerminalAuthBuilder Balance(); TerminalManageBuilder Capture(decimal? amount = null); + + /// + /// Instruct the terminal to refund the last completed transaction. + /// + /// Refund Amount + /// TerminalAuthBuilder Refund(decimal? amount = null); + + /// + /// Instruct the terminal to process sale transaction. + /// + /// Sale Amount + /// TerminalAuthBuilder Sale(decimal? amount = null); + + /// + /// Verify the account of the card holder. + /// + /// TerminalAuthBuilder Verify(); TerminalManageBuilder Void(); TerminalAuthBuilder Withdrawal(decimal? amount = null); #endregion + + #region Terminal Management + + /// + /// The terminal immediately performs a reversal of the last completed transaction if no Transaction Id is set. + /// + /// Amount to be passed for cancel request. + /// TerminalManageBuilder + TerminalManageBuilder Reverse(decimal? amount = null); + + #endregion + + #region Pay@Table Feature + + /// + /// Response to terminal after Pay@Table request has been made. + /// + /// + /// + TerminalAuthBuilder PayAtTableResponse(); + + #endregion } } diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs index 99058151..343b2eb8 100644 --- a/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs +++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalAuthBuilder.cs @@ -2,6 +2,7 @@ using GlobalPayments.Api.Entities; using GlobalPayments.Api.PaymentMethods; using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico; namespace GlobalPayments.Api.Terminals.Builders { public class TerminalAuthBuilder : TerminalBuilder { @@ -10,8 +11,9 @@ public class TerminalAuthBuilder : TerminalBuilder { internal decimal? Amount { get; set; } internal string AuthCode { get { - if (PaymentMethod is TransactionReference) + if (PaymentMethod is TransactionReference) { return (PaymentMethod as TransactionReference).AuthCode; + } return null; } } @@ -30,11 +32,19 @@ internal string AuthCode { internal string TaxExemptId { get; set; } internal string TransactionId { get { - if (PaymentMethod is TransactionReference) + if (PaymentMethod is TransactionReference) { return (PaymentMethod as TransactionReference).TransactionId; + } return null; } } + internal string CurrencyCode { get; set; } + internal PaymentMode PaymentMode { get; set; } + internal string TableNumber { get; set; } + internal TaxFreeType? TaxFreeType { get; set; } + internal PATPaymentMode? AdditionalMessage { get; set; } + internal PATResponseType? PayAtTableResponse { get; private set; } + public string FilePath { get; private set; } public TerminalAuthBuilder WithAddress(Address address) { Address = address; @@ -48,9 +58,16 @@ public TerminalAuthBuilder WithAmount(decimal? amount) { Amount = amount; return this; } + + /// + /// Sets the authorization code for the transaction. + /// + /// Authorization Code + /// public TerminalAuthBuilder WithAuthCode(string value) { - if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) + if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) { PaymentMethod = new TransactionReference(); + } (PaymentMethod as TransactionReference).AuthCode = value; return this; } @@ -64,6 +81,12 @@ public TerminalAuthBuilder WithAutoSubstantiation(AutoSubstantiation value) { AutoSubstantiation = value; return this; } + + /// + /// Sets the cash back for the transaction. + /// + /// + /// public TerminalAuthBuilder WithCashBack(decimal? amount) { CashBackAmount = amount; return this; @@ -126,9 +149,80 @@ public TerminalAuthBuilder WithTransactionId(string value) { return this; } - internal TerminalAuthBuilder(TransactionType type, PaymentMethodType paymentType) : base(type, paymentType) { + /// + /// Sets the currency code for the transaction. + /// + /// Currency Code + /// + public TerminalAuthBuilder WithCurrencyCode(string value) { + CurrencyCode = value; + return this; + } + + /// + /// Sets the payment mode for the transaction. + /// + /// Payment Mode + /// + public TerminalAuthBuilder WithPaymentMode(PaymentMode value) { + PaymentMode = value; + return this; + } + + /// + /// Sets the payment mode for the Pay@Table feature + /// + /// Pay@Table Payment Mode + /// + public TerminalAuthBuilder WithPaymentMode(PATPaymentMode additionalMessage) { + AdditionalMessage = additionalMessage; + return this; + } + + /// + /// Sets the table number for the transaction. + /// + /// Table Number + /// + public TerminalAuthBuilder WithTableNumber(string value) { + TableNumber = value; + return this; } + /// + /// Method used for requesting a Tax Free Refund Payment type transaction. + /// + /// + /// Payment Type of refund. Either Cash or Credit + /// + /// + public TerminalAuthBuilder WithTaxFree(TaxFreeType taxFreeType) { + TaxFreeType = taxFreeType; + return this; + } + + public TerminalAuthBuilder WithPayAtTableResponseType(PATResponseType response) { + PayAtTableResponse = response; + return this; + } + + /// + /// Sets the path of the XML Document. + /// + /// XML Document Path + /// + public TerminalAuthBuilder WithXMLPath(string filePath) { + FilePath = filePath; + return this; + } + + internal TerminalAuthBuilder(TransactionType type, PaymentMethodType paymentType) : base(type, paymentType) { } + + /// + /// Executes the transaction. + /// + /// + /// public override ITerminalResponse Execute(string configName = "default") { base.Execute(configName); diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs index 8fd725c4..06e2ab68 100644 --- a/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs +++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalManageBuilder.cs @@ -1,6 +1,7 @@ using GlobalPayments.Api.Entities; using GlobalPayments.Api.PaymentMethods; using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico; namespace GlobalPayments.Api.Terminals.Builders { public class TerminalManageBuilder : TerminalBuilder { @@ -10,12 +11,32 @@ public class TerminalManageBuilder : TerminalBuilder { internal decimal? Gratuity { get; set; } internal string TransactionId { get { - if (PaymentMethod is TransactionReference) + if (PaymentMethod is TransactionReference) { return (PaymentMethod as TransactionReference).TransactionId; + } + return null; + } + } + internal string CurrencyCode { get; set; } + internal PaymentMode PaymentMode { get; set; } + internal string AuthCode { + get { + if (PaymentMethod is TransactionReference) + return (PaymentMethod as TransactionReference).AuthCode; return null; } } + /// + /// Sets the currency code for the transaction. + /// + /// Currency Code + /// + public TerminalManageBuilder WithCurrencyCode(string value) { + CurrencyCode = value; + return this; + } + public TerminalManageBuilder WithAmount(decimal? amount) { Amount = amount; return this; @@ -32,10 +53,25 @@ public TerminalManageBuilder WithGratuity(decimal? amount) { Gratuity = amount; return this; } + + /// + /// Sets the authorization code for the transaction. + /// + /// Authorization Code + /// + public TerminalManageBuilder WithAuthCode(string value) { + if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) { + PaymentMethod = new TransactionReference(); + } + (PaymentMethod as TransactionReference).AuthCode = value; + return this; + } + public TerminalManageBuilder WithTransactionId(string value) { if (PaymentMethod == null || !(PaymentMethod is TransactionReference)) PaymentMethod = new TransactionReference(); (PaymentMethod as TransactionReference).TransactionId = value; + return this; } @@ -57,7 +93,7 @@ public override byte[] Serialize(string configName = "default") { } protected override void SetupValidations() { - Validations.For(TransactionType.Capture).Check(() => TransactionId).IsNotNull(); + Validations.For(TransactionType.Capture).When(() => AuthCode).IsNull().Check(() => TransactionId).IsNotNull(); Validations.For(TransactionType.Void).When(() => ClientTransactionId).IsNull().Check(() => TransactionId).IsNotNull(); Validations.For(PaymentMethodType.Gift).Check(() => Currency).IsNotNull(); } diff --git a/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs b/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs index 56156875..454f4979 100644 --- a/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs +++ b/src/GlobalPayments.Api/Terminals/Builders/TerminalReportBuilder.cs @@ -1,4 +1,5 @@ using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico; using GlobalPayments.Api.Terminals.PAX; using System; using System.Linq; @@ -7,6 +8,8 @@ namespace GlobalPayments.Api.Terminals.Builders { public class TerminalReportBuilder { internal TerminalReportType ReportType { get; set; } + internal ReceiptType ReceiptType { get; set; } + internal ReportType? Type { get; set; } private TerminalSearchBuilder _searchBuilder; internal TerminalSearchBuilder SearchBuilder { @@ -22,6 +25,14 @@ public TerminalReportBuilder(TerminalReportType reportType) { ReportType = reportType; } + public TerminalReportBuilder(ReceiptType receiptType) { + ReceiptType = receiptType; + } + + public TerminalReportBuilder(ReportType reportType) { + Type = reportType; + } + public TerminalSearchBuilder Where(PaxSearchCriteria criteria, T value) { return SearchBuilder.And(criteria, value); } diff --git a/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs b/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs index f200899b..4d43c924 100644 --- a/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs +++ b/src/GlobalPayments.Api/Terminals/ConnectionConfig.cs @@ -3,31 +3,27 @@ using GlobalPayments.Api.Terminals.HPA; using GlobalPayments.Api.Terminals.Abstractions; using GlobalPayments.Api.Terminals.Genius; +using System.IO.Ports; +using GlobalPayments.Api.Terminals.Ingenico; namespace GlobalPayments.Api.Terminals { public enum ConnectionModes { SERIAL, TCP_IP, SSL_TCP, - HTTP + HTTP, + TCP_IP_SERVER, + PAY_AT_TABLE } public enum BaudRate { + r9600 = 9600, r38400 = 38400, r57600 = 57600, r19200 = 19200, r115200 = 115200 } - public enum Parity { - None = 0, - Odd, - Even, - } - public enum StopBits { - One = 1, - Two - } public enum DataBits { Seven = 7, Eight = 8 @@ -47,6 +43,7 @@ public interface ITerminalConfiguration { Parity Parity { get; set; } StopBits StopBits { get; set; } DataBits DataBits { get; set; } + Handshake Handshake { get; set; } // Timeout int Timeout { get; set; } @@ -62,6 +59,7 @@ public class ConnectionConfig : Configuration, ITerminalConfiguration { public Parity Parity { get; set; } public StopBits StopBits { get; set; } public DataBits DataBits { get; set; } + public Handshake Handshake { get; set; } public string IpAddress { get; set; } public string Port { get; set; } public IRequestIdProvider RequestIdProvider { get; set; } @@ -84,8 +82,14 @@ internal override void ConfigureContainer(ConfiguredServices services) { services.DeviceController = new HpaController(this); break; //case DeviceType.GENIUS: - //services.DeviceController = new GeniusController(this); - //break; + //services.DeviceController = new GeniusController(this); + //break; + case DeviceType.Ingenico_EPOS_Desk5000: + case DeviceType.Ingenico_EPOS_Lane3000: + case DeviceType.Ingenico_EPOS_Move3500: + case DeviceType.Ingenico_EPOS_Move5000: + services.DeviceController = new IngenicoController(this); + break; default: break; } @@ -97,7 +101,7 @@ internal override void Validate() { if (ConnectionMode == ConnectionModes.TCP_IP || ConnectionMode == ConnectionModes.HTTP) { if (string.IsNullOrEmpty(IpAddress)) throw new ApiException("IpAddress is required for TCP or HTTP communication modes."); - if(string.IsNullOrEmpty(Port)) + if (string.IsNullOrEmpty(Port)) throw new ApiException("Port is required for TCP or HTTP communication modes."); } } diff --git a/src/GlobalPayments.Api/Terminals/ControlCodes.cs b/src/GlobalPayments.Api/Terminals/ControlCodes.cs index af2587a9..ac4fb88e 100644 --- a/src/GlobalPayments.Api/Terminals/ControlCodes.cs +++ b/src/GlobalPayments.Api/Terminals/ControlCodes.cs @@ -15,6 +15,11 @@ public enum ControlCodes : byte { GS = 0x1D, EOT = 0x04, + // Ingenico Currency Symbol + NUM = 0x23, + GBP = 0xA3, + SP = 0x20, + // PAX Specific ?? US = 0x1F, RS = 0x1E, diff --git a/src/GlobalPayments.Api/Terminals/DeviceController.cs b/src/GlobalPayments.Api/Terminals/DeviceController.cs index c494ca55..8d6e6028 100644 --- a/src/GlobalPayments.Api/Terminals/DeviceController.cs +++ b/src/GlobalPayments.Api/Terminals/DeviceController.cs @@ -33,6 +33,8 @@ public IRequestIdProvider RequestIdProvider { } public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; internal DeviceController(ITerminalConfiguration settings) { _settings = settings; @@ -40,6 +42,14 @@ internal DeviceController(ITerminalConfiguration settings) { _connector.OnMessageSent += (message) => { OnMessageSent?.Invoke(message); }; + + _connector.OnBroadcastMessage += (code, message) => { + OnBroadcastMessage?.Invoke(code, message); + }; + + _connector.OnPayAtTableRequest += (request) => { + OnPayAtTableRequest?.Invoke(request); + }; } public byte[] Send(IDeviceMessage message) { diff --git a/src/GlobalPayments.Api/Terminals/DeviceInterface.cs b/src/GlobalPayments.Api/Terminals/DeviceInterface.cs index 3813a178..be4148a7 100644 --- a/src/GlobalPayments.Api/Terminals/DeviceInterface.cs +++ b/src/GlobalPayments.Api/Terminals/DeviceInterface.cs @@ -1,6 +1,8 @@ -using GlobalPayments.Api.Entities; +using System; +using GlobalPayments.Api.Entities; using GlobalPayments.Api.Terminals.Abstractions; using GlobalPayments.Api.Terminals.Builders; +using GlobalPayments.Api.Terminals.Ingenico; using GlobalPayments.Api.Terminals.Messaging; namespace GlobalPayments.Api.Terminals { @@ -9,17 +11,29 @@ public abstract class DeviceInterface : IDeviceInterface where T : DeviceCont protected IRequestIdProvider _requestIdProvider; public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; internal DeviceInterface(T controller) { _controller = controller; _controller.OnMessageSent += (message) => { OnMessageSent?.Invoke(message); }; + + _controller.OnBroadcastMessage += (code, message) => { + OnBroadcastMessage?.Invoke(code, message); + }; + + _controller.OnPayAtTableRequest += (request) => { + OnPayAtTableRequest?.Invoke(request); + }; + + _requestIdProvider = _controller.RequestIdProvider; } #region Admin Methods - public virtual void Cancel() { + public virtual IDeviceResponse Cancel() { throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); } @@ -78,6 +92,22 @@ public virtual IDeviceResponse SetStoreAndForwardMode(bool enabled) { public virtual IDeviceResponse StartCard(PaymentMethodType paymentMethodType) { throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); } + + public virtual IDeviceResponse Duplicate() { + throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); + } + + public virtual IDeviceResponse GetTerminalStatus() { + throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); + } + + public virtual IDeviceResponse GetTerminalConfiguration() { + throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); + } + + public virtual IDeviceResponse TestConnection() { + throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); + } #endregion #region Batching @@ -94,6 +124,15 @@ public virtual IEODResponse EndOfDay() { public virtual TerminalReportBuilder LocalDetailReport() { throw new UnsupportedTransactionException("This function is not supported by the currently configured device."); } + public virtual TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET) { + return new TerminalReportBuilder(type); + } + + public virtual TerminalReportBuilder GetReport(Ingenico.ReportType type) { + //return new TerminalReportBuilder(TerminalReportType.LocalDetailReport).WithReportType(type); + return new TerminalReportBuilder(type); + } + #endregion #region Transactions @@ -120,8 +159,10 @@ public virtual TerminalAuthBuilder Sale(decimal? amount = null) { return new TerminalAuthBuilder(TransactionType.Sale, PaymentMethodType.Credit) .WithAmount(amount); } + public virtual TerminalAuthBuilder Verify() { - return new TerminalAuthBuilder(TransactionType.Verify, PaymentMethodType.Credit); + return new TerminalAuthBuilder(TransactionType.Verify, PaymentMethodType.Credit) + .WithAmount(6.18m); } public virtual TerminalManageBuilder Void() { return new TerminalManageBuilder(TransactionType.Void, PaymentMethodType.Credit); @@ -137,5 +178,25 @@ public void Dispose() { _controller.Dispose(); } #endregion + + #region For clarification + + #region Transaction Management + public virtual TerminalManageBuilder Reverse(decimal? amount = null) { + return new TerminalManageBuilder(TransactionType.Reversal, PaymentMethodType.Credit) + .WithAmount(amount); + } + + #endregion + + #region Pay@Table Methods + + public virtual TerminalAuthBuilder PayAtTableResponse() { + return new TerminalAuthBuilder(TransactionType.PayAtTable, PaymentMethodType.Other); + } + + #endregion + + #endregion } } diff --git a/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs b/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs index 55eaea1c..eaa44b98 100644 --- a/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs +++ b/src/GlobalPayments.Api/Terminals/Genius/Interfaces/GeniusHttpInterface.cs @@ -17,6 +17,8 @@ internal class GeniusHttpInterface : IDeviceCommInterface { private GeniusConfig _gatewayConfig; public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; public GeniusHttpInterface(ITerminalConfiguration settings) { _settings = settings; @@ -66,9 +68,9 @@ private async Task StageTransactionAsync(IDeviceMessage message try { string payload = Encoding.UTF8.GetString(message.GetSendBuffer()); - string url = ServiceEndpoints.GENIUS_TERMINAL_TEST; + string url = ServiceEndpoints.GENIUS_TERMIAL_TEST; if (_gatewayConfig.Environment.Equals(Entities.Environment.PRODUCTION)) { - url = ServiceEndpoints.GENIUS_TERMINAL_PRODUCTION; + url = ServiceEndpoints.GENIUS_TERMIAL_PRODUCTION; } HttpClient httpClient = new HttpClient { diff --git a/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs b/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs index 71be05bd..9f4c4226 100644 --- a/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs +++ b/src/GlobalPayments.Api/Terminals/HPA/HpaInterface.cs @@ -14,9 +14,10 @@ internal HpaInterface(HpaController controller) : base(controller) { } #region Admin Messages - public override void Cancel() { + public override IDeviceResponse Cancel() { // TODO: Cancel for HPA? Reset(); + return null; } public override IDeviceResponse CloseLane() { diff --git a/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs b/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs index 8ebdb03b..af4bae6a 100644 --- a/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs +++ b/src/GlobalPayments.Api/Terminals/HPA/Interfaces/HpaTcpInterface.cs @@ -16,6 +16,8 @@ internal class HpaTcpInterface : IDeviceCommInterface { List message_queue; public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; public HpaTcpInterface(ITerminalConfiguration settings) { this._settings = settings; diff --git a/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs b/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs index a33768a3..0a7ec44b 100644 --- a/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs +++ b/src/GlobalPayments.Api/Terminals/HPA/Responses/SipBaseResponse.cs @@ -41,7 +41,7 @@ public SipBaseResponse(byte[] buffer, params string[] messageIds) { RequestId = root.GetValue("RequestId"); ResponseId = root.GetValue("ResponseId"); Status = root.GetValue("MultipleMessage"); - DeviceResponseCode = NormalizeResponse(root.GetValue("Result")); + DeviceResponseCode = NormalizeResponse(root.GetValue("Result")); DeviceResponseText = root.GetValue("ResultText"); if ((DeviceResponseCode.Equals("00", StringComparison.OrdinalIgnoreCase)) || (DeviceResponseCode.Equals("2501", StringComparison.OrdinalIgnoreCase))){ diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs new file mode 100644 index 00000000..16a73bf3 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoController.cs @@ -0,0 +1,310 @@ +using GlobalPayments.Api.Builders; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Builders; +using GlobalPayments.Api.Terminals.Ingenico.Responses; +using GlobalPayments.Api.Utils; +using System; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class IngenicoController : DeviceController { + public IngenicoController(ITerminalConfiguration settings) : base(settings) { } + + internal override IDeviceInterface ConfigureInterface() { + if (_interface == null) { + _interface = new IngenicoInterface(this); + } + return _interface; + } + + internal override IDeviceCommInterface ConfigureConnector() { + switch (_settings.ConnectionMode) { + case ConnectionModes.SERIAL: + return new IngenicoSerialInterface(_settings); + case ConnectionModes.TCP_IP_SERVER: + case ConnectionModes.PAY_AT_TABLE: + return new IngenicoTcpInterface(_settings); + default: + throw new NotImplementedException(); + } + } + + #region overrides + internal override ITerminalResponse ManageTransaction(TerminalManageBuilder builder) { + IDeviceMessage request = BuildManageTransaction(builder); + + if (builder.TransactionType == TransactionType.Reversal) { + return DoReverseRequest(request); + } else { + return DoRequest(request); + } + } + + internal override ITerminalReport ProcessReport(TerminalReportBuilder builder) { + IDeviceMessage request; + if (builder.Type != null) { + request = BuildReportTransaction(builder); + return ReportRequest(request); + } else { + request = TerminalUtilities.BuildRequest(INGENICO_REQ_CMD.RECEIPT.FormatWith(builder.ReceiptType), settings: _settings.ConnectionMode); + return XmlRequest(request); + } + } + + internal override ITerminalResponse ProcessTransaction(TerminalAuthBuilder builder) { + IDeviceMessage request = BuildProcessTransaction(builder); + return DoRequest(request); + } + + internal override byte[] SerializeRequest(TerminalAuthBuilder builder) { + return BuildProcessTransaction(builder).GetSendBuffer(); + } + + internal override byte[] SerializeRequest(TerminalManageBuilder builder) { + return BuildManageTransaction(builder).GetSendBuffer(); + } + + internal override byte[] SerializeRequest(TerminalReportBuilder builder) { + throw new NotImplementedException(); + } + #endregion + + #region Methods + internal IDeviceMessage BuildManageTransaction(TerminalManageBuilder builder) { + int refNumber = builder.ReferenceNumber; + decimal? amount = ValidateAmount(builder.Amount); + int returnRep = 1; + int paymentMode = ValidatePaymentMode(builder.PaymentMode); + int? paymentType = (int?)((IngenicoInterface)_interface).paymentMethod ?? 0; + string currencyCode = (string.IsNullOrEmpty(builder.CurrencyCode) ? "826" : builder.CurrencyCode); + string privData = "EXT0100000"; + int immediateAns = 0; + int forceOnline = 0; + string extendedData = "0000000000"; + + // Validation for Authcode + if (!string.IsNullOrEmpty(builder.AuthCode)) { + extendedData = INGENICO_REQ_CMD.AUTHCODE.FormatWith(builder.AuthCode); + } + // Validation for Reversal with Transaction Id value in Extended data + else if (builder.TransactionId != null && builder.TransactionType == TransactionType.Reversal) { + extendedData = INGENICO_REQ_CMD.REVERSE_WITH_ID.FormatWith(builder.TransactionId); + } else if (builder.TransactionType == TransactionType.Reversal) { + extendedData = INGENICO_REQ_CMD.REVERSE; + } + + // Concat all data to create a request string. + var sb = new StringBuilder(); + + sb.Append(builder.ReferenceNumber.ToString("00")); + sb.Append(amount?.ToString("00000000")); + sb.Append(returnRep); + sb.Append(paymentMode); + sb.Append(paymentType); + sb.Append(currencyCode); + sb.Append(privData); + sb.Append("A01" + immediateAns); + sb.Append("B01" + forceOnline); + sb.Append(extendedData); + + return TerminalUtilities.BuildRequest(sb.ToString(), _settings.ConnectionMode); + } + + internal IDeviceMessage BuildProcessTransaction(TerminalAuthBuilder builder) { + string message = string.Empty; + + // Pay@Table functionalities + if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) { + if (builder.PayAtTableResponse != null && builder.AdditionalMessage != null) { + StringBuilder payAtTableResp = new StringBuilder(); + string privData = builder.PayAtTableResponse.ToString(); + + if (privData.Length < 10) { + for (int i = privData.Length; i < 10; i++) { + privData += (char)ControlCodes.SP; + } + } + + decimal? patAmount = ValidateAmount(builder.Amount); + string patCurrency = ValidateCurrency(builder.CurrencyCode); + int additionalMsg = (int?)builder.AdditionalMessage ?? 0; + + payAtTableResp.Append(PAYATTABLE_RESP.PAT_EPOS_NUMBER); + payAtTableResp.Append(PAYATTABLE_RESP.PAT_STATUS); + payAtTableResp.Append(patAmount?.ToString("00000000")); + payAtTableResp.Append(additionalMsg); + payAtTableResp.Append(patCurrency); + payAtTableResp.Append(privData); + + message = payAtTableResp.ToString(); + } else if (!string.IsNullOrEmpty(builder.FilePath)) { + message = TerminalUtilities.GetTextContent(builder.FilePath); + } else { + throw new BuilderException("PayAtTable Response type and Additional message cannot be null."); + } + } else { + // Standard functionalities + int referenceNumber = builder.ReferenceNumber; + decimal? amount = builder.Amount; + int returnRep = 1; + int paymentMode = 0; + int paymentType = (int)((IngenicoInterface)_interface).paymentMethod; + string currencyCode = "826"; + string privateData = "EXT0100000"; + int immediateAnswer = 0; + int forceOnline = 0; + string extendedData = "0000000000"; + + decimal? cashbackAmount = builder.CashBackAmount; + string authCode = builder.AuthCode; + string tableId = builder.TableNumber; + + // Validations + if (referenceNumber == default(int) && RequestIdProvider != null) { + referenceNumber = RequestIdProvider.GetRequestId(); + } + amount = ValidateAmount(amount); + + // Tax free Refund handling + if (paymentType == (int)PaymentType.Refund && builder.TaxFreeType == TaxFreeType.CASH) { + paymentType = (int)PaymentType.TaxFreeCashRefund; + } else if (paymentType == (int)PaymentType.Refund && builder.TaxFreeType == TaxFreeType.CREDIT) { + paymentType = (int)PaymentType.TaxFreeCreditRefund; + + } + + paymentMode = ValidatePaymentMode(builder.PaymentMode); + currencyCode = ValidateCurrency((string.IsNullOrEmpty(builder.CurrencyCode) ? currencyCode : builder.CurrencyCode)); + + if (!string.IsNullOrEmpty(tableId)) { + ValidateTableId(tableId); + extendedData = INGENICO_REQ_CMD.TABLE_WITH_ID.FormatWith(tableId); + } else if (!string.IsNullOrEmpty(authCode)) { + extendedData = INGENICO_REQ_CMD.AUTHCODE.FormatWith(authCode); + } else if (cashbackAmount != null) { + ValidateCashbackAmount(cashbackAmount); + cashbackAmount *= 100; + extendedData = INGENICO_REQ_CMD.CASHBACK.FormatWith(Convert.ToInt64(Math.Round(cashbackAmount.Value, MidpointRounding.AwayFromZero))); + } + + // Concat all data to create a request string. + var sb = new StringBuilder(); + + sb.Append(referenceNumber.ToString("00").Substring(0, 2)); + sb.Append(amount?.ToString("00000000")); + sb.Append(returnRep); + sb.Append(paymentMode); + sb.Append(paymentType); + sb.Append(currencyCode); + sb.Append(privateData); + sb.Append("A01" + immediateAnswer); + sb.Append("B01" + forceOnline); + sb.Append(extendedData); + + message = sb.ToString(); + } + + return TerminalUtilities.BuildRequest(message, _settings.ConnectionMode); + } + + internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder) { + if (!IsObjectNullOrEmpty(builder.Type)) { + string message = INGENICO_REQ_CMD.REPORT.FormatWith(builder.Type); + return TerminalUtilities.BuildRequest(message, settings: _settings.ConnectionMode); + } else { + throw new BuilderException("Type of report is missing in request."); + } + } + + internal IngenicoTerminalReportResponse XmlRequest(IDeviceMessage request) { + byte[] send = Send(request); + return new IngenicoTerminalReportResponse(send); + } + + internal ReportResponse ReportRequest(IDeviceMessage request) { + byte[] send = Send(request); + return new ReportResponse(send); + } + + #region Validations + private bool IsObjectNullOrEmpty(object value) { + bool response = false; + if (value == null || string.IsNullOrWhiteSpace(value.ToString())) { + response = true; + } else { + response = false; + } + + return response; + } + + private void ValidateTableId(string value) { + if (value.Length > 8) { + throw new BuilderException("The maximum length for table number is 8."); + } + } + + private void ValidateCashbackAmount(decimal? value) { + if (value >= 1000000m) { + throw new BuilderException("Cashback Amount exceed."); + } + if (value < 0m) { + throw new BuilderException("Cashback Amount must not be in less than zero."); + } + } + + private int ValidatePaymentMode(PaymentMode? paymentMode) { + if (IsObjectNullOrEmpty(paymentMode)) { + paymentMode = PaymentMode.APPLICATION; + } + + return (int)paymentMode; + } + + private string ValidateCurrency(string currencyCode) { + if (!string.IsNullOrWhiteSpace(currencyCode)) { + currencyCode = currencyCode.PadLeft(3, '0'); + } else { + currencyCode = "826"; + } + + return currencyCode.Substring(0, 3); + } + + private decimal? ValidateAmount(decimal? amount) { + if (amount != null && amount > 0 && amount < 1000000m) { + amount *= 100; + } else if (amount == null) { + throw new BuilderException("Amount can not be null."); + } else if (amount >= 1000000m) { + throw new BuilderException("Amount exceed."); + } else { + throw new BuilderException("Invalid input amount."); + } + + return amount; + } + + #endregion + + #endregion + + #region Request + internal IngenicoTerminalResponse DoRequest(IDeviceMessage request) { + byte[] response = Send(request); + return new IngenicoTerminalResponse(response); + } + + private CancelResponse DoCancelRequest(IDeviceMessage request) { + byte[] response = Send(request); + return new CancelResponse(response); + } + + private IngenicoTerminalResponse DoReverseRequest(IDeviceMessage request) { + byte[] response = Send(request); + return new IngenicoTerminalResponse(response); + } + #endregion + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs new file mode 100644 index 00000000..04db6b97 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoEnums.cs @@ -0,0 +1,306 @@ + +using GlobalPayments.Api.Utils; +using System; + +namespace GlobalPayments.Api.Terminals.Ingenico { + internal class INGENICO_REQ_CMD { + // Request Transactions + public const string AUTHCODE = "AUTHCODE={0}"; + public const string CASHBACK = "CASHB={0};"; + + // Request Commands + /** + * REQUEST_MESSAGE is hard-coded in order to fulfill the request message frame 3 + * and values in here are ignored in the terminal. + */ + public const string REQUEST_MESSAGE = "0100000001100826EXT0100000A010B010"; + public const string CANCEL = "CMD=CANCEL"; + public const string DUPLICATE = "CMD=DUPLIC"; + public const string REVERSE = "CMD=REVERSE"; + public const string REVERSE_WITH_ID = "CMD=REV{0}"; + public const string TABLE_WITH_ID = "CMD=ID{0}"; + + // Terminal Management Commands + public const string STATE = "CMD=STATE"; + public const string PID = "CMD=PID"; + public const string LOGON = "CMD=LOGON"; + public const string RESET = "CMD=RESET"; + public const string CALLTMS = "CMD=CALLTMS"; + + // Request Report + public const string REPORT = "0100000001100826EXT0100000A010B010CMD={0}"; + public const string RECEIPT = "0100000001100826EXT0100000A010B010CMD={0}"; + } + + internal class INGENICO_GLOBALS { + public const string BROADCAST = "BROADCAST CODE"; + public const string CANCEL = "CMD=CANCEL"; + public const string TID_CODE = "TID CODE"; + public const string KEEP_ALIVE_RESPONSE = " OK"; + public static bool KeepAlive = true; + public const int IP_PORT = 18101; + public const int RAW_RESPONSE_LENGTH = 80; + public const string MGMT_SCOPE = "root\\CIMV2"; + public const string MGMT_QUERY = "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\""; + public const int MSG_FRAME_TWO_LEN = 80; + public const string XML_TAG = "", "LF" }; + public readonly static string INVALID = "\u0005\u0004"; + public readonly static string ENDXML = ""; + } + + internal static class PAYATTABLE_RESP { + public readonly static string PAT_EPOS_NUMBER = "00"; + public readonly static string PAT_STATUS = "0"; + } + + public enum ReceiptType { + TICKET, + SPLITR, + TAXFREE, + REPORT + } + + public enum ReportType { + EOD, + BANKING, + XBAL, + ZBAL + } + + public enum TransactionStatus { + SUCCESS = 0, + REFERRAL = 2, + CANCELLED_BY_USER = 6, + FAILED = 7, + RECEIVED = 9 + } + + public enum ReverseStatus { + REVERSAL_SUCCESS = 0, + REVERSAL_FAILED = 7, + NOTHING_TO_REVERSE = 9 + } + + public enum CancelStatus { + CANCEL_DONE = 9, + CANCEL_FAILED = 7 + } + + public enum DynamicCurrencyStatus { + CONVERSION_APPLIED = 1, + REJECTED = 0 + } + + public enum TransactionSubTypes { + [Description("S")] + SPLIT_SALE_TXN, + + [Description("D")] + DCC_TXN, + + [Description("R")] + REFERRAL_RESULT + } + + public enum TerminalStatus { + NOT_READY = 0, + READY = 1 + } + + public enum SalesMode { + STANDARD_SALE_MODE = 0, + VENDING_MODE = 1 + } + + public enum PaymentMethod { + Keyed = 1, + Swiped = 2, + Chip = 3, + Conctactless = 4 + } + + public enum PaymentType { + Sale = 0, + Refund = 1, + CompletionMode = 2, + PreAuthMode = 3, + TaxFreeCreditRefund = 4, + TaxFreeCashRefund = 5, + AccountVerification = 6, + ReferralConfirmation = 9 + } + + public enum PaymentMode { + APPLICATION = 0, + MAILORDER = 1 + } + + public enum TaxFreeType { + CREDIT = 0, + CASH = 1 + } + + // Codes in Response field for TLV format + public enum RepFieldCode { + AuthCode = 67, // C + CashbackAmount = 90, // Z + GratuityAmount = 89, // Y + FinalTransactionAmount = 77, // M + AvailableAmount = 65, // A + DccCurrency = 85, // U + DccConvertedAmount = 79, // O + PaymentMethod = 80, // P + TransactionSubType = 84, // T + SplitSalePaidAmount = 83, // S + DccOperationStatus = 68, // D + } + + public enum StateResponseCode { + Status = 83, // S + AppVersionNumber = 86, // V + HandsetNumber = 72, // H + TerminalId = 84, // T + } + + public enum TLVFormat { + /// + /// Format for transaction request. + /// + Standard, + + /// + /// Format for State command request. + /// + State, + + /// + /// Format ffor PayAtTable parsing + /// + PayAtTable + } + + public enum ParseFormat { + /// + /// For Transaction response parsing format + /// + Transaction = 0, + + /// + /// For State Command response parsing format + /// + State = 1, + + /// + /// For PID Command response parsing format + /// + PID = 2, + + /// + /// For Pay@Table functionalities in terminal + /// + PayAtTableRequest, + + /// + /// For XML commands response format + /// + XML + } + + /// + /// Type of request message from terminal during Pay@Table mode. + /// + public enum PATRequestType { + /// + /// Indicates a Table Lock + /// + TableLock = 1, + + /// + /// Indicates a Table Unlock + /// + TableUnlock = 2, + + /// + /// Indicates a Receipt for table + /// + TableReceipt = 3, + + /// + /// Indicates a List of Table. + /// + TableList = 4, + + /// + /// Indicates a Transaction Outcome request + /// + TransactionOutcome, + + /// + /// Indicates a Additional Message XML request + /// + AdditionalMessage, + + /// + /// Indicates a Transfer of Data request + /// + TransferData, + + /// + /// Indicates a Split Sale Report XML request + /// + SplitSaleReport, + + /// + /// Indicates a Ticket XML request + /// + Ticket, + + /// + /// Indicates a End of Day Report XML request + /// + EndOfDayReport + } + + /// + /// Confirmation options + /// + public enum PATResponseType { + /// + /// Positive confirmation + /// + CONF_OK, + + /// + /// Negative confirmation + /// + CONF_NOK + } + + /// + /// Indicates if the EPOS want to uses the additional Message + /// + public enum PATPaymentMode { + NO_ADDITIONAL = 0, + + USE_ADDITIONAL = 1 + } + + public enum PATPrivateDataCode { + WaiterId = 79, + TableId = 76, + TerminalId = 84, + TerminalCurrency = 67 + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs new file mode 100644 index 00000000..00964f3c --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/IngenicoInterface.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GlobalPayments.Api.Builders; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Builders; +using GlobalPayments.Api.Utils; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class IngenicoInterface : DeviceInterface, IDeviceInterface { + internal PaymentType? paymentMethod = null; + internal IngenicoInterface(IngenicoController controller) : base(controller) { + } + + #region Terminal Management/Admin Methods + public override IDeviceResponse GetTerminalStatus() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.STATE); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new StateResponse(response); + } + + public override IInitializeResponse Initialize() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.PID); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new POSIdentifierResponse(response); + } + + public override IDeviceResponse GetTerminalConfiguration() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.CALLTMS); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new IngenicoTerminalResponse(response); + } + + public override IDeviceResponse TestConnection() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.LOGON); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new IngenicoTerminalResponse(response); + } + + public override IDeviceResponse Reboot() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.RESET); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new IngenicoTerminalResponse(response); + } + + #endregion + + #region Payment Transaction Management + + public override TerminalAuthBuilder Sale(decimal? amount = null) { + paymentMethod = PaymentType.Sale; + return base.Sale(amount); + } + + public override TerminalAuthBuilder Refund(decimal? amount = null) { + paymentMethod = PaymentType.Refund; + return base.Refund(amount); + } + + public override TerminalManageBuilder Capture(decimal? amount = null) { + paymentMethod = PaymentType.CompletionMode; + return base.Capture(amount); + } + + /// + /// Authorize method is Equivalent of Pre-Authorisation from Ingenico + /// + /// + /// + public override TerminalAuthBuilder Authorize(decimal? amount = null) { + paymentMethod = PaymentType.PreAuthMode; + return base.Authorize(amount); + } + + public override TerminalAuthBuilder Verify() { + paymentMethod = PaymentType.AccountVerification; + return base.Verify(); + } + #endregion + + #region XML & Report Management + public override TerminalReportBuilder GetReport(ReportType type) { + return base.GetReport(type); + } + + public override TerminalReportBuilder GetLastReceipt(ReceiptType type = ReceiptType.TICKET) { + return base.GetLastReceipt(type); + } + #endregion + + #region Transaction Management + + public override IDeviceResponse Cancel() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.CANCEL); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new IngenicoTerminalResponse(response); + } + + public override TerminalManageBuilder Reverse(decimal? amount = null) { + if (amount != null) { + return base.Reverse(amount); + } + else throw new BuilderException("Amount can't be null."); + } + + ///// + ///// Duplicate falls under lost transaction recovery and we have mechanisms for this which we'll need to look into further + ///// + public override IDeviceResponse Duplicate() { + StringBuilder sb = new StringBuilder(); + sb.Append(INGENICO_REQ_CMD.REQUEST_MESSAGE); + sb.Append(INGENICO_REQ_CMD.DUPLICATE); + + byte[] response = _controller.Send(TerminalUtilities.BuildRequest(sb.ToString(), settings: _controller.ConnectionMode.Value)); + + return new IngenicoTerminalResponse(response); + } + + #endregion + + public override TerminalAuthBuilder PayAtTableResponse() { + return base.PayAtTableResponse(); + } + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs new file mode 100644 index 00000000..789efcbe --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoSerialInterface.cs @@ -0,0 +1,269 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Messaging; +using GlobalPayments.Api.Utils; +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace GlobalPayments.Api.Terminals.Ingenico { + internal class IngenicoSerialInterface : IDeviceCommInterface { + private SerialPort _serialPort; + private ITerminalConfiguration _settings; + + private bool _transComplete; + private bool _isResult; + private bool _isAcknowledge; + private bool _isBroadcast; + private bool _isXML; + private volatile bool _exit; + + private List _messageResponse; + private string _bufferReceived = string.Empty; + private StringBuilder _report = new StringBuilder(); + private static readonly object _lock = new object(); + + public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; // not required for this connection mode + + public IngenicoSerialInterface(ITerminalConfiguration settings) { + _settings = settings; + Connect(); + } + + public void Connect() { + if (_settings == null) { + throw new ConfigurationException("Please create connection between device and serial port."); + } + + if (_settings.Timeout <= 0) { + _settings.Timeout = Timeout.Infinite; + } + + if (_serialPort == null) { + string portName = "COM{0}".FormatWith(_settings.Port); + + _serialPort = new SerialPort() { + PortName = portName, + BaudRate = (int)_settings.BaudRate, + DataBits = (int)_settings.DataBits, + StopBits = _settings.StopBits, + Parity = _settings.Parity, + Handshake = _settings.Handshake, + RtsEnable = true, + DtrEnable = true, + ReadTimeout = _settings.Timeout + }; + + if (_serialPort == null) { + throw new ConfigurationException("Cannot connect to the terminal."); + } + + if (!_serialPort.IsOpen) { + _serialPort.DataReceived += new SerialDataReceivedEventHandler(Serial_DataReceived); + _serialPort.Open(); + } + } else { + throw new ConfigurationException("Serial port is already open."); + } + } + + public void Disconnect() { + _serialPort.Close(); + _serialPort?.Dispose(); + _serialPort = null; + } + + private void Serial_DataReceived(object sender, SerialDataReceivedEventArgs e) { + var serial = (SerialPort)sender; + + while (!_exit) { + try { + Thread.Sleep(100); + _bufferReceived = serial.ReadExisting(); + + if (!string.IsNullOrEmpty(_bufferReceived)) { + _serialPort.ReadTimeout = _settings.Timeout; + + if (_bufferReceived.Equals(INGENICO_RESP.ACKNOWLEDGE)) { + _isAcknowledge = true; + break; + } else if (_bufferReceived.Equals(INGENICO_RESP.ENQUIRY)) { + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.ACK), 0, 1); + break; + } else if (_bufferReceived.Contains(INGENICO_GLOBALS.BROADCAST)) { + _isBroadcast = true; + break; + } else if (INGENICO_RESP.XML.Any(_bufferReceived.Contains)) { + _isXML = true; + break; + } else if (!_bufferReceived.Contains(INGENICO_RESP.INVALID) + && !_bufferReceived.Contains(INGENICO_GLOBALS.BROADCAST) + && !INGENICO_RESP.XML.Any(_bufferReceived.Contains)) { + _isResult = true; + break; + } + } + } finally { + lock (_lock) { + Monitor.Pulse(_lock); + } + } + }; + } + + private bool ValidateResponseLRC(string calculate, string actual) { + bool response = false; + + string calculateLRC = BitConverter.ToString(TerminalUtilities.CalculateLRC(calculate)); + string actualLRC = BitConverter.ToString(TerminalUtilities.CalculateLRC(actual)); + + if (actualLRC == calculateLRC) { + response = true; + } + + return response; + } + + private async Task WriteMessage(IDeviceMessage message) { + return await Task.Run(() => { + try { + int enquiryCount = 0; + _messageResponse = new List(); + + if (_serialPort == null) { + return false; + } + + do { + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.ENQ), 0, 1); + + if (!_isAcknowledge) { + Thread.Sleep(1000); + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.EOT), 0, 1); + enquiryCount++; + + if (enquiryCount.Equals(3)) { + throw new MessageException("Terminal did not respond in enquiry for three (3) times. Send aborted."); + } + } else { + do { + byte[] msg = message.GetSendBuffer(); + foreach (byte b in msg) { + byte[] _b = new byte[] { b }; + _serialPort.Write(_b, 0, 1); + } + + if (_isAcknowledge) { + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.EOT), 0, 1); + _isAcknowledge = false; + break; + } + } while (true); + + do { + Thread.Sleep(100); + if (_isBroadcast) { + byte[] bMsg = Encoding.ASCII.GetBytes(_bufferReceived); + BroadcastMessage broadcastMsg = new BroadcastMessage(bMsg); + OnBroadcastMessage?.Invoke(broadcastMsg.Code, broadcastMsg.Message); + _isBroadcast = false; + } + + if (_isXML) { + while (!_transComplete) { + if (_report.ToString().Contains(INGENICO_RESP.ENDXML)) { + string xmlData = _report.ToString().Substring(1, _report.ToString().Length - 3); + + if (MessageReceived(xmlData)) { + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.ACK), 0, 1); + _report = new StringBuilder(); + _isXML = false; + _transComplete = true; + } + } else { + _report.Append(_bufferReceived); + } + + Thread.Sleep(0500); + }; + } + + if (_isResult) { + string check = Encoding.UTF8.GetString(message.GetSendBuffer()); + string refNumber = check.Substring(0, 2); + + if (_bufferReceived.Contains(refNumber)) { + do { + string responseData = _bufferReceived.Substring(1, _bufferReceived.Length - 3); + string actualReceived = _bufferReceived.Substring(1, _bufferReceived.Length - 3); + bool validateLRC = ValidateResponseLRC(responseData, actualReceived); + + if (validateLRC) { + if (MessageReceived(responseData)) { + _serialPort.Write(BitConverter.GetBytes((char)ControlCodes.ACK), 0, 1); + _isResult = false; + _transComplete = true; + } + } + } while (!_transComplete); + } + } + } while (!_transComplete); + + return _transComplete; + } + } while (true); + } catch (ApiException e) { + throw new ApiException(e.Message); + } + }); + } + + public byte[] Send(IDeviceMessage message) { + try { + if (_serialPort != null) { + _transComplete = false; + _exit = false; + + string bufferSend = Encoding.ASCII.GetString(message.GetSendBuffer()); + OnMessageSent?.Invoke(bufferSend.Substring(1, bufferSend.Length - 3)); + + Task task = WriteMessage(message); + lock (_lock) { + while (!_transComplete) { + if (!Monitor.Wait(_lock, _settings.Timeout)) { + _exit = true; + _transComplete = true; + throw new ApiException("Terminal did not respond within timeout."); + } + } + } + + return _messageResponse.ToArray(); + } else { + throw new ConfigurationException("Terminal not connected."); + } + } catch (ApiException e) { + throw new ApiException(e.Message); + } + } + + private bool MessageReceived(string messageData) { + if (_messageResponse == null) { + return false; + } + + foreach (char b in messageData) { + _messageResponse.Add((byte)b); + } + + return true; + } + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs new file mode 100644 index 00000000..492cadb8 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/IngenicoTcpInterface.cs @@ -0,0 +1,326 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico.Requests; +using GlobalPayments.Api.Terminals.Messaging; +using GlobalPayments.Api.Utils; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace GlobalPayments.Api.Terminals.Ingenico { + internal class IngenicoTcpInterface : IDeviceCommInterface { + private volatile TcpClient _client; + private NetworkStream _stream; + private ITerminalConfiguration _settings; + private TcpListenerEx _listener; + private Socket _server; + private List _ipAddresses = new List(); + private BroadcastMessage _broadcastMessage; + private byte[] _termResponse; + private Thread _dataReceiving; + private bool _isKeepAlive; + private bool _isKeepAliveRunning; + private Exception _receivingException; + private bool _isResponseNeeded; + private volatile bool _readData; + private volatile bool _disposable; + private volatile bool _bufferSend; + + public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; + + public IngenicoTcpInterface(ITerminalConfiguration settings) { + _settings = settings; + _client = new TcpClient(); ; + _ipAddresses = new List(); + + InitializeServer(); + + // Start listening to port. + Connect(); + + // Accepting client connected to port. + AcceptingClient(); + } + + public void Connect() { + try { + if (!_listener.Active) { + _listener.Start(); + } else { + throw new ConfigurationException("Server already started."); + } + } catch (SocketException ex) { + throw new ConfigurationException(ex.Message); + } + } + + public void Disconnect() { + try { + if (_listener.Active) { + _readData = false; + _stream.Close(); + + // Closing and disposing current clients + if (!_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) { + while (true) { + if (_disposable) { + _client.Close(); + _client.Dispose(); + break; + } + } + } else { + _client.Close(); + _client.Dispose(); + } + + // Stopping server listening + _listener.Stop(); + _ipAddresses.Clear(); + } + } catch (Exception ex) { + throw new ConfigurationException(ex.Message); + } + } + + public byte[] Send(IDeviceMessage message) { + byte[] buffer = message.GetSendBuffer(); + _termResponse = null; + _bufferSend = false; + _isResponseNeeded = true; + + try { + // Validate if server is starting + if (!_listener.Active) { + throw new ConfigurationException("Server is not running."); + } + + // Validate keep alive for setting of timeout during Transaction + _stream.ReadTimeout = _settings.Timeout; + + if (_ipAddresses.Count > 0 || _client.Connected) { + _stream.WriteAsync(buffer, 0, buffer.Length).Wait(); + _bufferSend = true; + + if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) { + string data = Encoding.UTF8.GetString(buffer); + OnMessageSent?.Invoke(data.Substring(1, data.Length - 3)); + + return null; + } + + OnMessageSent?.Invoke(Encoding.UTF8.GetString(RemoveHeader(buffer))); + while (_termResponse == null) { + Thread.Sleep(100); + if (_receivingException != null) { + Exception ex = _receivingException; + _receivingException = null; + throw ex; + } + + if (_termResponse != null) { + // Remove timeout for stream read + if (!_isKeepAlive) { + _stream.ReadTimeout = -1; + } + + _isResponseNeeded = false; + _receivingException = null; + } + } + + return _termResponse; + } else { + throw new ConfigurationException("No terminal connected to server."); + } + } catch (Exception ex) { + throw new ApiException(ex.Message); + } + } + + #region Interface private Methods + private void InitializeServer() { + try { + if (_listener == null) { + int _port = INGENICO_GLOBALS.IP_PORT; // Default port. + if (!string.IsNullOrWhiteSpace(_settings.Port)) { + if (!int.TryParse(_settings.Port, out _port)) { + throw new ConfigurationException("Invalid port number."); + } + } + + _listener = new TcpListenerEx(IPAddress.Any, _port); + + // Set timeout for client to send data. + _server = _listener.Server; + + // Initialize keep Alive value to false. + _isKeepAlive = false; + _isKeepAliveRunning = false; + + _readData = true; + _disposable = false; + } else { + throw new ConfigurationException("Server already initialize."); + } + } catch (Exception e) { + throw new ConfigurationException(e.Message); + } + } + + private void AcceptingClient() { + try { + _client = _listener.AcceptTcpClient(); + _stream = _client.GetStream(); + _ipAddresses.Add(((IPEndPoint)_client.Client.RemoteEndPoint).Address); + + if (_settings.ConnectionMode != ConnectionModes.PAY_AT_TABLE) { + if (_settings.Timeout <= 0) { + _settings.Timeout = Timeout.Infinite; + } + + _stream.ReadTimeout = _settings.Timeout; + } + + // Start thread for handling keep alive request. + if (_dataReceiving == null || _dataReceiving.ThreadState != ThreadState.Running) { + _dataReceiving = new Thread(new ThreadStart(AnalyzeReceivedData)); + _dataReceiving.Start(); + } + } catch (Exception e) { + throw new ConfigurationException(e.Message); + } + } + + private bool isBroadcast(byte[] terminalResponse) { + return Encoding.UTF8.GetString(terminalResponse).Contains(INGENICO_GLOBALS.BROADCAST); + } + + private bool isKeepAlive(byte[] buffer) { + return Encoding.UTF8.GetString(buffer).Contains(INGENICO_GLOBALS.TID_CODE); + } + + private byte[] RemoveHeader(byte[] buffer) { + return buffer.SubArray(2, buffer.Length - 2); + } + + private byte[] KeepAliveResponse(byte[] buffer) { + if (buffer.Length > 0) { + var tIdIndex = Encoding.ASCII.GetString(buffer, 0, buffer.Length).IndexOf(INGENICO_GLOBALS.TID_CODE); + var tId = Encoding.ASCII.GetString(buffer, tIdIndex + 10, 8); + + var respData = INGENICO_GLOBALS.KEEP_ALIVE_RESPONSE.FormatWith(tId); + respData = TerminalUtilities.CalculateHeader(Encoding.ASCII.GetBytes(respData)) + respData; + return Encoding.ASCII.GetBytes(respData); + } else { + return null; + } + } + + private async void AnalyzeReceivedData() { + try { + var headerBuffer = new byte[2]; + while (_readData) { + // Pay@Table functionalities handling. + if (_settings.ConnectionMode.Equals(ConnectionModes.PAY_AT_TABLE)) { + byte[] buffer = new byte[8192]; + int bytesReceived = _stream.ReadAsync(buffer, 0, buffer.Length).Result; + + if (bytesReceived > 0) { + byte[] readBuffer = buffer.SubArray(0, bytesReceived); + string raw = Encoding.UTF8.GetString(readBuffer); + string dataETX = raw.Substring(1, raw.Length - 2); + + byte[] bufferLRC = TerminalUtilities.CalculateLRC(raw.Substring(raw.Length - 1)); + string receivedLRC = BitConverter.ToString(bufferLRC); + + byte[] calculateLRC = TerminalUtilities.CalculateLRC(dataETX); + string calculatedLRC = BitConverter.ToString(calculateLRC); + + if (receivedLRC.Equals(calculatedLRC)) { + string data = raw.Substring(1, raw.Length - 3); + byte[] patRequest = Encoding.UTF8.GetBytes(data); + OnPayAtTableRequest?.Invoke(new PATRequest(patRequest)); + } + } + } else { + // Standard functionalities handling + _stream.Read(headerBuffer, 0, headerBuffer.Length); + + if (!_readData) { + throw new Exception(); + } + + int dataLength = await Task.Run(() => TerminalUtilities.HeaderLength(headerBuffer)); + if (dataLength > 0) { + byte[] dataBuffer = new byte[dataLength]; + + var incomplete = true; + int offset = 0; + int tempLength = dataLength; + + do { + + // Read data + int bytesReceived = _stream.Read(dataBuffer, offset, tempLength); + if (!_readData) { + throw new Exception(); + } + if (bytesReceived != tempLength) { + offset += bytesReceived; + tempLength -= bytesReceived; + } else { + incomplete = false; + } + } while (incomplete); + + var readBuffer = new byte[dataLength]; + Array.Copy(dataBuffer, readBuffer, dataLength); + + if (isBroadcast(readBuffer)) { + _broadcastMessage = new BroadcastMessage(readBuffer); + OnBroadcastMessage?.Invoke(_broadcastMessage.Code, _broadcastMessage.Message); + } else if (isKeepAlive(readBuffer) && INGENICO_GLOBALS.KeepAlive) { + + _isKeepAlive = true; + + if (_isKeepAlive && !_isKeepAliveRunning) { + _stream.ReadTimeout = _settings.Timeout; + _isKeepAliveRunning = true; + } + + var keepAliveRep = KeepAliveResponse(readBuffer); + _stream.WriteAsync(keepAliveRep, 0, keepAliveRep.Length).Wait(); + } else { // Receiving request response data. + _termResponse = readBuffer; + } + } else { + _receivingException = new ApiException("No data received."); + } + } + } + } catch (Exception ex) { + if (_settings.ConnectionMode != ConnectionModes.PAY_AT_TABLE) { + if (_isResponseNeeded || _isKeepAlive) { + _receivingException = ex; + _stream.ReadTimeout = -1; + _isKeepAlive = false; + } + + if (_readData) { + AnalyzeReceivedData(); + } else { + _disposable = true; + } + } + } + } + #endregion + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs new file mode 100644 index 00000000..c15fcfad --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Interfaces/TcpListenerEx.cs @@ -0,0 +1,12 @@ +using System.Net; +using System.Net.Sockets; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class TcpListenerEx : TcpListener { + public TcpListenerEx(IPAddress localaddr, int port) : base(localaddr, port) { + + } + + public new bool Active { get { return base.Active; } } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs new file mode 100644 index 00000000..dcb90ea6 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/PATRequest.cs @@ -0,0 +1,115 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Utils; +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +namespace GlobalPayments.Api.Terminals.Ingenico.Requests { + public class PATRequest { + private byte[] _buffer; + + public PATRequestType RequestType { get; set; } + public string WaiterId { get; set; } + public string TableId { get; set; } + public string TerminalId { get; set; } + public string TerminalCurrency { get; set; } + public string XMLData { get; set; } + public TransactionOutcomeRequest TransactionOutcome { get; set; } + + public override string ToString() => Encoding.UTF8.GetString(_buffer); + + // Assign passed value of buffer into private variable. + public PATRequest(byte[] buffer) { + _buffer = buffer; + ParseData(); + } + + private void ParseData() { + string strBuffer = Encoding.UTF8.GetString(_buffer); + + // XML + if (strBuffer.Contains(INGENICO_GLOBALS.XML_TAG)) { + if (!strBuffer.EndsWith(">")) { + char[] xmlArr = strBuffer.ToCharArray(); + + for (int i = strBuffer.Length - 1; i <= strBuffer.Length; i--) { + if (xmlArr[i] == '>') { + XMLData = strBuffer.Substring(0, (i + 1)); + break; + } + } + } else { + XMLData = strBuffer; + } + + // Convert String to XML + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(XMLData); + + XmlElement root = xmlDoc.DocumentElement; + string rootTag = root.Name; + + if (rootTag == INGENICO_GLOBALS.ADDITIONAL_MSG) { + RequestType = PATRequestType.AdditionalMessage; + } else if (rootTag == INGENICO_GLOBALS.TRANSFER_DATA) { + RequestType = PATRequestType.TransferData; + } else if (rootTag == INGENICO_GLOBALS.TRANSACTION_XML) { + XmlNodeList nList = xmlDoc.GetElementsByTagName("RECEIPT"); + XmlNode node = nList.Item(0); + + if (node.NodeType == XmlNodeType.Element) { + XmlElement element = (XmlElement)node; + string sType = element.GetAttribute("STYPE"); + + if (sType.Equals("SPLITSALE REPORT")) { + RequestType = PATRequestType.SplitSaleReport; + } else if (sType.Equals("CUSTOMER")) { + RequestType = PATRequestType.Ticket; + } else { + RequestType = PATRequestType.EndOfDayReport; + } + } else { + throw new ApiException("First child node is not an element"); + } + } else { + throw new ApiException("The root tag of the xml cannot recognize"); + } + } else { + // Workaround for split sale but not final logic + if (strBuffer.ToLower().Contains("split_sale")) { + RequestType = PATRequestType.SplitSaleReport; + XMLData = strBuffer; + } + + // Message Frame 2 + else if (_buffer.Length >= INGENICO_GLOBALS.MSG_FRAME_TWO_LEN) { + RequestType = PATRequestType.TransactionOutcome; + TransactionOutcome = new TransactionOutcomeRequest(_buffer); + } else { + // Message Frame 1 + RequestType = (PATRequestType)strBuffer.Substring(11, 1).ToInt32(); + string privData = strBuffer.Substring(16); + + if (privData.Length < 55) { + switch (RequestType) { + case PATRequestType.TableLock: + case PATRequestType.TableUnlock: + TableId = privData; + break; + default: + break; + } + } else { + var tlvData = new TypeLengthValue(_buffer); + + WaiterId = tlvData.GetValue((byte)PATPrivateDataCode.WaiterId, typeof(string))?.ToString(); + TableId = tlvData.GetValue((byte)PATPrivateDataCode.TableId, typeof(string), TLVFormat.PayAtTable)?.ToString(); + TerminalId = tlvData.GetValue((byte)PATPrivateDataCode.TerminalId, typeof(string))?.ToString(); + TerminalCurrency = tlvData.GetValue((byte)PATPrivateDataCode.TerminalCurrency, typeof(string))?.ToString(); + } + } + } + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs new file mode 100644 index 00000000..1cb70cb7 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Requests/TransactionOutcomeRequest.cs @@ -0,0 +1,33 @@ +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico.Requests { + public class TransactionOutcomeRequest : DeviceResponse { + private byte[] _buffer; + + public new TransactionStatus Status { get; private set; } + public string Amount { get; private set; } + public string CurrencyCode { get; private set; } + public string PrivateData { get; private set; } + public DataResponse RepField { get; private set; } + + internal TransactionOutcomeRequest(byte[] buffer) { + _buffer = buffer; + ParseData(); + } + + private void ParseData() { + Status = (TransactionStatus)Encoding.UTF8.GetString(_buffer.SubArray(2, 1)).ToInt32(); + Amount = Encoding.UTF8.GetString(_buffer.SubArray(3, 8)); + RepField = new DataResponse(_buffer.SubArray(12, 55)); + CurrencyCode = Encoding.UTF8.GetString(_buffer.SubArray(67, 3)); + PrivateData = Encoding.UTF8.GetString(_buffer.SubArray(70, _buffer.Length - 70)); + DeviceResponseText = Encoding.UTF8.GetString(_buffer); + } + + public override string ToString() { + return DeviceResponseText; + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs new file mode 100644 index 00000000..77a6e50a --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/BroadcastMessage.cs @@ -0,0 +1,60 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Ingenico; +using System; +using System.Collections.Generic; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class BroadcastMessage { + private byte[] _buffer; + private string _code; + private string _message; + public string Code { + get { return _code; } + } + public string Message { + get { return _message; } + } + + private Dictionary _broadcastData = new Dictionary { + {"A0", "CONNECTING" }, + {"A1", "CONNECTION MADE" }, + {"A2", "APPROVED" }, + {"A3", "DECLINED" }, + {"A4", "INSERT CARD" }, + {"A5", "CARD ERROR" }, + {"A6", "PROCESSING ERROR" }, + {"A7", "REMOVE CARD" }, + {"A8", "TRY AGAIN" }, + {"A9", "PRESENT CARD" }, + {"AA", "RE-PRESENT CARD" }, + {"AB", "CARD NOT SUPPORTED" }, + {"AC", "PRESENT ONLY ONE CARD" }, + {"AD", "PLEASE WAIT" }, + {"AE", "BAD SWIPE" }, + {"AF", "CARD EXPIRED" }, + {"B0", "DECLINED BY CARD" }, + {"B1", "PIN ENTRY" }, + {"B2", "CASHBACK AMOUNT ENTRY" }, + {"B3", "PAPER OUT" }, + }; + + public BroadcastMessage(byte[] buffer) { + _buffer = buffer; + ParseBroadcast(_buffer); + } + + private void ParseBroadcast(byte[] broadBuffer) { + if (broadBuffer.Length > 0) { + var strBroadcast = ASCIIEncoding.UTF8.GetString(broadBuffer); + int findIndex = strBroadcast.IndexOf(INGENICO_GLOBALS.BROADCAST); + int findLen = 14 + 2; // additional 2 is for extra char '="' + _code = strBroadcast.Substring(findIndex + findLen, 2); + _message = _broadcastData[_code]; + } + else { + throw new MessageException("No broadcast message."); + } + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs new file mode 100644 index 00000000..e17badf0 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/CancelResponse.cs @@ -0,0 +1,18 @@ +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System; +using System.Collections.Generic; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class CancelResponse : IngenicoTerminalResponse, IDeviceResponse{ + public CancelResponse(byte[] buffer) : base(buffer) { + ParseResponse(buffer); + } + + public override void ParseResponse(byte[] response) { + base.ParseResponse(response); + Status = ((CancelStatus)Encoding.UTF8.GetString(response.SubArray(2, 1)).ToInt32()).ToString(); + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs new file mode 100644 index 00000000..a500e2b6 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DataResponse.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GlobalPayments.Api.Terminals.Ingenico; +using GlobalPayments.Api.Utils; +using System.Linq; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class DataResponse { + + private string _authCode; + private string _finalAmount; + private PaymentMethod? _paymentMethod; + private string _cashbackAmount; + private string _gratuityAmount; + private string _availableAmount; + private string _dccCode; + private string _dccAmount; + private TransactionSubTypes? _txnSubType; + private string _splitSaleAmount; + private DynamicCurrencyStatus? _dccStatus; + + private byte[] _buffer; + + public DataResponse(byte[] buffer) { + _buffer = buffer; + ParseData(); + } + + #region Property Fields + + public string AuthorizationCode { + get { return _authCode ?? string.Empty; } + } + + public decimal? FinalAmount { + get { return _finalAmount.ToAmount(); } + set { _finalAmount = value.ToString(); } + } + + public PaymentMethod? PaymentMethod { + get { return _paymentMethod; } + set { _paymentMethod = value; } + } + + public decimal? CashbackAmount { + get { return _cashbackAmount.ToAmount(); } + set { _cashbackAmount = value.ToString(); } + } + + public decimal? GratuityAmount { + get { return _gratuityAmount.ToAmount(); } + set { _gratuityAmount = value.ToString(); } + } + + public decimal? AvailableAmount { + get { return _availableAmount.ToAmount(); } + set { _availableAmount = value.ToString(); } + } + public string DccCode { + get { return _dccCode; } + set { _dccCode = value; } + } + + public decimal? DccAmount { + get { return _dccAmount.ToAmount(); } + set { _dccAmount = value.ToString(); } + } + + public TransactionSubTypes? TransactionSubType { + get { return _txnSubType; } + set { _txnSubType = value; } + } + + public decimal? SplitSaleAmount { + get { return _splitSaleAmount.ToAmount(); } + set { _splitSaleAmount = value.ToString(); } + } + + public DynamicCurrencyStatus? DccStatus { + get { return _dccStatus; } + set { _dccStatus = value; } + } + + #endregion + + private void ParseData() { + + var tlv = new TypeLengthValue(_buffer); + + Type stringType = typeof(string); + + _authCode = (string)tlv.GetValue((byte)RepFieldCode.AuthCode, stringType); + _cashbackAmount = (string)tlv.GetValue((byte)RepFieldCode.CashbackAmount, stringType); + _gratuityAmount = (string)tlv.GetValue((byte)RepFieldCode.GratuityAmount, stringType); + _finalAmount = (string)tlv.GetValue((byte)RepFieldCode.FinalTransactionAmount, stringType); + _availableAmount = (string)tlv.GetValue((byte)RepFieldCode.AvailableAmount, stringType); + _dccCode = (string)tlv.GetValue((byte)RepFieldCode.DccCurrency, stringType); + _dccAmount = (string)tlv.GetValue((byte)RepFieldCode.DccConvertedAmount, stringType); + _txnSubType = EnumConverter.FromDescription(tlv.GetValue((byte)RepFieldCode.TransactionSubType, stringType)); + _dccStatus = (DynamicCurrencyStatus?)tlv.GetValue((byte)RepFieldCode.DccOperationStatus, typeof(DynamicCurrencyStatus?)); + _splitSaleAmount = (string)tlv.GetValue((byte)RepFieldCode.SplitSalePaidAmount, stringType); + _paymentMethod = (PaymentMethod?)tlv.GetValue((byte)RepFieldCode.PaymentMethod, typeof(PaymentMethod?)); + } + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs new file mode 100644 index 00000000..69c53c7e --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/DeviceResponse.cs @@ -0,0 +1,141 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public abstract class IngenicoBaseResponse : DeviceResponse { + protected byte[] _buffer; + protected ParseFormat _parseFormat; + internal DataResponse _respField; + + #region Added Properties Specific for Ingenico + public string DccCurrency { get; set; } + public DynamicCurrencyStatus? DccStatus { get; set; } + public decimal? DccAmount { get; set; } + public TransactionSubTypes? TransactionSubType { get; set; } + public decimal? SplitSaleAmount { get; set; } + public PaymentMode PaymentMode { get; set; } + public string CurrencyCode { get; set; } + public string PrivateData { get; set; } + public decimal? FinalTransactionAmount { get; set; } + + internal string Amount { get; set; } + #endregion + + internal IngenicoBaseResponse(byte[] buffer, ParseFormat format = ParseFormat.Transaction) { + if (buffer != null) { + _buffer = buffer; + _parseFormat = format; + + if (_parseFormat != ParseFormat.XML) { + ParseResponse(_buffer); + } + } + } + + + public virtual void ParseResponse(byte[] response) { + if (response != null) { + ReferenceNumber = Encoding.UTF8.GetString(response.SubArray(0, 2)); + Status = ((TransactionStatus)Encoding.UTF8.GetString(response.SubArray(2, 1)).ToInt32()).ToString(); + Amount = Encoding.UTF8.GetString(response.SubArray(3, 8)); + PaymentMode = (PaymentMode)Encoding.UTF8.GetString(response.SubArray(11, 1)).ToInt32(); + CurrencyCode = Encoding.UTF8.GetString(response.SubArray(67, 3)); + PrivateData = Encoding.UTF8.GetString(response.SubArray(70, response.Length - 70)); + + // This is for parsing of Response field for Transaction request + if (_parseFormat == ParseFormat.Transaction) { + _respField = new DataResponse(response.SubArray(12, 55)); + FinalTransactionAmount = _respField.FinalAmount; + DccAmount = _respField.DccAmount; + DccCurrency = _respField.DccCode; + DccStatus = _respField.DccStatus; + } + } + } + + public override string ToString() { + DeviceResponseText = Encoding.UTF8.GetString(_buffer, 0, _buffer.Length); + return DeviceResponseText; + } + + } + + public class IngenicoTerminalResponse : IngenicoBaseResponse, ITerminalResponse { + internal IngenicoTerminalResponse(byte[] buffer, ParseFormat format = ParseFormat.Transaction) : base(buffer, format) { } + + #region Properties + public decimal? TransactionAmount { + get { return Amount.ToAmount(); } + set { if (value.HasValue) { Amount = value.ToString(); } } + } + public decimal? BalanceAmount { + get { return _respField.AvailableAmount; } + set { if (value.HasValue) { _respField.AvailableAmount = value; } } + } + public string AuthorizationCode { + get { return _respField.AuthorizationCode; } + set { if (value.Length > 0) { value.ToString(); } } + } + public decimal? TipAmount { + get { return _respField.GratuityAmount; } + set { if (value.HasValue) { _respField.GratuityAmount = value; } } + } + public decimal? CashBackAmount { + get { return _respField.CashbackAmount; } + set { if (value.HasValue) { _respField.CashbackAmount = value; } } + } + public string PaymentType { + get { return _respField.PaymentMethod.ToString(); } + set { if (value.Length > 0) { value.ToString(); } } + } + public string TerminalRefNumber { + get { return ReferenceNumber; } + set { if (value.Length > 0) { ReferenceNumber = value.ToString(); } } + } + + public string ResponseCode { get; set; } + public string TransactionId { get; set; } + public string Token { get; set; } + public string SignatureStatus { get; set; } + public byte[] SignatureData { get; set; } + public string TransactionType { get; set; } + public string MaskedCardNumber { get; set; } + public string EntryMethod { get; set; } + public string ApprovalCode { get; set; } + public decimal? AmountDue { get; set; } + public string CardHolderName { get; set; } + public string CardBIN { get; set; } + public bool CardPresent { get; set; } + public string ExpirationDate { get; set; } + public string AvsResponseCode { get; set; } + public string AvsResponseText { get; set; } + public string CvvResponseCode { get; set; } + public string CvvResponseText { get; set; } + public bool TaxExempt { get; set; } + public string TaxExemptId { get; set; } + public string TicketNumber { get; set; } + public ApplicationCryptogramType ApplicationCryptogramType { get; set; } + public string ApplicationCryptogram { get; set; } + public string CardHolderVerificationMethod { get; set; } + public string TerminalVerificationResults { get; set; } + public string ApplicationPreferredName { get; set; } + public string ApplicationLabel { get; set; } + public string ApplicationId { get; set; } + public decimal? MerchantFee { get; set; } + public string ResponseText { get; set; } + #endregion + } + + public class IngenicoTerminalReportResponse : IngenicoBaseResponse, ITerminalReport { + internal IngenicoTerminalReportResponse(byte[] buffer) : base(buffer, ParseFormat.XML) { + _buffer = buffer; + Status = _buffer.Length > 0 ? "SUCCESS" : "FAILED"; + } + + public override string ToString() { + return Encoding.GetEncoding(28591).GetString(_buffer); + } + } +} \ No newline at end of file diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs new file mode 100644 index 00000000..a2231fc2 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/POSIdentifierResponse.cs @@ -0,0 +1,18 @@ +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class POSIdentifierResponse : IngenicoTerminalResponse, IInitializeResponse { + public string SerialNumber { get; set; } + + public POSIdentifierResponse(byte[] buffer) + : base(buffer, ParseFormat.PID) { + } + + public override void ParseResponse(byte[] response) { + base.ParseResponse(response); + SerialNumber = Encoding.UTF8.GetString(response.SubArray(12, 55)).Trim(); + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs new file mode 100644 index 00000000..cd4f021d --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReportResponse.cs @@ -0,0 +1,11 @@ +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico.Responses { + public class ReportResponse : IngenicoTerminalResponse, ITerminalReport { + internal ReportResponse(byte[] buffer) : base(buffer) { + ParseResponse(buffer); + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs new file mode 100644 index 00000000..dfe7524f --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/ReverseResponse.cs @@ -0,0 +1,18 @@ +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System; +using System.Collections.Generic; +using System.Text; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class ReverseResponse : IngenicoTerminalResponse, IDeviceResponse{ + public ReverseResponse(byte[] buffer) : base(buffer) { + ParseResponse(buffer); + } + + public override void ParseResponse(byte[] response) { + base.ParseResponse(response); + Status = ((ReverseStatus)Encoding.UTF8.GetString(response.SubArray(2, 1)).ToInt32()).ToString(); + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs new file mode 100644 index 00000000..db534c4e --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/INGENICO/Responses/StateResponse.cs @@ -0,0 +1,55 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Utils; +using System; + +namespace GlobalPayments.Api.Terminals.Ingenico { + public class StateResponse : IngenicoTerminalResponse, IDeviceResponse { + + private TerminalStatus _terminalStatus; + private SalesMode _salesMode; + private string _terminalCapabilities; + private string _additionalTerminalCapabilities; + private string _appVersionNumber; + private string _handsetNumber; + private string _terminalId; + + public StateResponse(byte[] buffer) + : base(buffer, ParseFormat.State) { + } + + public TerminalStatus TerminalStatus { get { return _terminalStatus; } set { } } + public SalesMode SalesMode { get { return _salesMode; } set { } } + public string TerminalCapabilities { get { return _terminalCapabilities; } set { } } + public string AdditionalTerminalCapabilities { get { return _additionalTerminalCapabilities; } set { } } + public string AppVersionNumber { get { return _appVersionNumber; } set { } } + public string HandsetNumber { get { return _handsetNumber; } set { } } + public string TerminalId { get { return _terminalId; } set { } } + + public override void ParseResponse(byte[] response) { + if (response == null) { + throw new ApiException("Response data is null"); + } + + if (response.Length < INGENICO_GLOBALS.RAW_RESPONSE_LENGTH) { + byte[] newResponse = new byte[INGENICO_GLOBALS.RAW_RESPONSE_LENGTH]; + response.CopyTo(newResponse, 0); + + response = newResponse; + } + + base.ParseResponse(response); + + var tlv = new TypeLengthValue(response.SubArray(12, 55)); + + string terminalStatusData = (string)tlv.GetValue((byte)StateResponseCode.Status, typeof(string), TLVFormat.State); + _terminalStatus = (TerminalStatus)Convert.ToByte(terminalStatusData.Substring(0, 1)); + _salesMode = (SalesMode)Convert.ToByte(terminalStatusData.Substring(1, 1)); + _terminalCapabilities = terminalStatusData.Substring(2, 6); + _additionalTerminalCapabilities = terminalStatusData.Substring(8, 10); + _appVersionNumber = (string)tlv.GetValue((byte)StateResponseCode.AppVersionNumber, typeof(string), TLVFormat.State); + _handsetNumber = (string)tlv.GetValue((byte)StateResponseCode.HandsetNumber, typeof(string), TLVFormat.State); + _terminalId = (string)tlv.GetValue((byte)StateResponseCode.TerminalId, typeof(string), TLVFormat.State); + } + } +} diff --git a/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs b/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs index d7cdab72..14fb0ba6 100644 --- a/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs +++ b/src/GlobalPayments.Api/Terminals/Messaging/BroadcastMessageEventHandler.cs @@ -1,3 +1,3 @@ namespace GlobalPayments.Api.Terminals.Messaging { - public delegate void BroadcastMessageEventHandler(); + public delegate void BroadcastMessageEventHandler(string code, string message); } diff --git a/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs b/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs new file mode 100644 index 00000000..5cb60564 --- /dev/null +++ b/src/GlobalPayments.Api/Terminals/Messaging/PayAtTableRequestEventHandler.cs @@ -0,0 +1,5 @@ +using GlobalPayments.Api.Terminals.Ingenico.Requests; + +namespace GlobalPayments.Api.Terminals.Messaging { + public delegate void PayAtTableRequestEventHandler(PATRequest request); +} diff --git a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs index 5f8229ea..20de9ad1 100644 --- a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs +++ b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxHttpInterface.cs @@ -13,6 +13,8 @@ internal class PaxHttpInterface : IDeviceCommInterface { WebRequest _client; public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; public PaxHttpInterface(ITerminalConfiguration settings) { _settings = settings; diff --git a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs index e152efcf..13335ae8 100644 --- a/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs +++ b/src/GlobalPayments.Api/Terminals/PAX/Interfaces/PaxTcpInterface.cs @@ -14,6 +14,8 @@ internal class PaxTcpInterface : IDeviceCommInterface { int _connectionCount = 0; public event MessageSentEventHandler OnMessageSent; + public event BroadcastMessageEventHandler OnBroadcastMessage; + public event PayAtTableRequestEventHandler OnPayAtTableRequest; public PaxTcpInterface(ITerminalConfiguration settings) { _settings = settings; @@ -59,11 +61,6 @@ public byte[] Send(IDeviceMessage message) { return rvalue; } } - else { - // Reset the connection before the next attempt - Disconnect(); - Connect(); - } } throw new MessageException("Terminal did not respond in the given timeout."); } diff --git a/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs b/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs index d228ebe3..aa3cf629 100644 --- a/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs +++ b/src/GlobalPayments.Api/Terminals/PAX/PaxController.cs @@ -27,7 +27,7 @@ internal override IDeviceCommInterface ConfigureConnector() { } } - internal PaxController(ITerminalConfiguration settings) : base(settings) { + internal PaxController(ITerminalConfiguration settings) : base(settings) { } #region overrides @@ -260,7 +260,7 @@ internal IDeviceMessage BuildReportTransaction(TerminalReportBuilder builder) { request = TerminalUtilities.BuildRequest( messageId, - "00", // EDC TYPE SET TO ALL + "01", // EDC TYPE SET TO ALL ControlCodes.FS, criteria.TransactionType.HasValue ? ((int)criteria.TransactionType.Value).ToString().PadLeft(2, '0') : string.Empty, ControlCodes.FS, diff --git a/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs b/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs index 29b52734..fd37cd56 100644 --- a/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs +++ b/src/GlobalPayments.Api/Terminals/PAX/PaxInterface.cs @@ -24,18 +24,20 @@ public override ISignatureResponse GetSignatureFile() { return new SignatureResponse(response, _controller.DeviceType.Value); } - public override void Cancel() { + public override IDeviceResponse Cancel() { if (_controller.ConnectionMode == ConnectionModes.HTTP) { throw new MessageException("The cancel command is not available in HTTP mode"); } try { _controller.Send(TerminalUtilities.BuildRequest(PAX_MSG_ID.A14_CANCEL)); + return null; } catch (MessageException exc) { if (!exc.Message.Equals("Terminal returned EOT for the current message.")) { throw; } + return null; } } diff --git a/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs b/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs index c2647ec6..f2059a2c 100644 --- a/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs +++ b/src/GlobalPayments.Api/Terminals/TerminalUtilities.cs @@ -7,6 +7,7 @@ using System.IO; using System.Drawing.Drawing2D; using System.Drawing.Imaging; +using GlobalPayments.Api.Entities; namespace GlobalPayments.Api.Terminals { public class TerminalUtilities { @@ -35,7 +36,7 @@ private static DeviceMessage BuildMessage(string messageId, string message) { // Begin Message buffer.Add((byte)ControlCodes.STX); - + // Add Message ID foreach (char c in messageId) buffer.Add((byte)c); @@ -61,6 +62,34 @@ private static DeviceMessage BuildMessage(string messageId, string message) { return new DeviceMessage(buffer.ToArray()); } + public static DeviceMessage BuildRequest(string message, ConnectionModes settings) { + var buffer = new List(); + byte[] lrc; + + switch (settings) { + case ConnectionModes.SERIAL: + case ConnectionModes.PAY_AT_TABLE: + buffer.Add((byte)ControlCodes.STX); + foreach (char c in message) + buffer.Add((byte)c); + buffer.Add((byte)ControlCodes.ETX); + lrc = CalculateLRC(message); + buffer.Add(lrc[0]); + break; + case ConnectionModes.TCP_IP_SERVER: + var _msg = CalculateHeader(Encoding.UTF8.GetBytes(message)) + message; + + foreach (char c in _msg) + buffer.Add((byte)c); + + break; + default: + throw new BuilderException("Failed to build request message. Unknown Connection mode."); + } + + return new DeviceMessage(buffer.ToArray()); + } + public static DeviceMessage BuildRequest(string message, MessageFormat format) { var buffer = new List(); @@ -142,5 +171,53 @@ public static byte[] BuildSignatureImage(string pathData, int width = 150) { return ms.ToArray(); } } + + public static string CalculateHeader(byte[] buffer) { + //The Header contains the data length in hexadecimal format on two digits + var hex = buffer.Length.ToString("X4"); + hex = hex.PadLeft(4, '0'); + + // Get total value per two char. + var fDigit = hex[0].ToString() + hex[1]; + var sDigit = hex[2].ToString() + hex[3]; + + return string.Format("{0}{1}", Convert.ToChar(Convert.ToUInt32(fDigit, 16)), + Convert.ToChar(Convert.ToUInt32(sDigit, 16))); + } + + public static int HeaderLength(byte[] buffer) { + // Conversion from decimal to hex value + var fHex = Convert.ToInt64(buffer[0]).ToString("X2"); + var sHex = Convert.ToInt64(buffer[1]).ToString("X2"); + + // Concat two hex value + var _hex = fHex + sHex; + + // Get decimal value of concatenated hex + return int.Parse(_hex, System.Globalization.NumberStyles.HexNumber); + } + + public static byte[] CalculateLRC(string requestMessage) { + byte[] bytes = Encoding.ASCII.GetBytes((requestMessage + (char)ControlCodes.ETX)); + byte lrc = 0; + for (int i = 0; i < bytes.Length; i++) { + lrc ^= bytes[i]; + } + bytes = new byte[] { lrc }; + return bytes; + } + + public static string GetTextContent(string filePath) { + try { + if (!filePath.Contains(".xml")) { + throw new BuilderException("File must be in XML Document"); + } + + return File.ReadAllText(filePath); + } + catch (Exception ex) { + throw ex; + } + } } } diff --git a/src/GlobalPayments.Api/Utils/CardUtils.cs b/src/GlobalPayments.Api/Utils/CardUtils.cs index 0ff95041..0d5c0388 100644 --- a/src/GlobalPayments.Api/Utils/CardUtils.cs +++ b/src/GlobalPayments.Api/Utils/CardUtils.cs @@ -17,75 +17,62 @@ public class CardUtils { private static readonly Regex StoredValueRegex = new Regex(@"^(?:600649|603261|603571|627600|639470)", RegexOptions.None); private static readonly Regex ValueLinkRegex = new Regex(@"^(?:601056|603225)", RegexOptions.None); private static readonly Regex HeartlandGiftRegex = new Regex(@"^(?:502244|627720|708355)", RegexOptions.None); - private static readonly Regex WorldFuelRegex = new Regex(@"^7000009[5-8]", RegexOptions.None); - private static readonly Regex FleetCorFleetwideRegex = new Regex(@"^70768598", RegexOptions.None); - private static readonly Regex FleetCorFuelmanPlusRegex = new Regex(@"^707649", RegexOptions.None); - private static readonly Regex FleetOneRegex = new Regex(@"^501486", RegexOptions.None); - private static readonly Regex TrackOnePattern = new Regex(@"%?[B0]?([\d]+)\^[^\^]+\^([\d]{4})([^?]+)?", RegexOptions.None); - private static readonly Regex TrackTwoPattern = new Regex(@";?([\d]+)[=|w](\d{4})([^?]+)?", RegexOptions.None); + private static readonly Regex TrackOnePattern = new Regex(@"%?[B0]?([\d]+)\^[^\^]+\^([\d]{4})([^?]+)\??", RegexOptions.None); + private static readonly Regex TrackTwoPattern = new Regex(@";?([\d]+)[=|w](\d{4})([^?]+)\??", RegexOptions.None); private static Dictionary _regexMap; private static Dictionary> _fleetBinMap; - private static Dictionary> _purchaseBinMap; static CardUtils() { - _regexMap = new Dictionary { { "Amex", AmexRegex }, { "MC", MasterCardRegex }, { "Visa", VisaRegex }, { "DinersClub", DinersClubRegex }, { "EnRoute", RouteClubRegex }, { "Discover", DiscoverRegex }, { "Jcb", JcbRegex }, { "Voyager", VoyagerRegex }, { "Wex", WexRegex }, { "StoredValue", StoredValueRegex }, { "ValueLink", ValueLinkRegex }, { "HeartlandGift", HeartlandGiftRegex }, { "WorldFuels", WorldFuelRegex }, { "FleetCorFleetwide", FleetCorFleetwideRegex }, { "FleetCorFuelmanPlus", FleetCorFuelmanPlusRegex }, { "FleetOne", FleetOneRegex } + _regexMap = new Dictionary { + { "Amex", AmexRegex }, + { "MC", MasterCardRegex }, + { "Visa", VisaRegex }, + { "DinersClub", DinersClubRegex }, + { "EnRoute", RouteClubRegex }, + { "Discover", DiscoverRegex }, + { "Jcb", JcbRegex }, + { "Voyager", VoyagerRegex }, + { "Wex", WexRegex }, + { "StoredValue", StoredValueRegex }, + { "ValueLink", ValueLinkRegex }, + { "HeartlandGift", HeartlandGiftRegex } }; // fleet bin ranges - _fleetBinMap = new Dictionary>(); + _fleetBinMap = new Dictionary>(); // visa fleet mappings - var visaFleetMap = new Dictionary { { "448460", "448460" }, { "448462", "448468" }, { "448470", "448516" }, { "448518", "448589" }, { "448591", "448591" }, { "448593", "448611" }, { "448613", "448615" }, { "448617", "448674" }, { "448676", "448686" }, { "448688", "448699" }, { "461400", "461421" }, { "480701", "480899" } - }; + var visaFleetMap = new Dictionary(); + visaFleetMap.Add("448460", "448611"); + visaFleetMap.Add("448613", "448615"); + visaFleetMap.Add("448617", "448674"); + visaFleetMap.Add("448676", "448686"); + visaFleetMap.Add("448688", "448699"); + visaFleetMap.Add("461400", "461421"); + visaFleetMap.Add("461423", "461499"); + visaFleetMap.Add("480700", "480899"); _fleetBinMap.Add("Visa", visaFleetMap); // mastercard fleet mappings - var mcFleetMap = new Dictionary { { "553231", "553380" }, { "556083", "556099" }, { "556100", "556599" }, { "556700", "556999" } - }; + var mcFleetMap = new Dictionary(); + mcFleetMap.Add("553231", "553380"); + mcFleetMap.Add("556083", "556099"); + mcFleetMap.Add("556100", "556599"); + mcFleetMap.Add("556700", "556999"); _fleetBinMap.Add("MC", mcFleetMap); // wright express fleet mappings - var wexFleetMap = new Dictionary { { "690046", "690046" }, { "707138", "707138" } - }; + var wexFleetMap = new Dictionary(); + wexFleetMap.Add("690046", "690046"); + wexFleetMap.Add("707138", "707138"); _fleetBinMap.Add("Wex", wexFleetMap); // voyager fleet - var voyagerFleetMap = new Dictionary { { "708885", "708889" } - }; + var voyagerFleetMap = new Dictionary(); + voyagerFleetMap.Add("708885", "708889"); _fleetBinMap.Add("Voyager", voyagerFleetMap); - - //WorldFuel fleet - var worldFuelFleetMap = new Dictionary { { "70000095", "70000095" }, { "70000096", "70000096" }, { "70000097", "70000097" }, { "70000098", "70000098" } - }; - _fleetBinMap.Add("WorldFuel", worldFuelFleetMap); - - //FleetCorFleetwide mappings - var fleetCorFleetwideMap = new Dictionary { { "70768598", "70768598" } - }; - _fleetBinMap.Add("FleetCorFleetwide", fleetCorFleetwideMap); - - //FleetCorFuelmanPlus mappings - var fleetCorFuelmanPlusMap = new Dictionary { { "707649", "707649" } - }; - _fleetBinMap.Add("FleetCorFuelmanPlus", fleetCorFuelmanPlusMap); - - //FleetOne mappings - var fleetOneMap = new Dictionary { { "501486", "501486" } - }; - _fleetBinMap.Add("FleetOne", fleetOneMap); - - // PurchaseBin ranges - _purchaseBinMap = new Dictionary>(); - - var visaPurchasingMap = new Dictionary { { "405607","405607" }, { "415928","415928" }, { "418308","418308" }, { "424604","424604" }, { "427533","427533" }, { "430736","430736" }, { "433085","433085" }, { "443085","443085" }, { "434868","434873" }, { "448410","448410" }, { "448419","448419" }, { "448421","448421" }, { "448452","448452" }, { "448461","448462" }, { "448469","448469" }, { "448485","448486" }, { "448483","448483" }, { "448489","448489" }, { "448491","448491" }, { "448515","448515" }, { "448517","448517" }, { "448524","448524" }, { "448535","448535" }, { "448546","448546" }, { "448548","448548" }, { "448557","448557" }, { "448562","448562" }, { "448569","448569" }, { "448598","448598" }, { "448609","448609" }, { "448626","448626" }, { "452072","452072" }, { "461422","461422" }, { "461431","461431" }, { "461437","461437" }, { "461481","461481" }, { "461490","461490" }, { "471500","471500" }, { "471503","471503" }, { "471508","471508" }, { "471511","471511" }, { "471522","471522" }, { "471529","471529" }, { "471539","471539" }, { "471556","471556" }, { "471569","471569" }, { "471573","471573" }, { "471575","471575" }, { "471578","471578" }, { "471586","471586" }, { "471592","471592" }, { "471596","471596" }, { "471630","471630" }, { "471640","471640" }, { "480439","480439" }, { "480452","480452" }, { "480455","480455" }, { "480458","480458" }, { "480470","480470" }, { "480725","480725" }, { "480824","480824" }, { "485901","485901" }, { "485910","485910" }, { "485915","485915" }, { "485948","485948" }, { "485983","485983" }, { "485986","485986" }, { "485997","485997" }, { "485999","485999" }, { "486509","486509" }, { "486535","486535" }, { "486560","486560" }, { "486576","486576" }, { "486580","486580" }, { "486583","486583" }, { "486640","486640" }, { "486670","486670" }, { "486690","486690" }, { "489629","489629" }, { "448499","448501" }, { "448506","448507" }, { "448559","448560" }, { "448564","448565" }, { "448600","448604" }, { "448606","448607" }, { "448620","448622" }, { "448672","448673" }, { "448676","448679" }, { "448692","448693" }, { "461426","461429" }, { "461470","461471" }, { "461487","461488" }, { "471515","471516" }, { "471524","471526" }, { "471545","471546" }, { "471552","471553" }, { "471563","471564" }, { "480406","480408" }, { "480411","480413" }, { "480420","480421" }, { "480423","480424" }, { "480722","480723" }, { "486511","486512" }, { "486516","486517" }, { "486521","486523" }, { "486524","486528" }, { "486550","486552" }, { "486554","486555" }, { "486588","486591" } - }; - _purchaseBinMap.Add("Visa", visaPurchasingMap); - - var MasterCardPurchasingMap = new Dictionary { { "513359", "513360" }, { "513721", "513722" }, { "513764", "513764" }, { "530249", "530249" }, { "540500", "540501" }, { "540505", "540511" }, { "540514", "540515" }, { "540517", "540517" }, { "540520", "540524" }, { "540526", "540529" }, { "540531", "540539" }, { "540542", "540543" }, { "540546", "540549" }, { "540554", "540554" }, { "540556", "540556" }, { "540561", "540562" }, { "540568", "540580" }, { "540582", "540583" }, { "540586", "540590" }, { "540592", "540596" }, { "540598", "540598" }, { "549297", "549297" }, { "552039", "552039" }, { "552587", "552587" }, { "552807", "552807" }, { "552902", "552906" }, { "552908", "552910" }, { "552913", "552914" }, { "552916", "552917" }, { "552924", "552927" }, { "552929", "552931" }, { "552934", "552934" }, { "552936", "552937" }, { "552941", "552942" }, { "552950", "552950" }, { "553424", "553424" }, { "553447", "553447" }, { "555000", "555001" }, { "555003", "555003" }, { "555005", "555006" }, { "555008", "555011" }, { "555013", "555014" }, { "555016", "555016" }, { "555018", "555021" }, { "555024", "555025" }, { "555027", "555027" }, { "555029", "555029" }, { "555033", "555033" }, { "555039", "555042" }, { "555078", "555078" }, { "555109", "555109" }, { "555225", "555225" }, { "555951", "555953" }, { "555957", "555958" }, { "555962", "555962" }, { "556024", "556024" }, { "558301", "558301" } - }; - _purchaseBinMap.Add("MC", MasterCardPurchasingMap); } public static bool IsFleet(string cardType, string pan) { @@ -124,37 +111,13 @@ public static string MapCardType(string pan) { if (IsFleet(rvalue, pan)) { rvalue += "Fleet"; } - if (IsPurchase(rvalue, pan)) { - rvalue += "Purchasing"; - } } } return rvalue; } - public static bool IsPurchase(string cardType, string pan) { - if (!string.IsNullOrEmpty(pan)) { - int compareValue = int.Parse(pan.Substring(0, 6)); - string baseCardType = cardType.TrimEnd("Purchasing"); - - if (_purchaseBinMap.ContainsKey(baseCardType)) { - var binRanges = _purchaseBinMap[baseCardType]; - foreach (string key in binRanges.Keys) { - int lowerRange = int.Parse(key); - int upperRange = int.Parse(binRanges[key]); - - if (compareValue >= lowerRange && compareValue <= upperRange) { - return true; - } - } - } - } - return false; - } - public static T ParseTrackData(T paymentMethod) where T : ITrackData { - string trackData = Regex.Replace(paymentMethod.Value, @"(?<=\d)\p{Zs}(?=\d)", ""); - //string trackData = paymentMethod.Value; + string trackData = paymentMethod.Value; Match matcher = TrackTwoPattern.Match(trackData); if (matcher.Success) { string pan = matcher.Groups[1].Value; @@ -176,7 +139,7 @@ public static T ParseTrackData(T paymentMethod) where T : ITrackData { else { matcher = TrackOnePattern.Match(trackData); if (matcher.Success) { - paymentMethod.TrackNumber = TrackNumber.TrackOne; + paymentMethod.TrackNumber = TrackNumber.TrackTwo; paymentMethod.Pan = matcher.Groups[1].Value; paymentMethod.Expiry = matcher.Groups[2].Value; paymentMethod.DiscretionaryData = matcher.Groups[3].Value; @@ -184,27 +147,6 @@ public static T ParseTrackData(T paymentMethod) where T : ITrackData { } } - return paymentMethod; - } - public static GiftCard ParseTrackData(GiftCard paymentMethod) { - string trackData = paymentMethod.Value; - Match matcher = TrackTwoPattern.Match(trackData); - if (matcher.Success) { - paymentMethod.TrackNumber = TrackNumber.TrackTwo; - paymentMethod.Pan = matcher.Groups[1].Value; - paymentMethod.Expiry = matcher.Groups[2].Value; - paymentMethod.TrackData = matcher.Value.TrimStart(';'); - } - else { - matcher = TrackOnePattern.Match(trackData); - if (matcher.Success) { - paymentMethod.TrackNumber = TrackNumber.TrackOne; - paymentMethod.Pan = matcher.Groups[1].Value; - paymentMethod.Expiry = matcher.Groups[2].Value; - paymentMethod.TrackData = matcher.Value.TrimStart('%'); - } - } - return paymentMethod; } } diff --git a/src/GlobalPayments.Api/Utils/EnumUtils.cs b/src/GlobalPayments.Api/Utils/EnumUtils.cs index 413395d3..42ecacd4 100644 --- a/src/GlobalPayments.Api/Utils/EnumUtils.cs +++ b/src/GlobalPayments.Api/Utils/EnumUtils.cs @@ -71,35 +71,5 @@ public static string GetMapping(Target target, object value) { } return null; } - public static T FromMapping(Target target, object value) { - var fields = typeof(T).GetRuntimeFields(); - foreach (var field in fields) { - var attr = field.GetCustomAttribute(); - if (attr != null && attr.Value.Equals(value) && attr.Target.Equals(target)) { - var rvalue = (T)Enum.Parse(typeof(T), field.Name); - return rvalue; - } - } - return default(T); - - } } - - //public class EnumUtils { - //public static bool IsDefined(byte value) where V : System.Enum { - // return Parse(value) != null; - //} - //public static V Parse(byte value) where V : System.Enum { - // ReverseByteEnumMap map = new ReverseByteEnumMap(); - // return map.Get(value); - //} - //public static V Parse(string value) where V : System.Enum { - // ReverseStringEnumMap map = new ReverseStringEnumMap(); - // return map.Get(value); - //} - //public static V Parse(int value) where V : System.Enum { - // ReverseIntEnumMap map = new ReverseIntEnumMap(); - // return map.Get(value); - //} - //} } diff --git a/src/GlobalPayments.Api/Utils/Extensions.cs b/src/GlobalPayments.Api/Utils/Extensions.cs index be53c37b..c466f0e7 100644 --- a/src/GlobalPayments.Api/Utils/Extensions.cs +++ b/src/GlobalPayments.Api/Utils/Extensions.cs @@ -1,11 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Text.RegularExpressions; -using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Entities; using GlobalPayments.Api.Terminals; +using System; +using System.Collections.Generic; using System.Globalization; +using System.Net.Sockets; using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; namespace GlobalPayments.Api.Utils { public static class Extensions { @@ -206,5 +207,10 @@ public static string TrimEnd(this string str, string trimString) { } return rvalue; } + public static T[] SubArray(this T[] data, int index, int length) { + T[] result = new T[length]; + Array.Copy(data, index, result, 0, length); + return result; + } } } diff --git a/src/GlobalPayments.Api/Utils/TypeLengthValue.cs b/src/GlobalPayments.Api/Utils/TypeLengthValue.cs new file mode 100644 index 00000000..88b4cfe0 --- /dev/null +++ b/src/GlobalPayments.Api/Utils/TypeLengthValue.cs @@ -0,0 +1,68 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Terminals.Ingenico; +using System; +using System.Linq; +using System.Text; + +namespace GlobalPayments.Api.Utils { + internal class TypeLengthValue { + + private byte[] _data = new byte[0]; + + public TypeLengthValue() { + + } + + public TypeLengthValue(byte[] data) { + _data = data; + } + + // Add TLV Format since Ingenico has different format of length when it comes to TLV Standard. + public TLVFormat TLVFormat { get; private set; } + + public object GetValue(byte type, Type returnType, TLVFormat format = TLVFormat.Standard) { + if (_data.Length == 0) { + throw new Exception("No data to parse."); + } + + TLVFormat = format; + int typeIndexLocation = Array.FindIndex(_data, e => e == type); + if (typeIndexLocation >= 0) { + // Get the length based on Documentation (TLV). + byte[] lengthBuffer = { _data[typeIndexLocation + 1], _data[typeIndexLocation + 2] }; + int length = 0; + + if (TLVFormat == TLVFormat.Standard) { + length = Convert.ToInt32(Encoding.UTF8.GetString(lengthBuffer, 0, lengthBuffer.Length), 16); + } else if (TLVFormat == TLVFormat.State || TLVFormat == TLVFormat.PayAtTable) { + length = Convert.ToInt32(Encoding.UTF8.GetString(lengthBuffer, 0, lengthBuffer.Length)); + } else { + throw new ApiException("Unsupported TLV format."); + } + + // Get the value of type according to length limit. + byte[] value = _data.SubArray(typeIndexLocation + 3, length); + + int endLength = typeIndexLocation + length + 3; + + // Remove field that have been parsed and successfully get the value. + _data = _data.SubArray(0, typeIndexLocation).Concat(_data.SubArray(endLength, _data.Length - endLength)).ToArray(); + string strValue = Encoding.ASCII.GetString(value, 0, value.Length); + + + if (returnType == typeof(decimal?)) { + return decimal.Parse(strValue); + } else if (returnType == typeof(string)) { + return strValue; + } else if (returnType == typeof(DynamicCurrencyStatus?)) { + return (DynamicCurrencyStatus)int.Parse(strValue); + } else if (returnType == typeof(PaymentMethod?)) { + return (PaymentMethod)int.Parse(strValue); + } else { + throw new Exception("Data type not supported in parsing of TLV data."); + } + } + return null; + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs new file mode 100644 index 00000000..5dcf6d64 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/AutoSubCertification.cs @@ -0,0 +1,721 @@ +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class AutoSubCertification { + public AutoSubCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw" + }, "retail"); + + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }, "ecomm"); + } + + [TestMethod] + public void Retail_000_CloseBatch() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw" + }); + + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + // Address Verification + + [TestMethod] + public void Retail_003_CardVerifyAmex() { + var address = new Address { + PostalCode = "75024" + }; + var manual_amex = TestCards.AmexManual(true, false); + + var response = manual_amex.Verify() + .WithAddress(address) + .WithRequestMultiUseToken(true) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_007_CardVerifyVisa() { + var visa_enc = TestCards.VisaSwipeEncrypted(); + + var response = visa_enc.Verify() + .WithRequestMultiUseToken(true) + .Execute("retail"); + Assert.IsNotNull(response, "response is null"); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(25m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute("retail"); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + + [TestMethod] + public void Retail_008a_CardVerifyMastercardSwipe() { + var card_enc = TestCards.MasterCardSwipeEncrypted(); + + var response = card_enc.Verify() + .WithRequestMultiUseToken(true) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(26m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute("retail"); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + + [TestMethod] + public void Retail_008b_CardVerifyMastercardSwipe() { + var card_enc = TestCards.MasterCard24Swipe(); + var response = card_enc.Verify() + .WithRequestMultiUseToken(true) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(26m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute("retail"); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + + // Manually Entered - Card Present + + [TestMethod] + public void Retail_009_ChargeVisaManualCardPresent() { + var address = new Address { + PostalCode = "750241234", + StreetAddress1 = "6860 Dallas Pkwy", + }; + var manual_card = TestCards.VisaManual(true, true); + + var response = manual_card.Charge(27m) + .WithCurrency("USD") + .WithAddress(address) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_010_ChargeMasterCardManualCardPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + var manual_card = TestCards.MasterCardManual(true, true); + + var response = manual_card.Charge(28m) + .WithCurrency("USD") + .WithAddress(address) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // CREDIT SALE Swiped Transactions + + [TestMethod] + public void Retail_011_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 29 + }; + + var response = card.Charge(29m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_012_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var autoSub = new AutoSubstantiation { + VisionSubTotal = 21 + }; + + var response = card.Charge(21m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_013_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var autoSub = new AutoSubstantiation { + ClinicSubTotal = 21, + DentalSubTotal = 10 + }; + + var response = card.Charge(31m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_014_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 22, + VisionSubTotal = 10 + }; + + var response = card.Charge(32m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_015_ChargeMastercardSwipe() { + var card = TestCards.MasterCardSwipe(); + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 33 + }; + + var response = card.Charge(33m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test 27 + var reversal = card.Reverse(33.00m).Execute("retail"); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Retail_016_ChargeMastercardSwipe() { + var card = TestCards.MasterCardSwipe(); + var autoSub = new AutoSubstantiation { + VisionSubTotal = 24 + }; + + var response = card.Charge(24m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_017_ChargeMastercardSwipe() { + var card = TestCards.MasterCardSwipe(); + var autoSub = new AutoSubstantiation { + ClinicSubTotal = 32, + DentalSubTotal = 10 + }; + + var response = card.Charge(42m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_018_ChargeMastercardSwipe() { + var card = TestCards.MasterCardSwipe(); + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 26, + VisionSubTotal = 10 + }; + + var response = card.Charge(36m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Retail_018b_ChargeMastercardSwipe() { + var card = TestCards.MasterCard25Swipe(); + + var response = card.Charge(11.50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + //Partially Approved + + [TestMethod] + public void Retail_022_ChargeDiscoverSwipePartialApproval() { + var card = TestCards.DiscoverSwipe(); + + var response = card.Charge(130.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110.00m, response.AuthorizedAmount); + + // test case 28 + var reversal = response.Reverse(110.00m).Execute("retail"); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Retail_023_ChargeMasterManualPartialApproval() { + var address = new Address { + PostalCode = "75024" + }; + var card = TestCards.MasterCardManual(true, true); + + var response = card.Charge(155.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .WithAddress(address) + .Execute("retail"); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(100.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void Retail_001_CloseBatch() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw", + ServiceUrl = "https://cert.api2.heartlandportico.com" + }); + + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + [TestMethod] + public void Ecom_000_CloseBatch() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A", + ServiceUrl = "https://cert.api2.heartlandportico.com" + }); + + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + // StreetAddress Verification + + [TestMethod] + public void Ecomm_003_Verify_Amex() { + var address = new Address { + PostalCode = "75024" + }; + var card = TestCards.AmexManual(); + + var response = card.Verify() + .WithAddress(address) + .WithRequestMultiUseToken(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_007_Verify_Visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var manual_card = TestCards.VisaManual(); + + var response = manual_card.Verify() + .WithRequestMultiUseToken(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(25m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_08a_Verify_Master_Card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var manual_card = TestCards.MasterCardManual(); + + var response = manual_card.Verify() + .WithRequestMultiUseToken(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var token = new CreditCardData { + Token = response.Token + }; + + var chargeResponse = token.Charge(26m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void Ecomm_08b_Verify_Master_Card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var manual_card = TestCards.MasterCardSeries2Manual(); + + var response = manual_card.Verify() + .WithRequestMultiUseToken(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var token = new CreditCardData { + Token = response.Token + }; + + var chargeResponse = token.Charge(26m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void Ecomm_009_Charge_Visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = TestCards.VisaManual(); + + var response = card.Charge(27m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_010_Charge_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = TestCards.MasterCardManual(); + + var response = card.Charge(28m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_010b_Charge_Master_Card_2Manual() { + var card = TestCards.MasterCardSeries2Manual(); + + var response = card.Charge(28m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Keyed transactions + + [TestMethod] + public void Ecomm_011_Charge_Visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 29 + }; + var card = TestCards.VisaManual(); + + var response = card.Charge(29m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_012_Charge_Visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + VisionSubTotal = 21 + }; + var card = TestCards.VisaManual(); + + var response = card.Charge(21m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_013_Charge_Visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + ClinicSubTotal = 21, + DentalSubTotal = 10 + }; + var card = TestCards.VisaManual(); + + var response = card.Charge(31m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_014_Charge_Visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 22, + VisionSubTotal = 10 + }; + var card = TestCards.VisaManual(); + + var response = card.Charge(32m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_015_Charge_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 33 + }; + var card = TestCards.MasterCardManual(); + + var response = card.Charge(33m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 27 + var voidResponse = response.Void().Execute("ecomm"); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void Ecomm_016_Charge_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + VisionSubTotal = 24 + }; + var card = TestCards.MasterCardManual(); + + var response = card.Charge(24m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_017_Charge_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + ClinicSubTotal = 32, + DentalSubTotal = 10 + }; + var card = TestCards.MasterCardManual(); + + var response = card.Charge(42m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Ecomm_018_Charge_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var autoSub = new AutoSubstantiation { + PrescriptionSubTotal = 26, + VisionSubTotal = 10 + }; + var card = TestCards.MasterCardManual(); + + var response = card.Charge(36m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowDuplicates(true) + .WithAutoSubstantiation(autoSub) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Partially Approved Sale + + [TestMethod] + public void Ecomm_022_Partial_Approval_Discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = TestCards.DiscoverManual(); + + var response = card.Charge(130m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowPartialAuth(true) + .Execute("ecomm"); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110m, response.AuthorizedAmount); + + // test case 28 + var reverseResponse = response.Reverse(110m).Execute("ecomm"); + Assert.IsNotNull(reverseResponse); + Assert.AreEqual("00", reverseResponse.ResponseCode); + } + + [TestMethod] + public void Ecomm_023_Partial_Approval_Master_Card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = TestCards.MasterCardManual(); + + var chargeResponse = card.Charge(145m) + .WithCurrency("USD") + .WithAddress(address) + .WithAllowPartialAuth(true) + .Execute("ecomm"); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("10", chargeResponse.ResponseCode); + Assert.AreEqual(65.00m, chargeResponse.AuthorizedAmount); + } + + [TestMethod] + public void Ecom_001_CloseBatch() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }); + + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs new file mode 100644 index 00000000..f4ceb058 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/CheckCertification.cs @@ -0,0 +1,345 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class CheckCertification { + Address address; + + public CheckCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }); + + address = new Address { + StreetAddress1 = "123 Main St.", + City = "Downtown", + State = "NJ", + PostalCode = "12345" + }; + } + + #region ACH Debit - Consumer + + [TestMethod] + public void checks_001ConsumerPersonalChecking() { + var check = TestChecks.Certification(SecCode.PPD, CheckType.PERSONAL, AccountType.CHECKING); + + var response = check.Charge(11.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 25 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_002ConsumerBusinessChecking() { + var check = TestChecks.Certification(SecCode.PPD, CheckType.BUSINESS, AccountType.CHECKING); + var response = check.Charge(12.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_003ConsumerPersonalSavings() { + var check = TestChecks.Certification(SecCode.PPD, CheckType.PERSONAL, AccountType.SAVINGS); + var response = check.Charge(13.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_004ConsumerBusinessSavings() { + var check = TestChecks.Certification(SecCode.PPD, CheckType.BUSINESS, AccountType.SAVINGS); + var response = check.Charge(14.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_005CorporatePersonalChecking() { + var check = TestChecks.Certification(SecCode.CCD, CheckType.PERSONAL, AccountType.CHECKING, "Heartland Pays"); + var response = check.Charge(15.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 26 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region ACH Debit - Corporate + + [TestMethod] + public void checks_006CorporateBuisnessChecking() { + var check = TestChecks.Certification(SecCode.CCD, CheckType.BUSINESS, AccountType.CHECKING, "Heartland Pays"); + var response = check.Charge(16.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_007CorporatePersonalSavings() { + var check = TestChecks.Certification(SecCode.CCD, CheckType.PERSONAL, AccountType.SAVINGS, "Heartland Pays"); + var response = check.Charge(17.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_008CorporateBuisnessSavings() { + var check = TestChecks.Certification(SecCode.CCD, CheckType.BUSINESS, AccountType.SAVINGS, "Heartland Pays"); + var response = check.Charge(18.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region eGold Checking Tests + + [TestMethod] + public void checks_009EgoldPersonalChecking() { + var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.CHECKING); + var response = check.Charge(11.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_010EgoldBuisnessChecking() { + var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.CHECKING); + var response = check.Charge(12.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 27 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_011EgoldPersonalSavings() { + var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.SAVINGS); + var response = check.Charge(13.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_012EgoldBusinessSavings() { + var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.SAVINGS); + var response = check.Charge(14.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region eSilver + + [TestMethod] + public void checks_013EsilverPersonalChecking() { + var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.CHECKING); + var response = check.Charge(15.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_014EsilverBuisnessChecking() { + var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.CHECKING); + var response = check.Charge(16.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 28 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_015EsilverPersonalSavings() { + var check = TestChecks.Certification(SecCode.POP, CheckType.PERSONAL, AccountType.SAVINGS); + var response = check.Charge(17.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_016EsilverBuisnessSavings() { + var check = TestChecks.Certification(SecCode.POP, CheckType.BUSINESS, AccountType.SAVINGS); + var response = check.Charge(18.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region Bronze + + [TestMethod, Ignore] + public void checks_017EbronzePersonalChecking() { + var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.CHECKING); + check.CheckVerify = true; + var response = check.Charge(19.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod, Ignore] + public void checks_018EbronzePersonalChecking() { + var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.CHECKING); + check.CheckVerify = true; + var response = check.Charge(20.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod, Ignore] + public void checks_019EbronzePersonalChecking() { + var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.PERSONAL, AccountType.SAVINGS); + check.CheckVerify = true; + var response = check.Charge(21.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod, Ignore] + public void checks_020EbronzeBusinessSavings() { + var check = TestChecks.Certification(SecCode.EBRONZE, CheckType.BUSINESS, AccountType.SAVINGS); + check.CheckVerify = true; + var response = check.Charge(22.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region Checks-by-Web + + [TestMethod] + public void checks_021WebPersonalChecking() { + var check = TestChecks.Certification(SecCode.WEB, CheckType.PERSONAL, AccountType.CHECKING); + var response = check.Charge(23.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_022WebBuisnessChecking() { + var check = TestChecks.Certification(SecCode.WEB, CheckType.BUSINESS, AccountType.CHECKING); + var response = check.Charge(24.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_023WebPersonalSavings() { + var check = TestChecks.Certification(SecCode.WEB, CheckType.PERSONAL, AccountType.SAVINGS); + var response = check.Charge(25.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 29 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void checks_024WebBusinessSavings() { + var check = TestChecks.Certification(SecCode.WEB, CheckType.BUSINESS, AccountType.SAVINGS); + var response = check.Charge(5.00m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + #endregion + + #region Check Void + // this is done inline + #endregion + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs new file mode 100644 index 00000000..9713a100 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/EcomCertification.cs @@ -0,0 +1,1499 @@ +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class EcomCertification { + bool useTokens = false; + + string visa_token; + string mastercard_token; + string discover_token; + string amex_token; + + EcommerceInfo ecom = new EcommerceInfo { + Channel = EcommerceChannel.ECOM + }; + + public EcomCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }); + } + + [TestMethod] + public void ecomm_000_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + [TestMethod] + public void ecomm_001_verify_visa() { + var card = new CreditCardData { + Number = "4484958240202792", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_002_verify_master_card() { + var card = new CreditCardData { + Number = "5356083898949891", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_003_verify_discover() { + var card = new CreditCardData { + Number = "6223971100014620", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithAddress(new Address { PostalCode = "75024" }) + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // StreetAddress Verification + + [TestMethod] + public void ecomm_004_verify_amex() { + var card = new CreditCardData { + Number = "345039962663847", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithAddress(new Address { PostalCode = "75024" }) + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Balance Inquiry (for Prepaid Card) + + [TestMethod] + public void ecomm_005_balance_inquiry_visa() { + var card = new CreditCardData { + Number = "4664383951958601", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // CREDIT SALE (For Multi-Use Token Only) + + [TestMethod, Ignore] + public void ecomm_006_charge_visa_token() { + var address = new Address { + StreetAddress1 = "6860 Dallas Pkwy", + PostalCode = "75024" + }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Charge(13.01m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + visa_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_007_charge_master_card_token() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(13.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + mastercard_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_008_charge_discover_token() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(13.03m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + discover_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_009_charge_amex_token() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var response = card.Charge(13.04m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + amex_token = response.Token; + } + + // CREDIT SALE + + [TestMethod] + public void ecomm_010_charge_visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(); + + var response = card.Charge(17.01m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 35 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011_charge_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(); + + var chargeResponse = card.Charge(17.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_012_charge_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual(); + + var chargeResponse = card.Charge(17.03m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_013_charge_amex() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(); + + var chargeResponse = card.Charge(17.04m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_014_charge_jcb() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "3566007770007321", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(17.05m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011b_charge_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = TestCards.MasterCardSeries2Manual(); + + var chargeResponse = card.Charge(17.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + // AUTHORIZATION + + [TestMethod] + public void ecomm_015_authorization_visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.06m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 015b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_016_authorization_master_card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 016b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_017_authorization_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_016b_authorization_master_card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "2223000010005780", + ExpMonth = 12, + ExpYear = 2019, + Cvn = "900" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 016b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + // PARTIALLY - APPROVED SALE + + [TestMethod] + public void ecomm_018_partial_approval_visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(130m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void ecomm_019_partial_approval_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(145m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(65.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void ecomm_020_partial_approval_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(155m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("10", chargeResponse.ResponseCode); + Assert.AreEqual(100.00m, chargeResponse.AuthorizedAmount); + + // test case 36 + var voidResponse = chargeResponse.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + // LEVEL II CORPORATE PURCHASE CARD + + [TestMethod] + public void ecomm_021_level_ii_response_b() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(112.34m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("B", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_022_level_ii_response_b() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(112.34m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("B", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_023_level_ii_response_r() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(123.45m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("R", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT); + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_024_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(134.56m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_025_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.06m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_026_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_027_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.08m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_028_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.09m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_029_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_030_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.11m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_031_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.12m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_032_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.13m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + // PRIOR / VOICE AUTHORIZATION + + [TestMethod] + public void ecomm_033_offline_sale() { + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(17.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithOfflineAuthCode("654321") + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_033_offline_authorization() { + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Authorize(17.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithOfflineAuthCode("654321") + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RETURN + + [TestMethod] + public void ecomm_034_offline_credit_return() { + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Refund(15.15m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_034b_offline_credit_return() { + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Refund(15.16m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // ONLINE VOID / REVERSAL + + [TestMethod] + public void ecomm_035_void_ecomm_10() { + // see test case 10 + } + + [TestMethod] + public void ecomm_036_void_ecomm_20() { + // see test case 20 + } + + // Time Out Reversal + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void ecomm_036b_timeout_reversal() { + var sale = TestCards.VisaManual().Charge(911m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithClientTransactionId("987321654") + .Execute(); + Assert.IsNotNull(sale); + Assert.AreEqual("91", sale.ResponseCode); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = "987321654"; + + var reversalResponse = response.Reverse(911m).Execute(); + } + + // One time bill payment + + [TestMethod] + public void ecomm_010_charge_visa_onetime() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(); + + var response = card.Charge(13.11m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 35 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011_charge_mastercard_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(); + + var chargeResponse = card.Charge(13.12m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_012_charge_discover_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual(); + + var chargeResponse = card.Charge(13.13m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_013_charge_amex_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(); + + var chargeResponse = card.Charge(13.14m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_014_charge_jcb_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "3566007770007321", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(13.15m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + // HMS GIFT - REWARDS + + // ACTIVATE + + [TestMethod] + public void ecomm_042_activate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Activate(6.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_043_activate_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Activate(7.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // LOAD / ADD VALUE + + [TestMethod] + public void ecomm_044_add_value_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Activate(8.00m).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_045_add_value_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Activate(8.00m).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // BALANCE INQUIRY + + [TestMethod] + public void ecomm_046_balance_inquiry_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + [TestMethod] + public void ecomm_047_balance_inquiry_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + // REPLACE / TRANSFER + + [TestMethod] + public void ecomm_048_replace_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard1.ReplaceWith(giftCard2).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + [TestMethod] + public void ecomm_049_replace_gift_2() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.ReplaceWith(giftCard1).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + // SALE / REDEEM + + [TestMethod] + public void ecomm_050_sale_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Charge(1.0m) + .WithCurrency("USD") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_051_sale_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Charge(2.0m) + .WithCurrency("USD") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_052_sale_gift_1_void() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var saleResponse = giftCard1.Charge(3.0m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + + // test case 54 + var voidResponse = saleResponse.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_053_sale_gift_2_reversal() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var saleResponse = giftCard2.Charge(4.0m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + + // test case 55 + var reverseResponse = saleResponse.Reverse(4.0m).Execute(); + Assert.IsNotNull(reverseResponse); + Assert.AreEqual("00", reverseResponse.ResponseCode); + } + + // VOID + + [TestMethod] + public void ecomm_054_void_gift() { + // see test case 52 + } + + // REVERSAL + + [TestMethod] + public void ecomm_055_reversal_gift() { + // see test case 53 + } + + [TestMethod] + public void ecomm_056_reversal_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Reverse(2.0m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // DEACTIVATE + + [TestMethod] + public void ecomm_057_deactivate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RECEIPTS MESSAGING + + // ecomm_058_receipts_messaging: print and scan receipt for test 51 + + // BALANCE INQUIRY + + [TestMethod] + public void ecomm_059_balance_inquiry_rewards_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0.00m, response.PointsBalanceAmount); + } + + [TestMethod] + public void ecomm_060_balance_inquiry_rewards_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0.00m, response.PointsBalanceAmount); + } + + // ALIAS + + [TestMethod] + public void ecomm_061_create_alias_gift_1() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void ecomm_062_create_alias_gift_2() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void ecomm_063_add_alias_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.AddAlias("2145550199").Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_064_add_alias_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.AddAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_065_delete_alias_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.RemoveAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // SALE / REDEEM + + [TestMethod] + public void ecomm_066_redeem_points_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Charge(100m) + .WithCurrency("POINTS") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + [TestMethod] + public void ecomm_067_redeem_points_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Charge(200m) + .WithCurrency("POINTS") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + [TestMethod] + public void ecomm_068_redeem_points_gift_2() { + var giftCard = new GiftCard { Alias = "9725550100" }; + + var response = giftCard.Charge(300.00m) + .WithCurrency("POINTS") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // REWARDS + + [TestMethod] + public void ecomm_069_rewards_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Rewards(10.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_070_rewards_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Rewards(11.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // REPLACE / TRANSFER + + [TestMethod] + public void ecomm_071_replace_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard1.ReplaceWith(giftCard2).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_072_replace_gift_2() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.ReplaceWith(giftCard1).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // DEACTIVATE + + [TestMethod] + public void ecomm_073_deactivate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_074_deactivate_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RECEIPTS MESSAGING + + // ecomm_075_receipts_messaging: print and scan receipt for test 51 + + // CLOSE BATCH + + [TestMethod] + public void ecomm_999_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs new file mode 100644 index 00000000..0cf25a2a --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/EcomCheckCertification.cs @@ -0,0 +1,122 @@ +using System; +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class EcomCheckCertification { + Address address; + + public EcomCheckCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }); + + address = new Address { + StreetAddress1 = "6860 Dallas Pkwy", + City = "Dallas", + State = "TX", + PostalCode = "75024" + }; + } + + [TestMethod] + public void ecomm_001_PersonalChecking() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.CHECKING, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "John Doe", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(19m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 1: " + response.TransactionId); + } + + [TestMethod] + public void ecomm_002_BusinessChecking() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.CHECKING, + CheckType = CheckType.BUSINESS, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "Acme Unlimited", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(20m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 2: " + response.TransactionId); + } + + [TestMethod] + public void ecomm_003_PersonalSavings() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.SAVINGS, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "John Doe", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(21m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 3: " + response.TransactionId); + + Transaction voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + Debug.WriteLine("Test 5: " + voidResponse.TransactionId); + } + + [TestMethod] + public void ecomm_004_BusinessSavings() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.SAVINGS, + CheckType = CheckType.BUSINESS, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "Acme Unlimited", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(22m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 4: " + response.TransactionId); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs new file mode 100644 index 00000000..5486294a --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/LodgingCertification.cs @@ -0,0 +1,2392 @@ +using System; +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class LodgingCertification { + private CreditCardData card; + private CreditTrackData track; + + public LodgingCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SiteId = 144101, + LicenseId = 144012, + DeviceId = 6402470, + Username = "701395572", + Password = "$Test1234", + ServiceUrl = "https://cert.api2-c.heartlandportico.com", + DeveloperId = "002914", + VersionNumber = "4268" + }); + } + + [TestMethod] + public void Lodging_000_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + /* + Check In/Check Out (Single Stay) - SALE : SWIPED + */ + [TestMethod] + public void Lodging_001_SaleVisaSwiped_SingleStay() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(10m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_002a_SaleMasterSwiped_SingleStay() { + track = TestCards.MasterCardSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(11m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_002b_SaleMaster24Swiped_SingleStay() { + track = TestCards.MasterCard24Swipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(11.50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_003_SaleDiscoverSwiped_SingleStay() { + track = TestCards.DiscoverSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(12m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_004_SaleAmexSwiped_SingleStay() { + track = TestCards.AmexSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(13m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_005_SaleJcbSwiped_SingleStay() { + track = TestCards.JcbSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Charge(14m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Check In/Check Out (Single Stay) - SALE : KEYED, CARD PRESENT + */ + [TestMethod] + public void Lodging_006_SaleVisaKeyed_CardPresent_SingleStay() { + card = TestCards.VisaManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(15m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_007a_SaleMasterKeyed_CardPresent_SingleStay() { + card = TestCards.MasterCardManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(16m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_007b_SaleMaster2SeriesKeyed_CardPresent_SingleStay() { + card = TestCards.MasterCardSeries2Manual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(16.50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_008_SaleDiscoverManualKeyed_CardPresent_SingleStay() { + card = TestCards.DiscoverManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(17m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_009_SaleAmexManualKeyed_CardPresent_SingleStay() { + card = TestCards.AmexManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(18m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_010_SaleJcbManualKeyed_CardPresent_SingleStay() { + card = TestCards.JcbManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(19m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Check In/Check Out (Single Stay) - SALE : KEYED, CARD NOT PRESENT + */ + [TestMethod] + public void Lodging_011_SaleVisaManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.VisaManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(20m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_012a_SaleMasterManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.MasterCardManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(21m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_012b_SaleMaster2SeriesManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.MasterCardSeries2Manual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(21.50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_013_SaleDiscoverManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.DiscoverManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(22m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_014_SaleAmexManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.AmexManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(23m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_015_SaleJcbManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.JcbManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Charge(24m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Contactless + Check In/Check Out - AUTHORIZATIONS : SWIPED + */ + [TestMethod] + public void Lodging_016_AuthVisaSwiped_SingleStay() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(25m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // capture + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_017a_AuthMasterSwiped_SingleStay() { + track = TestCards.MasterCardSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(26m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_017b_AuthMaster24Swiped_SingleStay() { + track = TestCards.MasterCard24Swipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(26.50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_018_AuthDiscoverSwiped_SingleStay() { + track = TestCards.DiscoverSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(27m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_019_AuthAmexSwiped_SingleStay() { + track = TestCards.AmexSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(28m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_020_AuthJcbSwiped_SingleStay() { + track = TestCards.JcbSwipe(); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = track.Authorize(29m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + Check In/Check Out - AUTHORIZATIONS : KEYED, CARD PRESENT + */ + [TestMethod] + public void Lodging_021_AuthVisaKeyed_CardPresent_SingleStay() { + card = TestCards.VisaManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(30m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_022_AuthMasterKeyed_CardPresent_SingleStay() { + card = TestCards.MasterCardManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(31m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_023_AuthDiscoverKeyed_CardPresent_SingleStay() { + card = TestCards.DiscoverManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(32m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_024_AuthAmexKeyed_CardPresent_SingleStay() { + card = TestCards.AmexManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(33m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_025_AuthJcbKeyed_CardPresent_SingleStay() { + card = TestCards.JcbManual(true, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(34m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + Check In/Check Out - AUTHORIZATIONS : KEYED, CARD NOT PRESENT + */ + [TestMethod] + public void Lodging_026_AuthVisaManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.VisaManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(35m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_027_AuthMasterManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.MasterCardManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(36m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_028_AuthDiscoverManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.DiscoverManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(37m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_029_AuthAmexManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.AmexManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(38m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_030_AuthJcbManualKeyed_CardNotPresent_SingleStay() { + card = TestCards.JcbManual(false, true); + + var lodgingData = new LodgingData { StayDuration = 1 }; + + Transaction response = card.Authorize(39m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + Advanced Deposit - SALES + */ + [TestMethod] + public void Lodging_031_SaleVisaManualKeyed_AdvancedDeposit() { + card = TestCards.VisaManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 1, + AdvancedDepositType = AdvancedDepositType.CARD_DEPOSIT + }; + + Transaction response = card.Charge(41m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_032_SaleAmexManualKeyed_AdvancedDeposit() { + card = TestCards.AmexManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 2, + AdvancedDepositType = AdvancedDepositType.CARD_DEPOSIT + }; + + Transaction response = card.Charge(80m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + No Show - SALES + */ + [TestMethod] + public void Lodging_033_SaleMasterManualKeyed_NoShow() { + card = TestCards.MasterCardManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 1, + NoShow = true + }; + + Transaction response = card.Charge(42m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_034_SaleAmexManualKeyed_NoShow() { + card = TestCards.AmexManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 1, + AdvancedDepositType = AdvancedDepositType.ASSURED_RESERVATION, + NoShow = true + }; + + Transaction response = card.Charge(43m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Visa Prestigious Property - SALES + */ + [TestMethod] + public void Lodging_035_SaleVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_500 + }; + + Transaction response = track.Charge(44m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_036_SaleVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1000 + }; + + Transaction response = track.Charge(45m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_037_SaleVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1500 + }; + + Transaction response = track.Charge(46m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Visa Prestigious Property - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_038_AuthVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_500 + }; + + Transaction response = track.Authorize(44m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_039_AuthVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1000 + }; + + Transaction response = track.Authorize(45m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_040_AuthVisaSwiped_PrestigiousProperty() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PrestigiousPropertyLimit = PrestigiousPropertyLimit.LIMIT_1500 + }; + + Transaction response = track.Authorize(46m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + MasterCard Preferred Customer - SALES + */ + [TestMethod] + public void Lodging_041_SaleMasterSwiped_PreferredCustomer() { + track = TestCards.MasterCardSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PreferredCustomer = true + }; + + Transaction response = track.Charge(47m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_042_SaleMasterManualKeyed_PreferredCustomer() { + card = TestCards.MasterCardManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 2, + PreferredCustomer = true + }; + + Transaction response = card.Charge(48m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + MasterCard Preferred Customer - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_043_AuthMasterSwiped_PreferredCustomer() { + track = TestCards.MasterCardSwipe(); + + var lodgingData = new LodgingData { + StayDuration = 1, + PreferredCustomer = true + }; + + Transaction response = track.Authorize(47m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_044_AuthMasterManualKeyed_PreferredCustomer() { + card = TestCards.MasterCardManual(false, true); + + var lodgingData = new LodgingData { + StayDuration = 2, + PreferredCustomer = true + }; + + Transaction response = card.Authorize(48m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + Additional / Extra Charges - SALES + */ + [TestMethod] + public void Lodging_045_SaleVisaSwiped_ExtraCharges() { + track = TestCards.VisaSwipe(); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Restaurant); + + Transaction response = track.Charge(49m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_045a_SaleVisaSwiped_ExtraChargesEdit() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(49m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Restaurant); + + Transaction editResponse = response.Edit() + .WithAmount(49m) + .WithCurrency("USD") + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + [TestMethod] + public void Lodging_046_SaleMasterSwiped_ExtraCharges() { + track = TestCards.MasterCardSwipe(); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.GiftShop) + .AddExtraCharge(ExtraChargeType.MiniBar) + .AddExtraCharge(ExtraChargeType.Telephone); + + Transaction response = track.Charge(50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_046a_SaleMasterSwiped_ExtraChargesEdit() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Charge(50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.GiftShop) + .AddExtraCharge(ExtraChargeType.MiniBar) + .AddExtraCharge(ExtraChargeType.Telephone); + + Transaction editResponse = response.Edit() + .WithAmount(50m) + .WithCurrency("USD") + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + [TestMethod] + public void Lodging_047_SaleDiscoverSwiped_ExtraCharges() { + track = TestCards.DiscoverSwipe(); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Laundry); + + Transaction response = track.Charge(51m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_047a_SaleDiscoverSwiped_ExtraChargesEdit() { + track = TestCards.DiscoverSwipe(); + + Transaction response = track.Charge(51m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Laundry); + + Transaction editResponse = response.Edit() + .WithAmount(50m) + .WithCurrency("USD") + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + /* + Additional / Extra Charges - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_048_AuthVisaSwiped_ExtraCharges() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Authorize(49m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Restaurant); + + Transaction captureResponse = response.Capture() + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void Lodging_049_AuthMasterSwiped_ExtraCharges() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Authorize(50m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.GiftShop) + .AddExtraCharge(ExtraChargeType.MiniBar) + .AddExtraCharge(ExtraChargeType.Telephone); + + Transaction captureResponse = response.Capture() + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void Lodging_050_AuthDiscoverSwiped_ExtraCharges() { + track = TestCards.DiscoverSwipe(); + + Transaction response = track.Authorize(51m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var lodgingData = new LodgingData() + .AddExtraCharge(ExtraChargeType.Laundry); + + Transaction captureResponse = response.Capture() + .WithLodgingData(lodgingData) + .Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + /* + Partial Approvals - SALES + */ + [TestMethod] + public void Lodging_051_SaleMasterSwiped_PartialApproval() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Charge(130m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110m, response.AuthorizedAmount); + } + + [TestMethod] + public void Lodging_052_SaleDiscoverManualKeyed_PartialApproval() { + card = TestCards.DiscoverManual(true, true); + + Transaction response = card.Charge(145m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(65m, response.AuthorizedAmount); + } + + /* + Partial Approvals - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_053_AuthMasterSwiped_PartialApproval() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Authorize(130m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110m, response.AuthorizedAmount); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_054_AuthDiscoverManualKeyed_PartialApproval() { + card = TestCards.DiscoverManual(true, true); + + Transaction response = card.Authorize(145m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(65m, response.AuthorizedAmount); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + CARD VERIFY + */ + [TestMethod] + public void Lodging_055_VerifyVisaSwiped() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Verify() + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_056_VerifyMasterManualKeyed() { + card = TestCards.MasterCardManual(false, true); + + Transaction response = card.Verify() + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_057_VerifyDiscoverSwiped() { + track = TestCards.DiscoverSwipe(); + + Transaction response = track.Verify() + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + FORCE / VOICE AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_058_OfflineAuth() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Authorize(52m) + .WithCurrency("USD") + .WithOfflineAuthCode("654321") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + RETURN + */ + [TestMethod] + public void Lodging_059_ReturnByCard() { + card = TestCards.DiscoverManual(false, true); + + Transaction response = card.Refund(53m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + RETURN by TxnID + */ + [TestMethod] + public void Lodging_059a_ReturnByTxnId_Visa() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(53m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction refund = response.Refund(53m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(refund); + Assert.AreEqual("00", refund.ResponseCode); + } + + [TestMethod] + public void Lodging_059b_ReturnByTxnId_MasterCard() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Charge(54m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction refund = response.Refund(54m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(refund); + Assert.AreEqual("00", refund.ResponseCode); + } + + /* + LEVEL II Corporate Purchase Card - SALES + */ + [TestMethod] + public void Lodging_060_LevelII_Sale_Visa_TaxNotUsed() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(112.34m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("B", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_061_LevelII_Sale_Visa_SalesTax() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(112.34m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("R", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_062_LevelII_Sale_Visa_TaxExempt() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Charge(123.45m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("R", response.CommercialIndicator); + + Transaction edit = response.Edit() + .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT)) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_063_LevelII_Sale_VisaManual_SalesTax() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Charge(134.56m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_064_LevelII_Sale_Master_TaxNotUsed() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Charge(111.06m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_065_LevelII_Sale_Master_SalesTax() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Charge(111.07m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_066_LevelII_Sale_MasterManual_SalesTax() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Charge(111.08m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_067_LevelII_Sale_MasterManual_TaxExempt() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Charge(111.09m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_068_LevelII_Sale_Amex_SalesTax() { + track = TestCards.AmexSwipe(); + + Transaction response = track.Charge(111.10m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_069_LevelII_Sale() { + track = TestCards.AmexSwipe(); + + Transaction response = track.Charge(111.11m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_070_LevelII_Sale_Amex_TaxNotUsed() { + card = TestCards.AmexManual(true, true); + + Transaction response = card.Charge(111.12m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + [TestMethod] + public void Lodging_071_LevelII_Sale_AmexManual_TaxExempt() { + card = TestCards.AmexManual(true, true); + + Transaction response = card.Charge(111.13m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + } + + /* + LEVEL II Corporate Purchase Card - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_072_LevelII_Authorization_Visa_TaxNotUsed() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Authorize(112.34m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("B", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_073_LevelII_Authorization_Visa_SalesTax() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Authorize(112.34m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("B", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_074_LevelII_Authorization_VisaManual_TaxExempt() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Authorize(123.45m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("R", response.CommercialIndicator); + + Transaction edit = response.Edit() + .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT)) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_075_LevelII_Authorization_VisaManual_SalesTax() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Authorize(134.56m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_076_LevelII_Authorization_Master_TaxNotUsed() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Authorize(111.06m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_077_LevelII_Authorization_Master_SalesTax() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Authorize(111.07m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_078_LevelII_Authorization_MasterManual_SalesTax() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Authorize(111.08m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_079_LevelII_Authorization_MasterManual_TaxExempt() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Authorize(111.09m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_080_LevelII_Authorization_Amex_SalesTax() { + track = TestCards.AmexSwipe(); + + Transaction response = track.Authorize(111.10m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m, + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_081_LevelII_Authorization() { + track = TestCards.AmexSwipe(); + + Transaction response = track.Authorize(111.11m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_082_LevelII_Authorization_AmexManual_TaxNotUsed() { + card = TestCards.AmexManual(true, true); + + Transaction response = card.Authorize(111.12m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_083_LevelII_Authorization_AmexManual_TaxExempt() { + card = TestCards.AmexManual(true, true); + + Transaction response = card.Authorize(111.13m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + Transaction edit = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(edit); + Assert.AreEqual("00", edit.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + Incremental Authorizations - SALES + */ + [TestMethod] + public void Lodging_084_IncrementalAuth_VisaSale() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(115m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction incremental = response.Increment(23m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(incremental); + Assert.AreEqual("00", incremental.ResponseCode); + } + + [TestMethod] + public void Lodging_085_IncrementalAuth_MasterSale() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Charge(116m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction incremental = response.Increment(24m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(incremental); + Assert.AreEqual("00", incremental.ResponseCode); + } + + /* + Incremental Authorizations - AUTHORIZATIONS + */ + [TestMethod] + public void Lodging_086_IncrementalAuth_VisaAuth() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Authorize(115m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction incremental = response.Increment(23m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(incremental); + Assert.AreEqual("00", incremental.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + [TestMethod] + public void Lodging_087_IncrementalAuth_MasterAuth() { + track = TestCards.MasterCardSwipe(); + + Transaction response = track.Authorize(116m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction incremental = response.Increment(24m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(incremental); + Assert.AreEqual("00", incremental.ResponseCode); + + Transaction capture = response.Capture().Execute(); + Assert.IsNotNull(capture); + Assert.AreEqual("00", capture.ResponseCode); + } + + /* + ONLINE VOID / REVERSAL (Required) + */ + [TestMethod] + public void Lodging_088_OnlineVoid_Visa() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(122m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction reversal = response.Void().Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Lodging_089_OnlineVoid_Master() { + card = TestCards.MasterCardManual(true, true); + + Transaction response = card.Charge(124m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction reversal = response.Void().Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Lodging_090_OnlineVoid_DiscoverManual() { + card = TestCards.DiscoverManual(false, true); + + Transaction response = card.Charge(125m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction reversal = response.Void().Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Lodging_091_OnlineVoid_Discover() { + track = TestCards.DiscoverSwipe(); + + Transaction response = track.Charge(155m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(100m, response.AuthorizedAmount); + + Transaction reversal = response.Reverse(100m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + /* + ONLINE VOID / REVERSAL FOR INCREMENTALS + */ + [TestMethod] + public void Lodging_092_IncrementalReversal_Visa() { + track = TestCards.VisaSwipe(); + + Transaction response = track.Charge(126m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction firstIncrement = response.Increment(26m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(firstIncrement); + Assert.AreEqual("00", firstIncrement.ResponseCode); + + Transaction secondIncrement = response.Increment(31m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(secondIncrement); + Assert.AreEqual("00", secondIncrement.ResponseCode); + + Transaction reversal = response.Reverse(126m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Lodging_093_IncrementalReversal_Discover() { + track = TestCards.DiscoverSwipe(); + + Transaction response = track.Charge(127m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction firstIncrement = response.Increment(27m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(firstIncrement); + Assert.AreEqual("00", firstIncrement.ResponseCode); + + Transaction secondIncrement = response.Increment(32m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(secondIncrement); + Assert.AreEqual("00", secondIncrement.ResponseCode); + + Transaction reversal = response.Reverse(127m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + /* + PIN DEBIT CARD FUNCTIONS - SALE + */ + [TestMethod] + public void Lodging_094_DebitSale_Visa() { + DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA"); + + Transaction response = track.Charge(139m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_095_DebitSale_Master() { + DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB"); + + Transaction response = track.Charge(135m) + .WithCurrency("USD") + .WithCashBack(5m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + PARTIALLY - APPROVED PURCHASE + */ + [TestMethod] + public void Lodging_096_DebitPartialApproval() { + DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB"); + + Transaction response = track.Charge(33m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(22m, response.AuthorizedAmount); ; + } + + [TestMethod] + public void Lodging_096a_DebitPartialApproval() { + DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA"); + + Transaction response = track.Charge(44m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(33m, response.AuthorizedAmount); + } + /* + RETURN + */ + [TestMethod] + public void Lodging_097_DebitReturn() { + DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA"); + + Transaction response = track.Refund(40m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + ONLINE VOID / REVERSAL (Required) + */ + [TestMethod] + public void Lodging_098_DebitReversal_Visa() { + DebitTrackData track = TestCards.AsDebit(TestCards.VisaSwipe(), "32539F50C245A6A93D123412324000AA"); + + Transaction response = track.Charge(142m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction reversal = track.Reverse(142m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void Lodging_099_DebitReversal_Master() { + DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB"); + + Transaction response = track.Charge(44m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + + Transaction reversal = track.Reverse(33m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + /* + CONTACTLESS - Sales + */ + [TestMethod] + public void Lodging_100_ContactlessSale_Visa() { + track = TestCards.VisaSwipe(EntryMethod.Proximity); + + Transaction response = track.Charge(6m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_101_ContactlessSale_Master() { + track = TestCards.MasterCardSwipe(EntryMethod.Proximity); + + Transaction response = track.Charge(6m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_102_ContactlessSale_Discover() + { + track = TestCards.DiscoverSwipe(EntryMethod.Proximity); + + Transaction response = track.Charge(6m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_103_ContactlessSale_Amex() { + track = TestCards.AmexSwipe(EntryMethod.Proximity); + + Transaction response = track.Charge(9m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + TIME OUT REVERSAL (TOR) + */ + [TestMethod, ExpectedException(typeof(GatewayException))] + public void Lodging_104_TimeOutReversal_Discover() { + track = TestCards.DiscoverSwipe(); + + string clientTransactionId = new Random().Next(10000000, 90000000).ToString(); + + track.Charge(10.33m) + .WithCurrency("USD") + .WithClientTransactionId(clientTransactionId) + .Execute(); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = clientTransactionId; + + var reversalResponse = response.Reverse(10.33m).Execute(); + Assert.IsNotNull(reversalResponse); + Assert.AreEqual("00", reversalResponse.ResponseCode); + } + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void Lodging_105_TimeOutReversal_Master() { + track = TestCards.MasterCardSwipe(); + + string clientTransactionId = new Random().Next(10000000, 90000000).ToString(); + + track.Charge(10.33m) + .WithCurrency("USD") + .WithClientTransactionId(clientTransactionId) + .Execute(); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = clientTransactionId; + + var reversalResponse = response.Reverse(10.33m).Execute(); + Assert.IsNotNull(reversalResponse); + Assert.AreEqual("00", reversalResponse.ResponseCode); + } + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void Lodging_106_TimeOutReversal_Jcb() { + track = TestCards.JcbSwipe(); + + string clientTransactionId = new Random().Next(10000000, 90000000).ToString(); + + track.Charge(10.33m) + .WithCurrency("USD") + .WithClientTransactionId(clientTransactionId) + .Execute(); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = clientTransactionId; + + var reversalResponse = response.Reverse(10.33m).Execute(); + Assert.IsNotNull(reversalResponse); + Assert.AreEqual("00", reversalResponse.ResponseCode); + } + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void Lodging_107_TimeOutReversal_Visa() { + track = TestCards.VisaSwipe(); + + string clientTransactionId = new Random().Next(10000000, 90000000).ToString(); + + track.Charge(10.33m) + .WithCurrency("USD") + .WithClientTransactionId(clientTransactionId) + .Execute(); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = clientTransactionId; + + var reversalResponse = response.Reverse(10.33m).Execute(); + Assert.IsNotNull(reversalResponse); + Assert.AreEqual("00", reversalResponse.ResponseCode); + } + + [TestMethod] + public void Lodging_999_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + /* + Per GSTP ISO Lodging MSRDebit Purchase with Cash Back + */ + + [TestMethod] + public void Lodging_246_DebitSale_Master() { + DebitTrackData track = TestCards.AsDebit(TestCards.MasterCardSwipe(), "F505AD81659AA42A3D123412324000AB"); + + Transaction response = track.Charge(3.73m) + .WithCurrency("USD") + .WithCashBack(0.40m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void Lodging_247_DebitSaleVisaKeyed_CardPresent() { + card = TestCards.VisaManual(true, true); + + Transaction response = card.Charge(3.70m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + Transaction duplicateResponse = card.Charge(3.70m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", duplicateResponse.ResponseCode); + } + } +} \ No newline at end of file diff --git a/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs new file mode 100644 index 00000000..dcc6de75 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/MotoCertification.cs @@ -0,0 +1,1496 @@ +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class MotoCertification { + bool useTokens = false; + + string visa_token; + string mastercard_token; + string discover_token; + string amex_token; + + EcommerceInfo ecom = new EcommerceInfo { + Channel = EcommerceChannel.ECOM + }; + + public MotoCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ" + }); + } + + [TestMethod] + public void ecomm_000_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + [TestMethod] + public void ecomm_001_verify_visa() { + var card = new CreditCardData { + Number = "4484958240202792", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_002_verify_master_card() { + var card = new CreditCardData { + Number = "5356083898949891", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_003_verify_discover() { + var card = new CreditCardData { + Number = "6223971100014620", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithAddress(new Address { PostalCode = "75024" }) + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // StreetAddress Verification + + [TestMethod] + public void ecomm_004_verify_amex() { + var card = new CreditCardData { + Number = "345039962663847", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Verify() + .WithAddress(new Address { PostalCode = "75024" }) + .WithRequestMultiUseToken(useTokens) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Balance Inquiry (for Prepaid Card) + + [TestMethod] + public void ecomm_005_balance_inquiry_visa() { + var card = new CreditCardData { + Number = "4664383951958601", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // CREDIT SALE (For Multi-Use Token Only) + + [TestMethod, Ignore] + public void ecomm_006_charge_visa_token() { + var address = new Address { + StreetAddress1 = "6860 Dallas Pkwy", + PostalCode = "75024" + }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025 + }; + + var response = card.Charge(13.01m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + visa_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_007_charge_master_card_token() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(13.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + mastercard_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_008_charge_discover_token() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(13.03m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + discover_token = response.Token; + } + + [TestMethod, Ignore] + public void ecomm_009_charge_amex_token() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var response = card.Charge(13.04m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + amex_token = response.Token; + } + + // CREDIT SALE + + [TestMethod] + public void ecomm_010_charge_visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(); + + var response = card.Charge(17.01m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 35 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011_charge_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(); + + var chargeResponse = card.Charge(17.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_012_charge_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual(); + + var chargeResponse = card.Charge(17.03m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_013_charge_amex() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(); + + var chargeResponse = card.Charge(17.04m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_014_charge_jcb() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "3566007770007321", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(17.05m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011b_charge_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = TestCards.MasterCardSeries2Manual(); + + var chargeResponse = card.Charge(17.02m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + // AUTHORIZATION + + [TestMethod] + public void ecomm_015_authorization_visa() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.06m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 015b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_016_authorization_master_card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 016b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_017_authorization_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_016b_authorization_master_card() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "2223000010005780", + ExpMonth = 12, + ExpYear = 2019, + Cvn = "900" + }; + + var authResponse = card.Authorize(17.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(authResponse); + Assert.AreEqual("00", authResponse.ResponseCode); + + // test 016b Capture/AddToBatch + var captureResponse = authResponse.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + // PARTIALLY - APPROVED SALE + + [TestMethod] + public void ecomm_018_partial_approval_visa() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(130m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void ecomm_019_partial_approval_discover() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "6011000990156527", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(145m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(65.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void ecomm_020_partial_approval_master_card() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(155m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithAllowPartialAuth(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("10", chargeResponse.ResponseCode); + Assert.AreEqual(100.00m, chargeResponse.AuthorizedAmount); + + // test case 36 + var voidResponse = chargeResponse.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + // LEVEL II CORPORATE PURCHASE CARD + + [TestMethod] + public void ecomm_021_level_ii_response_b() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(112.34m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("B", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_022_level_ii_response_b() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(112.34m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithAllowDuplicates(true) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("B", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_023_level_ii_response_r() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(123.45m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("R", chargeResponse.CommercialIndicator); + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT)) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_024_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(134.56m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_025_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.06m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_026_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.07m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_027_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.08m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_028_level_ii_response_s() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(111.09m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("S", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_029_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_030_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.11m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_031_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.12m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_032_level_ii_no_response() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "372700699251018", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "1234" + }; + + var chargeResponse = card.Charge(111.13m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + Assert.AreEqual("0", chargeResponse.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = chargeResponse.Edit() + .WithCommercialData(commercialData) + .Execute(); + + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + // PRIOR / VOICE AUTHORIZATION + + [TestMethod] + public void ecomm_033_offline_sale() { + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Charge(17.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithOfflineAuthCode("654321") + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_033_offline_authorization() { + var card = new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Authorize(17.10m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithOfflineAuthCode("654321") + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RETURN + + [TestMethod] + public void ecomm_034_offline_credit_return() { + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Refund(15.15m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_034b_offline_credit_return() { + var card = new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var response = card.Refund(15.16m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithInvoiceNumber("123456") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // ONLINE VOID / REVERSAL + + [TestMethod] + public void ecomm_035_void_ecomm_10() { + // see test case 10 + } + + [TestMethod] + public void ecomm_036_void_ecomm_20() { + // see test case 20 + } + + // Time Out Reversal + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void ecomm_036b_timeout_reversal() { + var sale = TestCards.VisaManual().Charge(911m) + .WithCurrency("USD") + .WithEcommerceInfo(ecom) + .WithClientTransactionId("987321654") + .Execute(); + Assert.IsNotNull(sale); + Assert.AreEqual("91", sale.ResponseCode); + + var response = Transaction.FromId(null, PaymentMethodType.Credit); + response.ClientTransactionId = "987321654"; + + var reversalResponse = response.Reverse(911m).Execute(); + } + + // One time bill payment + + [TestMethod] + public void ecomm_010_charge_visa_onetime() { + var address = new Address { StreetAddress1 = "6860 Dallas Pkwy", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(); + + var response = card.Charge(13.11m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 35 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_011_charge_mastercard_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "750241234" }; + var card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(); + + var chargeResponse = card.Charge(13.12m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_012_charge_discover_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = discover_token } : TestCards.DiscoverManual(); + + var chargeResponse = card.Charge(13.13m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_013_charge_amex_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + var card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(); + + var chargeResponse = card.Charge(13.14m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_014_charge_jcb_onetime() { + var address = new Address { StreetAddress1 = "6860", PostalCode = "75024" }; + + var card = new CreditCardData { + Number = "3566007770007321", + ExpMonth = 12, + ExpYear = 2025, + Cvn = "123" + }; + + var chargeResponse = card.Charge(13.15m) + .WithCurrency("USD") + .WithAddress(address) + .WithInvoiceNumber("123456") + .WithOneTimePayment(true) + .WithAllowDuplicates(true) + .Execute(); + + Assert.IsNotNull(chargeResponse); + Assert.AreEqual("00", chargeResponse.ResponseCode); + } + + // HMS GIFT - REWARDS + + // ACTIVATE + + [TestMethod] + public void ecomm_042_activate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Activate(6.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_043_activate_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Activate(7.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // LOAD / ADD VALUE + + [TestMethod] + public void ecomm_044_add_value_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Activate(8.00m).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_045_add_value_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Activate(8.00m).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // BALANCE INQUIRY + + [TestMethod] + public void ecomm_046_balance_inquiry_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + [TestMethod] + public void ecomm_047_balance_inquiry_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + // REPLACE / TRANSFER + + [TestMethod] + public void ecomm_048_replace_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard1.ReplaceWith(giftCard2).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + [TestMethod] + public void ecomm_049_replace_gift_2() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.ReplaceWith(giftCard1).Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10m, response.BalanceAmount); + } + + // SALE / REDEEM + + [TestMethod] + public void ecomm_050_sale_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.Charge(1.0m) + .WithCurrency("USD") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_051_sale_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.Charge(2.0m) + .WithCurrency("USD") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_052_sale_gift_1_void() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var saleResponse = giftCard1.Charge(3.0m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + + // test case 54 + var voidResponse = saleResponse.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + } + + [TestMethod] + public void ecomm_053_sale_gift_2_reversal() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var saleResponse = giftCard2.Charge(4.0m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + + // test case 55 + var reverseResponse = saleResponse.Reverse(4.0m).Execute(); + Assert.IsNotNull(reverseResponse); + Assert.AreEqual("00", reverseResponse.ResponseCode); + } + + // VOID + + [TestMethod] + public void ecomm_054_void_gift() { + // see test case 52 + } + + // REVERSAL + + [TestMethod] + public void ecomm_055_reversal_gift() { + // see test case 53 + } + + [TestMethod] + public void ecomm_056_reversal_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Reverse(2.0m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // DEACTIVATE + + [TestMethod] + public void ecomm_057_deactivate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RECEIPTS MESSAGING + + // ecomm_058_receipts_messaging: print and scan receipt for test 51 + + // BALANCE INQUIRY + + [TestMethod] + public void ecomm_059_balance_inquiry_rewards_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0.00m, response.PointsBalanceAmount); + } + + [TestMethod] + public void ecomm_060_balance_inquiry_rewards_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + var response = giftCard2.BalanceInquiry().Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0.00m, response.PointsBalanceAmount); + } + + // ALIAS + + [TestMethod] + public void ecomm_061_create_alias_gift_1() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void ecomm_062_create_alias_gift_2() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void ecomm_063_add_alias_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var response = giftCard1.AddAlias("2145550199").Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_064_add_alias_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.AddAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_065_delete_alias_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.RemoveAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // SALE / REDEEM + + [TestMethod] + public void ecomm_066_redeem_points_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Charge(100m) + .WithCurrency("POINTS") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + [TestMethod] + public void ecomm_067_redeem_points_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Charge(200m) + .WithCurrency("POINTS") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + [TestMethod] + public void ecomm_068_redeem_points_gift_2() { + var giftCard = new GiftCard { Alias = "9725550100" }; + + var response = giftCard.Charge(300.00m) + .WithCurrency("POINTS") + .Execute(); + + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + } + + // REWARDS + + [TestMethod] + public void ecomm_069_rewards_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Rewards(10.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_070_rewards_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Rewards(11.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // REPLACE / TRANSFER + + [TestMethod] + public void ecomm_071_replace_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard1.ReplaceWith(giftCard2).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_072_replace_gift_2() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.ReplaceWith(giftCard1).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // DEACTIVATE + + [TestMethod] + public void ecomm_073_deactivate_gift_1() { + var giftCard1 = new GiftCard { Number = "5022440000000000098" }; + + var response = giftCard1.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void ecomm_074_deactivate_gift_2() { + var giftCard2 = new GiftCard { Number = "5022440000000000007" }; + + var response = giftCard2.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RECEIPTS MESSAGING + + // ecomm_075_receipts_messaging: print and scan receipt for test 51 + + // CLOSE BATCH + + [TestMethod] + public void ecomm_999_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs new file mode 100644 index 00000000..e0fc483a --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/MotoCheckCertification.cs @@ -0,0 +1,121 @@ +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class MotoCheckCertification { + Address address; + + public MotoCheckCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MRCQAQBC_VQACBE0rFaZlbDDPieMGP06JDAtjyS7NQ" + }); + + address = new Address { + StreetAddress1 = "6860 Dallas Pkwy", + City = "Dallas", + State = "TX", + PostalCode = "75024" + }; + } + + [TestMethod] + public void ecomm_001_PersonalChecking() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.CHECKING, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "John Doe", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(19m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 1: " + response.TransactionId); + } + + [TestMethod] + public void ecomm_002_BusinessChecking() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.CHECKING, + CheckType = CheckType.BUSINESS, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "Acme Unlimited", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(20m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 2: " + response.TransactionId); + } + + [TestMethod] + public void ecomm_003_PersonalSavings() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.SAVINGS, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "John Doe", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(21m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 3: " + response.TransactionId); + + Transaction voidResponse = response.Void().Execute(); + Assert.IsNotNull(voidResponse); + Assert.AreEqual("00", voidResponse.ResponseCode); + Debug.WriteLine("Test 5: " + voidResponse.TransactionId); + } + + [TestMethod] + public void ecomm_004_BusinessSavings() { + eCheck check = new eCheck { + RoutingNumber = "490000018", + AccountNumber = "24413815", + AccountType = AccountType.SAVINGS, + CheckType = CheckType.BUSINESS, + SecCode = SecCode.WEB, + DriversLicenseNumber = "09876543210", + DriversLicenseState = "NJ", + CheckHolderName = "Acme Unlimited", + PhoneNumber = "5558675309" + }; + + Transaction response = check.Charge(22m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + Debug.WriteLine("Test 4: " + response.TransactionId); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs new file mode 100644 index 00000000..723fe84c --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/RecurringCertification.cs @@ -0,0 +1,480 @@ +using System; +using GlobalPayments.Api; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class RecurringCertification { + private static Customer _customerPerson; + private static Customer _customerBusiness; + private static RecurringPaymentMethod _paymentMethodVisa; + private static RecurringPaymentMethod _paymentMethodMasterCard; + private static RecurringPaymentMethod _paymentMethodCheckPpd; + private static RecurringPaymentMethod _paymentMethodCheckCcd; + private static Schedule _scheduleVisa; + private static Schedule _scheduleMasterCard; + private static Schedule _scheduleCheckPpd; + private static Schedule _scheduleCheckCcd; + + private static readonly string TodayDate = DateTime.Today.ToString("yyyyMMdd"); + private static readonly string IdentifierBase = "{0}-{1}" + Guid.NewGuid().ToString().Substring(0, 10); + + private static string GetIdentifier(string identifier) { + return string.Format(IdentifierBase, TodayDate, identifier); + } + + public RecurringCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" + }); + } + + [TestMethod, Ignore] + public void recurring_000_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + //Console.WriteLine(string.Format("Batch ID: {0}", response.Id)); + //Console.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + [TestMethod] + public void recurring_000_CleanUp() { + // Remove Schedules + try { + var schResults = Schedule.FindAll(); + foreach (var schedule in schResults) { + schedule.Delete(true); + } + } + catch (ApiException exc) { + Assert.IsNotNull(exc); + } + + // Remove Payment Methods + try { + var pmResults = RecurringPaymentMethod.FindAll(); + foreach (var pm in pmResults) { + pm.Delete(true); + } + } + catch (ApiException exc) { + Assert.IsNotNull(exc); + } + + // Remove Customers + try { + var custResults = Customer.FindAll(); + foreach (var c in custResults) { + c.Delete(true); + } + } + catch (ApiException exc) { + Assert.IsNotNull(exc); + } + } + + // CUSTOMER SETUP + + [TestMethod] + public void recurring_001_AddCustomerPerson() { + var customer = new Customer { + Id = GetIdentifier("Person"), + FirstName = "John", + LastName = "Doe", + Status = "Active", + Email = "john.doe@email.com", + Address = new Address { + StreetAddress1 = "123 Main St", + City = "Dallas", + State = "TX", + PostalCode = "98765", + Country = "USA" + }, + WorkPhone = "5551112222" + }.Create(); + Assert.IsNotNull(customer); + Assert.IsNotNull(customer.Key); + _customerPerson = customer; + } + + [TestMethod] + public void recurring_002_AddCustomerBusiness() { + var customer = new Customer { + Id = GetIdentifier("Business"), + Company = "AcmeCo", + Status = "Active", + Email = "acme@email.com", + Address = new Address { + StreetAddress1 = "987 Elm St", + City = "Princeton", + State = "NJ", + PostalCode = "12345", + Country = "USA" + }, + WorkPhone = "5551112222" + }.Create(); + Assert.IsNotNull(customer); + Assert.IsNotNull(customer.Key); + _customerBusiness = customer; + } + + // PAYMENT METHOD SETUP + + [TestMethod] + public void recurring_003_AddPaymentCreditVisa() { + if (_customerPerson == null) + Assert.Inconclusive(); + + var paymentMethod = _customerPerson.AddPaymentMethod(GetIdentifier("CreditV"), new CreditCardData { + Number = "4012002000060016", + ExpMonth = 12, + ExpYear = 2025 + }).Create(); + Assert.IsNotNull(paymentMethod); + Assert.IsNotNull(paymentMethod.Key); + _paymentMethodVisa = paymentMethod; + } + + [TestMethod] + public void recurring_004_AddPaymentCreditMasterCard() { + if (_customerPerson == null) + Assert.Inconclusive(); + + var paymentMethod = _customerPerson.AddPaymentMethod( + GetIdentifier("CreditMC"), + new CreditCardData { + Number = "5473500000000014", + ExpMonth = 12, + ExpYear = 2025 + }).Create(); + Assert.IsNotNull(paymentMethod); + Assert.IsNotNull(paymentMethod.Key); + _paymentMethodMasterCard = paymentMethod; + } + + [TestMethod] + public void recurring_005_AddPaymentCheckPPD() { + if (_customerPerson == null) + Assert.Inconclusive(); + + var paymentMethod = _customerPerson.AddPaymentMethod( + GetIdentifier("CheckPPD"), + new eCheck { + AccountType = AccountType.CHECKING, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.PPD, + RoutingNumber = "490000018", + DriversLicenseNumber = "7418529630", + DriversLicenseState = "TX", + AccountNumber = "24413815", + BirthYear = 1989 + }).Create(); + Assert.IsNotNull(paymentMethod); + Assert.IsNotNull(paymentMethod.Key); + _paymentMethodCheckPpd = paymentMethod; + } + + [TestMethod] + public void recurring_006_AddPaymentCheckCCD() { + if (_customerBusiness == null) + Assert.Inconclusive(); + + var paymentMethod = _customerBusiness.AddPaymentMethod( + GetIdentifier("CheckCCD"), + new eCheck { + AccountType = AccountType.CHECKING, + CheckType = CheckType.BUSINESS, + SecCode = SecCode.CCD, + RoutingNumber = "490000018", + DriversLicenseNumber = "3692581470", + DriversLicenseState = "TX", + AccountNumber = "24413815", + BirthYear = 1989 + } + ).Create(); + Assert.IsNotNull(paymentMethod); + Assert.IsNotNull(paymentMethod.Key); + _paymentMethodCheckCcd = paymentMethod; + } + + // PAYMENT SETUP - DECLINED + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void recurring_007_AddPaymentCheckPPD() { + if (_customerPerson == null) + Assert.Inconclusive(); + + var paymentMethod = _customerPerson.AddPaymentMethod( + GetIdentifier("CheckPPD"), + new eCheck { + AccountType = AccountType.CHECKING, + CheckType = CheckType.PERSONAL, + SecCode = SecCode.PPD, + RoutingNumber = "490000018", + DriversLicenseNumber = "7418529630", + DriversLicenseState = "TX", + AccountNumber = "24413815", + BirthYear = 1989 + } + ).Create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + [TestMethod] + public void recurring_008_AddScheduleCreditVisa() { + if (_paymentMethodVisa == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodVisa.AddSchedule(GetIdentifier("CreditV")) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithAmount(30.01m) + .WithFrequency(ScheduleFrequency.WEEKLY) + .WithReprocessingCount(1) + .WithStatus("Active") + .Create(); + Assert.IsNotNull(schedule); + Assert.IsNotNull(schedule.Key); + _scheduleVisa = schedule; + } + + [TestMethod] + public void recurring_009_AddScheduleCreditMasterCard() { + if (_paymentMethodMasterCard == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodMasterCard.AddSchedule(GetIdentifier("CreditMC")) + .WithStatus("Active") + .WithAmount(30.02m) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithFrequency(ScheduleFrequency.WEEKLY) + .WithEndDate(DateTime.Parse("04/01/2027")) + .WithReprocessingCount(2) + .Create(); + Assert.IsNotNull(schedule); + Assert.IsNotNull(schedule.Key); + _scheduleMasterCard = schedule; + } + + [TestMethod] + public void recurring_010_AddScheduleCheckPPD() { + if (_paymentMethodCheckPpd == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodCheckPpd.AddSchedule(GetIdentifier("CheckPPD")) + .WithStatus("Active") + .WithAmount(30.03m) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithFrequency(ScheduleFrequency.MONTHLY) + .WithReprocessingCount(1) + .WithNumberOfPayments(2) + .Create(); + Assert.IsNotNull(schedule); + Assert.IsNotNull(schedule.Key); + _scheduleCheckPpd = schedule; + } + + [TestMethod] + public void recurring_011_AddScheduleCheckCCD() { + if (_paymentMethodCheckCcd == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodCheckCcd.AddSchedule(GetIdentifier("CheckCCD")) + .WithStatus("Active") + .WithAmount(30.04m) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithFrequency(ScheduleFrequency.BI_WEEKLY) + .WithReprocessingCount(1) + .Create(); + Assert.IsNotNull(schedule); + Assert.IsNotNull(schedule.Key); + _scheduleCheckCcd = schedule; + } + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void recurring_012_AddScheduleCreditVisa() { + if (_paymentMethodVisa == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodVisa.AddSchedule(GetIdentifier("CreditV")) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithAmount(30.01m) + .WithFrequency(ScheduleFrequency.WEEKLY) + .WithReprocessingCount(1) + .WithStatus("Active") + .Create(); + } + + [TestMethod, ExpectedException(typeof(GatewayException))] + public void recurring_013_AddScheduleCCheckPPD() { + if (_paymentMethodCheckPpd == null) + Assert.Inconclusive(); + + var schedule = _paymentMethodCheckPpd.AddSchedule(GetIdentifier("CheckPPD")) + .WithStatus("Active") + .WithAmount(30.03m) + .WithStartDate(DateTime.Parse("02/01/2027")) + .WithFrequency(ScheduleFrequency.MONTHLY) + .WithReprocessingCount(1) + .WithNumberOfPayments(2) + .Create(); + } + + // Recurring Billing using PayPlan - Managed Schedule + + [TestMethod] + public void recurring_014_RecurringBillingVisa() { + if (_paymentMethodVisa == null || _scheduleVisa == null) + Assert.Inconclusive(); + + var response = _paymentMethodVisa.Charge(20.01m) + .WithCurrency("USD") + .WithScheduleId(_scheduleVisa.Key) + .WithOneTimePayment(false) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod, Ignore] + public void recurring_015_RecurringBillingMasterCard() { + if (_paymentMethodMasterCard == null || _scheduleMasterCard == null) + Assert.Inconclusive(); + + var response = _paymentMethodMasterCard.Charge(20.02m) + .WithCurrency("USD") + .WithScheduleId(_scheduleVisa.Key) + .WithOneTimePayment(false) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void recurring_016_RecurringBillingCheckPPD() { + if (_paymentMethodCheckPpd == null || _scheduleCheckPpd == null) + Assert.Inconclusive(); + + var response = _paymentMethodCheckPpd.Charge(20.03m) + .WithCurrency("USD") + .WithScheduleId(_scheduleVisa.Key) + .WithOneTimePayment(false) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void recurring_017_RecurringBillingCheckCCD() { + if (_paymentMethodCheckCcd == null || _scheduleCheckCcd == null) + Assert.Inconclusive(); + + var response = _paymentMethodCheckCcd.Charge(20.04m) + .WithCurrency("USD") + .WithScheduleId(_scheduleVisa.Key) + .WithOneTimePayment(false) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // One time bill payment + + [TestMethod] + public void recurring_018_RecurringBillingVisa() { + if (_paymentMethodVisa == null) + Assert.Inconclusive(); + + var response = _paymentMethodVisa.Charge(20.06m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void recurring_019_RecurringBillingMasterCard() { + if (_paymentMethodMasterCard == null) + Assert.Inconclusive(); + + var response = _paymentMethodMasterCard.Charge(20.07m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void recurring_020_RecurringBillingCheckPPD() { + if (_paymentMethodCheckPpd == null) + Assert.Inconclusive(); + + var response = _paymentMethodCheckPpd.Charge(20.08m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void recurring_021_RecurringBillingCheckCCD() { + if (_paymentMethodCheckCcd == null) + Assert.Inconclusive(); + + var response = _paymentMethodCheckCcd.Charge(20.09m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Onetime bill payment - declined + + [TestMethod] + public void recurring_022_RecurringBillingVisa_Decline() { + if (_paymentMethodVisa == null) + Assert.Inconclusive(); + + var response = _paymentMethodVisa.Charge(10.08m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("51", response.ResponseCode); + } + + [TestMethod] + public void recurring_023_RecurringBillingCheckPPD_Decline() { + if (_paymentMethodCheckPpd == null) + Assert.Inconclusive(); + + var response = _paymentMethodCheckPpd.Charge(25.02m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("1", response.ResponseCode); + } + + [TestMethod, Ignore] + public void recurring_999_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + //Console.WriteLine(string.Format("Batch ID: {0}", response.Id)); + //Console.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs b/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs new file mode 100644 index 00000000..ad48f13c --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Certifications/RetailCertification.cs @@ -0,0 +1,1835 @@ +using System; +using System.Diagnostics; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.PaymentMethods; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Tests.TestData; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Certifications { + [TestClass] + public class RetailCertification { + bool useTokens = false; + + string visa_token; + string mastercard_token; + string discover_token; + string amex_token; + + public RetailCertification() { + ServicesContainer.ConfigureService(new PorticoConfig { + SecretApiKey = "skapi_cert_MaePAQBr-1QAqjfckFC8FTbRTT120bVQUlfVOjgCBw" + }); + } + + [TestMethod] + public void retail_000_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + + /* + CREDIT CARD FUNCTIONS + CARD VERIFY + ACCOUNT VERIFICATION + */ + + [TestMethod] + public void retail_001_CardVerifyVisa() { + var visa_enc = TestCards.VisaSwipeEncrypted(); + + var response = visa_enc.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + Assert.IsNotNull(response, "response is null"); + Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); + + if (useTokens) { + Assert.IsNotNull(response.Token, "token is null"); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(15.01m) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + } + + [TestMethod] + public void retail_002_CardVerifyMastercardSwipe() { + var card_enc = TestCards.MasterCardSwipeEncrypted(); + + var response = card_enc.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + if (useTokens) { + Assert.IsNotNull(response.Token); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(15.02m) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + } + + [TestMethod] + public void retail_003_CardVerifyDiscover() { + var discover_enc = TestCards.DiscoverSwipeEncrypted(); + var response = discover_enc.Verify() + .WithRequestMultiUseToken(useTokens) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + if (useTokens) { + Assert.IsNotNull(response.Token); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(15.03m) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + } + + // Address Verification + + [TestMethod] + public void retail_004_CardVerifyAmex() { + var address = new Address { + PostalCode = "75024" + }; + + var manual_amex = TestCards.AmexManual(false, true); + + var response = manual_amex.Verify() + .WithAddress(address) + .WithRequestMultiUseToken(useTokens) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + if (useTokens) { + Assert.IsNotNull(response.Token); + + var token = new CreditCardData { + Token = response.Token + }; + + var saleResponse = token.Charge(15.04m) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(saleResponse); + Assert.AreEqual("00", saleResponse.ResponseCode); + } + } + + // Balance Inquiry (for Prepaid) + + [TestMethod] + public void retail_005_BalanceInquiryVisa() { + var visa_enc = TestCards.VisaSwipeEncrypted(); + + var response = visa_enc.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // CREDIT SALE (For multi-use token only) + + [TestMethod] + public void retail_006_ChargeVisaSwipeToken() { + var card = TestCards.VisaSwipe(); + var response = card.Charge(15.01m) + .WithCurrency("USD") + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + visa_token = response.Token; + } + + [TestMethod] + public void retail_007_ChargeMastercardSwipeToken() { + var card = TestCards.MasterCardSwipe(); + var response = card.Charge(15.02m) + .WithCurrency("USD") + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + mastercard_token = response.Token; + } + + [TestMethod] + public void retail_008_ChargeDiscoverSwipeToken() { + var card = TestCards.DiscoverSwipe(); + var response = card.Charge(15.03m) + .WithCurrency("USD") + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + discover_token = response.Token; + } + + [TestMethod] + public void retail_009_ChargeAmexSwipeToken() { + var card = TestCards.AmexSwipe(); + var response = card.Charge(15.04m) + .WithCurrency("USD") + .WithRequestMultiUseToken(true) + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + amex_token = response.Token; + } + + /* + CREDIT SALE + SWIPED + */ + + [TestMethod] + public void retail_010_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var response = card.Charge(15.01m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test 59 + var reverse = response.Reverse(15.01m).Execute(); + Assert.IsNotNull(reverse); + Assert.AreEqual("00", reverse.ResponseCode); + } + + [TestMethod] + public void retail_011_ChargeMastercardSwipe() { + var card = TestCards.MasterCardSwipe(); + var response = card.Charge(15.02m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_012_ChargeDiscoverSwipe() { + var card = TestCards.DiscoverSwipe(); + var response = card.Charge(15.03m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_013_ChargeAmexSwipe() { + var card = TestCards.AmexSwipe(); + var response = card.Charge(15.04m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_014_ChargeJbcSwipe() { + var card = TestCards.JcbSwipe(); + var response = card.Charge(15.05m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 58 + var refund = response.Refund(15.05m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(refund); + Assert.AreEqual("00", refund.ResponseCode); + } + + #region Retail card + [TestMethod] + public void retail_014a_ChargeRetailMastercard24() { + var card = TestCards.MasterCard24Swipe(); + var response = card.Charge(15.34m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_014b_ChargeRetailMastercard25() { + var card = TestCards.MasterCard25Swipe(); + var response = card.Charge(15.34m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + #endregion + + [TestMethod] + public void retail_015_ChargeVisaSwipe() { + var card = TestCards.VisaSwipe(); + var response = card.Charge(15.06m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 63 + var reversal = response.Reverse(15.06m).WithAuthAmount(5.06m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Manually Entered - Card Present + + [TestMethod] + public void retail_016_ChargeVisaManualCardPresent() { + var address = new Address { + PostalCode = "750241234", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var manual_card = TestCards.VisaManual(true, true); + var response = manual_card.Charge(16.01m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_017_ChargeMasterCardManualCardPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var manual_card = TestCards.MasterCardManual(true, true); + var response = manual_card.Charge(16.02m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 60 + var reverse = response.Reverse(16.02m).Execute(); + Assert.IsNotNull(reverse); + Assert.AreEqual("00", reverse.ResponseCode); + } + + [TestMethod] + public void retail_018_ChargeDiscoverManualCardPresent() { + var address = new Address { + PostalCode = "750241234" + }; + + var manual_card = TestCards.DiscoverManual(true, true); + var response = manual_card.Charge(16.03m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_019_ChargeAmexManualCardPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860" + }; + + var manual_card = TestCards.AmexManual(true, true); + var response = manual_card.Charge(16.04m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_020_ChargeJcbManualCardPresent() { + var address = new Address { + PostalCode = "75024" + }; + + var manual_card = TestCards.JcbManual(true, true); + var response = manual_card.Charge(16.05m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_021_ChargeDiscoverManualCardPresent() { + var address = new Address { + PostalCode = "750241234", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var manual_card = TestCards.DiscoverManual(true, true); + var response = manual_card.Charge(16.07m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 64 + var reversal = response.Reverse(16.07m) + .WithAuthAmount(6.07m) + .Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + // Manually Entered - Card Not Present + + [TestMethod] + public void retail_022_ChargeVisaManualCardNotPresent() { + var address = new Address { + PostalCode = "750241234", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var manual_card = useTokens ? new CreditCardData { Token = visa_token } : TestCards.VisaManual(false, true); + + var response = manual_card.Charge(17.01m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_023_ChargeMasterCardManualCardNotPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var manual_card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.MasterCardManual(false, true); + + var response = manual_card.Charge(17.02m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 61 + var reversal = response.Reverse(17.02m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void retail_024_ChargeDiscoverManualCardNotPresent() { + var address = new Address { + PostalCode = "750241234" + }; + + var manual_card = useTokens ? new CreditCardData { Token = mastercard_token } : TestCards.DiscoverManual(false, true); + + var response = manual_card.Charge(17.03m) + .WithCurrency("USD").WithAddress(address).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_025_ChargeAmexManualCardNotPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860" + }; + + var manual_card = useTokens ? new CreditCardData { Token = amex_token } : TestCards.AmexManual(false, true); + + var response = manual_card.Charge(17.04m) + .WithCurrency("USD").WithAddress(address).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_026_ChargeJcbManualCardNotPresent() { + var address = new Address { + PostalCode = "75024" + }; + + var manual_card = TestCards.JcbManual(false, true); + var response = manual_card.Charge(17.05m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Contactless + + [TestMethod] + public void retail_027_ChargeVisaContactless() { + var card = TestCards.VisaSwipe(EntryMethod.Proximity); + var response = card.Charge(18.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_028_ChargeMastercardContactless() { + var card = TestCards.MasterCardSwipe(EntryMethod.Proximity); + + var response = card.Charge(18.02m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_029_ChargeDiscoverContactless() { + var card = TestCards.DiscoverSwipe(EntryMethod.Proximity); + + var response = card.Charge(18.03m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_030_ChargeAmexContactless() { + var card = TestCards.AmexSwipe(EntryMethod.Proximity); + + var response = card.Charge(18.04m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // AUTHORIZATION + + [TestMethod] + public void retail_031_AuthorizeVisaSwipe() { + var card = TestCards.VisaSwipe(); + + // 031a authorize + var response = card.Authorize(15.08m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 031b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_032_AuthorizeVisaSwipeAdditionalAuth() { + var card = TestCards.VisaSwipe(); + + // 032a authorize + var response = card.Authorize(15.09m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 032b Additional Auth (restaurant only) + + // 032c Add to batch + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_033_AuthorizeMasterCardSwipe() { + var card = TestCards.MasterCardSwipe(); + + // 033a authorize + var response = card.Authorize(15.10m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 033b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_033a_AuthorizeDiscoverSwipe() { + var card = TestCards.DiscoverSwipe(); + + var response = card.Authorize(15.10m) + .WithCurrency("USD") + .WithAllowDuplicates(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // AUTHORIZATION - Manually Entered, Card Present + + [TestMethod] + public void retail_034_AuthorizeVisaManualCardPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var card = TestCards.VisaManual(true, true); + + // 034a authorize + var response = card.Authorize(16.08m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 034b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_035_AuthorizeVisaManualCardPresentAdditionalAuth() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var card = TestCards.VisaManual(true, true); + + // 035a authorize + var response = card.Authorize(16.09m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 035b Additional Auth (restaurant only) + + // 035c Add to batch + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_036_AuthorizeMasterCardManualCardPresent() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var card = TestCards.MasterCardManual(true, true); + + // 036a authorize + var response = card.Authorize(16.10m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 036b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_036a_AuthorizeDiscoverManualCardPresent() { + var address = new Address { + PostalCode = "750241234" + }; + + var card = TestCards.DiscoverManual(true, true); + var response = card.Authorize(16.10m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // AUTHORIZATION - Manually Entered, Card Not Present + + [TestMethod] + public void retail_037_AuthorizeVisaManual() { + var address = new Address { + PostalCode = "750241234", + StreetAddress1 = "6860 Dallas Pkwy" + }; + + var card = TestCards.VisaManual(false, true); + + // 034a authorize + var response = card.Authorize(17.08m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 034b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_038_AuthorizeMasterCardManual() { + var address = new Address { + PostalCode = "75024", + StreetAddress1 = "6860" + }; + + var card = TestCards.MasterCardManual(false, true); + + // 036a authorize + var response = card.Authorize(17.09m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // 036b capture + var captureResponse = response.Capture().Execute(); + Assert.IsNotNull(captureResponse); + Assert.AreEqual("00", captureResponse.ResponseCode); + } + + [TestMethod] + public void retail_038a_AuthorizeDiscoverManual() { + var address = new Address { + PostalCode = "750241234" + }; + + var card = TestCards.DiscoverManual(false, true); + + var response = card.Authorize(17.10m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // PARTIALLY APPROVED SALE (Required) + + [TestMethod] + public void retail_039_ChargeDiscoverSwipePartialApproval() { + var card = TestCards.DiscoverSwipe(); + + var response = card.Charge(40.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(40.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void retail_040_ChargeVisaSwipePartialApproval() { + var card = TestCards.VisaSwipe(); + var response = card.Charge(130.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(110.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void retail_041_ChargeDiscoverManualPartialApproval() { + var address = new Address { + PostalCode = "75024" + }; + var card = TestCards.DiscoverManual(true, true); + + var response = card.Charge(145.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(65.00m, response.AuthorizedAmount); + } + + [TestMethod, Ignore] + public void retail_042_ChargeMasterCardSwipePartialApproval() { + var card = TestCards.MasterCardSwipe(); + var response = card.Charge(155.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(100.00m, response.AuthorizedAmount); + + // test case 62 + var reversal = response.Reverse(100.00m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + /* + SALE WITH GRATUITY + Tip Edit (Tip at Settlement) + */ + + [TestMethod] + public void retail_043_ChargeVisaSwipeEditGratuity() { + var card = TestCards.VisaSwipe(); + var response = card.Charge(15.12m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var editResponse = response.Edit() + .WithAmount(18.12m) + .WithGratuity(3.00m) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + [TestMethod] + public void retail_044_ChargeMasterCardManualEditGratuity() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.MasterCardManual(true, true); + var response = card.Charge(15.13m) + .WithCurrency("USD") + .WithAddress(address) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var editResponse = response.Edit() + .WithAmount(18.13m) + .WithGratuity(3.00m) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + // Tip on Purchase + + [TestMethod] + public void retail_045_ChargeVisaManualGratuity() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.VisaManual(true, true); + + var response = card.Charge(18.61m) + .WithCurrency("USD") + .WithAddress(address) + .WithGratuity(3.50m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_046_ChargeMasterCardSwipeGratuity() { + var card = TestCards.MasterCardSwipe(); + + var response = card.Charge(18.62m) + .WithCurrency("USD") + .WithGratuity(3.50m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var editResponse = response.Edit() + .WithAmount(18.12m) + .WithGratuity(3.00m) + .Execute(); + Assert.IsNotNull(editResponse); + Assert.AreEqual("00", editResponse.ResponseCode); + } + + // LEVEL II CORPORATE PURCHASE CARD + + [TestMethod] + public void retail_047_LevelIIVisaSwipeResponseB() { + var card = TestCards.VisaSwipe(); + + var response = card.Charge(112.34m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("B", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod, Ignore] + public void retail_047a_LevelIIVisaSwipeResonseB() { + var card = TestCards.VisaSwipe(); + + var response = card.Charge(112.35m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("B", response.CommercialIndicator); + + var cpcResponse = response.Edit() + .WithCommercialData(new CommercialData(TaxType.NOTUSED)) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_048_LevelIIVisaSwipeResponseR() { + var card = TestCards.VisaSwipe(); + + var response = card.Charge(123.45m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("R", response.CommercialIndicator); + + var cpcResponse = response.Edit() + .WithCommercialData(new CommercialData(TaxType.TAXEXEMPT)) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_049_LevelIIVisaManualResponseS() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.VisaManual(true, true); + + var response = card.Charge(134.56m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_050_LevelIIMasterCardSwipeResponseS() { + var card = TestCards.MasterCardSwipe(); + + var response = card.Charge(111.06m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_051_LevelIIMasterCardManualResponseS() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.MasterCardManual(true, true); + + var response = card.Charge(111.07m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_051a_LevelIIMasterCardManualResponseS() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.MasterCardManual(true, true); + var response = card.Charge(111.08m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + PoNumber = "9876543210", + TaxAmount = 1m + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_052_LevelIIMasterCardManualResponseS() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.MasterCardManual(true, true); + var response = card.Charge(111.09m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("S", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_053_LevelIIAmexSwipeNoResponse() { + var card = TestCards.AmexSwipe(); + var response = card.Charge(111.10m) + .WithCurrency("USD") + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.SALESTAX) { + TaxAmount = 1m + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_054_LevelIIAmexManualNoResponse() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.AmexManual(true, true); + + var response = card.Charge(111.11m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_055_LevelIIAmexManualNoResponse() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.AmexManual(true, true); + var response = card.Charge(111.12m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.NOTUSED) { + PoNumber = "9876543210" + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + [TestMethod] + public void retail_055a_LevelIIAmexManualNoResponse() { + var address = new Address { + PostalCode = "75024" + }; + + var card = TestCards.AmexManual(true, true); + var response = card.Charge(111.13m) + .WithCurrency("USD") + .WithAddress(address) + .WithCommercialRequest(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual("0", response.CommercialIndicator); + + var commercialData = new CommercialData(TaxType.TAXEXEMPT) { + PoNumber = "9876543210" + }; + + var cpcResponse = response.Edit() + .WithCommercialData(commercialData) + .Execute(); + Assert.IsNotNull(cpcResponse); + Assert.AreEqual("00", cpcResponse.ResponseCode); + } + + // OFFLINE SALE / AUTHORIZATION + + [TestMethod] + public void retail_056_OfflineChargeVisaManual() { + var card = TestCards.VisaManual(false, true); + + var response = card.Charge(15.12m) + .WithCurrency("USD") + .WithOfflineAuthCode("654321") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_056_OfflineAuthVisaManual() { + var card = TestCards.VisaManual(false, true); + + var response = card.Authorize(15.11m) + .WithCurrency("USD") + .WithOfflineAuthCode("654321") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RETURN + + [TestMethod] + public void retail_057_ReturnMasterCard() { + var card = TestCards.MasterCardManual(false, true); + + var response = card.Refund(15.11m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_057a_ReturnMasterCardSwipe() { + var card = TestCards.MasterCardSwipe(); + var response = card.Refund(15.15m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // ONLINE VOID / REVERSAL (Required) + + // PIN DEBIT CARD FUNCTIONS + + [TestMethod] + public void retail_065_DebitSaleVisaSwipe() { + var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(14.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_066_DebitSaleMasterCardSwipe() { + var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB"); + + var response = card.Charge(14.02m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 71 + var reversal = card.Reverse(14.02m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + [TestMethod] + public void retail_067_DebitSaleVisaSwipeCashBack() { + var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(14.03m) + .WithCurrency("USD") + .WithCashBack(5.00m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_067a_DebitSaleMasterCard() { + var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB"); + + var response = card.Charge(14.04m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // PARTIALLY APPROVED PURCHASE + + [TestMethod] + public void retail_068_DebitSaleMasterCardPartialApproval() { + var card = TestCards.MasterCardSwipe().AsDebit("F505AD81659AA42A3D123412324000AB"); + + var response = card.Charge(33.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(22.00m, response.AuthorizedAmount); + } + + [TestMethod] + public void retail_069_DebitSaleVisaPartialApproval() { + var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(44.00m) + .WithCurrency("USD") + .WithAllowPartialAuth(true) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("10", response.ResponseCode); + Assert.AreEqual(33.00m, response.AuthorizedAmount); + + // test case 72 + var reversal = card.Reverse(33.00m).Execute(); + Assert.IsNotNull(reversal); + Assert.AreEqual("00", reversal.ResponseCode); + } + + // RETURN + + [TestMethod] + public void retail_070_DebitReturnVisaSwipe() { + var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA"); + + var response = card.Refund(14.07m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_070a_DebitReturnVisaSwipe() { + var card = TestCards.VisaSwipe().AsDebit("32539F50C245A6A93D123412324000AA"); + + var response = card.Refund(14.08m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + var reversalResponse = card.Reverse(14.08m).Execute(); + Assert.IsNotNull(reversalResponse); + Assert.AreEqual("00", reversalResponse.ResponseCode); + } + + // REVERSAL + + /* + EBT FUNCTIONS + Food Stamp Purchase + */ + + [TestMethod] + public void retail_080_EbtfsPurchaseVisaSwipe() { + var card = TestCards.VisaSwipe().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(101.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_081_EbtfsPurchaseVisaManual() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(102.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Food Stamp Electronic Voucher (Manual Entry Only) + + [TestMethod] + public void retail_082_EbtVoucherPurchaseVisa() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + card.SerialNumber = "123456789012345"; + card.ApprovalCode = "123456"; + + var response = card.Charge(103.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Food Stamp Balance Inquiry + + [TestMethod] + public void retail_083_EbtfsReturnVisaSwipe() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Refund(104.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_084_EbtfsReturnVisaManual() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Refund(105.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Food Stamp Balance Inquiry + + [TestMethod] + public void retail_085_EbtBalanceInquiryVisaSwipe() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_086_EbtBalanceInquiryVisaManual() { + var card = TestCards.VisaManual(true, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + Assert.AreEqual("00", response.ResponseCode); + EBT CASH BENEFITS + Cash Back Purchase + */ + + [TestMethod] + public void retail_087_EbtCashBackPurchaseVisaSwipe() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(106.01m) + .WithCurrency("USD") + .WithCashBack(5.00m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_088_EbtCashBackPurchaseVisaManual() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(107.01m) + .WithCurrency("USD") + .WithCashBack(5.00m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // No Cash Back Purchase + + [TestMethod] + public void retail_089_EbtCashBackPurchaseVisaSwipeNoCashBack() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(108.01m) + .WithCurrency("USD") + .WithCashBack(0m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_090_EbtCashBackPurchaseVisaManualNoCashBack() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(109.01m) + .WithCurrency("USD") + .WithCashBack(0m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Cash Back Balance Inquiry + + [TestMethod] + public void retail_091_EbtBalanceInquiryVisaSwipeCash() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.BalanceInquiry(InquiryType.CASH).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_092_EbtBalanceInquiryVisaManualCash() { + var card = TestCards.VisaManual(true, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.BalanceInquiry(InquiryType.CASH).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // Bash Benefits Withdrawal + + [TestMethod] + public void retail_093_EbtBenefitWithDrawalVisaSwipe() { + var card = TestCards.VisaSwipeEncrypted().AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(110.01m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_094_EbtBenefitWithDrawalVisaManual() { + var card = TestCards.VisaManual(false, true).AsEBT("32539F50C245A6A93D123412324000AA"); + + var response = card.Charge(111.01m) + .WithCurrency("USD") + .WithCashBack(0m) + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + /* + HMS GIFT - REWARDS + GIFT + ACTIVATE + */ + + [TestMethod] + public void retail_095_ActivateGift1Swipe() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.Activate(6.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_096_ActivateGift2Manual() { + var card = TestCards.GiftCard2Manual(); + + var response = card.Activate(7.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // ADD VALUE + + [TestMethod] + public void retail_097_AddValueGift1Swipe() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.AddValue(8.00m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_098_AddValueGift2Manual() { + var card = TestCards.GiftCard2Manual(); + + var response = card.Activate(9.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // BALANCE INQUIRY + + [TestMethod] + public void retail_099_BalanceInquiryGift1Swipe() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10.00m, response.BalanceAmount); + } + + [TestMethod] + public void retail_100_BalanceInquiryGift2Manual() { + var card = TestCards.GiftCard2Manual(); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(10.00m, response.BalanceAmount); + } + + // REPLACE / TRANSFER + + [TestMethod] + public void retail_101_ReplaceGift1Swipe() { + var oldCard = TestCards.GiftCard1Swipe(); + var newCard = TestCards.GiftCard2Manual(); + + var response = oldCard.ReplaceWith(newCard).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_102_ReplaceGift2Manual() { + var newCard = TestCards.GiftCard1Swipe(); + var oldCard = TestCards.GiftCard2Manual(); + + var response = oldCard.ReplaceWith(newCard).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // SALE / REDEEM + + [TestMethod] + public void retail_103_SaleGift1Swipe() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.Charge(1.00m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_104_SaleGift2Manual() { + var card = TestCards.GiftCard2Manual(); + + var response = card.Charge(2.00m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_105_SaleGift1VoidSwipe() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.Charge(3.00m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + // test case 107 + var voidResponse = response.Void().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_106_SaleGift2ReversalManual() { + var card = TestCards.GiftCard2Manual(); + + var response = card.Charge(4.00m) + .WithCurrency("USD") + .Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + + //test case 108 + var voidResponse = response.Reverse(4.00m).Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // VOID + + // REVERSAL + + // DEACTIVATE + + [TestMethod] + public void retail_109_DeactivateGift1() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.Deactivate().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + // RECEIPTS MESSAGING + + [TestMethod] + public void retail_110_ReceiptsMessaging() { + // PRINT AND SCAN RECEIPT FOR TEST 107 + } + + /* + REWARDS + BALANCE INQUIRY + */ + + [TestMethod] + public void retail_111_BalanceInquiryRewards1() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0m, response.PointsBalanceAmount); + } + + [TestMethod] + public void retail_112_BalanceInquiryRewards2() { + var card = TestCards.GiftCard2Manual(); + + var response = card.BalanceInquiry().Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + Assert.AreEqual(0m, response.PointsBalanceAmount); + } + + // ALIAS + + [TestMethod] + public void retail_113_CreateAliasGift1() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void retail_114_CreateAliasGift2() { + var card = GiftCard.Create("9725550100"); + Assert.IsNotNull(card); + } + + [TestMethod] + public void retail_115_AddAliasGift1() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.AddAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_116_AddAliasGift2() { + var card = TestCards.GiftCard2Manual(); + + var response = card.AddAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_117_DeleteAliasGift1() { + var card = TestCards.GiftCard1Swipe(); + + var response = card.RemoveAlias("2145550199").Execute(); + Assert.IsNotNull(response); + Assert.AreEqual("00", response.ResponseCode); + } + + [TestMethod] + public void retail_999_CloseBatch() { + try { + var response = BatchService.CloseBatch(); + Assert.IsNotNull(response); + Debug.WriteLine(string.Format("Batch ID: {0}", response.Id)); + Debug.WriteLine(string.Format("Sequence Number: {0}", response.SequenceNumber)); + } + catch (GatewayException exc) { + if (exc.ResponseMessage != "Transaction was rejected because it requires a batch to be open.") + Assert.Fail(exc.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs b/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs index de20c4a5..24d8f019 100644 --- a/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs +++ b/tests/GlobalPayments.Api.Tests/Genius/GeniusTests.cs @@ -449,7 +449,7 @@ public void Sale_Level3() { Quantity = 5.1m, UnitOfMeasure = "lbs", UnitCost = 0.6m, - //DiscountAmount = 0.61m, + DiscountAmount = 0.61m, TotalAmount = 0.62m, TaxAmount = 0.63m, ExtendedAmount = 0.64m, @@ -463,7 +463,7 @@ public void Sale_Level3() { Quantity = 5.1m, UnitOfMeasure = "lbs", UnitCost = 0.6m, - //DiscountAmount = 0.61m, + DiscountAmount = 0.61m, TotalAmount = 0.62m, TaxAmount = 0.63m, ExtendedAmount = 0.64m, diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs index 32859b48..32b6ed84 100644 --- a/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs +++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoAchTests.cs @@ -1,6 +1,5 @@ using GlobalPayments.Api.Entities; using GlobalPayments.Api.PaymentMethods; -using GlobalPayments.Api.Tests.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace GlobalPayments.Api.Tests { @@ -39,30 +38,6 @@ public void Init() { }; } - [TestMethod, Ignore] - public void CheckSaleWithSingleUseToken() { - var check = new eCheck { - Token = "supt_bUNE7MtGwN0hdDcElNijZ83A", - CheckType = CheckType.PERSONAL, - SecCode = SecCode.PPD, - AccountType = AccountType.CHECKING, - EntryMode = EntryMethod.Manual, - CheckHolderName = "John Doe", - DriversLicenseNumber = "09876543210", - DriversLicenseState = "TX", - PhoneNumber = "8003214567", - BirthYear = 1997, - SsnLast4 = "4321" - }; - - var response = check.Charge(11m) - .WithCurrency("USD") - .WithAddress(address) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode, response.ResponseMessage); - } - [TestMethod] public void CheckSale() { var response = check.Charge(11m) @@ -91,11 +66,10 @@ public void CheckVoidFromTransactionId() { } [TestMethod] - public void CheckNewCryptoUrl() { + public void checkNewCryptoUrl() { ServicesContainer.ConfigureService(new PorticoConfig { SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" }); - var response = check.Charge(10.00m) .WithCurrency("USD") .WithAddress(address) @@ -103,40 +77,7 @@ public void CheckNewCryptoUrl() { .Execute(); Assert.IsNotNull(response); Assert.AreEqual("00", response.ResponseCode); - } - - [TestMethod] - public void SupportTestCase() { - ServicesContainer.ConfigureService(new PorticoConfig { - SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A", - Environment = Environment.TEST, - RequestLogger = new RequestFileLogger(@"C:\temp\portico\requestlog.txt") - } - ); - var check = new eCheck { - AccountNumber = "24413815", - RoutingNumber = "490000018", - AccountType = AccountType.CHECKING, - CheckType = CheckType.PERSONAL, - EntryMode = EntryMethod.Manual, - SecCode = SecCode.PPD, - CheckHolderName = "John Doe" - }; - - var address = new Address { - StreetAddress1 = "123 Main St.", - City = "Downtown", - State = "NJ", - PostalCode = "12345" - }; - - var response = check.Charge(10.00m) - .WithCurrency("USD") - .WithAddress(address) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); } } } diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs index 0e998c83..04ee9a0a 100644 --- a/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs +++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoCreditTests.cs @@ -73,33 +73,6 @@ public void CreditAuthWithShippingAmt() { Assert.AreEqual(2m, report.ShippingAmount); } - [TestMethod] - public void CreditAuthorizationWithCOF() - { - Transaction response = card.Authorize(14m) - .WithCurrency("USD") - .WithAllowDuplicates(true) - .WithCardBrandStorage(StoredCredentialInitiator.Merchant) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); - Assert.IsNotNull(response.CardBrandTransactionId); - - Transaction cofResponse = card.Authorize(14m) - .WithCurrency("USD") - .WithAllowDuplicates(true) - .WithCardBrandStorage(StoredCredentialInitiator.CardHolder, response.CardBrandTransactionId) - .Execute(); - Assert.IsNotNull(cofResponse); - Assert.AreEqual("00", cofResponse.ResponseCode); - - Transaction capture = cofResponse.Capture(16m) - .WithGratuity(2m) - .Execute(); - Assert.IsNotNull(capture); - Assert.AreEqual("00", capture.ResponseCode); - } - [TestMethod] public void CreditSale() { var response = card.Charge(15m) @@ -110,62 +83,6 @@ public void CreditSale() { Assert.AreEqual("00", response.ResponseCode); } - [TestMethod] - public void CreditSaleWithRefund() { - var response = card.Charge(15m) - .WithCurrency("USD") - .WithAllowDuplicates(true) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); - - var trans = Transaction.FromId(response.TransactionId) - .Refund(15m) - .WithCurrency("USD") - .WithAllowDuplicates(true) - .Execute(); - Assert.IsNotNull(trans); - Assert.AreEqual("00", trans.ResponseCode); - } - - [TestMethod] - public void CreditSaleWithCOF() { - var response = card.Charge(15m) - .WithCurrency("USD") - .WithCardBrandStorage(StoredCredentialInitiator.CardHolder) - .WithAllowDuplicates(true) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); - Assert.IsNotNull(response.CardBrandTransactionId); - - Transaction cofResponse = card.Charge(15m) - .WithCurrency("USD") - .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId) - .WithAllowDuplicates(true) - .Execute(); - Assert.IsNotNull(cofResponse); - Assert.AreEqual("00", cofResponse.ResponseCode); - } - - [TestMethod] - public void CreditVerifyWithCOF() { - Transaction response = card.Verify() - .WithAllowDuplicates(true) - .WithCardBrandStorage(StoredCredentialInitiator.CardHolder) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); - Assert.IsNotNull(response.CardBrandTransactionId); - - Transaction cofResponse = card.Verify() - .WithAllowDuplicates(true) - .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId) - .Execute(); - Assert.IsNotNull(cofResponse); - Assert.AreEqual("00", cofResponse.ResponseCode); - } - [TestMethod] public void CreditSaleWithConvenienceAmt() { var response = card.Charge(15m) @@ -449,15 +366,5 @@ public void CreditTestWithClientTransactionId() { Assert.IsNotNull(response); Assert.AreEqual("00", response.ResponseCode); } - - [TestMethod] - public void CreditTokenize() { - ServicesContainer.ConfigureService(new PorticoConfig { - SecretApiKey = "skapi_cert_MTyMAQBiHVEAewvIzXVFcmUd2UcyBge_eCpaASUp0A" - }, "tokenize"); - - var token = card.Tokenize("tokenize"); - Assert.IsNotNull(token); - } } } diff --git a/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs b/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs index d696c14b..1a8bd04c 100644 --- a/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs +++ b/tests/GlobalPayments.Api.Tests/Portico/PorticoRecurringTests.cs @@ -385,36 +385,6 @@ public void Test_007b_CreditCharge_ScheduleId() { Assert.AreEqual("00", response.ResponseCode); } - [TestMethod] - public void Test_007b_CreditCharge_ScheduleIdWithCOF() { - RecurringPaymentMethod paymentMethod = RecurringPaymentMethod.Find(PaymentId("Credit")); - Assert.IsNotNull(paymentMethod); - - Schedule schedule = Schedule.Find(PaymentId("Credit")); - Assert.IsNotNull(schedule); - - Transaction response = paymentMethod.Charge(19m) - .WithCurrency("USD") - .WithScheduleId(schedule.Key) - .WithAllowDuplicates(true) - .WithOneTimePayment(false) - .WithCardBrandStorage(StoredCredentialInitiator.CardHolder) - .Execute(); - Assert.IsNotNull(response); - Assert.AreEqual("00", response.ResponseCode); - Assert.IsNotNull(response.CardBrandTransactionId); - - Transaction nextResponse = paymentMethod.Charge(15m) - .WithCurrency("USD") - .WithScheduleId(schedule.Key) - .WithAllowDuplicates(true) - .WithOneTimePayment(false) - .WithCardBrandStorage(StoredCredentialInitiator.Merchant, response.CardBrandTransactionId) - .Execute(); - Assert.IsNotNull(nextResponse); - Assert.AreEqual("00", nextResponse.ResponseCode); - } - [TestMethod] public void Test_007c_ACHCharge_OneTime() { var paymentMethod = RecurringPaymentMethod.Find(PaymentId("ACH")); diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs new file mode 100644 index 00000000..531c5cc6 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/IngenicoTransactionTests.cs @@ -0,0 +1,175 @@ +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Ingenico; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class IngenicoTransactionTests { + IDeviceInterface _device; + + public IngenicoTransactionTests() { + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = Entities.DeviceType.Ingenico_EPOS_Desk5000, + ConnectionMode = ConnectionModes.TCP_IP_SERVER, + Port = "18101", + //BaudRate = BaudRate.r9600, + //Parity = System.IO.Ports.Parity.Even, + //DataBits = DataBits.Seven, + //Handshake = System.IO.Ports.Handshake.None, + //StopBits = System.IO.Ports.StopBits.One, + Timeout = 10 * 1000 + }); + Assert.IsNotNull(_device); + } + + [TestMethod] + public void Test() { + SaleTest(); + RefundTest(); + PreAuthTest(); + CompletionTest(); + } + + [TestMethod] + public void SaleTest() { + _device.OnMessageSent += (message) => { + Assert.IsNotNull(message); + }; + + Thread.Sleep(1500); + _device.Dispose(); + + //var resp = _device.Sale(6.18m) + // .WithReferenceNumber(1) + // .WithCurrencyCode("826") + // .Execute(); + + //Assert.IsNotNull(resp); + + //Thread.Sleep(5000); + } + + public void RefundTest() { + _device.OnMessageSent += (message) => { + Assert.IsNotNull(message); + }; + + var resp = _device.Refund(6.18m) + .WithReferenceNumber(1) + .WithCurrencyCode("826") + .WithCashBack(3m) + .Execute(); + + Assert.IsNotNull(resp); + + Thread.Sleep(5000); + } + + public void PreAuthTest() { + _device.OnMessageSent += (message) => { + Assert.IsNotNull(message); + }; + + var resp = _device.Authorize(6.18m) + .WithReferenceNumber(1) + .WithCurrencyCode("826") + .WithCashBack(3m) + .Execute(); + + Assert.IsNotNull(resp); + + Thread.Sleep(5000); + } + + [TestMethod] + public void CompletionTest() { + _device.OnMessageSent += (message) => { + Assert.IsNotNull(message); + }; + + var resp = _device.Capture(6.18m) + .WithAuthCode("025433") + .WithReferenceNumber(1) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(resp); + + Thread.Sleep(5000); + } + + [TestMethod] + public void AsyncCancelTest() { + + Thread thSale = new Thread(new ThreadStart(() => { + var resp = _device.Sale(6.18m) + .WithReferenceNumber(1) + .WithCurrencyCode("826") + .WithTaxFree(TaxFreeType.CASH) + .WithCashBack(3m) + .Execute(); + + + Assert.IsNotNull(resp, "Sale Assert"); + })); + + + Thread thCancel = new Thread(new ThreadStart(() => { + var resp = _device.Cancel(); + + Assert.IsNotNull(resp, "Cancel assert"); + })); + + thSale.Start(); + Thread.Sleep(2000); + thCancel.Start(); + } + + [TestMethod] + public void CancelTest() { + var resp = _device.Cancel(); + + Assert.IsNotNull(resp); + } + + [TestMethod] + public void TaxFreeCreditCardRefundTest() { + try { + var respone = _device.Refund(5m) + .WithTaxFree(TaxFreeType.CREDIT) + .Execute(); + + Assert.IsNotNull(respone); + } + catch (ApiException e) { + Assert.Fail(e.Message); + //throw e; + } + catch (Exception e) { + Assert.Fail(e.Message); + //throw e; + } + } + + [TestMethod] + public void TaxFreeCashRefundTest() { + try { + var respone = _device.Refund(5m) + .WithReferenceNumber(1) + .WithTaxFree(TaxFreeType.CASH) + .Execute(); + + Assert.IsNotNull(respone); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs new file mode 100644 index 00000000..f333397f --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/PayAtTableRequestTests.cs @@ -0,0 +1,73 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Ingenico; +using GlobalPayments.Api.Terminals.Ingenico.Requests; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class PayAtTableRequestTests { + + private IDeviceInterface _device; + + public PayAtTableRequestTests() { + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = DeviceType.Ingenico_EPOS_Desk5000, + ConnectionMode = ConnectionModes.PAY_AT_TABLE, + Port = "18101", + Timeout = 10 * 1000 + }); + + Assert.IsNotNull(_device); + + _device.OnPayAtTableRequest += _device_OnPayAtTableRequest; + } + + private void _device_OnPayAtTableRequest(PATRequest request) { + // Success ConfirmaitonOK + //Thread.Sleep(8 * 1000); + + if (request.RequestType == PATRequestType.TableList) { + var test = request.TableId; + _device.PayAtTableResponse() + .WithXMLPath("C:\\Users\\steven.tan\\Desktop\\PAY@TABLE SAMPLE RESPONSE\\tablelistsample.xml") + .Execute(); + } else if (request.RequestType == PATRequestType.Ticket) { + _device.PayAtTableResponse() + .WithPayAtTableResponseType(PATResponseType.CONF_OK) + .WithAmount(123.45M) + .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL) + .Execute(); + } else if (request.RequestType == PATRequestType.SplitSaleReport) { + _device.PayAtTableResponse() + .WithPayAtTableResponseType(PATResponseType.CONF_OK) + .WithAmount(123.45M) + .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL) + .Execute(); + } else if (request.RequestType == PATRequestType.TableReceipt) { + _device.PayAtTableResponse() + .WithXMLPath("C:\\Users\\steven.tan\\Desktop\\PAY@TABLE SAMPLE RESPONSE\\receiptrequestsample.xml") + .Execute(); + } else if (request.RequestType == PATRequestType.TransactionOutcome) { + _device.PayAtTableResponse() + .WithPayAtTableResponseType(PATResponseType.CONF_OK) + .WithAmount(123.45M) + .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL) + .Execute(); + } else if (request.RequestType == PATRequestType.TableLock) { + _device.PayAtTableResponse() + .WithPayAtTableResponseType(PATResponseType.CONF_OK) + .WithAmount(123M) + .WithPaymentMode(PATPaymentMode.NO_ADDITIONAL) + .Execute(); + } + } + + [TestMethod] + public void TableLock() { + Thread.Sleep(20 * 1000); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs new file mode 100644 index 00000000..b0943c36 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SaleTransactionManagement.cs @@ -0,0 +1,141 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class PaymentTransactionManagement { + IDeviceInterface _device; + + public PaymentTransactionManagement() { + + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = DeviceType.Ingenico_EPOS_Lane3000, + ConnectionMode = ConnectionModes.SERIAL, + Port = "7", + BaudRate = BaudRate.r9600, + Parity = System.IO.Ports.Parity.Even, + StopBits = System.IO.Ports.StopBits.One, + DataBits = DataBits.Seven, + Timeout = 65000 + }); + + Assert.IsNotNull(_device); + } + + [TestMethod] + public void SaleTest1() { + var response = _device.Sale(12m) + .WithReferenceNumber(15) + .WithCashBack(10m) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(response); + } + + + [TestMethod] + public void SaleTest() { + _device.OnMessageSent += (message) => { + Assert.IsNotNull(message); + }; + + ITerminalResponse response = _device.Sale(5.12m) + .WithPaymentMode(PaymentMode.MAILORDER) + .WithCashBack(7.569m) + .WithReferenceNumber(1) + .Execute(); + + var authCode = response.AuthorizationCode; + + Assert.IsNotNull(response.AuthorizationCode); + } + + [TestMethod] + public void RefundTest() { + var response = _device.Refund(1m) + .WithPaymentMethodType(PaymentMethodType.Credit) + .WithReferenceNumber(1) + .Execute(); + + Assert.IsNotNull(response.AuthorizationCode); + } + + + [TestMethod] + public void SaleNegativeTest() { + var response = _device.Sale(5.12m) + .WithCashBack(7.52m) + .WithReferenceNumber(1) + .Execute(); + + Assert.IsNull(response.AuthorizationCode); + } + + [TestMethod] + public void SaleTWithOnMessageSentest() { + _device.OnBroadcastMessage += (code, message) => { + Assert.IsNull(code); + Assert.IsNull(message); + }; + + + var response = _device.Refund(5.12m) + //.WithCashBack(7.5m) + .WithReferenceNumber(1) + .Execute(); + + Assert.IsNotNull(response.AuthorizationCode); + } + + [TestMethod] + public void CancelTest() { + try { + _device.Cancel(); + } catch (ApiException ex) { + Assert.Fail(ex.Message); + } + } + + [TestMethod] + public void AsyncCancelTest() { + var Task1 = Task.Factory.StartNew(() => { + var response = _device.Sale(5.12m) + .WithCashBack(7.5m) + .WithReferenceNumber(1) + .Execute(); + + Assert.IsNotNull(response); + }); + var Task2 = Task.Factory.StartNew(() => { + try { + Thread.Sleep(5000); + _device.Cancel(); + } catch (Exception ex) { + Assert.Fail(ex.Message); + } + }); + + Task.WaitAll(Task1, Task2); + } + + + [TestMethod] + public void GetLastReceiptTest() { + var response = _device + .GetLastReceipt() + .Execute(); + + string xmlData = response.ToString(); + + Assert.IsNotNull(response.ToString()); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs new file mode 100644 index 00000000..f36b9b33 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/SerialPaymentTransactions.cs @@ -0,0 +1,180 @@ +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Abstractions; +using GlobalPayments.Api.Terminals.Ingenico; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading; +using System.Threading.Tasks; +using ReportType = GlobalPayments.Api.Terminals.Ingenico.ReportType; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class SerialPaymentTransactions { + IDeviceInterface _device; + + public SerialPaymentTransactions() { + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = DeviceType.Ingenico_EPOS_Lane3000, + ConnectionMode = ConnectionModes.SERIAL, + Port = "5", + BaudRate = BaudRate.r9600, + DataBits = DataBits.Seven, + StopBits = System.IO.Ports.StopBits.One, + Parity = System.IO.Ports.Parity.Even, + Handshake = System.IO.Ports.Handshake.None, + Timeout = 65000 + }); + + Assert.IsNotNull(_device); + } + + [TestMethod] + public void CaptureTest() { + var response = _device.Capture(6.18m) + .WithReferenceNumber(1) + .WithCurrencyCode("826") + .WithTransactionId("011223") + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void SaleTest() { + var response = _device.Sale(6.18m) + .WithReferenceNumber(1) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .WithTableNumber("1") + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void Reverse() { + var response = _device.Reverse(amount: 6.18m) + .WithReferenceNumber(12) + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void SaleRefund() { + var response = _device.Refund(6.18m) + .WithReferenceNumber(1) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .WithTableNumber("1") + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void preAuth() { + var response = _device.Authorize(20.00m) + .WithReferenceNumber(1) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void SaleCancel() { + var task1 = Task.Factory.StartNew(() => { + var response = _device.Sale(523m) + .WithReferenceNumber(1) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(response); + }); + + var task2 = Task.Factory.StartNew(() => { + Thread.Sleep(10000); + _device.Cancel(); + }); + + Task.WaitAll(task1, task2); + } + + [TestMethod] + public void TaxFree() { + + var splitR = _device + .GetLastReceipt(ReceiptType.SPLITR) + .Execute(); + + string test = splitR.ToString(); + + if (splitR.ToString().Contains("")) + Assert.IsNotNull(splitR); + } + + [TestMethod] + public void Ticket() { + ITerminalReport res = _device + .GetLastReceipt(ReceiptType.TICKET) + .Execute(); + + string test = res.ToString(); + + if (res.ToString().Contains("")) + Assert.IsNotNull(res); + } + + [TestMethod] + public void EOD() { + + /** This example doesn't return XML/Report Data but it intiate End of Day + Report and the terminal will return EODOK if success. + */ + ITerminalReport res = _device + .GetReport(ReportType.EOD) + .Execute(); + + Assert.IsNotNull(res); + } + + [TestMethod] + public void Cashback() { + var response = _device.Sale(20.00m) + .WithReferenceNumber(01) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .WithCashBack(2.00m) + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void AccountVerification() { + + var response = _device.Verify() + .WithReferenceNumber(01) + .WithPaymentMode(PaymentMode.MAILORDER) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(response); + } + + [TestMethod] + public void test123() { + var response = _device.Verify() + .WithReferenceNumber(01) + .WithPaymentMode(PaymentMode.APPLICATION) + .WithCurrencyCode("826") + .Execute(); + + Assert.IsNotNull(response); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs new file mode 100644 index 00000000..cc5c1270 --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TerminalManagementTest.cs @@ -0,0 +1,87 @@ +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Ingenico; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Text; +using System.Threading; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class TerminalManagementTest { + IDeviceInterface _device; + + public TerminalManagementTest() { + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = Entities.DeviceType.Ingenico_EPOS_Desk5000, + ConnectionMode = ConnectionModes.TCP_IP_SERVER, + Port = "18101", + Timeout = 5 * 1000 + }); + Assert.IsNotNull(_device); + } + + [TestMethod] + public void StateCommandTest() { + try { + var resp = _device.GetTerminalStatus(); + + Assert.IsNotNull(resp); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + + [TestMethod] + public void PIDCommandTest() { + try { + var resp = _device.Initialize(); + + Assert.IsNotNull(resp); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + + [TestMethod] + public void CALLTMSCommandTest() { + try { + var resp = _device.GetTerminalConfiguration(); + + Assert.IsNotNull(resp); + Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + + [TestMethod] + public void LOGONCommandTest() { + try { + var resp = _device.TestConnection(); + + Assert.IsNotNull(resp); + Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + + [TestMethod] + public void RESETCommandTest() { + try { + var resp = _device.Reboot(); + + Assert.IsNotNull(resp); + Assert.IsNotNull((resp as IngenicoTerminalResponse).PrivateData); + } + catch (Exception e) { + Assert.Fail(e.Message); + } + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs new file mode 100644 index 00000000..0483167a --- /dev/null +++ b/tests/GlobalPayments.Api.Tests/Terminals/Ingenico/TransactionTest.cs @@ -0,0 +1,86 @@ +using System.Threading; +using System.Threading.Tasks; +using GlobalPayments.Api.Entities; +using GlobalPayments.Api.Services; +using GlobalPayments.Api.Terminals; +using GlobalPayments.Api.Terminals.Ingenico; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace GlobalPayments.Api.Tests.Terminals.Ingenico { + [TestClass] + public class TransactionTest { + IDeviceInterface _device; + + public TransactionTest() { + _device = DeviceService.Create(new ConnectionConfig() { + DeviceType = DeviceType.Ingenico_EPOS_Lane3000, + ConnectionMode = ConnectionModes.TCP_IP_SERVER, + Port = "18101", + Timeout = 60000, + RequestIdProvider = new RandomIdProvider() + }); + Assert.IsNotNull(_device); + } + + + [TestMethod] + public void AsyncCancelTest() { + var tsk1 = Task.Factory.StartNew(() => { + var respSale = _device.Sale(15.12m) + .WithCashBack(3m) + .WithReferenceNumber(02) + .Execute(); + + Assert.IsNotNull(respSale); + }); + + var tsk2 = Task.Factory.StartNew(() => { + Thread.Sleep(7000); + + var respCancel = _device.Cancel(); + + Assert.IsNotNull(respCancel); + Assert.AreEqual(respCancel.Status, "CANCEL_DONE"); + }); + + Thread.Sleep(10000); + _device.Dispose(); + + Task.WaitAll(tsk1, tsk2); + } + + [TestMethod] + public void ReverseTest() { + + Thread.Sleep(10000); + + var resSale = _device.Sale(125.12m) + .WithReferenceNumber(55) + .Execute(); + + Thread.Sleep(10000); + + if (resSale != null) { + var resp = _device.Reverse(amount: 6.18m) + .WithReferenceNumber(12) + .Execute(); + + var termId = resp.TerminalRefNumber; + + Assert.IsNotNull(termId); + Assert.AreEqual(resp.Status, "REVERSAL_SUCCESS"); + } + else Assert.IsNull(resSale); + } + + [TestMethod] + public void DuplicTest() { + + var duplicate = _device.Duplicate(); + + _device.Dispose(); + Assert.IsNotNull(duplicate); + Assert.AreEqual(((IngenicoTerminalResponse)duplicate).PrivateData, "DUPLICDONE"); + } + } +} diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs index e45620f6..eced7fe7 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxBatchTests.cs @@ -12,7 +12,7 @@ public class PaxBatchTests { public PaxBatchTests() { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, - ConnectionMode = ConnectionModes.TCP_IP, + ConnectionMode = ConnectionModes.HTTP, IpAddress = "10.12.220.172", Port = "10009", RequestIdProvider = new RandomIdProvider() diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs index f50f6077..ac74f89f 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxCreditTests.cs @@ -411,7 +411,6 @@ public void CreditDuplicateTransaction() { .Execute(); Assert.IsNotNull(duplicate); Assert.AreEqual("00", duplicate.ResponseCode); - Assert.AreEqual(response.AuthorizationCode, duplicate.AuthorizationCode); } } } diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs index 045d3a6b..cb576e7d 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxDebitTests.cs @@ -11,9 +11,8 @@ public class PaxDebitTests { public PaxDebitTests() { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, - ConnectionMode = ConnectionModes.TCP_IP, - IpAddress = "10.12.220.172", - //IpAddress = "192.168.0.31", + ConnectionMode = ConnectionModes.HTTP, + IpAddress = "192.168.0.31", Port = "10009", RequestIdProvider = new RandomIdProvider() }); diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs index 92212ddc..2fe022ab 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxEbtTests.cs @@ -11,7 +11,7 @@ public class PaxEbtTests { public PaxEbtTests() { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, - ConnectionMode = ConnectionModes.TCP_IP, + ConnectionMode = ConnectionModes.HTTP, IpAddress = "10.12.220.172", Port = "10009", RequestIdProvider = new RandomIdProvider() diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs index 28542acb..f10845c8 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxGiftTests.cs @@ -13,7 +13,7 @@ public class PaxGiftTests { public PaxGiftTests() { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, - ConnectionMode = ConnectionModes.TCP_IP, + ConnectionMode = ConnectionModes.HTTP, IpAddress = "10.12.220.172", Port = "10009", RequestIdProvider = new RandomIdProvider() diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs index f347d89e..529f0b50 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxLevel2Tests.cs @@ -12,7 +12,7 @@ public class PaxLevel2Tests { public PaxLevel2Tests() { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, - ConnectionMode = ConnectionModes.TCP_IP, + ConnectionMode = ConnectionModes.HTTP, IpAddress = "10.12.220.172", Port = "10009", RequestIdProvider = new RandomIdProvider() diff --git a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs index a57edbc9..05b7d228 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/Pax/PaxReportTests.cs @@ -19,8 +19,7 @@ public static void Initialize(TestContext context) { _device = DeviceService.Create(new ConnectionConfig { DeviceType = DeviceType.PAX_S300, ConnectionMode = ConnectionModes.TCP_IP, - IpAddress = "10.12.220.172", - //IpAddress = "192.168.0.31", + IpAddress = "192.168.0.31", Port = "10009", Timeout = 30000, RequestIdProvider = new RandomIdProvider() diff --git a/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs b/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs index 946ecccc..399c192c 100644 --- a/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs +++ b/tests/GlobalPayments.Api.Tests/Terminals/RequestIdProviders.cs @@ -22,7 +22,7 @@ public class IncrementalNumberProvider : IRequestIdProvider { private static IncrementalNumberProvider _instance; public static IncrementalNumberProvider GetInstance() { - if (_instance == null) { + if (_instance != null) { _instance = new IncrementalNumberProvider(); } return _instance; diff --git a/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs b/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs index 2f810996..4de42458 100644 --- a/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs +++ b/tests/GlobalPayments.Api.Tests/TestData/TestCards.cs @@ -44,15 +44,10 @@ public static CreditCardData VisaManual(bool cardPresent = false, bool readerPre } public static CreditTrackData VisaSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { + return new CreditTrackData { Value = "%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?", EntryMethod = entryMethod }; - return rvalue; - //return new CreditTrackData { - // Value = "%B4012002000060016^VI TEST CREDIT^251210118039000000000396?;4012002000060016=25121011803939600000?", - // EntryMethod = entryMethod - //}; } public static CreditTrackData VisaFallbackSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { @@ -95,15 +90,10 @@ public static CreditCardData MasterCardSeries2Manual(bool cardPresent = false, b } public static CreditTrackData MasterCardSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { - Value = "%B5506740000004316^MC TEST CARD^251210199998888777766665555444433332?;5506740000004316=25121019999888877776?", + return new CreditTrackData { + Value = "%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?", EntryMethod = entryMethod }; - return rvalue; - //return new CreditTrackData { - // Value = "%B5473500000000014^MC TEST CARD^251210199998888777766665555444433332?;5473500000000014=25121019999888877776?", - // EntryMethod = entryMethod - //}; } public static CreditTrackData MasterCard24Swipe(EntryMethod entryMethod = EntryMethod.Swipe) { @@ -142,15 +132,10 @@ public static CreditCardData DiscoverManual(bool cardPresent = false, bool reade } public static CreditTrackData DiscoverSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData creditTrackData = new CreditTrackData { + return new CreditTrackData { Value = "%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?", EntryMethod = entryMethod }; - return creditTrackData; - //return new CreditTrackData { - // Value = "%B6011000990156527^DIS TEST CARD^25121011000062111401?;6011000990156527=25121011000062111401?", - // EntryMethod = entryMethod - //}; } public static CreditTrackData DiscoverSwipeEncrypted(EntryMethod entryMethod = EntryMethod.Swipe) { return new CreditTrackData { @@ -174,16 +159,10 @@ public static CreditCardData AmexManual(bool cardPresent = false, bool readerPre } public static CreditTrackData AmexSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { - Value = "%B3739 531923 51004^STANDARD ANSI ^2008100812345?", + return new CreditTrackData { + Value = "%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?", EntryMethod = entryMethod }; - return rvalue; - //return new CreditTrackData - //{ - // Value = "%B3727 006992 51018^AMEX TEST CARD^2512990502700?;372700699251018=2512990502700?", - // EntryMethod = entryMethod - //}; } public static CreditCardData JcbManual(bool cardPresent = false, bool readerPresent = false) { @@ -214,175 +193,6 @@ public static GiftCard GiftCard2Manual() { return new GiftCard { Number = "5022440000000000007" }; - } - public static CreditCardData VisaFleetManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData rvalue = new CreditCardData { - Number = "4761360000000249", - ExpMonth = 12, - ExpYear = 2025, - Cvn = "123", - CardPresent = cardPresent, - ReaderPresent = readerPresent - }; - return rvalue; - } - public static CreditTrackData VisaFleetSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { - Value = "%B4485536666666663^VISA TEST CARD/GOOD^25121019206100000001?;4485536666666663=16111019206100000001?", - EntryMethod = entryMethod - }; - return rvalue; - //CreditTrackData rvalue = new CreditTrackData(); - //rvalue.Value = "%B4484630000000126^VISA TEST CARD/GOOD^25121019206100000001?;4484630000000126=16111019206100000001?"; - //rvalue.EntryMethod = entryMethod; - //return rvalue; - } - public static CreditCardData MasterCardFleetManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData card = new CreditCardData { - Number = "5567300000000016", - ExpMonth = 12, - ExpYear = 2025, - Cvn = "123", - CardPresent = cardPresent, - ReaderPresent = readerPresent - }; - - return card; - } - public static CreditTrackData MasterCardFleetSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { - Value = "%B5567300000000016^MASTERCARD FLEET ^2512101777766665555444433332111?;5567300000000016=25121019999888877724?", - EntryMethod = entryMethod - }; - return rvalue; - //CreditTrackData track = new CreditTrackData(); - //track.Value = "%B5567300000000016^MASTERCARD FLEET ^2512101777766665555444433332111?;5567300000000016=25121019999888877711?"; - //track.EntryMethod = entryMethod; - - //return track; - } - public static CreditCardData FleetOneManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData rvalue = new CreditCardData { - Number = "5014860000000000126", - ExpMonth = 12, - ExpYear = 2025, - Cvn = "123", - CardPresent = cardPresent, - ReaderPresent = readerPresent - }; - return rvalue; - } - public static CreditTrackData FleetOneSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData { - Value = "%B5014860000000126^FLEETONE TEST CARD/GOOD^25121019206100000001?;5014860000000126=16111019206100000001?", - EntryMethod = entryMethod - }; - return rvalue; - } - public static GiftCard ValueLinkManual() { - GiftCard rvalue = new GiftCard(); - rvalue.SetValue("6010561234567890123"); - return rvalue; - } - public static GiftCard ValueLinkSwipe() { - GiftCard rvalue = new GiftCard(); - rvalue.SetValue("7083559999009209310=999900100000000"); - return rvalue; - } - public static CreditCardData AmexManualEncrypted(bool cardPresent=true) { - CreditCardData rvalue = new CreditCardData(); - rvalue.Number = "372700790311018"; - rvalue.ExpMonth = 12; - rvalue.ExpYear = 2020; - rvalue.CardPresent = cardPresent; - rvalue.ReaderPresent = true; - rvalue.EncryptionData = EncryptionData.Version2("/wECAQEEAoFGAgEH4gwTTDT6jRZwb3NAc2VjdXJlZXhjaGFuZ2UubmV0yp142cX/wGCVF/gVBOFEiFbZxWq0ZQeADdyMNKbOOzxu2MsHhZ+MkDQrz1KJKJVOHQyV3/mnHBWsQPdlGpVkxK0GxFrxbtIxOwViiBZb2ySajpUat6o+MunOrz7ZsYeurOJHtrpYrLEmPgVwxL3dn3Br+XS5sF2pqtG4lq5MsmgAzzKH9/llZ+FDb1e0NJX/8Nso784bBAr3dmUqagCaWSVb4fcg", "1"); - return rvalue; - } - public static CreditTrackData AmexSwipeEncrypted(EntryMethod entryMethod=EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData(); - rvalue.Value = "B372700791018^AMEX TEST CARD^2512990ocSvC1w2YgC"; - rvalue.EntryMethod = entryMethod; - rvalue.EncryptionData = EncryptionData.Version2("/wECAQEEAoFGAgEH4gwTTDT6jRZwb3NAc2VjdXJlZXhjaGFuZ2UubmV0yp142cX/wGCVF/gVBOFEiFbZxWq0ZQeADdyMNKbOOzxu2MsHhZ+MkDQrz1KJKJVOHQyV3/mnHBWsQPdlGpVkxK0GxFrxbtIxOwViiBZb2ySajpUat6o+MunOrz7ZsYeurOJHtrpYrLEmPgVwxL3dn3Br+XS5sF2pqtG4lq5MsmgAzzKH9/llZ+FDb1e0NJX/8Nso784bBAr3dmUqagCaWSVb4fcg", "1"); - return rvalue; - } - /* - SVS - ;7083559900007000792=99990018010300000? - ;7083559900007000776=99990013849500000? - ;7083559900007000818=99990012504400000? - */ - public static GiftCard SvsManual() { - GiftCard rvalue = new GiftCard(); - rvalue.SetValue("6394700000001113"); - rvalue.Pin = "1234"; - return rvalue; - } - public static GiftCard SvsSwipe() { - GiftCard rvalue = new GiftCard(); - rvalue.SetValue(";7083559900007000818=99990012504400000?"); - return rvalue; - } - - public static CreditCardData VisaCorporateManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData rvalue = new CreditCardData(); - rvalue.Number = "4013872718148777"; - rvalue.ExpMonth = 12; - rvalue.ExpYear = 2025; - rvalue.Cvn = "123"; - rvalue.CardPresent = cardPresent; - rvalue.ReaderPresent = readerPresent; - return rvalue; - } - - public static CreditTrackData VisaCorporateSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData(); - rvalue.Value = "%B4273594425847534^VISA TEST CARD/GOOD^2512101?;4273594425847534=1712101?"; - rvalue.EntryMethod = entryMethod; - return rvalue; - } - - public static CreditCardData VisaPurchasingManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData rvalue = new CreditCardData(); - rvalue.Number = "4484104292153662"; - rvalue.ExpMonth = 12; - rvalue.ExpYear = 2025; - rvalue.Cvn = "123"; - rvalue.CardPresent = cardPresent; - rvalue.ReaderPresent = readerPresent; - return rvalue; - } - - public static CreditTrackData VisaPurchasingSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData(); - rvalue.Value = "%B4484104292153662^POSINT TEST VISA P CARD^2512501032100321001000?;4484104292153662=18035010321?"; - rvalue.EntryMethod = entryMethod; - return rvalue; - } - - public static CreditCardData MasterCardPurchasingManual(bool cardPresent = false, bool readerPresent = false) { - CreditCardData rvalue = new CreditCardData(); - rvalue.Number = "5302490000004066"; - rvalue.ExpMonth = 12; - rvalue.ExpYear = 2025; - rvalue.Cvn = "123"; - rvalue.CardPresent = cardPresent; - rvalue.ReaderPresent = readerPresent; - return rvalue; - } - - public static CreditTrackData MasterCardPurchasingSwipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData(); - rvalue.Value = "%B5405059925478964^MASTERCARD TEST^25121011234567890123?;5405059925478964=18121011234567890123?"; - rvalue.EntryMethod = entryMethod; - return rvalue; - } - - public static CreditTrackData MasterCard2Swipe(EntryMethod entryMethod = EntryMethod.Swipe) { - CreditTrackData rvalue = new CreditTrackData(); - rvalue.Value = "%B2223000010005780^TEST CARD/EMV BIN-2^25121010000000009210?;2223000010005780=25121010000000009210?"; - rvalue.EntryMethod = entryMethod; - return rvalue; } } } diff --git a/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs b/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs index 5834a093..5646e666 100644 --- a/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs +++ b/tests/GlobalPayments.Api.Tests/TransIT/TransitAuthenticationTests.cs @@ -13,15 +13,15 @@ public TransitAuthenticationTests() { //}); } - [TestMethod] + [TestMethod, Ignore] public void GenerateKey_Manual() { // TODO: I have verified this works and am awaiting for guidance on how to handle the transaction keys before finalizing this piece string transactionKey = TransitService.GenerateTransactionKey( Environment.TEST, - "887000003282", - "TA5654114", - "TransitCert2020!" - //"3RDHBVQOYIGTC9WQ32CPBFMPGX5OTWN3" + "887000003226", + "TA5622118", + "f8mapGqWrE^rVaA9", + "3RDHBVQOYIGTC9WQ32CPBFMPGX5OTWN3" ); Assert.IsNotNull(transactionKey); } diff --git a/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs b/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs index 55592f57..fc225125 100644 --- a/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs +++ b/tests/GlobalPayments.Api.Tests/TransIT/TransitCreditTests.cs @@ -151,14 +151,14 @@ public void Auth_MultiCapture() { var captureResponse = response.Capture(10m) .WithCurrency("USD") - .WithMultiCapture(1, 2) + .WithMultiCapture(true) .Execute(); Assert.IsNotNull(captureResponse); Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage); var captureResponse2 = response.Capture(10m) .WithCurrency("USD") - .WithMultiCapture(2, 2) + .WithMultiCapture(true) .Execute(); Assert.IsNotNull(captureResponse2); Assert.AreEqual("00", captureResponse2.ResponseCode, captureResponse2.ResponseMessage); @@ -174,7 +174,7 @@ public void Auth_MultiCapture_Mixed() { var captureResponse = response.Capture(12m) .WithCurrency("USD") - .WithMultiCapture(1, 2) + .WithMultiCapture(true) .Execute(); Assert.IsNotNull(captureResponse); Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage); @@ -196,15 +196,12 @@ public void Auth_MultiCapture_OverAuth() { var captureResponse = response.Capture(21m) .WithCurrency("USD") - .WithMultiCapture(1, 2) + //.WithMultiCapture(true) .Execute(); Assert.IsNotNull(captureResponse); Assert.AreEqual("00", captureResponse.ResponseCode, captureResponse.ResponseMessage); - response.Capture(10m) - .WithCurrency("USD") - .WithMultiCapture(2, 2) - .Execute(); + response.Capture(10m).WithCurrency("USD").WithMultiCapture(true).Execute(); } [TestMethod, ExpectedException(typeof(GatewayException))]