Spring Banking is a simulated banking system, built by @jsblanco as the final project for the Ironhack Java Backend Bootcamp, that ran from July October 2022.
This system has four main product:
- Credit cards
- Checking accounts
- Student checking accounts (for people younger than 24)
- Savings accounts
At the same time, there are three kinds of users:
- Admins, who have free reign upon the app
- Account holders, who can check their products and operate with them, but depend on admins to create, update or delete these products;
- Third party users, who own no products, but can operate on other people's products under specific circumstances.
You must run this app using Maven. When running, the app provides a REST API for users to interact with. Attached you will find a Postman collection mocking the main calls of this project.



The system must have 4 types of accounts: StudentChecking, Checking, Savings, and CreditCard.
Checking Accounts should have:
- A balance
- A secretKey
- A PrimaryOwner
- An optional SecondaryOwner
- A minimumBalance
- A penaltyFee
- A monthlyMaintenanceFee
- A creationDate
- A status (FROZEN, ACTIVE)
Student Checking Accounts are identical to Checking Accounts except that they do NOT have:
- A monthlyMaintenanceFee
- A minimumBalance
Savings are identical to Checking accounts except that they:
- Do NOT have a monthlyMaintenanceFee
- Do have an interestRate
CreditCard Accounts have:
- A balance
- A PrimaryOwner
- An optional SecondaryOwner
- A creditLimit
- An interestRate
- A penaltyFee
The system must have 3 types of Users: Admins and AccountHolders.
The AccountHolders should be able to access their own accounts and only their accounts when passing the correct credentials using Basic Auth. AccountHolders have:
- A name
- Date of birth
- A primaryAddress (which should be a separate address class)
- An optional mailingAddress
- Admins only have a name
- The ThirdParty Accounts have a hashed key and a name.
Admins can create new accounts. When creating a new account they can create Checking, Savings, or CreditCard Accounts.
- Savings accounts have a default interest rate of 0.0025
- Savings accounts may be instantiated with an interest rate other than the default, with a maximum interest rate of 0.5
- Savings accounts should have a default minimumBalance of 1000
- Savings accounts may be instantiated with a minimum balance of less than 1000 but no lower than 100
- CreditCard accounts have a default creditLimit of 100
- CreditCards may be instantiated with a creditLimit higher than 100 but not higher than 100000
- CreditCards have a default interestRate of 0.2
- CreditCards may be instantiated with an interestRate less than 0.2 but not lower than 0.1
- When creating a new Checking account, if the primaryOwner is less than 24, a StudentChecking account should be created otherwise a regular Checking Account should be created.
- Checking accounts should have a minimumBalance of 250 and a monthlyMaintenanceFee of 12
- Interest and Fees should be applied appropriately
- The penaltyFee for all accounts should be 40.
- If any account drops below the minimumBalance, the penaltyFee should be deducted from the balance automatically
- Interest on savings accounts is added to the account annually at the rate of specified interestRate per year. That means that if I have 1000000 in a savings account with a 0.01 interest rate, 1% of 1 Million is added to my account after 1 year. When a savings account balance is accessed, you must determine if it has been 1 year or more since either the account was created or since interest was added to the account, and add the appropriate interest to the balance if necessary.
- Interest on credit cards is added to the balance monthly. If you have a 12% interest rate (0.12) then 1% interest will be added to the account monthly. When the balance of a credit card is accessed, check to determine if it has been 1 month or more since the account was created or since interested was added, and if so, add the appropriate interest to the balance.
- Admins should be able to access the balance for any account and to modify it.
- AccountHolders should be able to access their own account balance
- Account holders should be able to transfer money from any of their accounts to any other account (regardless of owner). The transfer should only be processed if the account has sufficient funds. The user must provide the Primary or Secondary owner name and the id of the account that should receive the transfer.
- There must be a way for third-party users to receive and send money to other accounts.
- Third-party users must be added to the database by an admin.
- In order to receive and send money, Third-Party Users must provide their hashed key in the header of the HTTP request. They also must provide the amount, the Account id and the account secret key.
- Include a Java/Spring Boot backend.
- Everything should be stored in MySQL database tables.
- Include at least 1 GET, POST, PUT/PATCH, and DELETE route.
- Include authentication with Spring Security.
- Include unit and integration tests.
- Include robust error handling.
- You must use the Money class for all currency and BigDecimal for any other decimal or large number math.
- Deliverables
- A working REST API, built by you that runs on a local server.
- The URL of the GitHub repository for your app.
- A simplified class diagram representing your project structure should be added to the repo.
- Adequate and complete documentation in the README.md file.