Ledgers and Transactions
Ledgers
A ledger is a table of numbers that you can save in a case, and access in forms.
Definitions:
A ledger can be viewed as a type of case property
But unlike the case property the ledgers can be updated directly in the form-builder with the transactions.
The row of the ledger is called an "entry" and corresponds to a product id.
The column of a ledger is called a "section":
You can create your own section when creating a ledger (stock, balance, price, order amounts ...)
You can define as many sections as you want for a ledger.
Some section ids, such as consumption (which store the average monthly consumption) are reserved by the application.
The number saved for each row and column is called a "quantity":
The quantities of a ledger are of integer type. Decimals are not supported.
Do you want to use a ledger?
You are a community health worker who manages ORS, zinc, and vitamins
You are building an app to track shipments of products over time
You are building an app to track orders/requisitions of products over time
You want to track the number of Rapid Diagnostic Tests (RDTs) at a facility over time
You want to make a sandwich shop app that tracks how much money 50 different clients owe you
Transactions
A transaction allow you to save and update numbers in a ledger.
There are 4 types of transactions:
Balance: set the ledger quantity to a specific value
Receive: increment the ledger quantity by a specific value
Dispense: decrement the ledger quantity by a specific value
Transfer: decrement the ledger quantity by a specific value on a case A & increment the ledger quantity by a specific value on a case B
Good to know !!!
Transactions are atomic – so if your phone shuts down mid-transfer, things don’t get lost.
Transactions are also resolved meaningfully. In CommCare, if 2 phones increments the same number, whichever phone writes last wins. In CommCare Supply, the increments are summed.
How to setup a transaction question?
Question ID: anything you want
Case: id of the case where your ledger will be saved.
This can take different values depending on which case you want to use to save your ledger.
In order to save the ledger in the current selected case, use: instance('commcaresession')/session/data/case_id.
In order to save the ledger in the user supply-point, use: instance('commcaresession')/session/user/data/commtrack-supply-point.
...
Balance ID: id of the section (i.e. stock, balance, ...)
Product: id of the product
When used in a repeat group over products, the syntax to use is current()/../../../@id. However this will depend if you put the transaction question in question groups or not (see here).
Quantity: value to set to the ledger.