diff options
Diffstat (limited to 'requirements/catalogue/req-030.md')
| -rw-r--r-- | requirements/catalogue/req-030.md | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/requirements/catalogue/req-030.md b/requirements/catalogue/req-030.md new file mode 100644 index 0000000..38961be --- /dev/null +++ b/requirements/catalogue/req-030.md @@ -0,0 +1,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 |
