El código se encuentra alojado en el Github y clúster de Genesys / Spin en ambientes de DEV + QA + Stage/Staging
Mirror
Balance Mirror
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC |
Clúster | Genesys |
Account Mirror
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC |
Clúster | Genesys |
Card Mirror
Tecnología | Gradle |
---|---|
Pipeline | Spin |
Lenguaje | Java 8 |
Spring boot | 2.5 |
Interfaz | Rest |
Clúster | Spin |
Gateway
Fiserv Gateway
Tecnología | Gradle |
---|---|
Pipeline | Spin |
Lenguaje | Java 8 |
Spring boot | 2 |
Interfaz | Rest |
Clúster | Spin |
Account Gateway
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC |
Clúster | Genesys |
Customer Gateway
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC |
Clúster | Genesys |
Aggregation
Account Aggregation
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC / Rest |
Clúster | Genesys |
Customer Aggregation
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC / Rest |
Clúster | Genesys |
Card Aggregation
Tecnología | Gradle |
---|---|
Pipeline | Spin |
Lenguaje | Java 8 |
Spring boot | 2 |
Interfaz | Rest |
Clúster | Spin |
Librerías
Common API
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 3.0.8 |
Interfaz | gRPC |
Clúster | Genesys |
Core Chassis
Tecnología | Maven |
---|---|
Pipeline | Genesys |
Lenguaje | Java 17 |
Spring boot | 2.7.12 |
Interfaz | gRPC |
Clúster | Genesys |
Data Structure for Mirror Balance
- SPMS-6Getting issue details... STATUS
This document contains the Balance Collection (MongoDB) definition. We could see java objects and JSON schema for MongoDB.
Version Control
Version | Major Changes | Doc |
---|---|---|
1.0 |
| |
1.1 |
|
Sources
Fiserv- Endpoint List
/accounts/balance
/account/FL-balance
Account Balance Endpoint
Fiserv endpoint:
/accounts/balance
Class:
FiservRepository
Service:
getAccountBalance
Request DTO properties
@Builder.Default protected String organizationNumber = "950"; protected String accountNumber;
Responses DTO
public class AccountBalanceResponseDTO { private String accountOrCardNumber; private Double currentBalance; private Double availableCreditLimit; private Double frozenBalance; }
FL-Balance Endpoint
Fiserv ednpoint:
/account/FL-balance
Class:
FiservRepository
Service:
transferBalanceFL
Request DTO
package com.spin.banking.common.fiserv.request; import com.fasterxml.jackson.annotation.JsonInclude; import com.spin.banking.common.domain.FalconIdentifier; import lombok.Builder; import lombok.Getter; import lombok.Setter; @Setter @Getter @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class TransactionDataFLDTO { private Long transactionAmount; private String actionCode; private String authorizationCode; private String effectiveDate; private String description; private String paidConcept; private String memoPostedIndicator; private String suppressMonetaryTransaction; private String n1n2ByPass; private FalconIdentifier identifier; private String box; private String crPlaza; private String crStore; private String keyTracking; private String beneficiaryAccount; private String senderAccount; private String counterpartInstitution; private String operatingInstitution; private String frcUprkBeneficiary; private String orderingFrcUprk; private String device; private String ip; private Double latitude; private Double longitude; private String recipientName; private String orderingName; private String paymentSourceId; }
Response DTO
public class BalanceTransferResponseDTO { private String historyDate; private String historyTime; private BalanceTransferDetailsResponseDTO transactionData; }
Target (MongoDB)
Collection Name:
balances
Schema:
db.createCollection("balances",{ validator: { $jsonSchema: { bsonType: "object", description: "Balance Object Collection", required: [ "accountNumber" ], properties: { "accountNumber": { bsonType: "string", description: "account Number must be a string and is required" }, "currentBalance": { bsonType: "double", description: "current balance must be a number" }, "availableCreditLimit": { bsonType: "double", description: "available credit limit must be a number and is required" }, "openToBuy": { bsonType: "long", description: "open to Buy must be a long number and is required" } } } } });
Target (Java)
import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.Email; import org.springframework.data.mongodb.core.mapping.Document; import org.bson.types.ObjectId; import org.bson.codecs.pojo.annotations.BsonProperty; @Getter @Setter @Document(collection = "balances") public class Balance { @Id @BsonProperty("_id") private ObjectId id; private Double availableCreditLimit; private Double currentBalance; @NotNull(message="account or card number is mandatory") private String accountOrCardNumber; }
Data Structure for Account Mirror
- SPMS-8Getting issue details... STATUS
This section presents the Fiserv endpoints of the Account domain and proposes the MongoDB data structure for Mirror Account based on the corresponding request/response.
Version control
Version | Major Changes | Doc |
---|---|---|
v1.0 |
| |
v1.1 |
| |
v1.2 |
|
For more details on the changes made, please refer to the changelog file.
Source
Fiserv - Account endpoint list
Account Details GET /account/details
Account Block Code POST /account/block-code
Target
Account Details
Source
Fiserv endpoint:
GET /account/details
Class:
FiservRepository
Service:
getAccountDetails
Response:
public class AccountDetailsResponseDTO { private AccountDataDTO accountData; }
public class AccountDataDTO { private String accountNumber; private String customerNumber; private String blockCode1; private String blockCode1Date; private String blockCode2; private String blockCode2Date; private String accountMakerDateOfBirth; //this comes in pesos private Double availableCredit; //daily posted average balance private Double userAmounts9; //daily memo average balance private Double userAmounts10; //Total current memo balance private Double userAmounts7; public Double getAvailableCredit() { return availableCredit * 100; } public Double getUserAmounts9() { return userAmounts9 * 100; } public Double getUserAmounts7() { return userAmounts7 * 100; } public Double getUserAmounts10() { return userAmounts10 * 100; } }
Request
public class AccountDetailsRequestDTO { private String organizationNumber; private String accountNumber; }
Account Block Code
Source
Fiserv endpoint:
POST /account/block-code
Class:
FiservRepository
Service:
setAccountBlockCode
Response:
public class AccountBlockUnblockResponseDTO { private String functionCode; private String accountNumber; private String blockCode1Local; private Integer localOrganization; }
Request
public class AccountBlockUnblockRequestDTO extends AbstractAccountFiservBaseRequest { private String blockCode; private Integer blockCodeIndicator; private Integer foreignUse; private String functionCode; }
public abstract class AbstractAccountFiservBaseRequest extends AbstractFiservBaseRequest { protected String accountNumber; }
public abstract class AbstractFiservBaseRequest { @Builder.Default protected String organizationNumber = "950"; }
Target MongoDB Account Mirror
Collection name:
accountDetails
Schema:
db.createCollection("accountDetails", { validator: { $jsonSchema: { bsonType: "object", title: "Account Details Object Validation", required: ["accountNumber"], properties: { accountNumber: { bsonType: "string", description: "'accountNumber' must be a string and is required" }, customerNumber: { bsonType: "string", description: "'customerNumber' must be a string" }, blockCode1: { bsonType: "string", description: "'blockCode1' must be a string" }, blockCode1Date: { bsonType: "string", description: "'blockCode1Date' must be a string" }, blockCode2: { bsonType: "string", description: "'blockCode2' must be a string" }, blockCode2Date: { bsonType: "string", description: "'blockCode2Date' must be a string" }, blocksBy: { bsonType: "string", description: "'blocksBy' must be a string" } } } } });
Index
db.accountDetails.createIndex({accountNumber: 1});
Target Java Account Mirror
import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Getter @Setter @Document(collection = "accountDetails") public class AccountDetail { @Id private String id; @NotNull(message="account number is mandatory") private String accountNumber; private String customerNumber; private String blockCode1; private String blockCode1Date; private String blockCode2; private String blockCode2Date; private String blocksBy; }
Data Structure for Card Mirror
- SPMS-71Getting issue details... STATUS
Fiserv - Card endpoint list:
Create a Card POST /cards/embosser [Mirror - Gateway]
Get card information POST /cards/embosser/details [Mirror - Gateway]
Link Card PATCH /cards/account [Gateway]
Get account by card number POST /cards/account [Mirror]
Card Activation PUT /cards/activation [Gateway]
Block Card PUT /cards/embosser/block [Mirror - Gateway]
Block/Unblock (pin) PUT /cards/pin/status [Equipo de Spin]
Update Card Pin PUT /cards/pin [Equipo de Spin]
Get Security Code Detail POST /cards/pin/security-codes [Equipo de Spin]
Invalid Attemps POST /cards/pin/invalid-attemps [Unavailable]
Get Credit Card Info POST /cards/embosser/card-pan [Unavailable]
Create a Card
Source
Fiserv endpoint:
/cards/embosser
Class:
FiservRepository
Service:
createCard
Request
public class CardRequestDTO { private String addressLine1; private String addressLine2; private AssignedSpendingLimitsDTO assignedSpendingLimits; private int atmCashAmount; private int atmCashNumber; private int atmCashSingleTransactionLimit; private String authorizationCriteriaTableNumber; private String authorizationSpendingLimitTable; private String blockCode; private int branchNumber; private int cardAction; private String cardActionReasonCode; private int cardDelayDays; private String cardNumber; private int cardSequence; private String cardholderAffiliationGroupId; private String cardholderFlag; private String city; private String currentCardActivation; private String customerNumber; private int deliveryOption; private String deviceIndicator; private String embossedName1; private String embossedName2; private String enrollmentStatusVBV; private String expirationDate; private int firstIssueBranch; private int internetPurchaseAmount; private int internetPurchaseNumber; private int internetPurchaseSingleTransactionLimit; private String languageCode; private int maximumAuthorizationFrequency; private String name1; private int name1TypeIndicator; private String name2; private int name2TypeIndicator; private String nextCardExpirationDate; private int numberOfCardsRequested; private int organizationNumber; private int overTheCounterCashAmount; private int overTheCounterCashNumber; private int overTheCounterCashSingleTransactionLimit; private int pinMailerDelayDays; private int pinOffset; private int pinSuppression; private String plasticId; private int posServiceCode; private String postToAccount; private int postalCode; private int processType; private int programId; private int reissueDeliveryOption; private String requestedCardType; private int retailPurchaseAmt; private int retailPurchaseNumber; private int retailPurchaseSingleTransactionLimit; private int securedCodeActivate; private String stateOrProvince; private String typeCardMailer; private String typeOfCard; private int user1; private int user2; private int user3; private int user4; private int user5; private int user6; private int user7; private int user8; private String userDate1; private String userDate2; private String vbvPassword; private String visaMiniIndicator; private String visaPlusIndicator; }
Response
public class AddCardResponseDTO { private String panToken; }
Create a Card
Source
Fiserv endpoint:
/cards/embosser/details
Class:
FiservRepository
Service:
getAccountByPanToken
Request
public class AccountByPanTokenRequestDTO { private String cardNumber; private Integer cardSequence; private Integer foreignUse; private String organizationNumber; }
Response
public class AccountByPanTokenResponseDTO { private String postToAccount; private String blockCode; private String cardNumber; private String currentCardActivation; private String dateBlock; }
Link Card
Source
Fiserv endpoint:
/account/prepaid
Class:
FiservRepository
Service:
linkCardToAccount
Request
public class CardToAccountLinkingRequestDTO { private String cardNumber; private Integer cardholderType; private String customerOrAccountNumber; }
Response
public class CardToAccountLinkingResponseDTO { private String cardNumber; private String customerOrAccountNumber; }
Card Activation
Source
Fiserv endpoint:
/cards/activation
Class:
FiservRepository
Service:
activateCard
Request
public class CardActivationRequestDTO { @NotNull(message = "userId is required") private String userId; @NotNull(message = "panToken is required") @Size(min = 12, max = 19, message = "panToken length must be between 12 and 19") private String panToken; @NotNull(message = "cardNumber is required") @Size(min = 12, max = 19, message = "cardNumber length must be between 12 and 19") private String cardNumber; private OxxoStoreDTO oxxoStoreDTO; } public class OxxoStoreDTO { @NotBlank private String id; @NotBlank private String place; @NotBlank private String store; private String storeName; private String stateName; private String oxxoStoreStateCode; private String colony; private String municipality; private String city; private Integer postalCode; @NotNull @Min(value = -90) @Max(value = 90) private Double latitud; @NotNull @Min(value = -180) @Max(value = 180) private Double longitud; @NotNull private Integer affiliationNumber; }
Response
public class CardActivationResponseDTO { private String cardNumber; }
Block Activation
Source
Fiserv endpoint:
/cards/embosser/block
Class:
FiservRepository
Service:
blockCard
Request
public class CardBlockingRequestDTO { @NotBlank(message = "userId is Required") private String userId; @NotNull(message = "blockingReason is required") private BlockingReason blockingReason; } public enum BlockingReason { FROZEN("A", true), GUARDIAN("B"), DECEASED("D"), VOLUNTARY_CANCELLATION("C"), LOST("L"), STOLEN("S"), DAMAGED("E"), FRAUD("F", true), MISHANDLING("V"), ACCOUNT_WITHOUT_CARD("X"), PREVENTIVE("Y"); private String fiservBlockCode; private boolean unblockable; BlockingReason(String fiservBlockCode) { this(fiservBlockCode, false); } public static BlockingReason resolveFromFiservCode(String fiservCode){ return Arrays.stream(values()).filter(blockingReason -> blockingReason.fiservBlockCode.equals(fiservCode)).findAny().orElse(null); } }
Response
public class CardBlockingResponseDTO { private String name; }
Block/Unblock
Source
Fiserv endpoint:
/cards/pin/status
Class:
FiservRepository
Service:
activateCard
Request
public class FiservCardPinBlockUnblockRequestDTO { private String cardNumber; private Integer cardSequenceNumber; private String channel; private Integer organizationNumber; private String serviceFunctionCode; }
Response
public class FiservCardPinBlockUnblockResponseDTO { private String cardNumber; private Integer cardSequenceNumber; }
GET ACOUNT BY CARD NUMBER
Source
Fiserv endpoint:
/account/balance/details
Request
public class AccountByCardNumberRequestDTO { private String cardNumber; }
Response
public class AccountByCardNumberResponseDTO { protected String accountNumber; }
Update Card Pin
Source
Fiserv endpoint:
/cards/pin
Class:
FiservRepository
Service:
activateCard
Request
public class FiservCardPinUpdateRequestDTO { private String cardNumber; private String channel; private String keyAssociationNumber; private String newPinBlock; private Integer organizationNumber; }
Response
public class FiservCardPinUpdateResponseDTO { private String cardNumber; }
Get Security Code Detail
Source
Fiserv endpoint:
/cards/pin/security-codes
Class:
FiservRepository
Service:
activateCard
Request
public class SecurityCodeDetailsRequestDTO extends AbstractFiservBaseRequest { private String cardNumber; private String channel; private String keyAssociation; }
Response
public class SecurityCodeDetailsResponseDTO { private String pinEncrypt; }
Invalid Attemps
Source
Fiserv endpoint:
/cards/pin/invalid-attemps
Class:
FiservRepository
Service:
activateCard
Request
public class PinInvalidAttemptsRequestDTO { private String cardNumber; private int cardSequenceNumber; }
Response
public class PinInvalidAttemptsResponseDTO { private PinInvalidAttemptsOutputAreaDTO outputArea; } public class PinInvalidAttemptsOutputAreaDTO { private String cardNumber; private int cardSequenceNumber; private int cardInvalidPinTries; private String cardInvalidPinTryDate; private int maxNumberInvalidPinTries; private String exceededInvalidPinTries; private String blockedIndicator; }
Get Credit Card Info
Source
Fiserv endpoint:
/cards/embosser/card-pan
Class:
FiservRepository
Service:
activateCard
Request
public class FiservCardRequestDTO extends AbstractFiservBaseRequest { private Integer cardSequence; private String functionType; private String cardNumber; public enum FunctionType { CARD_NUMBER("C"), PAN_TOKEN("P"); private String type; FunctionType(String type) { this.type = type; } public String getValue() { return type; } } }
Response
public class FiservCardResponseDTO { private Integer organizationNumber; private Integer logo; private String cardNumber; private String accountNumber; private Integer cardSequence; private String panToken; }
Target (MongoDB Schema)
Collection Name:
cards
Schema
db.createCollection("cards",{ validator: { $jsonSchema: { bsonType: "object", description: "Card object collection", required: [], properties: { "addressLine1": { bsonType: "string", description: "addressLine1" }, "addressLine2": { bsonType: "string", description: "addressLine2" }, "atmCashAmount": { bsonType: "int", description: "atmCashAmount" }, "atmCashNumber": { bsonType: "int", description: "atmCashNumber" }, "atmCashSingleTransactionLimit": { bsonType: "int", description: "atmCashSingleTransactionLimit" }, "authorizationCriteriaTableNumber": { bsonType: "string", description: "authorizationCriteriaTableNumber" }, "authorizationSpendingLimitTable": { bsonType: "string", description: "authorizationSpendingLimitTable" }, "blockCode": { bsonType: "string", description: "blockCode" }, "branchNumber": { bsonType: "int", description: "branchNumber" }, "cardAction": { bsonType: "int", description: "cardAction" }, "cardActionReasonCode": { bsonType: "string", description: "cardActionReasonCode" }, "cardDelayDays": { bsonType: "int", description: "cardDelayDays" }, "cardNumber": { bsonType: "string", description: "cardNumber" }, "cardSequence": { bsonType: "int", description: "cardSequence" }, "cardholderAffiliationGroupId": { bsonType: "string", description: "cardholderAffiliationGroupId" }, "cardholderFlag": { bsonType: "string", description: "cardholderFlag" }, "city": { bsonType: "string", description: "city" }, "currentCardActivation": { bsonType: "string", description: "currentCardActivation" }, "customerNumber": { bsonType: "string", description: "customerNumber" }, "deliveryOption": { bsonType: "int", description: "deliveryOption" }, "deviceIndicator": { bsonType: "string", description: "deviceIndicator" }, "embossedName1": { bsonType: "string", description: "embossedName1" }, "embossedName2": { bsonType: "string", description: "embossedName2" }, "enrollmentStatusVBV": { bsonType: "string", description: "enrollmentStatusVBV" }, "expirationDate": { bsonType: "string", description: "expirationDate" }, "firstIssueBranch": { bsonType: "int", description: "firstIssueBranch" }, "internetPurchaseAmount": { bsonType: "int", description: "internetPurchaseAmount" }, "internetPurchaseNumber": { bsonType: "int", description: "internetPurchaseNumber" }, "internetPurchaseSingleTransactionLimit": { bsonType: "int", description: "internetPurchaseSingleTransactionLimit" }, "languageCode": { bsonType: "string", description: "languageCode" }, "maximumAuthorizationFrequency": { bsonType: "int", description: "maximumAuthorizationFrequency" }, "name1": { bsonType: "string", description: "name1" }, "name1TypeIndicator": { bsonType: "int", description: "name1TypeIndicator" }, "name2": { bsonType: "string", description: "name2" }, "name2TypeIndicator": { bsonType: "int", description: "name2TypeIndicator" }, "nextCardExpirationDate": { bsonType: "string", description: "nextCardExpirationDate" }, "numberOfCardsRequested": { bsonType: "int", description: "numberOfCardsRequested" }, "organizationNumber": { bsonType: "int", description: "organizationNumber" }, "overTheCounterCashAmount": { bsonType: "int", description: "overTheCounterCashAmount" }, "overTheCounterCashNumber": { bsonType: "int", description: "overTheCounterCashNumber" }, "overTheCounterCashSingleTransactionLimit": { bsonType: "int", description: "overTheCounterCashSingleTransactionLimit" }, "pinMailerDelayDays": { bsonType: "int", description: "pinMailerDelayDays" }, "pinOffset": { bsonType: "int", description: "pinOffset" }, "pinSuppression": { bsonType: "int", description: "pinSuppression" }, "plasticId": { bsonType: "string", description: "plasticId" }, "posServiceCode": { bsonType: "int", description: "posServiceCode" }, "postToAccount": { bsonType: "string", description: "postToAccount" }, "postalCode": { bsonType: "int", description: "postalCode" }, "processType": { bsonType: "int", description: "processType" }, "programId": { bsonType: "int", description: "programId" }, "reissueDeliveryOption": { bsonType: "int", description: "reissueDeliveryOption" }, "requestedCardType": { bsonType: "string", description: "requestedCardType" }, "retailPurchaseAmt": { bsonType: "int", description: "retailPurchaseAmt" }, "retailPurchaseNumber": { bsonType: "int", description: "retailPurchaseNumber" }, "retailPurchaseSingleTransactionLimit": { bsonType: "int", description: "retailPurchaseSingleTransactionLimit" }, "securedCodeActivate": { bsonType: "int", description: "securedCodeActivate" }, "stateOrProvince": { bsonType: "string", description: "stateOrProvince" }, "typeCardMailer": { bsonType: "string", description: "typeCardMailer" }, "typeOfCard": { bsonType: "string", description: "typeOfCard" }, "user1": { bsonType: "int", description: "user1" }, "user2": { bsonType: "int", description: "user2" }, "user3": { bsonType: "int", description: "user3" }, "user4": { bsonType: "int", description: "user4" }, "user5": { bsonType: "int", description: "user5" }, "user6": { bsonType: "int", description: "user6" }, "user7": { bsonType: "int", description: "user7" }, "user8": { bsonType: "int", description: "user8" }, "userDate1": { bsonType: "string", description: "userDate1" }, "userDate2": { bsonType: "string", description: "userDate2" }, "vbvPassword": { bsonType: "string", description: "vbvPassword" }, "visaMiniIndicator": { bsonType: "string", description: "visaMiniIndicator" }, "visaPlusIndicator": { bsonType: "string", description: "visaPlusIndicator" }, } } }
Add Comment