From 6b4376b4bf150d83881ee613f5050e5cfbb17623 Mon Sep 17 00:00:00 2001 From: Sean Fuhrmann Date: Sat, 16 Dec 2017 18:20:31 -0600 Subject: [PATCH 1/3] Added support for PAX ADJUST keyword - allowing ability to add a tip to a transaction without having CREDITEDIT support --- SecureSubmit/SecureSubmit.csproj | 1 + .../PAX/Fluent/CreditAdjustBuilder.cs | 64 +++++++++++++++++++ SecureSubmit/Terminals/PAX/PaxDevice.cs | 5 ++ 3 files changed, 70 insertions(+) create mode 100644 SecureSubmit/Terminals/PAX/Fluent/CreditAdjustBuilder.cs diff --git a/SecureSubmit/SecureSubmit.csproj b/SecureSubmit/SecureSubmit.csproj index 88e2a04..f50426b 100644 --- a/SecureSubmit/SecureSubmit.csproj +++ b/SecureSubmit/SecureSubmit.csproj @@ -213,6 +213,7 @@ + diff --git a/SecureSubmit/Terminals/PAX/Fluent/CreditAdjustBuilder.cs b/SecureSubmit/Terminals/PAX/Fluent/CreditAdjustBuilder.cs new file mode 100644 index 0000000..c310a9d --- /dev/null +++ b/SecureSubmit/Terminals/PAX/Fluent/CreditAdjustBuilder.cs @@ -0,0 +1,64 @@ +using System; +using SecureSubmit.Entities; +using SecureSubmit.Fluent; +using SecureSubmit.Infrastructure; +using SecureSubmit.Terminals.Extensions; + +namespace SecureSubmit.Terminals.PAX { + public class CreditAdjustBuilder : HpsBuilderAbstract { + private int referenceNumber; + decimal? gratuity; + int? transactionId; + + public CreditAdjustBuilder WithTransactionId(int? value) { + this.transactionId = value; + return this; + } + + public CreditAdjustBuilder WithGratuity(decimal? value) + { + this.gratuity = value; + return this; + } + + public CreditAdjustBuilder WithReferenceNumber(int referenceNumber) { + this.referenceNumber = referenceNumber; + return this; + } + + public CreditAdjustBuilder(PaxDevice device) + : base(device) { + } + + public override CreditResponse Execute() { + base.Execute(); + + var amounts = new AmountRequest(); + if (gratuity.HasValue) + amounts.TransactionAmount = "{0:c}".FormatWith(gratuity).ToNumeric(); + + var trace = new TraceRequest { + ReferenceNumber = referenceNumber.ToString(), + TransactionNumber = referenceNumber.ToString() + }; + + var extData = new ExtDataSubGroup(); + if (transactionId.HasValue) + extData[EXT_DATA.HOST_REFERENCE_NUMBER] = transactionId.Value.ToString(); + + var response = service.DoCredit( + PAX_TXN_TYPE.ADJUST, + amounts, + new AccountRequest(), + trace, + new AvsRequest(), + new CashierSubGroup(), + new CommercialRequest(), + new EcomSubGroup(), + extData + ); + + return response; + } + } +} diff --git a/SecureSubmit/Terminals/PAX/PaxDevice.cs b/SecureSubmit/Terminals/PAX/PaxDevice.cs index ee9fc41..18b6d07 100644 --- a/SecureSubmit/Terminals/PAX/PaxDevice.cs +++ b/SecureSubmit/Terminals/PAX/PaxDevice.cs @@ -134,6 +134,11 @@ public CreditCaptureBuilder CreditCapture(int referenceNumber, decimal? amount = return new CreditCaptureBuilder(this).WithReferenceNumber(referenceNumber).WithAmount(amount); } + public CreditAdjustBuilder CreditAdjust(int referenceNumber, decimal? gratuity = null) + { + return new CreditAdjustBuilder(this).WithReferenceNumber(referenceNumber).WithGratuity(gratuity); + } + public CreditEditBuilder CreditEdit(decimal? amount = null) { if (!_settings.DeviceId.HasValue || !_settings.SiteId.HasValue || !_settings.LicenseId.HasValue || string.IsNullOrEmpty(_settings.UserName) || string.IsNullOrEmpty(_settings.Password)) throw new HpsConfigurationException("Device is not configured properly for Credit Edit. Please provide the device credentials in the ConnectionConfig."); From 5beddd52873a3b0944428ba6c536e941644b38bf Mon Sep 17 00:00:00 2001 From: Sean Fuhrmann Date: Sat, 16 Dec 2017 18:22:54 -0600 Subject: [PATCH 2/3] Added TotalCount and TotalAmount parsing - populate publicly expose HostResponse on BatchCloseResponse --- .../Terminals/PAX/Responses/BatchCloseResponse.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/SecureSubmit/Terminals/PAX/Responses/BatchCloseResponse.cs b/SecureSubmit/Terminals/PAX/Responses/BatchCloseResponse.cs index 1e18df6..df87116 100644 --- a/SecureSubmit/Terminals/PAX/Responses/BatchCloseResponse.cs +++ b/SecureSubmit/Terminals/PAX/Responses/BatchCloseResponse.cs @@ -1,13 +1,14 @@ using System; using System.IO; +using System.Linq; using SecureSubmit.Terminals.Extensions; namespace SecureSubmit.Terminals.PAX { public class BatchCloseResponse : PaxDeviceResponse { private HostResponse hostResponse; - public string TotalCount { get; set; } - public string TotalAmount { get; set; } + public int TotalCount { get; set; } + public decimal TotalAmount { get; set; } public string TimeStamp { get; set; } public string TID { get; set; } public string MID { get; set; } @@ -20,11 +21,13 @@ protected override void ParseResponse(BinaryReader br) { base.ParseResponse(br); this.hostResponse = new HostResponse(br); - this.TotalCount = br.ReadToCode(ControlCodes.FS); - this.TotalAmount = br.ReadToCode(ControlCodes.FS); + this.TotalCount = br.ReadToCode(ControlCodes.FS).Split('=').Sum(o => Convert.ToInt32(o)); + this.TotalAmount = br.ReadToCode(ControlCodes.FS).Split('=').Sum(o => Convert.ToDecimal(o) / 100); this.TimeStamp = br.ReadToCode(ControlCodes.FS); this.TID = br.ReadToCode(ControlCodes.FS); this.MID = br.ReadToCode(ControlCodes.ETX); + + this.HostResponse = hostResponse; } } } From 6b5e29793a9146069ad069a0e215180b5cfe6faf Mon Sep 17 00:00:00 2001 From: Sean Fuhrmann Date: Sun, 11 Mar 2018 16:20:46 -0500 Subject: [PATCH 3/3] Added Batch Clear support --- SecureSubmit/SecureSubmit.csproj | 1 + SecureSubmit/Terminals/PAX/Fluent/CreditVoidBuilder.cs | 9 ++++----- SecureSubmit/Terminals/PAX/PaxDevice.cs | 5 +++++ .../Terminals/PAX/Responses/BatchClearResponse.cs | 7 +++++++ 4 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 SecureSubmit/Terminals/PAX/Responses/BatchClearResponse.cs diff --git a/SecureSubmit/SecureSubmit.csproj b/SecureSubmit/SecureSubmit.csproj index f50426b..29a7ae6 100644 --- a/SecureSubmit/SecureSubmit.csproj +++ b/SecureSubmit/SecureSubmit.csproj @@ -241,6 +241,7 @@ + diff --git a/SecureSubmit/Terminals/PAX/Fluent/CreditVoidBuilder.cs b/SecureSubmit/Terminals/PAX/Fluent/CreditVoidBuilder.cs index 4fcb63e..bfd645f 100644 --- a/SecureSubmit/Terminals/PAX/Fluent/CreditVoidBuilder.cs +++ b/SecureSubmit/Terminals/PAX/Fluent/CreditVoidBuilder.cs @@ -25,7 +25,10 @@ public override CreditResponse Execute() { base.Execute(); var extData = new ExtDataSubGroup(); - extData[EXT_DATA.HOST_REFERENCE_NUMBER] = transactionId.Value.ToString(); + if (transactionId.HasValue) + { + extData[EXT_DATA.HOST_REFERENCE_NUMBER] = transactionId.Value.ToString(); + } return service.DoCredit(PAX_TXN_TYPE.VOID, new AmountRequest(), @@ -38,9 +41,5 @@ public override CreditResponse Execute() { extData ); } - - protected override void SetupValidations() { - AddValidation(() => { return transactionId.HasValue; }, "TransactionId is required."); - } } } diff --git a/SecureSubmit/Terminals/PAX/PaxDevice.cs b/SecureSubmit/Terminals/PAX/PaxDevice.cs index 18b6d07..f9a68e1 100644 --- a/SecureSubmit/Terminals/PAX/PaxDevice.cs +++ b/SecureSubmit/Terminals/PAX/PaxDevice.cs @@ -213,6 +213,11 @@ public BatchCloseResponse BatchClose() { var response = _interface.Send(TerminalUtilities.BuildRequest(PAX_MSG_ID.B00_BATCH_CLOSE, DateTime.Now.ToString("YYYYMMDDhhmmss"))); return new BatchCloseResponse(response); } + public BatchClearResponse BatchClear() + { + var response = _interface.Send(TerminalUtilities.BuildRequest(PAX_MSG_ID.B04_BATCH_CLEAR)); + return new BatchClearResponse(response); + } #endregion #region Reporting Commands diff --git a/SecureSubmit/Terminals/PAX/Responses/BatchClearResponse.cs b/SecureSubmit/Terminals/PAX/Responses/BatchClearResponse.cs new file mode 100644 index 0000000..51b48be --- /dev/null +++ b/SecureSubmit/Terminals/PAX/Responses/BatchClearResponse.cs @@ -0,0 +1,7 @@ +using System; + +namespace SecureSubmit.Terminals.PAX { + public class BatchClearResponse : PaxDeviceResponse { + public BatchClearResponse(byte[] buffer) : base(buffer, PAX_MSG_ID.B05_RSP_BATCH_CLEAR) { } + } +}