public void GetSchemeSettlementEntries_OnValidResponse_ReturnCount() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); var secrets = SpiClientTestUtils.SetTestSecrets(); const string jsonStr = @"{""message"":{""data"":{""accumulacxted_purchase_count"":""1"",""accumulated_purchase_value"":""1000"",""accumulated_settle_by_acquirer_count"":""1"",""accumulated_settle_by_acquirer_value"":""1000"",""accumulated_total_count"":""1"",""accumulated_total_value"":""1000"",""bank_date"":""14062019"",""bank_time"":""160940"",""host_response_code"":""941"",""host_response_text"":""CUTOVER COMPLETE"",""merchant_acquirer"":""EFTPOS FROM BANK SA"",""merchant_address"":""213 Miller Street"",""merchant_city"":""Sydney"",""merchant_country"":""Australia"",""merchant_name"":""Merchant4"",""merchant_postcode"":""2060"",""merchant_receipt"":""EFTPOS FROM BANK SA\r\nMerchant4\r\n213 Miller Street\r\nSydney 2060\r\n\r\nAustralia\r\n\r\n\r\n SETTLEMENT CUTOVER\r\nTSP 100612348842\r\nTIME 14JUN19 16:09\r\nTRAN 001137-001137\r\nFROM 13JUN19 20:00\r\nTO 14JUN19 16:09\r\n\r\nDebit\r\nTOT 0 $0.00\r\n\r\nMasterCard\r\nTOT 0 $0.00\r\n\r\nVisa\r\nPUR 1 $10.00\r\nTOT 1 $10.00\r\n\r\nBANKED 1 $10.00\r\n\r\nAmex\r\nTOT 0 $0.00\r\n\r\nDiners\r\nTOT 0 $0.00\r\n\r\nJCB\r\nTOT 0 $0.00\r\n\r\nUnionPay\r\nTOT 0 $0.00\r\n\r\nTOTAL\r\nPUR 1 $10.00\r\nTOT 1 $10.00\r\n\r\n (941) CUTOVER COMP\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n"",""schemes"":[{""scheme_name"":""Debit"",""settle_by_acquirer"":""Yes"",""total_count"":""0"",""total_value"":""0""},{""scheme_name"":""MasterCard"",""settle_by_acquirer"":""Yes"",""total_count"":""0"",""total_value"":""0""},{""scheme_name"":""Visa"",""settle_by_acquirer"":""Yes"",""total_count"":""1"",""total_purchase_count"":""1"",""total_purchase_value"":""1000"",""total_value"":""1000""},{""scheme_name"":""Amex"",""settle_by_acquirer"":""No"",""total_count"":""0"",""total_value"":""0""},{""scheme_name"":""Diners"",""settle_by_acquirer"":""No"",""total_count"":""0"",""total_value"":""0""},{""scheme_name"":""JCB"",""settle_by_acquirer"":""No"",""total_count"":""0"",""total_value"":""0""},{""scheme_name"":""UnionPay"",""settle_by_acquirer"":""No"",""total_count"":""0"",""total_value"":""0""}],""settlement_period_end_date"":""14Jun19"",""settlement_period_end_time"":""16:09"",""settlement_period_start_date"":""13Jun19"",""settlement_period_start_time"":""20:00"",""settlement_triggered_date"":""14Jun19"",""settlement_triggered_time"":""16:09:40"",""stan"":""000000"",""success"":true,""terminal_id"":""100612348842"",""transaction_range"":""001137-001137""},""datetime"":""2019-06-14T16:09:46.395"",""event"":""settle_response"",""id"":""settle116""}}"; // act var msg = Message.FromJson(jsonStr, secrets); transactionFlowState.Response = msg; var comWrapper = new ComWrapper(); var schemeArray = comWrapper.GetSchemeSettlementEntries(transactionFlowState); var settleResponse = new Settlement(transactionFlowState.Response); var schemes = settleResponse.GetSchemeSettlementEntries(); var schemeList = new List <SchemeSettlementEntry>(); foreach (var s in schemes) { schemeList.Add(s); } // assert Assert.Equal(schemeArray.ToList().Count, schemeList.Count); }
private void HandleFinishedGetLastTransaction(TransactionFlowState txState) { if (txState.Response != null) { var gltResponse = new GetLastTransactionResponse(txState.Response); if (_lastCmd.Length > 1) { // User specified that he intended to retrieve a specific tx by pos_ref_id // This is how you can use a handy function to match it. var success = _spi.GltMatch(gltResponse, _lastCmd[1]); if (success == Message.SuccessState.Unknown) { Console.WriteLine("# Did not retrieve Expected Transaction. Here is what we got:"); } else { Console.WriteLine("# Tx Matched Expected Purchase Request."); } } var purchaseResponse = new PurchaseResponse(txState.Response); Console.WriteLine("# Scheme: {0}", purchaseResponse.SchemeName); Console.WriteLine("# Response: {0}", purchaseResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", purchaseResponse.GetRRN()); Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(purchaseResponse.GetCustomerReceipt().TrimEnd()); } else { // We did not even get a response, like in the case of a time-out. Console.WriteLine("# Could Not Retrieve Last Transaction."); } }
public void TransactionFlowState_OnValidRequestGotGltResponse_ReturnObject() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.GotGltResponse(); // assert Assert.False(transactionFlowState.AwaitingGltResponse); }
public void TransactionFlowState_OnValidRequestAuthCodeSent_ReturnObjects() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.AuthCodeSent("AuthCodeSent"); // assert Assert.False(transactionFlowState.AwaitingPhoneForAuth); Assert.Equal("AuthCodeSent", transactionFlowState.DisplayMessage); }
public void TransactionFlowState_OnValidRequestCancelFailed_ReturnObjects() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.CancelFailed("CancelFailed"); // assert Assert.False(transactionFlowState.AttemptingToCancel); Assert.Equal("CancelFailed", transactionFlowState.DisplayMessage); }
private void HandleFinishedPurchase(TransactionFlowState txState) { PurchaseResponse purchaseResponse; switch (txState.Success) { case Message.SuccessState.Success: Console.WriteLine($"# WOOHOO - WE GOT PAID!"); purchaseResponse = new PurchaseResponse(txState.Response); Console.WriteLine("# Response: {0}", purchaseResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", purchaseResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", purchaseResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!purchaseResponse.WasCustomerReceiptPrinted() ? purchaseResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); Console.WriteLine("# PURCHASE: {0}", purchaseResponse.GetPurchaseAmount()); Console.WriteLine("# TIP: {0}", purchaseResponse.GetTipAmount()); Console.WriteLine("# SURCHARGE: {0}", purchaseResponse.GetSurchargeAmount()); Console.WriteLine("# CASHOUT: {0}", purchaseResponse.GetCashoutAmount()); Console.WriteLine("# BANKED NON-CASH AMOUNT: {0}", purchaseResponse.GetBankNonCashAmount()); Console.WriteLine("# BANKED CASH AMOUNT: {0}", purchaseResponse.GetBankCashAmount()); break; case Message.SuccessState.Failed: Console.WriteLine($"# WE DID NOT GET PAID :("); if (txState.Response != null) { purchaseResponse = new PurchaseResponse(txState.Response); Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Error Detail: {0}", txState.Response.GetErrorDetail()); Console.WriteLine("# Response: {0}", purchaseResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", purchaseResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", purchaseResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!purchaseResponse.WasCustomerReceiptPrinted() ? purchaseResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); } break; case Message.SuccessState.Unknown: Console.WriteLine($"# WE'RE NOT QUITE SURE WHETHER WE GOT PAID OR NOT :/"); Console.WriteLine($"# CHECK THE LAST TRANSACTION ON THE EFTPOS ITSELF FROM THE APPROPRIATE MENU ITEM."); Console.WriteLine($"# IF YOU CONFIRM THAT THE CUSTOMER PAID, CLOSE THE ORDER."); Console.WriteLine($"# OTHERWISE, RETRY THE PAYMENT FROM SCRATCH."); break; default: throw new ArgumentOutOfRangeException(); } }
public void TransactionFlowState_OnValidRequestCallingGlt_ReturnObjects() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.CallingGlt("25"); // assert Assert.True(transactionFlowState.AwaitingGltResponse); Assert.NotNull(transactionFlowState.LastStateRequestTime); Assert.Equal("25", transactionFlowState.LastGltRequestId); }
private static void HandleFinishedSettlementEnquiry(TransactionFlowState txState) { switch (txState.Success) { case Message.SuccessState.Success: Console.WriteLine($"# SETTLEMENT ENQUIRY SUCCESSFUL!"); if (txState.Response != null) { var settleResponse = new Settlement(txState.Response); Console.WriteLine("# Response: {0}", settleResponse.GetResponseText()); Console.WriteLine("# Merchant Receipt:"); Console.WriteLine(settleResponse.GetReceipt().TrimEnd()); Console.WriteLine("# Period Start: " + settleResponse.GetPeriodStartTime()); Console.WriteLine("# Period End: " + settleResponse.GetPeriodEndTime()); Console.WriteLine("# Settlement Time: " + settleResponse.GetTriggeredTime()); Console.WriteLine("# Transaction Range: " + settleResponse.GetTransactionRange()); Console.WriteLine("# Terminal Id: " + settleResponse.GetTerminalId()); Console.WriteLine("# Total TX Count: " + settleResponse.GetTotalCount()); Console.WriteLine($"# Total TX Value: {settleResponse.GetTotalValue() / 100.0}"); Console.WriteLine("# By Aquirer TX Count: " + settleResponse.GetSettleByAcquirerCount()); Console.WriteLine($"# By Aquirere TX Value: {settleResponse.GetSettleByAcquirerValue() / 100.0}"); Console.WriteLine("# SCHEME SETTLEMENTS:"); var schemes = settleResponse.GetSchemeSettlementEntries(); foreach (var s in schemes) { Console.WriteLine("# " + s); } } break; case Message.SuccessState.Failed: Console.WriteLine($"# SETTLEMENT ENQUIRY FAILED!"); if (txState.Response != null) { var settleResponse = new Settlement(txState.Response); Console.WriteLine("# Response: {0}", settleResponse.GetResponseText()); Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Merchant Receipt:"); Console.WriteLine(settleResponse.GetReceipt().TrimEnd()); } break; case Message.SuccessState.Unknown: Console.WriteLine($"# SETTLEMENT ENQUIRY RESULT UNKNOWN!"); break; default: throw new ArgumentOutOfRangeException(); } }
public void TransactionFlowState_OnValidRequestFailed_ReturnObjects() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.Failed(stlEnqMsg, "Failed"); // assert Assert.Equal(stlEnqMsg, transactionFlowState.Response); Assert.True(transactionFlowState.Finished); Assert.Equal(Message.SuccessState.Failed, transactionFlowState.Success); Assert.Equal("Failed", transactionFlowState.DisplayMessage); }
private void HandleFinishedMoto(TransactionFlowState txState) { MotoPurchaseResponse motoResponse; PurchaseResponse purchaseResponse; switch (txState.Success) { case Message.SuccessState.Success: Console.WriteLine($"# WOOHOO - WE GOT MOTO-PAID!"); motoResponse = new MotoPurchaseResponse(txState.Response); purchaseResponse = motoResponse.PurchaseResponse; Console.WriteLine("# Response: {0}", purchaseResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", purchaseResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", purchaseResponse.SchemeName); Console.WriteLine("# Card Entry: {0}", purchaseResponse.GetCardEntry()); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!purchaseResponse.WasCustomerReceiptPrinted() ? purchaseResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); Console.WriteLine("# PURCHASE: {0}", purchaseResponse.GetPurchaseAmount()); Console.WriteLine("# BANKED NON-CASH AMOUNT: {0}", purchaseResponse.GetBankNonCashAmount()); Console.WriteLine("# BANKED CASH AMOUNT: {0}", purchaseResponse.GetBankCashAmount()); break; case Message.SuccessState.Failed: Console.WriteLine($"# WE DID NOT GET MOTO-PAID :("); if (txState.Response != null) { motoResponse = new MotoPurchaseResponse(txState.Response); purchaseResponse = motoResponse.PurchaseResponse; Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Error Detail: {0}", txState.Response.GetErrorDetail()); Console.WriteLine("# Response: {0}", purchaseResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", purchaseResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", purchaseResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(purchaseResponse.GetCustomerReceipt().TrimEnd()); } break; case Message.SuccessState.Unknown: Console.WriteLine($"# WE'RE NOT QUITE SURE WHETHER THE MOTO WENT THROUGH OR NOT :/"); Console.WriteLine($"# CHECK THE LAST TRANSACTION ON THE EFTPOS ITSELF FROM THE APPROPRIATE MENU ITEM."); Console.WriteLine($"# YOU CAN THE TAKE THE APPROPRIATE ACTION."); break; default: throw new ArgumentOutOfRangeException(); } }
public void TransactionFlowState_OnValidRequestPhoneForAuthRequired_ReturnObjects() { // arrnge var secrets = SpiClientTestUtils.SetTestSecrets(); const string jsonStr = @"{""message"":{""event"":""authorisation_code_required"",""id"":""20"",""datetime"":""2017-11-01T06:09:33.918"",""data"":{""merchant_id"":""12345678"",""auth_centre_phone_number"":""1800999999"",""pos_ref_id"": ""xyz""}}}"; var msg = Message.FromJson(jsonStr, secrets); var request = new PhoneForAuthRequired(msg); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, msg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // act transactionFlowState.PhoneForAuthRequired(request, "PhoneForAuthRequired"); // assert Assert.Equal(request, transactionFlowState.PhoneForAuthRequiredMessage); Assert.True(transactionFlowState.AwaitingPhoneForAuth); Assert.Equal("PhoneForAuthRequired", transactionFlowState.DisplayMessage); }
public void TransactionFlowState_OnValidResponseSignatureRequired_ReturnObjects() { // arrange var secrets = SpiClientTestUtils.SetTestSecrets(); const string jsonStr = @"{""message"":{""data"":{""merchant_receipt"": ""\nEFTPOS FROM WESTPAC\nVAAS Product 2\n275 Kent St\nSydney 2000\nAustralia\n\n\nMID 02447506\nTSP 100381990116\nTIME 26APR17 11:29\nRRN 170426000358\nTRAN 000358 CREDIT\nAmex S\nCARD............4477\nAUTH 764167\n\nPURCHASE AUD100.00\nTIP AUD5.00\n\nTOTAL AUD105.00\n\n\n (001) APPROVE WITH\n SIGNATURE\n\n\n\n\n\n\nSIGN:_______________\n\n\n\n\n\n\n\n"",""pos_ref_id"":""prchs-06-06-2019-11-49-05""},""datetime"": ""2017-04-26T11:30:21.000"",""event"": ""signature_required"",""id"": ""24""}}"; // act var msg = Message.FromJson(jsonStr, secrets); var response = new SignatureRequired(msg); var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, msg, $"Waiting for EFTPOS connection to make a settlement enquiry"); transactionFlowState.SignatureRequired(response, "SignatureRequired"); // assert Assert.Equal(response, transactionFlowState.SignatureRequiredMessage); Assert.True(transactionFlowState.AwaitingSignatureCheck); Assert.Equal("SignatureRequired", transactionFlowState.DisplayMessage); }
private void HandleFinishedCashout(TransactionFlowState txState) { CashoutOnlyResponse cashoutResponse; switch (txState.Success) { case Message.SuccessState.Success: Console.WriteLine($"# CASH-OUT SUCCESSFUL - HAND THEM THE CASH!"); cashoutResponse = new CashoutOnlyResponse(txState.Response); Console.WriteLine("# Response: {0}", cashoutResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", cashoutResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", cashoutResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!cashoutResponse.WasCustomerReceiptPrinted() ? cashoutResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); Console.WriteLine("# CASHOUT: {0}", cashoutResponse.GetCashoutAmount()); Console.WriteLine("# BANKED NON-CASH AMOUNT: {0}", cashoutResponse.GetBankNonCashAmount()); Console.WriteLine("# BANKED CASH AMOUNT: {0}", cashoutResponse.GetBankCashAmount()); break; case Message.SuccessState.Failed: Console.WriteLine($"# CASHOUT FAILED!"); if (txState.Response != null) { cashoutResponse = new CashoutOnlyResponse(txState.Response); Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Error Detail: {0}", txState.Response.GetErrorDetail()); Console.WriteLine("# Response: {0}", cashoutResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", cashoutResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", cashoutResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(cashoutResponse.GetCustomerReceipt().TrimEnd()); } break; case Message.SuccessState.Unknown: Console.WriteLine($"# WE'RE NOT QUITE SURE WHETHER THE CASHOUT WENT THROUGH OR NOT :/"); Console.WriteLine($"# CHECK THE LAST TRANSACTION ON THE EFTPOS ITSELF FROM THE APPROPRIATE MENU ITEM."); Console.WriteLine($"# YOU CAN THE TAKE THE APPROPRIATE ACTION."); break; default: throw new ArgumentOutOfRangeException(); } }
public void TransactionFlowState_OnValidState_ReturnObjects() { // arrange var stlEnqMsg = new SettlementEnquiryRequest(RequestIdHelper.Id("stlenq")).ToMessage(); // act var transactionFlowState = new TransactionFlowState("1", TransactionType.SettlementEnquiry, 0, stlEnqMsg, $"Waiting for EFTPOS connection to make a settlement enquiry"); // assert Assert.Equal("1", transactionFlowState.PosRefId); Assert.Equal("1", transactionFlowState.Id); Assert.Equal(TransactionType.SettlementEnquiry, transactionFlowState.Type); Assert.Equal(0, transactionFlowState.AmountCents); Assert.False(transactionFlowState.AwaitingSignatureCheck); Assert.False(transactionFlowState.RequestSent); Assert.False(transactionFlowState.Finished); Assert.Equal(Message.SuccessState.Unknown, transactionFlowState.Success); Assert.Equal($"Waiting for EFTPOS connection to make a settlement enquiry", transactionFlowState.DisplayMessage); }
private void HandleFinishedRefund(TransactionFlowState txState) { RefundResponse refundResponse; switch (txState.Success) { case Message.SuccessState.Success: Console.WriteLine($"# REFUND GIVEN- OH WELL!"); refundResponse = new RefundResponse(txState.Response); Console.WriteLine("# Response: {0}", refundResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", refundResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", refundResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!refundResponse.WasCustomerReceiptPrinted() ? refundResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); Console.WriteLine("# REFUNDED AMOUNT: {0}", refundResponse.GetRefundAmount()); break; case Message.SuccessState.Failed: Console.WriteLine($"# REFUND FAILED!"); if (txState.Response != null) { refundResponse = new RefundResponse(txState.Response); Console.WriteLine("# Error: {0}", txState.Response.GetError()); Console.WriteLine("# Error Detail: {0}", txState.Response.GetErrorDetail()); Console.WriteLine("# Response: {0}", refundResponse.GetResponseText()); Console.WriteLine("# RRN: {0}", refundResponse.GetRRN()); Console.WriteLine("# Scheme: {0}", refundResponse.SchemeName); Console.WriteLine("# Customer Receipt:"); Console.WriteLine(!refundResponse.WasCustomerReceiptPrinted() ? refundResponse.GetCustomerReceipt().TrimEnd() : "# PRINTED FROM EFTPOS"); } break; case Message.SuccessState.Unknown: Console.WriteLine($"# WE'RE NOT QUITE SURE WHETHER THE REFUND WENT THROUGH OR NOT :/"); Console.WriteLine($"# CHECK THE LAST TRANSACTION ON THE EFTPOS ITSELF FROM THE APPROPRIATE MENU ITEM."); Console.WriteLine($"# YOU CAN THE TAKE THE APPROPRIATE ACTION."); break; default: throw new ArgumentOutOfRangeException(); } }
private void OnTxFlowStateChanged(object sender, TransactionFlowState txState) { Console.Clear(); PrintStatusAndActions(); Console.Write("> "); }
private void OnTxFlowStateChanged(object sender, TransactionFlowState e) { SpiFlowInfo(); SpiPairingStatus(); }