Skip to content

Commit 861cf7c

Browse files
OctopusDeploy release: 14.2.17
1 parent d0a2173 commit 861cf7c

File tree

6 files changed

+245
-3
lines changed

6 files changed

+245
-3
lines changed

CHANGELOG.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
2-
## Latest Version - V14.2.16 (04/22/2025)
2+
## Latest Version - V14.2.17 (05/01/2025)
3+
### Bug Fixes
4+
- [NTS] - Added message code condition for retransmit data collect & credit adjustment (Issue 10359).
5+
- [NTS] - Corrected unit of measure for type of purchase 3 in VisaFleet data collect transactions (Issue 10360).
6+
7+
## V14.2.16 (04/22/2025)
38
### Bug Fixes
49
- [NTS] - Added code 70/70/79 scenerio for retransmitBatchClose transaction with Message Code 16 (Issue -10358).
510

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.heartlandpaymentsystems</groupId>
55
<artifactId>globalpayments-sdk</artifactId>
6-
<version>14.2.16</version>
6+
<version>14.2.17</version>
77
<packaging>jar</packaging>
88
<name>Heartland &amp; Global Payments SDK</name>
99
<description>API for processing payments through Global Payments</description>

src/main/java/com/global/api/gateways/NtsConnector.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,7 @@ public Transaction resubmitTransaction(ResubmitBuilder builder) throws ApiExcept
371371
MessageWriter request = new MessageWriter();
372372
String reqStr = new String(decodeRequest, StandardCharsets.UTF_8);
373373
int count = 21;
374+
int count1 = 98;
374375
String originalReq = reqStr.substring(messageRequestLength);
375376
String messageCode = originalReq.substring(21, 23);
376377
int hostRespCount = 6;
@@ -398,27 +399,37 @@ public Transaction resubmitTransaction(ResubmitBuilder builder) throws ApiExcept
398399
case Sale: {
399400
if (messageCode.equals(NtsMessageCode.DataCollectOrSale.getValue())) {
400401
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitDataCollect.getValue() + originalReq.substring(count + 2);
402+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitDataCollect.getValue() + originalReq.substring(count1 + 2);
401403
} else if (messageCode.equals(NtsMessageCode.CreditAdjustment.getValue())) {
402404
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitCreditAdjustment.getValue() + originalReq.substring(count + 2);
405+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitCreditAdjustment.getValue() + originalReq.substring(count1 + 2);
403406
} else if (messageCode.equals(NtsMessageCode.ForceCollectOrForceSale.getValue())) {
404407
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitForceCollect.getValue() + originalReq.substring(count + 2);
408+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitForceCollect.getValue() + originalReq.substring(count1 + 2);
405409
} else if (messageCode.equals(NtsMessageCode.ForceCreditAdjustment.getValue())) {
406410
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitForceCreditAdjustment.getValue() + originalReq.substring(count + 2);
411+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitForceCreditAdjustment.getValue() + originalReq.substring(count1 + 2);
407412
}
408413
if (builder.isForceToHost()) {
409414
if (messageCode.equals(NtsMessageCode.DataCollectOrSale.getValue())) {
410415
originalReq = originalReq.substring(0, count) + NtsMessageCode.ForceCollectOrForceSale.getValue() + originalReq.substring(count + 2);
416+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.ForceCollectOrForceSale.getValue() + originalReq.substring(count1 + 2);
411417
} else if (messageCode.equals(NtsMessageCode.CreditAdjustment.getValue())) {
412418
originalReq = originalReq.substring(0, count) + NtsMessageCode.ForceCreditAdjustment.getValue() + originalReq.substring(count + 2);
419+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.ForceCreditAdjustment.getValue() + originalReq.substring(count1 + 2);
413420
} else if (messageCode.equals(NtsMessageCode.ReversalOrVoid.getValue())) {
414421
originalReq = originalReq.substring(0, count) + NtsMessageCode.ForceReversalOrForceVoid.getValue() + originalReq.substring(count + 2);
422+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.ForceReversalOrForceVoid.getValue() + originalReq.substring(count1 + 2);
415423
}
416424
if (messageCode.equals(NtsMessageCode.RetransmitDataCollect.getValue())) {
417425
originalReq = originalReq.substring(0, count) + NtsMessageCode.ForceCollectOrForceSale.getValue() + originalReq.substring(count + 2);
426+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.ForceCollectOrForceSale.getValue() + originalReq.substring(count1 + 2);
418427
} else if (messageCode.equals(NtsMessageCode.ForceCollectOrForceSale.getValue())) {
419428
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitForceCollect.getValue() + originalReq.substring(count + 2);
429+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitForceCollect.getValue() + originalReq.substring(count1 + 2);
420430
} else if (messageCode.equals(NtsMessageCode.RetransmitCreditAdjustment.getValue())) {
421431
originalReq = originalReq.substring(0, count) + NtsMessageCode.RetransmitForceCreditAdjustment.getValue() + originalReq.substring(count + 2);
432+
originalReq = originalReq.substring(0, count1) + NtsMessageCode.RetransmitForceCreditAdjustment.getValue() + originalReq.substring(count1 + 2);
422433
}
423434
}
424435
if (builder.getHostResponseCode().equals(NtsHostResponseCode.Code70TwiceInRow.getValue())){

src/main/java/com/global/api/network/entities/NTSUserData.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ public static StringBuilder getProductDataTag09(TransactionBuilder builder, NTSC
645645
for (int i = 0; i < 1; i++) {
646646
if (fuelFlag && i < fuel.size()) {
647647
sb.append(StringUtils.padLeft(fuel.get(i).getCode(), 2, ' '));
648-
sb.append(StringUtils.padLeft(purchaseType.equals(PurchaseType.Fuel) ? fuel.get(i).getUnitOfMeasure().getValue() : " ", 1, ' '));
648+
sb.append(StringUtils.padLeft(purchaseType.equals(PurchaseType.NonFuel) ? " " : fuel.get(i).getUnitOfMeasure().getValue(), 1, ' '));
649649
sb.append(StringUtils.toNumeric(fuel.get(i).getQuantity(), 6));
650650
sb.append(StringUtils.toFormatDigit(fuel.get(i).getPrice(), 5, 3));
651651
sb.append(StringUtils.toNumeric(fuel.get(i).getAmount(), 9));

src/test/java/com/global/api/tests/network/nts/NtsFleetTest.java

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4684,6 +4684,106 @@ public void test_VoyagerFleetEMV_Datacollect_10348() throws ApiException{
46844684
assertEquals("00", dataCollectResponse.getResponseCode());
46854685
}
46864686

4687+
@Test //working
4688+
public void test_VisaFleet_DataCollect_10360() throws ApiException {
4689+
4690+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.AuthorizationOrBalanceInquiry);
4691+
4692+
track = new CreditTrackData();
4693+
track.setValue(";4484630000000126=25121011000062111401?");
4694+
track.setEntryMethod(EntryMethod.Swipe);
4695+
4696+
productData = new NtsProductData(ServiceLevel.FullServe, track);
4697+
productData.addFuel(NtsProductCode.Diesel1, UnitOfMeasure.Gallons, 10.24, 2.899);
4698+
productData.addNonFuel(NtsProductCode.Batteries, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4699+
productData.addNonFuel(NtsProductCode.CarWash, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4700+
productData.addNonFuel(NtsProductCode.Dairy, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4701+
productData.setPurchaseType(PurchaseType.Fuel);
4702+
productData.setProductCodeType(ProductCodeType.IdnumberAndOdometerOrVehicleId);
4703+
productData.add(new BigDecimal("32.33"), new BigDecimal(0));
4704+
4705+
4706+
Transaction response = track.authorize(new BigDecimal(10))
4707+
.withCurrency("USD")
4708+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
4709+
.withUniqueDeviceId("0102")
4710+
.withNtsProductData(productData)
4711+
.withFleetData(fleetData)
4712+
.withNtsTag16(tag)
4713+
.withCvn("123")
4714+
.execute();
4715+
4716+
assertNotNull(response);
4717+
assertEquals("00", response.getResponseCode());
4718+
4719+
// Data-Collect request preparation.
4720+
4721+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithoutPin);
4722+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.DataCollectOrSale);
4723+
4724+
Transaction dataCollectResponse = response.capture(new BigDecimal(10))
4725+
.withCurrency("USD")
4726+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
4727+
.withNtsProductData(productData)
4728+
.withFleetData(fleetData)
4729+
.execute();
4730+
assertNotNull(dataCollectResponse);
4731+
4732+
// check response
4733+
assertEquals("00", dataCollectResponse.getResponseCode());
4734+
}
4735+
4736+
//-ve scenarios
4737+
@Test //working
4738+
public void test_VisaFleet_DataCollect_10360_1() throws ApiException {
4739+
4740+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.AuthorizationOrBalanceInquiry);
4741+
4742+
track = new CreditTrackData();
4743+
track.setValue(";4484630000000126=25121011000062111401?");
4744+
track.setEntryMethod(EntryMethod.ContactEMV);
4745+
4746+
productData = new NtsProductData(ServiceLevel.FullServe, track);
4747+
productData.addFuel(NtsProductCode.Diesel1, UnitOfMeasure.Gallons, 10.24, 2.899);
4748+
productData.addNonFuel(NtsProductCode.Batteries, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4749+
productData.addNonFuel(NtsProductCode.CarWash, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4750+
productData.addNonFuel(NtsProductCode.Dairy, UnitOfMeasure.NoFuelPurchased, 1, 10.74);
4751+
productData.setPurchaseType(PurchaseType.NonFuel);
4752+
productData.setProductCodeType(ProductCodeType.IdnumberAndOdometerOrVehicleId);
4753+
productData.add(new BigDecimal("32.33"), new BigDecimal(0));
4754+
4755+
4756+
Transaction response = track.authorize(new BigDecimal(10))
4757+
.withCurrency("USD")
4758+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
4759+
.withUniqueDeviceId("0102")
4760+
.withNtsProductData(productData)
4761+
.withFleetData(fleetData)
4762+
.withNtsTag16(tag)
4763+
.withTagData(emvTagData)
4764+
.withCvn("123")
4765+
.execute();
4766+
4767+
assertNotNull(response);
4768+
assertEquals("00", response.getResponseCode());
4769+
4770+
// Data-Collect request preparation.
4771+
4772+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithoutPin);
4773+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.DataCollectOrSale);
4774+
4775+
Transaction dataCollectResponse = response.capture(new BigDecimal(10))
4776+
.withCurrency("USD")
4777+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
4778+
.withNtsProductData(productData)
4779+
.withFleetData(fleetData)
4780+
.execute();
4781+
assertNotNull(dataCollectResponse);
4782+
4783+
// check response
4784+
assertEquals("00", dataCollectResponse.getResponseCode());
4785+
}
4786+
46874787

46884788

46894789
}

src/test/java/com/global/api/tests/network/nts/NtsRequestToBalanceTest.java

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,4 +922,130 @@ public void test_WexFleetEMV_RTB_01_Issue_10356() throws ApiException {
922922
assertNotNull(dataCollect);
923923

924924
}
925+
926+
private Transaction creditDataCollect(double amount) throws ApiException {
927+
NtsRequestMessageHeader ntsRequestMessageHeader = new NtsRequestMessageHeader();
928+
ntsRequestMessageHeader.setTerminalDestinationTag("478");
929+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithPin);
930+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.AuthorizationOrBalanceInquiry);
931+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.NotPromptedPin);
932+
933+
priorMessageInformation =new PriorMessageInformation();
934+
priorMessageInformation.setResponseTime("999");
935+
priorMessageInformation.setConnectTime("999");
936+
priorMessageInformation.setMessageReasonCode("01");
937+
ntsRequestMessageHeader.setPriorMessageInformation(priorMessageInformation);
938+
939+
940+
productData = getProductDataForNonFleetBankCards(track);
941+
942+
track = NtsTestCards.MasterCardTrack2(EntryMethod.Swipe);
943+
944+
Transaction response = track.authorize(new BigDecimal(amount))
945+
.withCurrency("USD")
946+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
947+
.withUniqueDeviceId("0102")
948+
.withNtsProductData(productData)
949+
.withNtsTag16(tag)
950+
.withCvn("123")
951+
.execute();
952+
assertNotNull(response);
953+
assertEquals("00", response.getResponseCode());
954+
955+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithoutPin);
956+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.DataCollectOrSale);
957+
958+
Transaction dataCollectResponse = response.capture(response.getAuthorizedAmount())
959+
.withCurrency("USD")
960+
.withNtsProductData(getProductDataForNonFleetBankCards(track))
961+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
962+
.withNtsTag16(tag)
963+
.execute();
964+
assertNotNull(dataCollectResponse);
965+
966+
// check response
967+
assertEquals("00", dataCollectResponse.getResponseCode());
968+
return dataCollectResponse;
969+
}
970+
971+
private Transaction creditCreditAuthorization(double amount) throws ApiException {
972+
NtsRequestMessageHeader ntsRequestMessageHeader = new NtsRequestMessageHeader();
973+
ntsRequestMessageHeader.setTerminalDestinationTag("478");
974+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithPin);
975+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.AuthorizationOrBalanceInquiry);
976+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.NotPromptedPin);
977+
978+
priorMessageInformation =new PriorMessageInformation();
979+
priorMessageInformation.setResponseTime("999");
980+
priorMessageInformation.setConnectTime("999");
981+
priorMessageInformation.setMessageReasonCode("01");
982+
ntsRequestMessageHeader.setPriorMessageInformation(priorMessageInformation);
983+
984+
985+
productData = getProductDataForNonFleetBankCards(track);
986+
987+
track = NtsTestCards.MasterCardTrack2(EntryMethod.Swipe);
988+
989+
Transaction response = track.authorize(new BigDecimal(amount))
990+
.withCurrency("USD")
991+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
992+
.withUniqueDeviceId("0102")
993+
.withNtsProductData(productData)
994+
.withNtsTag16(tag)
995+
.withCvn("123")
996+
.execute();
997+
assertNotNull(response);
998+
assertEquals("00", response.getResponseCode());
999+
1000+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithoutPin);
1001+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.CreditAdjustment);
1002+
1003+
Transaction dataCollectResponse = response.capture(response.getAuthorizedAmount())
1004+
.withCurrency("USD")
1005+
.withNtsProductData(getProductDataForNonFleetBankCards(track))
1006+
.withNtsRequestMessageHeader(ntsRequestMessageHeader)
1007+
.withNtsTag16(tag)
1008+
.execute();
1009+
assertNotNull(dataCollectResponse);
1010+
1011+
// check response
1012+
assertEquals("00", dataCollectResponse.getResponseCode());
1013+
return dataCollectResponse;
1014+
}
1015+
1016+
@Test
1017+
public void test_BatchCloseIssue_10359_retransmitDatacollect() throws ApiException {
1018+
1019+
Transaction t= creditDataCollect(10.11);
1020+
Transaction t1= creditCreditAuthorization(10.11);
1021+
1022+
NtsRequestMessageHeader ntsRequestMessageHeader = new NtsRequestMessageHeader();
1023+
ntsRequestMessageHeader.setTerminalDestinationTag("478");
1024+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.WithPin);
1025+
ntsRequestMessageHeader.setNtsMessageCode(NtsMessageCode.RequestToBalacnce);
1026+
ntsRequestMessageHeader.setPinIndicator(PinIndicator.NotPromptedPin);
1027+
1028+
priorMessageInformation =new PriorMessageInformation();
1029+
priorMessageInformation.setResponseTime("999");
1030+
priorMessageInformation.setConnectTime("999");
1031+
priorMessageInformation.setMessageReasonCode("01");
1032+
ntsRequestMessageHeader.setPriorMessageInformation(priorMessageInformation);
1033+
1034+
NtsRequestToBalanceData data = new NtsRequestToBalanceData(batchProvider.getSequenceNumber(), new BigDecimal(1), "Version");
1035+
Transaction batchClose = BatchService.closeBatch(BatchCloseType.EndOfShift,
1036+
ntsRequestMessageHeader, batchProvider.getBatchNumber(), 1
1037+
, new BigDecimal(30.33), BigDecimal.ONE, data)
1038+
.execute();
1039+
assertNotNull(batchClose);
1040+
1041+
BatchSummary batchSummary = batchClose.getBatchSummary();
1042+
LinkedList<String> list = new LinkedList<>();
1043+
list.add(t.getTransactionToken());
1044+
list.add(t1.getTransactionToken());
1045+
1046+
BatchSummary summary = batchSummary.resubmitTransactions(list);
1047+
assertNotNull(summary);
1048+
1049+
}
1050+
9251051
}

0 commit comments

Comments
 (0)