Maybe renew a customer when they top up
If they are expired and they top up, ask sgx-jmp to check if they and registered
and bill/renew them.
Require settled_after to be NOT NULL
Add settled_after to transactions table
Customer with no plan gets highest matching rate
Since we don't know their plan, be safe and pick the highest rate. This means
we can still get a sense of Transitional users' usage instead of not knowing at all.
Fix for cdr_with_charge performance
Allow check_and_notify_low_balance to be called outside of trigger
For use from, eg, jmp-pay
NOTIFY on low balance
This will be picked up by the LISTEN in sgx-jmp to auto-top-up or notify the
customer of low balance.
Do not charge for voicemail
Do not bill over user limit without consent
If the user has no configured limit in Redis, limit is 0
If the CDR would cost less than their limit, bill normally
If they have already spent more than within buffer of their limit, bill normally
Else, bill only enough to get up to their limit
Get customer data from Redis
Insert charge for CDR
Trigger to insert a transaction charging the customer for the amount owed for
an INSERTed CDR.
Function to compute the amount to charge a customer for a given cdr
This takes into account how much of their "included" minute credit has already
been used in the calendar month.
Store plans data in a table
Ideally this would come via FDW, but for now we can easily have a script push to
this table from the source of truth.
Table for call_rates and view to augment CDRs with that data
For every $15 deposited, add one invite code
View to get all invites not yet used up.
Table to store invite codes and their status. Stores who make the code and
when, who used the code (if anyone has used it yet) and when, and the code
itself. Codes are single-use so once used_by_id is set the code cannot be used again.
Creating with a literal stored the time that was 'now' when the view was
created. We want the current time when the view is accessed.
plan_log uses a tsrange instead of two timestamps now
This is honestly just more correct, but also allows for easy checking of
non-overlapping ranges, which we now do.