A mini version of Aspire app. This is code challenge test before techincal interviewing of Aspire company.
This App requires: PHP 7.2.5, Composer
Make sure to do the following steps to set up the app.
-
Run command
composer installto install all dependencies. -
Database: this app is using
sqlitedatabase to help you easier in setting up. You don't need to configure database, the system configured already. The database is placed atdb/aspireapp.db. -
Run
php bin/console doctrine:migrations:migrateto migrate database table structure. -
Run
php bin/console doctrine:fixtures:loadto init login info. This command will create 2 users for the system. They are: -
demo@aspireapp.com / pwd123--> Normal user. -
admin@aspireapp.com / adminpwd123--> Admin user. -
Run:
php -S 127.0.0.1:8000 -t publicto start the web server. You can access web server with URL:http://localhost:8000.
** If you got any problem with port 8000. Please choose another free port on your PC.
I tried to make the system can be configurable as much as possible.
We might have many types of repayment frequency. They might be: monthly, fortnightly, yearly...
Currently, system is supporting for Weekly repayment frequency. You can integrate other type by changing the value of $loan->repaymentFrequency.
We are using App\Service\Repayment\RepaymentService to handle all business of repayment.
This service will detect which type of repayment frequency is using and then using the corresponding Strategy to process
To add Monthly repayment into system:
- Set value of $loan:
$loan->setRepaymentFrequency(Loan::REPAYMENT_MONTHLY). - Create class
MonthlyRepaymentto handle monthly behavior and override all abstract methods
namespace App\Service\Repayment;
use App\Entity\Loan;
class MonthlyRepayment extends RepaymentStrategy
{
public function calculateAmount(Loan $loan): float
{
// TODO: Implement calculateAmount() method.
}
public function getNextRepaymentDate(Loan $loan): \DateTime
{
// TODO: Implement getNextRepaymentDate() method.
}
}
- Register
MonthlyRepaymentas a service inconfig/services.yaml.
services:
...
app.service.repayment.mothly:
class: App\Service\Repayment\MonthRepayment
...
- Integrate
MonthlyRepaymentintoRepaymentServiceinconfig/services.yaml.
services:
...
app.service.repayment.mothly:
class: App\Service\Repayment\MonthRepayment
...
App\Service\Repayment\RepaymentService:
arguments:
$repaymentStrategies:
# loan.paymentFrequency: RepaymentStrategyServiceAlias
1: '@app.service.repayment.weekly'
3: '@app.service.repayment.mothly'
Currently, system is supporting interest rate per month
We can add more interest rate such as: interest rate per year, flat interest rate, interest rate reduce base loan amount left.
Just modify InterestRateService and do like the idea of Payment frequency
So sorry i don't have enough time to deal with unit test. Let me have a chance to talk at the technical interview
We have 2 types of user. They are normal and admin users.
- User can log in to the app with this credential:
demo@aspireapp.com / pwd123. - After logging in success, user will be redirected to
My Loanspage. This page displays all loans application of current user. - User can register a new loan application by clicking button
Register new loan application
- Enter loan information to register a new loan

- After registering, the loan application status will be
New. We will wait until the admin approve this loan application. - All the loans will be assumed to have a “weekly” repayment frequency.
- To Repay: go to
My Loanspage, clickshowbutton on the specific loan. Then press buttonRepay. Please remember: buttonRepayjust appears when status is approved - User can see the summary of loan reppayments, loan detail, loan repayment history on this page

- Admin can log in to the app with this credential:
admin@aspireapp.com / adminpwd123. - After logging in success, user will be redirected to
Loans listpage. This page displays all loans application.
- Admin can approve or change a loan application by clicking
Editon specific loan - Admin can see the list of latest
Loan Repaymentsby clicking on each top menu - Admin can approve a
Loan repaymentby clicking buttonApproveon specificLoan Repayment