Examine

Start Server

To start server from binary on Windows downloaded from GitHub:

.\ledglive.exe sr -v

Navigate to http://localhost:8652 or to https://localhost:8653

Link to start server from source code

Using other devices, such as another PC or mobile phone

ipconfig on windows will let you know IP address to view server on other devices. Just replace localhost with the IP address navigate through warnings if using https.

The display on a mobile phone is viewable but next to unusable at the moment and the UI at the moment does not cater for mobile phone use. Only UI use with PCs has been considered up to now.

Security

There is no user level security. This can be externally imposed, such as by using a VPN (virtual private network) to cross through the Internet.

Https provides transport layer security but without added in user level security at the app level this is not sufficient to avoid using a VPN.

Examining sample Opal Trader accounts

Change Date Begin to 1/9/2021 (1 September 2021) to see a few sample ledger entries

Using a Journal Entry Date with a Ledger Date

LedgLive dates only work with the Ledger date, which is changeable. A journal entry date is optional. Ledger entries in LedgLive are intended to group small numbers of directly related journal entries together that occur near the same time, unlike a traditional ledger system.

Please note the date in a journal entry row is a convenience and is not used by LedgLive at the moment, other than to record such a date, if desired.

A journal entry date is useful to keep closely related transaction together with dates that are apart, such as for a refund, return or variation or appearance on a bank statement.

The journal entry date can be used for a more traditional ledger system where the transaction date is associated with the journal entry rather than the ledger entry and where a ledger records a summary of multiple journal entries or extracts from journals.

Terminology and basic structure

LL (ledgLive), as discussed, uses terminology entity, account, ledger and journal.

The react web client is a SPA (single page application), currently with no internal routing. The web client is only used to make ledger and journal entries as well as deletions.

Account addition and deletion is not allowed through the web client but can be made with other methods.

The web client has three sections

Select account and dates

Select account and dates
Select account and dates

An account of an entity must be selected for Row+ to generate a new journal entry for a ledger.

Begin, end and new dates can be chosen and they are used to search journal entries that satisfy the following

  1. They belong to a ledger entry within the date range
  2. The journal entry of the ledger belongs to a chosen account for the account journal entries table below (a Row+ account or the account of a selected journal entry)

The Row+ account id is stored in browser local storage and currently this local storage may need to manually cleared if a new chart of accounts is used (to be fixed).

Account journal entries table - mainly read only

Account journal entries table - mainly read only
Account journal entries table - mainly read only

Journal entries for an account are listed in reverse date order and have navigation buttons

Selecting any row in the

The account shown is varied two ways

  1. By selecting a new account in the ‘select account and dates’ search box and pressing enter
  2. By clicking on any journal entry row in the ‘ledger journal entries’ below

There is an exception to the read only rule for this table. The account name can be edited and the account can be set to allow balance reconciliation

Account journal entries with reconciliation enabled
Account journal entries with reconciliation enabled

Ledger journal entries table - intended for data entry

Ledger journal entries table - for data entry
Ledger journal entries table - for data entry

In data entry order. Note that the first entry is has an ‘Account Title’ that is more highlighted than the two below. This is an active row that any of the four account change drop down and select boxes above can act on. Enter changes account. Escape skips to next row and then rolls back to top at end.

Table navigation

Table navigation buttons at end of table space
Table navigation buttons at end of table space

UI (User Interface) Behaviour

Select Entity & Account (the default account for Row+ journal entry)

Select Entity & Account
Select Entity & Account

The top drop down box selects the entity whose accounts you can view through the search box below. The default entities are Opal Trader, Mr Opal and Ms Opal and they have parallel accounts (named ‘loan to …’ with corresponding ‘loan from …') with each other.

In the search box just type to search for account or press the down arrow to view all accounts.

Clicking on the search box or its down arrow has no search effect. Escape, tab or click anywhere else does not select anything new. ‘Enter’ populates the account journal entries below. Something must be selected for Row+ button to add a new journal entry to Ledger and it can be your most common account or the default account for Row+. While clicking on a journal entry row in the ledger table will change the account displayed, Row+ will still use the original selected account.

If you want to display the original selected account for Row+ in the account journal entries, just press enter again in the search box.

It is not expected you change this Row+ account for each new Row+ journal entry because it is very quick to change the account of any journal entry.

Creating and Deleting Ledgers and Journal Entries

  • ‘New’ creates a new Ledger entry
  • ‘Delete’ deleted Ledger entry and all its journal entries
  • ‘Row+’ adds a journal entry to current Ledger with default account for Row+
  • ‘Row-’ deleted all journal entries to current Ledger that have a tick box on the left

By default the last journal entry of an account by date range selected shows in the ledger journal entry.

The image shows there are six journal entries in the account in the date range. It is important to realise the number is an index number is not an ID. You can navigate by button or by entering a new index number

For the sample Opal Trader account from 1 September 2021 to 30 September 2021 six entries show, Extending the date end range to 30 June 2022 shows a seventh entry for 30 June 2022 and it was automatically generated as part of requesting a Profit and Loss statement and a Balance Sheet report on the command line, even though 30 June 2022 is well away. This Ledger entry is automatically updated each time, if necessary, each time the report is requested. It is only necessary to know it is there. It can be ignored as the report is more useful.

Showing if a ledger is double balanced and using the imbalance to make final entry

Shows if ledger is double balanced or not.


Not double balanced until as the total consumption tax entry has not been made yet. Note how the imbalance amount or the total tax shows the total consumption tax to be entered to make the ledger double balanced.

Applying and Reversing Consumption Tax

Apply a selected consumption tax rate or reverse an already applied tax to 0. Works on a selected Ledger journal entry line.

The ‘TAX Code’ column in the journal entry is just a convenience and is not used by any reports. What is in the actual ‘TAX’ column is the only data that counts. Leave or change back to ‘N/A, 0%’ on the ‘Choose Tax To Apply’ drop down to use this as default with Row+ when new journal entries are made. You can change the ‘Tax Code’ column of any entry anyway and you can make manual adjustments

Changing Ledger Date and Description

Change date of ledger and its description using first two edit boxes.

A date can also be associated with a journal entry, however Ledglive currently does not use a journal entry date for any reports. Please see link above.

Changing Viewed Ledger by ID

Choose a different ledger to display by ID using third box above. ‘Fixed Ledger ID: …’ below box lets you know the ID of the currently shown ledger with journal entries. The ID does not need to be in the current date range. A very convenient to navigate between journal entries is to enter a number in this box, press enter to view ledger by ID, press ‘»’ above to view what you were looking at before and then just press enter in the box again to view by ID again.

How to change accounts of multiple journal entries in a few seconds

Four boxes in a line here. Works in a similar manner to Row+ account search box. Can all be set to different entities and the entity account choice is remembered by the browser.

  • Search and select whatever entity account you want. The ‘Account Title’ text in the selected row has a darker background.
  • Choose Ledger journal entry row
  • Press enter in search box and the account is changed for the journal
  • Above action moves journal entry selected to the next row or to top if on last row
  • Press enter again to re apply selected account account
  • OR search for new account and press enter twice to apply
  • Escape moves to next row or to top if on last row if the selected row

So in a few seconds you can change or leave the accounts of multiple journal entries of a ledger.


Updating Journal entry description, debit, credit and consumption tax quickly

Each journal line entry for a ledger has, as shown above

  1. A tick box (when ticked then button Row- removes all journal entries with this box ticked)
  2. A Journal entry description as text
  3. Debit amount (always >=0)
  4. Credit amount (always >=0). As discussed, both a credit and debit is allowed, for your convenience if your rules allow it
  5. Tax amount (can be + or -) that is important for reporting. Negative indicates a tax on a credit amount and positive a tax on a debit amount
  6. A private proportion as a percentage
  7. A journal date independent of ledger date that does not need to be filled in and is not currently used for reporting
  8. An account title that is easily editable in row sequence in four account search boxes above
  9. An entity (or account owner) that is part of account
  10. A tax code that is for convenience and is not currently used for reporting

For columns two to six of journal entry an edit must be accompanied by some action that confirms the edit. Please see section following.

Confirming text and numeric edits. Clicking outside is not sufficient

The project has focussed on making data entry quick and convenient for PC users using a keyboard.

For use on a mobile phone two major changes are required

  1. Layout need to change for mbile phone use. This would also be convenient for PCs with low resolution screens
  2. An unobtrusive popup to replace confirming actions below, to avoid inconvenient equivalent action of a mobile phone pop up keyboard

This applies to columns two to six of a journal entry and other edit boxes

Confirming is very simple. Press

  • Enter (navigates to description box of next row if there is a row below)
  • Forward Tab (Tab)
  • Backward Tab (Shift + Tab)
  • Down Arrow (navigates to same box in row below if there is a row below)
  • Up Arrow (navigates to same box in row above if there is a row above)

Clicking outside an edit box before a confirming action cancels the edit

The Escape key will also cancel edits and make the edit box lose focus

Chart of Accounts for Opal Trader

The ID in the database is arbitrary but has been chosen to match a conventional chart of accounts

  1. The last four digits are a conventional COA (chart of accounts) account number starting with 1 for asset, 2 for liability…
  2. The digits before the last four digits are the entity ID and is the same digits as for the accountowner_id.

So the ID for the ‘Other Current Assets’ account below is 11010. The last four digits, 1010, is the account number with the first 1 representing an asset account. There is one digit before the last four digits, it is 1 and this the accountowner_id, 1, for opaltrader.

Accountowner_id is 2 for Mr Opal and 3 for Ms. Opal. The accountowner identifies an owning entity.

<ledglive> db r -t account # use ledglive in database mode to read table with name account
npx ts-node app db r -t account
using external certs
LL (LedgLive) Server and Client, https://ledglive.io, v0.1.0
0 {"id":11010,"number":null,"reconciled":null,"title":"Other Current Assets","accountowner_id":1,"accounttype_id":1,"openingbalance":1000}
1 {"id":11110,"number":null,"reconciled":null,"title":"Bank","accountowner_id":1,"accounttype_id":1,"openingbalance":10000}
2 {"id":11120,"number":null,"reconciled":null,"title":"Merchant Account","accountowner_id":1,"accounttype_id":1,"openingbalance":1000}
3 {"id":11130,"number":null,"reconciled":null,"title":"Cash","accountowner_id":1,"accounttype_id":1,"openingbalance":4000}
4 {"id":11210,"number":null,"reconciled":null,"title":"Accounts Receivable Debtors","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
5 {"id":11310,"number":null,"reconciled":null,"title":"Stock","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
6 {"id":11420,"number":null,"reconciled":null,"title":"Consumption Tax Paid With Purchases","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
7 {"id":11423,"number":null,"reconciled":null,"title":"Private Consumption Tax Paid With Purchases","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
8 {"id":11510,"number":null,"reconciled":null,"title":"Other Non-Current Assets","accountowner_id":1,"accounttype_id":1,"openingbalance":20000}
9 {"id":11520,"number":null,"reconciled":null,"title":"Furniture and Fittings","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
10 {"id":11530,"number":null,"reconciled":null,"title":"Office Equipment","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
11 {"id":11540,"number":null,"reconciled":null,"title":"Plant and Machinery","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
12 {"id":11550,"number":null,"reconciled":null,"title":"Company Car","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
13 {"id":12010,"number":null,"reconciled":null,"title":"Other Current Liabilities","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
14 {"id":12110,"number":null,"reconciled":null,"title":"Bank Overdraft","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
15 {"id":12210,"number":null,"reconciled":null,"title":"Accounts Payable Creditors","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
16 {"id":12310,"number":null,"reconciled":null,"title":"Dividends Payable","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
17 {"id":12410,"number":null,"reconciled":null,"title":"Other Tax","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
18 {"id":12420,"number":null,"reconciled":null,"title":"Consumption Tax Collected From Sales","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
19 {"id":12423,"number":null,"reconciled":null,"title":"Private Consumption Tax Collected From Sales","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
20 {"id":12510,"number":null,"reconciled":null,"title":"Other Non-Current Liabilities","accountowner_id":1,"accounttype_id":1,"openingbalance":0}
21 {"id":12520,"number":null,"reconciled":null,"title":"Loans from Mr Opal","accountowner_id":1,"accounttype_id":2,"openingbalance":-3000}
22 {"id":12530,"number":null,"reconciled":null,"title":"Loans from Ms Opal","accountowner_id":1,"accounttype_id":2,"openingbalance":0}
23 {"id":13110,"number":null,"reconciled":null,"title":"Equity","accountowner_id":1,"accounttype_id":3,"openingbalance":-33000}
24 {"id":13310,"number":null,"reconciled":null,"title":"Dividends","accountowner_id":1,"accounttype_id":3,"openingbalance":0}
25 {"id":14010,"number":null,"reconciled":null,"title":"Other Revenue","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
26 {"id":14020,"number":null,"reconciled":null,"title":"Interest from loans made or deposits","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
27 {"id":14210,"number":null,"reconciled":null,"title":"Other Rough Opal Sales","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
28 {"id":14220,"number":null,"reconciled":null,"title":"Other Finished Opal Sales","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
29 {"id":14320,"number":null,"reconciled":null,"title":"Private Sales","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
30 {"id":14510,"number":null,"reconciled":null,"title":"Retailer A Sales","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
31 {"id":14520,"number":null,"reconciled":null,"title":"Retailer B Sales","accountowner_id":1,"accounttype_id":4,"openingbalance":null}
32 {"id":15001,"number":null,"reconciled":null,"title":"Profit/Loss (Retained Earnings/Losses)","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
33 {"id":15010,"number":null,"reconciled":null,"title":"Other Expenses","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
34 {"id":15020,"number":null,"reconciled":null,"title":"Bank Account Fees","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
35 {"id":15030,"number":null,"reconciled":null,"title":"Interest from loans given","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
36 {"id":15110,"number":null,"reconciled":null,"title":"Rent","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
37 {"id":15120,"number":null,"reconciled":null,"title":"Wages/Salaries","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
38 {"id":15130,"number":null,"reconciled":null,"title":"Utilities","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
39 {"id":15140,"number":null,"reconciled":null,"title":"Company Car Expenses","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
40 {"id":15142,"number":null,"reconciled":null,"title":"Website Hosting","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
41 {"id":15210,"number":null,"reconciled":null,"title":"Advertising","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
42 {"id":15211,"number":null,"reconciled":null,"title":"Freight","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
43 {"id":15310,"number":null,"reconciled":null,"title":"Depreciation","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
44 {"id":15320,"number":null,"reconciled":null,"title":"Private Purhases","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
45 {"id":15325,"number":null,"reconciled":null,"title":"Private Depreciation","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
46 {"id":15520,"number":null,"reconciled":null,"title":"COG Other Rough Opal Purchases","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
47 {"id":15530,"number":null,"reconciled":null,"title":"COG Other Finsished Opal Purchases","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
48 {"id":15540,"number":null,"reconciled":null,"title":"COG Miner A Purchases","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
49 {"id":15550,"number":null,"reconciled":null,"title":"COG Miner B Purchases","accountowner_id":1,"accounttype_id":5,"openingbalance":null}
50 {"id":21010,"number":null,"reconciled":null,"title":"Other Currrent Assets","accountowner_id":2,"accounttype_id":1,"openingbalance":-1000}
51 {"id":21110,"number":null,"reconciled":null,"title":"Bank","accountowner_id":2,"accounttype_id":1,"openingbalance":10000}
52 {"id":21130,"number":null,"reconciled":null,"title":"Cash","accountowner_id":2,"accounttype_id":1,"openingbalance":1000}
53 {"id":21510,"number":null,"reconciled":null,"title":"Other Non-Current Assets","accountowner_id":2,"accounttype_id":1,"openingbalance":0}
54 {"id":21520,"number":null,"reconciled":null,"title":"Loans to Opal Trader","accountowner_id":2,"accounttype_id":1,"openingbalance":3000}
55 {"id":22010,"number":null,"reconciled":null,"title":"Other Current Liabilities","accountowner_id":2,"accounttype_id":1,"openingbalance":0}
56 {"id":22120,"number":null,"reconciled":null,"title":"Credit Card","accountowner_id":2,"accounttype_id":2,"openingbalance":-1000}
57 {"id":22510,"number":null,"reconciled":null,"title":"Loans from Bank","accountowner_id":2,"accounttype_id":2,"openingbalance":0}
58 {"id":22511,"number":null,"reconciled":null,"title":"Loans from Ms Opal","accountowner_id":2,"accounttype_id":2,"openingbalance":0}
59 {"id":24010,"number":null,"reconciled":null,"title":"Other Revenue","accountowner_id":2,"accounttype_id":4,"openingbalance":null}
60 {"id":25010,"number":null,"reconciled":null,"title":"Other Expenses","accountowner_id":2,"accounttype_id":5,"openingbalance":null}
61 {"id":31010,"number":null,"reconciled":null,"title":"Other Currrent Assets","accountowner_id":3,"accounttype_id":1,"openingbalance":-1000}
62 {"id":31110,"number":null,"reconciled":null,"title":"Bank","accountowner_id":3,"accounttype_id":1,"openingbalance":10000}
63 {"id":31130,"number":null,"reconciled":null,"title":"Cash","accountowner_id":3,"accounttype_id":1,"openingbalance":1000}
64 {"id":31510,"number":null,"reconciled":null,"title":"Other Non-Current Assets","accountowner_id":3,"accounttype_id":1,"openingbalance":0}
65 {"id":31520,"number":null,"reconciled":null,"title":"Loans to Opal Trader","accountowner_id":3,"accounttype_id":1,"openingbalance":0}
66 {"id":31521,"number":null,"reconciled":null,"title":"Loans to Mr Opal","accountowner_id":3,"accounttype_id":1,"openingbalance":0}
67 {"id":32010,"number":null,"reconciled":null,"title":"Other Current Liabilities","accountowner_id":3,"accounttype_id":1,"openingbalance":0}
68 {"id":32120,"number":null,"reconciled":null,"title":"Credit Card","accountowner_id":3,"accounttype_id":2,"openingbalance":-1000}
69 {"id":32510,"number":null,"reconciled":null,"title":"Loans from Bank","accountowner_id":3,"accounttype_id":2,"openingbalance":0}
70 {"id":34010,"number":null,"reconciled":null,"title":"Other Revenue","accountowner_id":3,"accounttype_id":4,"openingbalance":null}
71 {"id":35010,"number":null,"reconciled":null,"title":"Other Expenses","accountowner_id":3,"accounttype_id":5,"openingbalance":null}

More

Please see guides.