Data Structure for Mirror Balance
Data Structure for Account Mirror
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.
Fiserv - Account endpoint list
Account Details GET /account/details
Account Block Code POST /account/block-code
Customer POST /customer
Account Customer Linking POST /account/customer
Account Card Linking POST /account/prepaid
Account Details
Source
Fiserv endpoint:
GET /account/details
Class:
FiservRepository
Service:
getAccountDetails
Response:
Code Block | ||
---|---|---|
| ||
public class AccountDetailsResponseDTO {
private AccountDataDTO accountData;
} |
Code Block | ||
---|---|---|
| ||
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
Code Block | ||
---|---|---|
| ||
public class AccountDetailsRequestDTO {
private String organizationNumber;
private String accountNumber;
} |
Target (MongoDB)
Collection name:
accountDetails
Schema:
Code Block language json db.createCollection("accountDetails", { validator: { $jsonSchema: { bsonType: "object", title: "Account Details Object Validation", required: [ "accountDataKey.accountNumber","accountDataKey.organizationNumber"], properties: { accountDataKey: { bsonType: "object", properties: { accountNumber: { bsonType: "string", description: "'accountNumber' must be a string and is required" }, organizationNumber: { bsonType: [ "string" ], description: "'organizationNumber' must be a string and is required" } } }, accountData: { bsonType: "object", properties: { 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" }, accountMakerDateOfBirth: { bsonType: "string", description: "'accountMakerDateOfBirth' must be a string" }, availableCredit: { bsonType: [ "double" ], description: "'availableCredit' must be a double" }, userAmounts9: { bsonType: [ "double" ], description: "'userAmounts9' must be a double" }, userAmounts10: { bsonType: [ "double" ], description: "'userAmounts10' must be a double" }, userAmounts7: { bsonType: [ "double" ], description: "'userAmounts7' must be a double" } } } } } } });
Index
Code Block language json db.accountDetails.createIndex({accountDataKey: 1}); db.accountDetails.createIndex({"accountDataKey.accountNumber": 1});
Target (Java)
Code Block | ||
---|---|---|
| ||
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;
private AccountDataKey accountDataKey;
private AccountData accountData;
} |
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document
public class AccountData {
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;
}
} |
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document
public class AccountDataKey {
@NotNull(message="account number is mandatory")
private String accountNumber;
@NotNull(message="organization number is mandatory")
private String organizationNumber;
} |
Account Block Code
Source
Fiserv endpoint:
POST /account/block-code
Class:
FiservRepository
Service:
setAccountBlockCode
Response:
Code Block | ||
---|---|---|
| ||
public class AccountBlockUnblockResponseDTO {
private String functionCode;
private String accountNumber;
private String blockCode1Local;
private Integer localOrganization;
} |
Request
Code Block | ||
---|---|---|
| ||
public class AccountBlockUnblockRequestDTO extends AbstractAccountFiservBaseRequest {
private String blockCode;
private Integer blockCodeIndicator;
private Integer foreignUse;
private String functionCode;
} |
Code Block | ||
---|---|---|
| ||
public abstract class AbstractAccountFiservBaseRequest extends AbstractFiservBaseRequest {
protected String accountNumber;
} |
Code Block | ||
---|---|---|
| ||
public abstract class AbstractFiservBaseRequest {
@Builder.Default
protected String organizationNumber = "950";
} |
Target (MongoDB)
Collection name:
blockUnblockAccounts
Schema:
Code Block language json db.createCollection("blockUnblockAccounts", { validator: { $jsonSchema: { bsonType: "object", title: "Block Unblock Accounts Object Validation", required: ["accountBlockUnblockKey.accountNumber","accountBlockUnblockKey.blockCode" ,"accountBlockUnblockKey.blockCodeIndicator","accountBlockUnblockKey.foreignUse","accountBlockUnblockKey.functionCode","accountBlockUnblockKey.organizationNumber"], properties: { accountBlockUnblockKey: { bsonType: "object", properties: { accountNumber: { bsonType: "string", description: "'accountNumber' must be a string and is required" }, blockCode: { bsonType: "string", description: "'blockCode' must be a string and is required" }, blockCodeIndicator: { bsonType: "int", description: "'blockCodeIndicator' must be a int and is required" }, foreignUse: { bsonType: "int", description: "'foreignUse' must be a int and is required" }, functionCode: { bsonType: "string", description: "'functionCode' must be a string and is required" }, organizationNumber: { bsonType: [ "string" ], description: "'organizationNumber' must be a string and is required" } } }, blockCode1Local: { bsonType: "string", description: "'blockCode1Local' must be a string" }, localOrganization: { bsonType: "string", description: "'localOrganization' must be a string" } } } } });
Index
Code Block language json db.blockUnblockAccounts.createIndex({accountBlockUnblockKey: 1}); db.blockUnblockAccounts.createIndex({"accountBlockUnblockKey.accountNumber": 1});
Target (Java)
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document(collection = "blockUnblockAccounts")
public class AccountBlockUnblock {
@Id
private String id;
private AccountBlockUnblockKey accountBlockUnblockKey;
private String blockCode1Local;
private Integer localOrganization;
} |
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotNull;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document
public class AccountBlockUnblockKey {
@NotNull(message="account number is mandatory")
private String accountNumber;
@NotNull(message="organization number is mandatory")
private String organizationNumber;
@NotNull(message="block is mandatory")
private String blockCode;
@NotNull(message="block code indicator is mandatory")
private Integer blockCodeIndicator;
@NotNull(message="foreign use is mandatory")
private Integer foreignUse;
@NotNull(message="function code is mandatory")
private String functionCode;
} |
Customer
Source
Fiserv endpoint:
POST /customer
Class:
FiservRepository
Service:
createCustomer
Response:
Code Block | ||
---|---|---|
| ||
public class AddCustomerResponseDTO {
private String customerNumber;
} |
Request
Code Block | ||
---|---|---|
| ||
public class CustomerRequestDTO {
private String org;
private String logo;
private String address;
private String houseNumber;
private String externalNumber;
private String colony;
private String city;
private String state;
private String postalCode;
private String dateOfBirth;
private String stateOfBirth;
private String email;
private int genderCode;
private String firstName;
private String lastName;
private String maternalLastName;
private String mobilePhoneNumber;
private String identificationNumberFlag;
private String identificationNumber;
private String ine;
private String occupation;
} |
Target (MongoDB)
Collection name:
customers
Schema:
Code Block language json db.createCollection("customers", { validator: { $jsonSchema: { bsonType: "object", title: "Customers Object Validation", required: ["customerNumber, customerKey.org","customerKey.logo","customerKey.address","customerKey.houseNumber","customerKey.externalNumber","customerKey.colony","customerKey.city","customerKey.state","customerKey.postalCode","customerKey.dateOfBirth","customerKey.stateOfBirth","customerKey.email","customerKey.genderCode","customerKey.firstName","customerKey.lastName","customerKey.maternalLastName","customerKey.mobilePhoneNumber","customerKey.identificationNumberFlag","customerKey.identificationNumber","customerKey.ine","customerKey.occupation"], properties: { customerKey: { bsonType: "object", properties: { customerNumber: { bsonType: "string", description: "'customerNumber' must be a string and is required" }, } }, org: { bsonType: "string", description: "'org' must be a string and is required" }, logo: { bsonType: "string", description: "'logo' must be a string and is required" }, address: { bsonType: "string", description: "'address' must be a string and is required" }, houseNumber: { bsonType: "string", description: "'houseNumber' must be a string and is required" }, externalNumber: { bsonType: "string", description: "'externalNumber' must be a string and is required" }, colony: { bsonType: "string", description: "'colony' must be a string and is required" }, city: { bsonType: "string", description: "'city' must be a string and is required" }, state: { bsonType: "string", description: "'state' must be a string and is required" }, postalCode: { bsonType: "string", description: "'postalCode' must be a string and is required" }, dateOfBirth: { bsonType: "string", description: "'dateOfBirth' must be a string and is required" }, stateOfBirth: { bsonType: "string", description: "'stateOfBirth' must be a string and is required" }, email: { bsonType: "string", description: "'email' must be a string and is required" }, genderCode: { bsonType: "int", description: "'genderCode' must be a int and is required" }, firstName: { bsonType: "string", description: "'firstName' must be a string and is required" }, lastName: { bsonType: "string", description: "'lastName' must be a string and is required" }, maternalLastName: { bsonType: "string", description: "'maternalLastName' must be a string and is required" }, mobilePhoneNumber: { bsonType: "string", description: "'mobilePhoneNumber' must be a string and is required" }, identificationNumberFlag: { bsonType: "string", description: "'identificationNumberFlag' must be a string and is required" }, identificationNumber: { bsonType: "string", description: "'identificationNumber' must be a string and is required" }, ine: { bsonType: "string", description: "'ine' must be a string and is required" }, occupation: { bsonType: "string", description: "'occupation' must be a string and is required" } } } } });
Index
Code Block language json db.customers.createIndex({customerKey: 1});
Target (Java)
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document(collection = "customers")
public class Customer {
@Id
private String id;
private CustomerKey customerKey;
@NotNull(message="org is mandatory")
private String org;
@NotNull(message="logo is mandatory")
private String logo;
@NotNull(message="address is mandatory")
private String address;
@NotNull(message="house number is mandatory")
private String houseNumber;
@NotNull(message="external number is mandatory")
private String externalNumber;
@NotNull(message="colony is mandatory")
private String colony;
@NotNull(message="city is mandatory")
private String city;
@NotNull(message="state is mandatory")
private String state;
@NotNull(message="postal code is mandatory")
private String postalCode;
@NotNull(message="date of birth is mandatory")
private String dateOfBirth;
@NotNull(message="state of birth is mandatory")
private String stateOfBirth;
@NotNull(message="email is mandatory")
private String email;
@NotNull(message="gender code is mandatory")
private int genderCode;
@NotNull(message="first name is mandatory")
private String firstName;
@NotNull(message="last name is mandatory")
private String lastName;
@NotNull(message="maternal last name is mandatory")
private String maternalLastName;
@NotNull(message="mobile phone number is mandatory")
private String mobilePhoneNumber;
@NotNull(message="identification number flag is mandatory")
private String identificationNumberFlag;
@NotNull(message="identification number is mandatory")
private String identificationNumber;
@NotNull(message="ine is mandatory")
private String ine;
@NotNull(message="occupation number is mandatory")
private String occupation;
} |
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document
public class CustomerKey{
@NotNull(message="customer number is mandatory")
private String customerNumber;
} |
Account Customer Linking
Source
Fiserv endpoint:
POST /account/customer
Class:
FiservRepository
Service:
linkAccountToCustomer
Response:
Code Block | ||
---|---|---|
| ||
public class AccountToCustomerLinkingResponseDTO {
private String customerNumber;
private String accountNumber;
} |
Request
Code Block | ||
---|---|---|
| ||
public class AccountToCustomerLinkingRequestDTO {
private String accountNumber;
private AlternateCustomerRequestDTO alternateCustomer = new AlternateCustomerRequestDTO();
private String customerNumber;
private String qualification;
private String organizationNumber;
private Integer customerTypeIndicator;
private Integer foreignUseIndicator;
@Getter
static class AlternateCustomerRequestDTO {
private String expirationDate;
private String status;
}
} |
Target (MongoDB)
Collection name:
accountCustomerLinks
Schema:
Code Block language json db.createCollection("accountCustomerLinks", { validator: { $jsonSchema: { bsonType: "object", title: "Account Customer Links Object Validation", required: ["customerNumber","accountNumber","qualification","organizationNumber","customerTypeIndicator","foreignUseIndicator"], properties: { customerNumber: { bsonType: "string", description: "'customerNumber' must be a string and is required" }, accountNumber: { bsonType: "string", description: "'accountNumber' must be a string and is required" }, qualification: { bsonType: "string", description: "'qualification' must be a string and is required" }, organizationNumber: { bsonType: "string", description: "'organizationNumber' must be a string and is required" }, customerTypeIndicator: { bsonType: "int", description: "'customerTypeIndicator' must be a int and is required" }, foreignUseIndicator: { bsonType: "int", description: "'foreignUseIndicator' must be a int and is required" }, expirationDate: { bsonType: "string", description: "'expirationDate' must be a string" }, status: { bsonType: "string", description: "'status' must be a string" } } } } });
Index
Code Block language json db.accountCustomerLinks.createIndex({customerNumber: 1}); db.accountCustomerLinks.createIndex({accountNumber: 1}); db.accountCustomerLinks.createIndex({"customerNumber,accountNumber": 1}); db.accountCustomerLinks.createIndex({"customerNumber,accountNumber,organizationNumber": 1});
Target (Java)
Code Block | ||
---|---|---|
| ||
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Getter
@Setter
@Document(collection = "accountCustomerLinks")
public class AccountToCustomerLinking {
@Id
private String id;
@NotNull(message="account number is mandatory")
private String accountNumber;
@NotNull(message="customer number is mandatory")
private String customerNumber;
@NotNull(message="qualification is mandatory")
private String qualification;
@NotNull(message="organization number is mandatory")
private String organizationNumber;
@NotNull(message="customer type indicator is mandatory")
private Integer customerTypeIndicator;
@NotNull(message="foreign use indicator is mandatory")
private Integer foreignUseIndicator;
private String expirationDate;
private String status;
} |
Account Card Linking
Source
Fiserv endpoint:
POST /account/prepaid
Class:
FiservRepository
Service:
linkCardToAccount
Response:
Code Block | ||
---|---|---|
| ||
public class CardToAccountLinkingResponseDTO {
private String cardNumber;
private String customerOrAccountNumber;
} |
Request
Code Block | ||
---|---|---|
| ||
public class CardToAccountLinkingRequestDTO {
private String cardNumber;
private Integer cardholderType;
private String customerOrAccountNumber;
} |
Target (MongoDB)
Collection name:
accountCardLinks
Schema:
Code Block language json db.createCollection("accountCardLinks", { validator: { $jsonSchema: { bsonType: "object", title: "Account Card Links Object Validation", required: ["cardNumber","cardholderType","customerOrAccountNumber"], properties: { cardNumber: { bsonType: "string", description: "'cardNumber' must be a string and is required" }, cardholderType: { bsonType: "int", description: "'cardholderType' must be a string and is required" }, customerOrAccountNumber: { bsonType: "string", description: "'customerOrAccountNumber' must be a string and is required" } } } } });
Index
Code Block language json db.accountCardLinks.createIndex({cardNumber: 1}); db.accountCardLinks.createIndex({cardholderType: 1}); db.accountCardLinks.createIndex({customerOrAccountNumber: 1}); db.accountCardLinks.createIndex({"cardNumber,cardholderType,customerOrAccountNumber": 1});
Target (Java)
...
language | java |
---|
...
El código se encuentra alojado en el Github y clúster de Genesys / Spin en ambientes de DEV + QA + Stage/Staging
Table of Contents | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
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 |