summaryrefslogtreecommitdiff
path: root/requirements/catalogue/req-030.md
blob: 38961be25f88b2526672c120345e6d0f4cec81e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# req-030

Schist must implement the procedure described below as `calculate_bucket_balance`.

## calculate_bucket_balance

Inputs:

-   A bucket name, `name`

1. If no bucket exists with the name, `name`, then return empty.
2. If more than one bucket exists with the name, `name`, then panic.
3. Let `bucket` be the bucket with the given name.
4. Let `cache_key = bucket.balance_cache_key`.
5. Let `is_up_to_date` be the result of the sub-procedure,
   `is_bucket_balance_up_to_date(bucket)`, as described below.
6. If `is_up_to_date = TRUE`, then return `bucket.balance`.
7. Let `transaction_sum` be the sum over the property, `amount`, of all
   transactions `t` such that `t.bucket_id = bucket.id`.
8. Let `drip_sum` be the sum over the property, `amount`, of all drips `d` such
   that `d.bucket_id = bucket.id`.
9. Return `drip_sum - transaction_sum`.

## is_bucket_balance_up_to_date

Inputs:

-   A bucket, `bucket`

1. Let `cache_key = bucket.balance_cache_key`.
2. If `cache_key` is not in the format, `<string>:<string>`, then return FALSE.
3. Let `drip_id` be the part of `cache_key` before the `:`.
4. If there is no drip with the ID, `drip_id`, then return FALSE.
5. Let `drip` be the drip with the ID, `drip_id`.
6. If there is a drip, `drip_2`, such that `drip_2.date > drip.date` and
   `drip.bucket_id = bucket.id`, then return FALSE.
7. Let `transaction_id` be the part of `cache_key` after the `:`.
8. If there is no transaction with the ID, `transaction_id`, then return FALSE.
9. Let `transaction` be the transaction with the ID, `transaction_id`.
10. If there is a transaction, `transaction_2`, such that
    `transaction_2.date > transaction.date` and
    `transaction.bucket_id = bucket.id`, then return FALSE.
11. Return TRUE.

Source: req-029

Satisfied by: dml-bucket, dml-drip