---
# System prepended metadata

title: ATM machine

---

# ATM machine

# Iteration 1

## Business rules
We want to build an ATM machine and the first thing we want to do it's to create a softaware that calculates the amount of money you are trying to obtain whenever you are trying to do a withdrawal,The software would give you the breakdown of the minimum amount of bills and coins that the ATM would have to give you.

The content of the ATM is:
```
| Value | Type |
|-------|------|
| 500   | bill |
| 200   | bill |
| 100   | bill |
| 50    | bill |
| 20    | bill |
| 10    | bill |
| 5     | bill |
| 2     | coin |
| 1     | coin |
```

Example:
**Input**
```
As a user
I withdraw 434€
```
**Output**
```
2 bills of 200.
1 bill of 20.
1 bill of 10.
2 coins of 2.
```

### Possible API for the ATM

**Primitive Obsession and tight couple to the presentation**
```java
public interface ATM {
    public String withdraw(int quantity);
}
```

**Returning list of DTO or Value Objects**
```java
public interface ATM {
    public List<Money> withdraw(int quantity);
}
```

**Outside-in**
```java
public interface ATM {
    public void withdraw(int quantity);
}
```


# Iteration 2

## Business rules
By law you only can have 5.000€ on the ATM machine, if anybody tryies to remove more than 5.000€. The ATM machine will throw an error saing that the operation was cancel.

Examples:
**Input**
```
As a user
I withdraw 5.0001€
```
**Output**
```
The operation was cancel
```

```
As a user
I withdraw 1000€
I withdraw 1000€
I withdraw 1000€
I withdraw 1000€
I withdraw 1001€
```
**Output**
```
The operation was cancel
```

# Iteration 3

## Business rules
The ATM machine has the following distribution of money
- If the ATM has no more bills or coins should try to use other quantities to allow the user to withdraw the amount.


```
| Value | Type | quantity of units |
|-------|------|-------------------|
| 500   | bill | 2                 |
| 200   | bill | 3                 |
| 100   | bill | 4                 |
| 50    | bill | 12                |
| 20    | bill | 20                |
| 10    | bill | 50                |
| 5     | bill | 100               |
| 2     | coin | 250               |
| 1     | coin | 500               |
```


### Examples:
**initial ATM state**
```
| Value | Type | quantity of units |
|-------|------|-------------------|
| 500   | bill | 2                 |
| 200   | bill | 3                 |
| 100   | bill | 4                 |
| 50    | bill | 12                |
| 20    | bill | 20                |
| 10    | bill | 50                |
| 5     | bill | 100               |
| 2     | coin | 250               |
| 1     | coin | 500               |
```

**Input**
```
As a user
I withdraw 1625€
```
**Output**
```
2 bills of 500.
1 bill of 20.
1 bill of 10.
2 coins of 2.
```

**ATM state after the output**
```
| Value | Type | quantity of units |
|-------|------|-------------------|
| 500   | bill | 0                 |
| 200   | bill | 0                 |
| 100   | bill | 4                 |
| 50    | bill | 12                |
| 20    | bill | 19                |
| 10    | bill | 50                |
| 5     | bill | 99                |
| 2     | coin | 250               |
| 1     | coin | 500               |
```

**Input**
```
As a user
I withdraw 1825€
```
**Output**
```
4 bills of 100.
12 bill of 50.
1 bill of 20.
44 bill of 10.
1 bill of 5.
```

**ATM state after the output**

```
| Value | Type | quantity of units |
|-------|------|-------------------|
| 500   | bill | 0                 |
| 200   | bill | 0                 |
| 100   | bill | 0                 |
| 50    | bill | 0                 |
| 20    | bill | 0                 |
| 10    | bill | 6                 |
| 5     | bill | 99                |
| 2     | coin | 250               |
| 1     | coin | 500               |
```