System Configuration
A single list of typed key/value settings that steer specific pieces of portal behaviour — from AIR's GST home state to the on/off switches for the daily background schedulers.
What this screen is
System Configuration is not a business record you create — it is a fixed catalogue of settings that ships with the code. Each row is one key (for example reservation.enabled) holding a current value. You cannot add a new key or delete an existing one from the console; keys are defined and seeded by developers. What you can do is open a key and, if it is marked editable, change its value.
The list
Nav: Administration → System Configuration.
| Column | Shows |
|---|---|
| key | The setting's unique identifier, e.g. gst.home_state_code. Searchable and sortable. |
| group | A category label the setting belongs to, shown as a plain badge. Sortable. |
| value | The current value, truncated to 40 characters in the list — open the record to see it in full. |
| is_editable | A tick/cross icon. Ticked keys can have their value changed from this console; crossed keys are locked — even an administrator cannot change them here. |
| updated_at | When the value last changed. Hidden by default — switch it on from the column toggle. |
There are no filters on this list — with typically only a handful of keys in the whole system, the plain sortable/searchable table is enough to find what you need.
Editing a value
- Open the key
Select Edit on the row. The edit screen shows key, group, type and description — all disabled. They are read-only reference information, not fields you change.
- Change the value, if you are allowed to
The value field is a text box. It is only enabled when the row's is_editable flag is on; otherwise it appears disabled and the console will refuse the save regardless.
- Save
Your input is validated and cast to the setting's underlying type before it is stored, and the cached copy of that key is cleared immediately — the new value takes effect straight away, with no restart or wait.
Each key has a fixed underlying type. Saving does not simply store whatever text you type — it is parsed and converted to that type (for example, a JSON-typed value is JSON-encoded unless it is already a plain string) before it is written, so a mistyped value is rejected with an error instead of silently breaking whatever else in the portal reads that key.
Currently seeded keys
These are the settings shipped with the system today, in the order the seeder writes them. The Editable column tells you whether the value field is enabled when you open the key — a No here means the portal manages that value itself and the field is greyed out.
| Key | What it controls | Editable |
|---|---|---|
| gst.home_state_code | AIR's home GST state code, shipped as 27 (Maharashtra). Billing compares an order's delivery state against this to decide whether GST is split as intra-state (CGST + SGST) or inter-state (IGST). | Yes |
| placeholder.region_id | A stand-in region ID, used internally wherever a process still needs a region reference that isn't otherwise resolvable — a stop-gap value, not a setting you would normally touch. | No |
| placeholder.pincode_id | The same placeholder pattern as above, for pincode references. | No |
| reservation.enabled | The kill-switch for the daily auto-reservation scheduler. Turn it off to pause automatic stock reservation across the whole portal. | Yes |
| reservation.cod_in_transit_limit | How many despatched-but-unremitted COD packages a customer may already have out before the nightly auto-reservation job holds their further parts. Seeded as 0, and 0 means the check is off — nothing is held on these grounds until someone sets a real number here. Set it to, say, 3 and a customer with three or more COD packages out whose money hasn't come back will have their next parts held as Too many unremitted COD packages already out for this customer until the cash is remitted. Lower it to tighten credit, raise it (or return it to 0) to loosen it. | Yes |
| wave.enabled | The kill-switch for the daily auto-wave-creation scheduler. Turn it off to stop new picking waves being created automatically. | Yes |
| refund.create_journal_entry | When on and both refund accounts below are filled in, issuing a refund also posts a balanced entry to the ledger. Shipped off. | Yes |
| refund.debit_account | The account code debited by that refund entry — the customer advance/liability being cleared. Shipped blank. | Yes |
| refund.credit_account | The account code credited by that refund entry — the bank or cash the refund is actually paid from. Shipped blank. | Yes |
| bounced.create_journal_entry | When on and both bounced accounts below are filled in, marking a payment voucher dishonoured posts a balanced reversal entry to the ledger. Shipped off. | Yes |
| bounced.debit_account | The account code debited by that reversal — the customer receivable being re-established. Shipped blank. | Yes |
| bounced.credit_account | The account code credited by that reversal — the bank or cash that did not clear. Shipped blank. | Yes |
| purchase.create_journal_entry | When on and all three purchase accounts below are filled in, posting a vendor bill also posts a balanced entry to the ledger. Shipped off. | Yes |
| purchase.purchases_account | The account code debited for the taxable amount of a posted vendor bill. Shipped blank. | Yes |
| purchase.input_gst_account | The account code debited for input GST on a posted vendor bill (CGST + SGST + IGST together). Shipped blank. | Yes |
| purchase.payables_account | The account code credited with the vendor payable — the bill's total amount. Shipped blank. | Yes |
| purchase.payment_credit_account | The account code (bank or cash) a vendor payment is paid from. Shipped blank. | Yes |
| despatch.customer_location_id | The global virtual Customers endpoint every delivery ships to. The portal points this at the seeded location itself — you never set it by hand. See Warehouses & Carriers for what the virtual endpoints are. | No |
| despatch.default_source_location_id | The stock location that despatch releases create their moves from when nothing more specific applies. Shipped blank, and this one you must fill in before releasing anything — see the warning below. | Yes |
It ships blank on purpose — only AIR knows which location despatch should draw from. Until you set it, releasing an approved order has no source to create its stock moves from. Set it once, early, as part of initial setup.
The three refund.* keys, the three bounced.* keys and the four purchase.* keys each work as a group: the …create_journal_entry switch only takes effect once every account code in its set is filled in. Turning the switch on and leaving an account blank simply means no entry is posted — you get no error. See Accounting — Journal & GST for what each entry looks like once it is posted.
reservation.enabled and wave.enabled are emergency/maintenance switches for two background jobs, not values you change routinely. reservation.cod_in_transit_limit is different — it is a real business policy dial, and it is deliberately shipped at 0 (off) so that no despatch is silently held until AIR decides what the limit should be. See Background Schedulers for exactly what each job does, when it runs, and what happens while its switch is off.