Data Structure for Mirror Balance
This document contains the Balance Collection (MongoDB) definition. We could see java objects and JSON schema for MongoDB.
Sources
Account Balance Endpoint
Fiserv ednpoint:
/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; }
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:
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; }
Target (MongoDB)
Collection name:
accountDetails
Schema:
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
db.accountDetails.createIndex({accountDataKey: 1}); db.accountDetails.createIndex({"accountDataKey.accountNumber": 1});
Target (Java)
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; }
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; } }
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:
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)
Collection name:
blockUnblockAccounts
Schema:
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
db.blockUnblockAccounts.createIndex({accountBlockUnblockKey: 1}); db.blockUnblockAccounts.createIndex({"accountBlockUnblockKey.accountNumber": 1});
Target (Java)
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; }
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:
public class AddCustomerResponseDTO { private String customerNumber; }
Request
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:
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
db.customers.createIndex({customerKey: 1});
Target (Java)
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; }
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:
public class AccountToCustomerLinkingResponseDTO { private String customerNumber; private String accountNumber; }
Request
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:
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
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)
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:
public class CardToAccountLinkingResponseDTO { private String cardNumber; private String customerOrAccountNumber; }
Request
public class CardToAccountLinkingRequestDTO { private String cardNumber; private Integer cardholderType; private String customerOrAccountNumber; }
Target (MongoDB)
Collection name:
accountCardLinks
Schema:
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
db.accountCardLinks.createIndex({cardNumber: 1}); db.accountCardLinks.createIndex({cardholderType: 1}); db.accountCardLinks.createIndex({customerOrAccountNumber: 1}); db.accountCardLinks.createIndex({"cardNumber,cardholderType,customerOrAccountNumber": 1});
Target (Java)
import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Getter @Setter @Document(collection = "accountCardLinks") public class CardToAccountLinking { @Id private String id; @NotNull(message="card number is mandatory") private String cardNumber; @NotNull(message="cardholder type is mandatory") private Integer cardholderType; @NotNull(message="customer or account number is mandatory") private String customerOrAccountNumber; }
Add Comment