# 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, `:`, 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