test-yield/README.md
2024-12-09 10:54:43 +01:00

147 lines
3.2 KiB
Markdown

# Test Technique - Laravel Wallet
![Screenshot](screenshot.png)
## Requirements
- PHP 8.2+
- Composer
(i) No need database, just use sqlite.
## Installation
```bash
composer install
```
```bash
cp .env.example .env
```
```bash
php artisan key:generate
```
```bash
php artisan migrate --seed
```
```bash
npm install
```
```bash
npm run dev
```
```bash
php artisan serve
```
## Running tests
```bash
vendor/bin/pest
```
## Running formatter
```bash
vendor/bin/pint
```
## Default Users
Rich chill guy (1M€ balance):
- Email: rich.chill.guy@test.fr
- Password: password
Another guy (0€ balance):
- Email: another.guy@test.fr
- Password: password
## Database schema
![Database schema](mcd.png)
Amounts are saved in cents.
Some Laravel tables are included :
- sessions
- cache
- cache_locks
- jobs
- job_batches
- failed_jobs
## Tickets
To validate the test, the first 3 tickets must be functional and tested. Implementation is a second point that can be challenged.
⚠️ Tests, factories & seeders are mandatory/required
### Bugfix - Error on login
On first login after registering, this error is thrown:
```
Call to a member function transactions() on null
```
### Feature - Notification when balance is low
When a user balance is low (< 10€), he should be notified by email.
### Feature - Recurring transfers
As a user, I want to be able to create recurring transfers.
I want to define :
- A start date
- An end date
- A frequency in days
- An recipient email
- An amount
- A reason
Of course, I want to be able to delete a recurring transfer.
The transfer must be executed every X days (according to the periodicity defined by the user) at 2:00 a.m.
The transfer must also be executed immediately after its creation.
If the user has a balance lower than the amount, the transfer should fail and the user should be notified by email.
- A POST api endpoint to create recurring transfer
- A DELETE api endpoint to delete recurring transfer
- A GET api endpoint to list recurring transfer (with their status)
- Any kind of UI in the dashboard
### BONUS - Feature - Taking out a loan
As a user I can ask to take out a loan.
**The credit is granted automatically if the following conditions are met:**
0-200 :
- If, over a 3-month period, the average account balance was above 100.
200-500 :
- If, over a 3-month period, the average account balance was over 300;
- and the user has made at least 5 transfers over the same period.
500-1000 :
- If over a 3-month period, the average account balance was above 500;
- and the user has made at least 1 transfer representing at least 50% of this average balance over the last six months.
Once the credit has been taken out, a recurring transfer (spread over 3 months) which the user cannot delete must be created, with a periodicity of 30 days.
### BONUS - Question
How can you ensure that recurring transfers are executed in the most optimal order?
In particular, when a user has several recurring transfers to be executed on the same day?
Example: at 2:00 AM my wallet is empty (0€), a debit (50€) is scheduled and an automatic transfer of 75 from another user is also scheduled to be credited to the account.
How would you ensure that as many transactions as possible are successful?