You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Inga 🏳‍🌈 62aa1a7d20 Merge pull request 'Refactored transaction controller' (#21) from refactor-10-refactor-transaction-controller into main 10 months ago
src refactor: unified getAmountWithExchange and getAmountWithoutExchange methods (closes #10) 10 months ago
test Initial commit with test assignment 11 months ago
.eslintrc.js enabled no-floating-promises eslint rules to prevent #3 from happening again 10 months ago
.gitignore switched from mysql to sqlite (closes #1) 10 months ago
.prettierrc Initial commit with test assignment 11 months ago
README.md Initial commit with test assignment 11 months ago
nest-cli.json Initial commit with test assignment 11 months ago
ormconfig.json switched from mysql to sqlite (closes #1) 10 months ago
package-lock.json feat: fixed applyRules logic (closes #16) 10 months ago
package.json feat: fixed applyRules logic (closes #16) 10 months ago
tsconfig.build.json Initial commit with test assignment 11 months ago
tsconfig.json Initial commit with test assignment 11 months ago

README.md

Introduction

Explore this code and be ready to tell us what is good or/and bad

Installation

  • npm install
  • npm install -g ts-node
  • Insert database connection information into ormconfig.json file
  • Run “db-build”

Running the app

# development
$ npm run start

# watch mode
$ npm run start:dev

## Test

```bash
# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

Task original

Create a RESTful API with an endpoint for transaction commission calculation. The API must use JSON format for requests and responses.

Request (Transaction) examples

1st example

{
  "date": "2021-01-01",
  "amount": "100.00",
  "currency": "EUR",
  "client_id": 42
}

2nd example

{
  "date": "2021-01-01",
  "amount": "200.40",
  "currency": "USD",
  "client_id": 42
}

Response (Commission) example

{
  "amount": "0.05",
  "currency": "EUR"
}

Commission response must always be in Euros. Please use a currency rates API (https://api.exchangerate.host/2021-01-01) for transactions in currency other than Euros.

Commission calculation rules

The lowest commission shall be used if there are multiple rules matching.

Rule #1: Default pricing

By default the price for every transaction is 0.5% but not less than 0.05€.

Rule #2: Client with a discount

Transaction price for the client with ID of 42 is 0.05€ (unless other rules set lower commission).

Rule #3: High turnover discount

Client after reaching transaction turnover of 1000.00€ (per month) gets a discount and transaction commission is 0.03€ for the following transactions.

See below an example in CSV format of rules applied to various transactions.

client_id,date,amount,currency,commission_amount,commission_currency
42,2021-01-02,2000.00,EUR,0.05,EUR
1,2021-01-03,500.00,EUR,2.50,EUR
1,2021-01-04,499.00,EUR,2.50,EUR
1,2021-01-05,100.00,EUR,0.50,EUR
1,2021-01-06,1.00,EUR,0.03,EUR
1,2021-02-01,500.00,EUR,2.50,EUR

Testing

Please write at least one unit and one integration test.

Remarks

  • You can use any language and any framework. We expect you to show knowledge of your chosen language's ecosystem (frameworks, 3rd party libraries, etc.)
  • Code must follow good practices (such as SOLID, design patterns, etc.) and be easily extendable in case we need to add additional commission calculation rules in the future
  • Please include README.md with instructions how to run your completed task.

Submitting the task

  • Make sure you don't mention [REDACTED] anywhere in the code or repository name.
  • Please include how long it took for you to do the task.