1
0
Fork 0
Browse Source

2022-02-08

master
tomleegough 2 years ago
commit
03e7d4b9b0
  1. BIN
      __pycache__/pelicanconf.cpython-37.pyc
  2. BIN
      __pycache__/pelicanconf.cpython-39.pyc
  3. 14
      content/articles/-blog_ideas.md
  4. 14
      content/articles/2018-09-23_gnucash.md
  5. 59
      content/articles/2021-01-03_accounting_systems.md
  6. 47
      content/articles/2021-01-12_sage_to_netsuite.md
  7. 32
      content/articles/2021-01-26 - api_ftp_csv_wtf.md
  8. 131
      content/articles/2021-01-26 - python_basics.md
  9. 18
      content/articles/2021-04-11_the_goal.md
  10. 63
      content/articles/2021-07-27_accounting_database_design.md
  11. 22
      content/articles/2021-10-03_why_virtual_fd_cfo.md
  12. 18
      content/pages/about.md
  13. 11
      content/pages/meta.md
  14. 32
      content/pages/services.md
  15. 12
      content/pages/software.md
  16. 1
      output
  17. 47
      pelicanconf.py
  18. 14
      tlg-theme/example-templates/archives.html
  19. 67
      tlg-theme/example-templates/article.html
  20. 8
      tlg-theme/example-templates/author.html
  21. 12
      tlg-theme/example-templates/authors.html
  22. 59
      tlg-theme/example-templates/base.html
  23. 12
      tlg-theme/example-templates/categories.html
  24. 8
      tlg-theme/example-templates/category.html
  25. 28
      tlg-theme/example-templates/index.html
  26. 27
      tlg-theme/example-templates/page.html
  27. 11
      tlg-theme/example-templates/pagination.html
  28. 14
      tlg-theme/example-templates/period_archives.html
  29. 7
      tlg-theme/example-templates/tag.html
  30. 12
      tlg-theme/example-templates/tags.html
  31. 1
      tlg-theme/static/css/spectre-exp.min.css
  32. 1
      tlg-theme/static/css/spectre-icons.min.css
  33. 1
      tlg-theme/static/css/spectre.min.css
  34. 79
      tlg-theme/static/css/style.css
  35. 13
      tlg-theme/templates/archives.html
  36. 67
      tlg-theme/templates/article.html
  37. 8
      tlg-theme/templates/author.html
  38. 12
      tlg-theme/templates/authors.html
  39. 85
      tlg-theme/templates/base.html
  40. 12
      tlg-theme/templates/categories.html
  41. 8
      tlg-theme/templates/category.html
  42. 28
      tlg-theme/templates/index.html
  43. 27
      tlg-theme/templates/page.html
  44. 11
      tlg-theme/templates/pagination.html
  45. 14
      tlg-theme/templates/period_archives.html
  46. 14
      tlg-theme/templates/tag.html
  47. 12
      tlg-theme/templates/tags.html

BIN
__pycache__/pelicanconf.cpython-37.pyc

Binary file not shown.

BIN
__pycache__/pelicanconf.cpython-39.pyc

Binary file not shown.

14
content/articles/-blog_ideas.md

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
Title: Blog ideas
Date: 2021-01-01
Tags: Accounting, Software, Case Study, FOSS,
Summary:
Status: draft
- [x] API, FTP, CSV, WTF!
- [ ] Xero API Intro
- [x] Book Review - The Goal
- [ ] Book Review - Management book, Intel
- [ ] Companies House API
- [ ] What does an Accountant do?
- [ ] Sales are vanity, profit is sanity, cash is reality
- [ ]

14
content/articles/2018-09-23_gnucash.md

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
Title: Gnucash
Date: 2018-09-23
Tags: FOSS, Accounting, Software
Summary: Gnucash - Personal Finance Software
I'm a big fan of FOSS software in general. One of my favourites and most used pieces of software is [Gnucash](https://gnucash.org). I've been using Gnucash to manage my personal finances for years. It's reasonably simple to understand how it operates. I've not read the documentation, but have been able to figure most of it out.
My workflow usually consists of me entering cash data onto the [Android](https://play.google.com/store/apps/details?id=org.gnucash.android&hl=en_US) app and importing that data and bank statement data into the desktop app. I can then allocate funds accuratley and quickly. Gnucash is able to associate descriptions from your bank statements with Gnucash categories to speed things up. Great if one description always matches up with the correct category. Not so much if the description has different categories.
My main area of criticism with Gnucash is the reporting. However, reporting across the board on accounting products is weak. Wether that's accountants like thier own reports, or are protecting their jobs by writing their own Excel reports - I'm not sure. The reports are passable, however, a report I'd really like is a time series cashflow. Gnucash can produce a total for a period, but not a time series, so I have to enter the data onto a spreadsheet - classic accountant. I'm sure I could write the report I want for Gnucash (it's FOSS after all), but I don't have the intellectual capacity, nor the programming skills at this time.
It's also not got a web front end, and the mysql database is experiental. Which means it's not great if you want multiple logins, or to use different machines, or use a server.
Still, for personal finance, where you are the only user, it's great. I've look around and have nto found anything that is close to this comprehensive without being overwhelming and non-free.

59
content/articles/2021-01-03_accounting_systems.md

@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
Title: Migrating Accounting Systems
Date: 2021-01-03
Tags: Accounting, Software
Summary: What is the process for migrating accounting systems?
Whether implementing an accounting system like [Xero](https://xero.com) for the first time, or migrating to or from other software, you'll need to follow the correct steps.
0. Plan, plan, plan
1. Choosing the software
2. Timing
3. Training
4. Static data
5. Opening balances
## Plan, plan, plan
Planning is essential for migrating to new accounting software. It's a bit cliche, but it goes a long way. Implmenting accounting software is a relatively straight forward process and many pieces of software have built in guides to follow. This guide should help you with the broad outline common to many different software setups.
## Choosing the software
You need to choose the right software for your business. I will cover some aspects of choosing different software in another post. For now, common considerations are:
- Cloud vs on-premises
- Size of your organisation
- Maturity of finance function
- Your existing processes
Moving accounting systems can be quite onerous depending on your existing processes, so it is important to consider how long you might use the software for.
## Timing
Choosing the timing is really part of the planning phase. There are particular break points that lend themselves to migrating accounting system. Those times are:
- Year End (Best)
- VAT Quarter End
- Month End
- Mid-month (Worse, don't do this)
THe main difference between the different timings are the opening balances.
Year ends are a good time migrate because it is a clear cut-off from old system to new system. If you are a smaller company, it also gives solid opening balances as these can be confirmed by your accountant. Whilst a year end is the best time to make the switch, however, your business may want to have the accounting system in sooner, so aligning with the VAT quarter might be more suitable.
When migrating at a VAT quarter end, you would perform a VAT return in your old software. Any open invoices in last VAT return would be bought over with an "out of scope" tax code. This will mean that it is not included on any future VAT returns.
## Training
No one likes to feel that they don't know what they are doing. Moving to new software can often leave staff behind. Training is one of the most important tasks, without adequate training it doesn't really matter how good the system or data are, you won't be able to use the software's full potential.
## Static data
Static data can be prepared well in advance. Examples of static data are: customer and supplier records, nominal codes, stock items, and employees. All of these can be arranged into the correct format ready for import or entry. Any changes after the initial preparation can then be easily updated.
I would recommend preparing spreadsheets of static data to import into your new software. This might be easier if you are migrating from one accounting package to another. A spreadsheet gives you the opportunity to check over the data and make changes as required before importing into the new software.
## Opening balances
The last data to prepare are the opening balances. This gives you the starting point for your new system. The opening balances are your trial balance at the end of the last day in your old accounting system. Your accountant should be able to help you with these figures. Migrating from one system to another is easier as you should be able to export a trial balance from the old system, it would then be acase of entering the data manually or importing the data. You will also need to enter all opening invoices into the new system. Usually, the balances of debtors and creditor ledgers would get posted to the suspense nominal, with the open invoiecs posted there too, so that the values cancel out.
A note on comparatives - In most cases, some comparative data are brought over. Xero normally takes they final trial balance for the last two years, so that there is something to compare against. Depending on date of your opening balances, you might bring over monthly trial balances for the current financial year. I recently migrated a client from [Sage50](https://www.sage.com/en-gb/products/sage-50cloud/) to [Oracle's Netsuite](https://www.netsuite.com/portal/home.shtml). We bought over 7 years worth of monthly trial balances, covering several legal entities. This was very ambitious, but provided some very good comparative data. [More here]({filename}/articles/2021-01-12_sage_to_netsuite.md)

47
content/articles/2021-01-12_sage_to_netsuite.md

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
Title: Migrating from Sage to Netsuite
Date: 2021-01-12
Tags: Accounting, Software, Case Study
Summary: One customers journey from Sage50 to Netsuite
In early 2020, I migrated a client from [Sage50](https://www.sage.com/en-gb/products/sage-50cloud/) to [Oracle's Netsuite](https://www.netsuite.com/portal/home.shtml). Read about how the project was implemented.
## Background
The client is a fast growing organisation made up of several trading legal entities. The organisation was characterised by low value, high volume transactions. Sage50 was becoming a hinderence to good decision making and becoming onerous for the finance team.
Each of the client's locations were operated under a separate legal entity. However, this was making reporting difficult in Sage as each legal entity has it's own instance of Sage. Creating consolidated accounts means exporting data out as a csv file and having some monster reporting spreadsheet. Because Sage treats each legal entity separately, the finance team were frequently having to log in and out of Sage to change companies.
Sage50 can be backed up to the cloud, but does not offer a good hosted solution. This means that you need to have good, frequent backups. If you don't, it could go very wrong. Xero and Netsuite are both examples of cloud software, meaning that they are on the internet and someone else will back up the data. Sage50 cannot be used remotely, so can be difficult if there is a need for staff to work offsite.
The client has lots of different sytems and pieces of software in use and wanted as many as possible to be automated. Sage50 doesn't relly have the capability to automate data entry. Various data can be imported, but these are manually done. It's better than nothing, but software like Xero and Nesuite are better options.
The main criteria of the new software were:
- Consolidated accounts
- Strong reporting
- Scope for automation
- Off premises
After looking at a number of different providers, the client settled on Netsuite being the right price and mix of the above criteria. Netsuite cannot be bought directly, it needs to be bought through a partner. I wil cover the alternatives in another post.
## Results
Netsuite dramatically improved the reporting within the finance function. The implementation came in on time and within budget. The opening balance date was aligned to the end of a VAT quarter. Aligning to a year end wasn't feasible. Under these circumstances, one would normally have comparative trial balances for each month within the financial year and maybe some year end balances. The trial balance date was 31st Jan, with the year end being 31st Oct. So trial balances for Nov, Dec, and Jan would be the norm. However, we imported a trial balance for every month covering 7 years of trade for multiple legal entities.
### Trial balances
Sage50 has the ability to export csv files containing data. It would not have been feasible to export each trial balance manually to cover the required time period. At least two entities had 7 years worth of data, this would mean exporting at least 170 trial balances. To get the Sage balances in the correct Netsuite format, I exported the data from Sage and wrote a small Python script to read the csv and write a new csv in the correct format for Netsuite. Once the script had been written, it could be run and re-run for any data tweeks before final import to Netsuite. The code took about half a day to write, but saved many hours of manipulating data in a spreadsheet.
### Nominal codes
Sage50 has a four digit code to represent the nominal code, Netsuite is a bit more flexible. The client want to take the opportunity to revise some of the chart of accounts. The old chart of accounts was not consistent over the different Sage entities and was largely the standard chart of accounts that Sage provides. They wanted a consistent chart of accounts and something more fit for purpose. After designing a new chart of accounts, we creating a mapping table to map from the old codes to the new codes. This could then be read by the script above so that the trial balances used the new coding.
### Automation
Due to the high volume, low vale of transactions, the client wanted to have sales imported from the EPOS system into the accounting software. Under Sage, this was done on a weekly basis. The EPOS software did not provide an API, so we wrote a script to crawl over the EPOS provider's back office website and generate an import file. I had previously written this script to generate an import for Sage, so was able to modify slightly to match Netsuite.
Most of the companies bookings were made through an online customer portal. Deposists are taken and then redeemed through the EPOS when a customer is on site. As the deposts were non-refundable, the VAT point was the date of the deposit which complictes the book-keeping slightly. This service did provide an API, so I wrote a script to generate an import file for Netsuite.
The last of the major integrations was for the client's purchasing system. The purchasing system held all orders, delivery notes, and invoices and did three-way matching. Once a day, the software would deposit a csv of invoices onto an FTP server. The integration for this was written by the third party provider as they had experience of this.
These integrations were all run from an AWS EC2 instance specifically created for the purpose of hosting integrations. The EPOS and deposit automations were written in Python and run on a cronjob.

32
content/articles/2021-01-26 - api_ftp_csv_wtf.md

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
Title: API, FTP WTF!
Date: 2021-01-26
Tags: Accounting, Software, Technology
Summary: Your guide to automation in accounting
Automating your accounting (and other) systems can be great for your business. It can help you get more done and with fewer errors. In order to get something automated, data needs to be retrieved from one and put into another. I wil describe two common methods.
## Application Programming Interface (API)
An API is a method for receiving and sending data in a programming context. Many API are accessible over the internet. The easist way of thinking of an API is like a website. With a website the process is:
1. Open Browser and enter web address (Request)
2. Server presents the website code (Response)
3. Browser renders the code (Action)
When you visit a website, you initiate a request and the browser and webserver perform some actions. A similar process happens with an API:
1. Send or request data from server (Request)
2. Get the data back (Response)
3. Do something with the data (Action)
All an API does is provide a route to getting data in and out of software. An API just sits there until something interacts with it. I will write a future post with some API examples.
## File Transfer Protocol (FTP)
FTP is a method for transferring files. Typically, in an FTP integration the process is that some software deposits a CSV file onto the FTP server. That server then may process the file futher or wait for another service to process the file. FTP integrations are usually used in conjunction with an API.
Let's say that you wanted to automate data transfer between Procure Wizard and Xero. In Procure Wizard, you can set a schedule to export invoices on a daily basis. However, the Xero API would not know that your invoices are waiting to be imported. You would need some code on your FTP server to take the Procure Wizard file and assemble it into the appropriate format for Xero.
## Conclusion
API and FTP aren't automations in themselves. They are methods for getting data in and out of software that can be automated. An automation might involve both API and FTP, or just one. But will definitely involve two bits of software...

131
content/articles/2021-01-26 - python_basics.md

@ -0,0 +1,131 @@ @@ -0,0 +1,131 @@
Title: Python Basics
Date: 2021-01-31
Tags: Python, Software, Technology
Summary: Basic Python concepts
In some future posts, I will make worked examples of API interactions and some automations. My preferred programming language is [Python](https://python.org). I cannot remember why I chose to learn Python, but it was pretty strightforward to pick up. I initially learned about coding when recording macros within Excel, then trying to improve them by writing the VBA (Visual Basic). In this post, I will cover some of the basic concepts that I will use in later posts.
I won't cover installing Python or running Python on your system. There are lots of tutorials and guides out there and that's part of the fun of learning a new programming language. For reference, I mostly use Debian (operating system) and Python 3.
## General
Python uses whitespace to separate out code. Broadly, one piece of logic per line is best. It makes it easier to understand.
Python also uses indents to group code together:
~~~
def some_function(i):
does something to i
returns result
~~~
~~~
def another_function(a):
this function is different to above
return result
~~~
## Variables
Any one that has taken GCSE maths would have come across variables. It's not a popular subject, but algebra is all variables. A variable is a container. In algebra it is a number, in programming it can be anything. For example, the formula *Y = X<sup>2</sup> + 4* both **Y** and **X** are variables. To plot a graph of **Y**, you would plug values into **X** and solve for **Y**.
Here's how you can assign a variable in Python:
~~~
# assign a string to a variable called "name"
name = 'guitar'
# assign a number to a variable
strings = 6
# assign a list to a variable
types = ['electric', 'acoustic']
~~~
## Arrays
An array is a collection of data. Python has several types. I mainly use lists and dicts.
### Lists
Lists are pretty simple. A list is a series of items that are separated by commas within square brackets. They can contain any data types, and can be mixed.
~~~
# list of strings
['hello', 'this', 'is', 'a', 'string']
# list of numbers
[1, 2, 3, 4.5, 6.7 ]
# list of variables
[first, second, third]
# mix list
['string', string, '1', 1]
~~~
### Dicts / JSON
A dict (or dictionary) is a more comprevensive data item. The syntax is reasonably easy to understand, and features heavily when dealing with API. Javascript has a similar array type called JSON (JavaScript Object Notation). Many API will return a JSON object for you to use.
Again, dicts can hold all different types of data. However, the most interesting part of a dict is that each data item has a key. The key refers to the data stored. A dict is how one might intuitively think of a database record. Of course, you can have lists of dicts.
Not all dicts in a list have to have the same keys, but it is useful if they do.
~~~
books = [
{
'title': '1984',
'author': 'George Orwell'
},
{
'title': 'Brave New World',
'author': 'Aldous Huxley'
}
]
~~~
## Functions
A function is an action that you regularly perform within a script. This saves you time in your code, as you only have to write the thing once. There are lots of built in functions in Python, you will definitely write your own.
Using the formula from above, we could write it as a function:
~~~
def solve_y(x):
y = (x * x) + 4
return y
~~~
Functions start *def* then the name of the function followed by brackets and a colon. In the example we can pass a number to the function and the function performs the action. The "return" part means that the function will give the result of the function back. This can be assigned to a variable or something else.
Here are some results for our function:
~~~
>>> solve_y(4)
20
>>> solve_y(2)
8
~~~
Our *solve_y* function can be writted using the in-built power function. It raises any number to the power of another number:
~~~
def solve_y(x):
y = pow(x, 2) + 4
return y
~~~
In our particular case, it doesn't really make it a lot simpler. However, it a bit clearer from a BODMAS point of view.
### For Loop
**For loops** are used lots. A for loop iterates over an item, assigning each of results to a variable. It's kind of hard for non-programmers to get your head around, however, it very powerful. Here are some examples:
~~~
>>> for i in range(5):
... i
...
0
1
2
3
4
~~~
**range(x)** is a function that returns numbers incremented by 1. The range function starts at 0 by default and will count the number of items. Our for loop will assign the result of the range function to the variable i. This is then displayed on the screen.

18
content/articles/2021-04-11_the_goal.md

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
Title: The Goal
Date: 2021-04-11
Tags: Accounting
Summary: The Goal; Goldratt (1984)
I'm aware that I am a little late to the party. For those who don't know, The Goal was is an business novel, published in 1984. The Goal is relatively short and easy reading, which makes it pretty accessible. You will be able to pick up the concepts and themes without a strong cost accounting background.
The Goal follows Alex, a plant manager whose plant is in trouble. He meets with an old college tutor who guides him through saving his plant and marriage. The book outlines Goldratt's Theory of Constraints (TOC), which is covered very briefly in the CIMA accounting qualification. The idea behind TOC is that you identify the goal of the organisation (to make money), then align all the processes around doing that. Which seems pretty obvious.
I first read The Goal in 2012, as I was about to start a job in a manufacturing organisation. My new boss recommended I read it to get a little background to the challenges with cost accounting. I enjoyed it at the time and have just finished re-reading it, and it has raised a whole bunch of questions for me.
The thing that really struggled with was Goldratt's critique of cost accounting. There is a scene where two characters are talking about stock, they both agree that stock is a liability, but it appears on the balance sheet as an asset. I had to think a lot about that to understand it.
In non-manufacturing organisations the stock value is creating by debiting stock and crediting cash. You literally spend money to have stock to sell. It is really important not to have too much stock as it can easily swallow cash. In manufacturing organisations the book-keeping is debit stock, credit profit and loss. The credit to profit and loss is known as *transfers to inventory*. The transfers to inventory happen at standard cost, which is a budget cost of producing whatever the product is.
Goldratt's argument against cost accounting disputes what should be included in the standard cost versus what is a period cost to be borne by the organisation. He states that only the material cost should be included. Typically, cost accounting includes overheads, labour, depreciation, and a lot else. I am inclined to agree with Goldratt, but I think that the accounting standards say otherwise.
I would highly recommend reading The Goal. It gives a good insight into cost accounting and running an organisation, and doesn't seem too dated, given that it is not far off 40 years old. I think that a lot of the problems that are discussed and characters encountered are still around now.

63
content/articles/2021-07-27_accounting_database_design.md

@ -0,0 +1,63 @@ @@ -0,0 +1,63 @@
Title: Accounting Database Design
Date: 2021-07-27
Tags: Accounting
Summary: Database choices in accounting software
Over the past few years, I have been developing my own accounting software [Hermes](https://hermes.dev.huginn.uk). It has primarily been so that I can learn how to write software, but in an area where I know what the end product should look like. It's been an interesting process thinking about how the data interacts and what the structure should be.
Double entry book-keeping is great. It makes it easy to have some in-built checks in your database. However, that doesn't automatically translate into some good database design. When I say "good database design", I mean that I had issues trying to make a pure double-entry system work in my database. I don't mean good from the point of view of best practice.
When I first wrote Hermes, I wasn't sure what type of organisation or individual I was writing for. So I created a double-entry adjacent system. Every entry had to have an entry in a bank account. It was double entry in the sense that there were always to entries, but it wasn't particularly flexible. I was trying to mimic my workflow in Gnucash. Basically, I would import my bank statements and code the transactions from there. I think that some other software, [Akaunting](https://akaunting.com/), used this method too. I've not looked at Akaunting for a number of years now, so things might have changed.
What I really wanted in a database was a table that listed all of the transactions in a single table. It might looks something like this:
<table>
<tr>
<th>Date</th>
<th>Description</th>
<th>Nominal</th>
<th>DR</th>
<th>CR</th>
</tr>
<tr>
<td>2021-07-01</td>
<td>Spend Money</td>
<td>Bank</td>
<td></td>
<td>50</td>
</tr>
<tr>
<td>2021-07-01</td>
<td>Spend Money</td>
<td>Petrol</td>
<td>40</td>
<td></td>
</tr>
<tr>
<td>2021-07-01</td>
<td>Spend Money</td>
<td>Snacks</td>
<td>10</td>
<td></td>
</tr>
<tr>
<td>2021-06-30</td>
<td>June Salary</td>
<td>Salary</td>
<td></td>
<td>2000</td>
</tr>
<tr>
<td>2021-06-30</td>
<td>June Salary</td>
<td>Bank</td>
<td>2000</td>
<td></td>
</tr>
</table>
This is pretty easy to follow. However, the problem that I had with something like this is that if you had multiple bank accounts, anf you wanted to find the balancing transactions, it would be very hard. Sage50 has a transactions screen, where it lists all of the transactions, I was drawing some inspriation from there.
Gnucash is a fully double entry system. It separates out a journal into two parts: transaction and splits. The transaction element contains things that are common: the description, date, and currency. Where the splits contain the value, the account (nominal), and the line description. I did think that this was too complex, but now I understand why it was done that way. You can have a double entry system, and in the database, make a select on the splits to find the opposite entries.
After having a break from Hermes, and a think about the database design, I refactored Hermes to the Gnucash model. Having transactions and splits.

22
content/articles/2021-10-03_why_virtual_fd_cfo.md

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
Title: Why do you need a Virtual Finance Director?
Date: 2021-10-03
Tags: Accounting, Finance Director, FD, Chief Finance Officer, CFO
Summary: Reasons why you need a Virtual Finance Director in your business
Whether you call it a Finance Director (FD) or a Chief Finance Officer (CFO), you need someone doing this role in your business - here's why.
Most businesses have a bookkeeper or two, and have external accountants doing the annual accounts and your tax return. So why do you need a finance director? Afterall, you created your business. You're the one keeping an eye on the profitability of your company, and no-one knows it better than you.
Let's look at what bookkeepers and external accountants do. Bookkeepers are an essential admin role in the business: they process invoices, chase debt, pay suppliers, maybe do some payroll, the list goes on. Often times though, the amount that a bookkeeper can advise or analyse data is limited as they spend the bulk of their time performing administrative tasks. It's not really their job to provide robust analyses. The question for bookkeepers is whether or not something is *accurate* not if it is *relevant*.
External accountants primary purpose is to prepare year-end, or statutory, accounts. Their remit is not to comment on how well or not your company is doing, it is to make sure that you are compliant. Again, it is *accuracy* over *relevance*. Accountants have special wording in the accounts, that specifically states, they are only preparing the accounts for your benefit. They are not passing any judgement. A firm of accountants *might* make some observations about your accounts, but the relevance of that is likely to be low. If your company is like most others, the year-end accounts are filed several months after the year end. Which is *far* too late to do anything about it.
A finance director has a different skill set and can tell you how you can improve your company's performance. Whilst accuracy is important, *relevance* is given a lot more emphasis. Management accounts are *"the production of timely and relevant information."* A finance director can help guide your existing staff to create better accounts, quicker, and help you make better decisions. Companies exist only exist for one reason: to make money. Making money can be measured in different ways, but the most important is cash. If your cash is going up, that means that you're making money! A virtual finance director can help you make sure the cash keeps going up.
Try this out: take a look at your most recent accounts, preferably management accounts as these will be more detailed and up to date. Take your profit before interest, tax, and depreciation (EBITDA) - this is the amount of cash your business should have generated. Now take your cash and the start and cash at the end of the same period. Compare the two figures.
If your EBITDA is lower than the change in cash, then great! You've converted some of your balance sheet into cash.
If your EBITDA is higher than the change in cash, then there is some money being "lost" along the way. Maybe your debtors are up, that means you've made sales but not been paid. Creditors down? Then you've paid off suppliers. Stock up? You've been building stock levels. Some combination of all three? You might need to look at your credit terms with suppliers and customers, and look at why your stock is increasing.
A finance director can help you identify where the cash is going, and what you need to do about it. A full-time finance director is likely to be out of budget for you. That's where a Vitrual FD comes in. Having someone who understands how the different bits of finance interact, whilst still being able to pay for themselves. A Virtual FD should be seen as an investment not a business cost.

18
content/pages/about.md

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
title: About
url:
save_as:index.html
Founded in 2017, we aren't a normal accounting practice. We are a complete outsourced finance team.
Based in the North East, serving customers across the UK, we leverage the latest in IT and cloud technology to bring you financial information you can depend on.
Our aim is to give you and your business the finance team it deserves. No more unexpected accountancy bills. No more out of scope work. We aim to be an extension of your company and add real value.
We are a [CIMA](https://www.cimaglobal.com/About-us/Find-a-CIMA-Accountant/Tom-Lee-Gough-Accounting-13911/) practice, which means that we focus on giving you the tools you need to maximise your businesses performance.
We can work with you to:
- Understand your numbers
- Improve profit
- Simplify your finance function
- Ensure statutory compliance

11
content/pages/meta.md

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
Title: My super title
Date: 2010-12-03 10:20
Modified: 2010-12-05 19:30
Category: Python
Tags: pelican, publishing
Slug: my-super-post
Authors: Alexis Metaireau, Conan Doyle
Summary: Short version for index and feeds
Status: hidden
This is the content of my super blog post.

32
content/pages/services.md

@ -0,0 +1,32 @@ @@ -0,0 +1,32 @@
title: Services
As your outsourced finance team, we offer our clients different levels of support:
### Basic
- Bookkeeping
- MTD VAT filing
- Annual accounts
- Corporation Tax
### Standard
- Bookkeeping
- MTD VAT Filing
- Annual Accounts
- Corporation Tax
- Payroll and Pension
- Management Reviews
### Premium
- Bookkeeping
- MTD VAT filing
- Annual accounts
- Corporation Tax
- Payroll and pension
- Management Reviews
- Forecasts
- Budgeting
Want more or less? [Email us](mailto:info@tlg-accounting.co.uk) and start a discussion about how we can help your business.

12
content/pages/software.md

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
title: Software
### Xero
In November 2017, we became [Xero](http://www.xero.com) certified. Xero is cloud accounting software that takes the pain out of managing your finances. Xero allows you to access your accounts form anywhere on any device. It really can simplify your business accounting. It'll help take the sting out of [Making Tax Digital](https://www.gov.uk/government/publications/making-tax-digital/overview-of-making-tax-digital)
### Hermes Accounting
[Hermes](https://hermes.dev.huginn.uk) is your favourite grade 37 bureaucrat. It is also our very own, free cloud accounting software. Why not create an account and see what Hermes can do for you?
### Coseach
Do you follow companies on Companies House? Do you want a simpler tool to see data? Take a look at [Cosearch](https://cosearch.dev.huginn.uk). Cosearch was developed internally to see a summary of some of the Companies House data. It is under active development and updates are added regularly.
Want to know more? [Email us](mailto:info@tlg-accounting.co.uk)

1
output

@ -0,0 +1 @@ @@ -0,0 +1 @@
Subproject commit 005edddb9de530e9e1171bd5778667aed409833f

47
pelicanconf.py

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals
AUTHOR = 'Tom Lee-Gough'
SITENAME = 'tlg-accounting.co.uk'
SITEURL = 'https://tlg-accounting.co.uk'
PATH = 'content'
TIMEZONE = 'Europe/London'
DEFAULT_LANG = 'en'
# Feed generation is usually not desired when developing
FEED_ALL_ATOM = 'feed.rss'
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
# Blogroll
LINKS = (
('Email', 'mailto:info@tlg-accouting.co.uk'),
('CIMA', 'https://www.cimaglobal.com/About-us/Find-a-CIMA-Accountant/Tom-Lee-Gough-Accounting-13911/'),
('LinkedIn', 'https://www.linkedin.com/company/tlg-accounting/'),
('Hermes', 'https://hermes.dev.huginn.co.uk'),
('Xero', 'https://xero.com'),
('TOP', '#')
)
# Social widget
# SOCIAL = (
# ('Linkedin', 'https://linkedin.com/in/tom-lee-gough-9b9b3433'),
# ('Twitter', 'https://twitter.com/gidorahTLG')
# )
DEFAULT_PAGINATION = False
CSS_FILE = [
# 'spectre.min.css',
'style.css'
]
THEME = 'tlg-theme'
# Uncomment following line if you want document-relative URLs when developing
RELATIVE_URLS = True

14
tlg-theme/example-templates/archives.html

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Archives{% endblock %}
{% block content %}
<h1>Archives for {{ SITENAME }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
{% endblock %}

67
tlg-theme/example-templates/article.html

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
{% extends "base.html" %}
{% block html_lang %}{{ article.lang }}{% endblock %}
{% block title %}{{ SITENAME }} - {{ article.title }}{% endblock %}
{% block head %}
{{ super() }}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(article) %}
{{ translations.entry_hreflang(article) }}
{% endif %}
{% if article.description %}
<meta name="description" content="{{article.description}}" />
{% endif %}
{% for tag in article.tags %}
<meta name="tags" content="{{tag}}" />
{% endfor %}
{% endblock %}
{% block content %}
<section id="content" class="body">
<header>
<h2 class="entry-title">
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(article) }}
</header>
<footer class="post-info">
<time class="published" datetime="{{ article.date.isoformat() }}">
{{ article.locale_date }}
</time>
{% if article.modified %}
<time class="modified" datetime="{{ article.modified.isoformat() }}">
{{ article.locale_modified }}
</time>
{% endif %}
{% if article.authors %}
<address class="vcard author">
By {% for author in article.authors %}
<a class="url fn" href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>
{% endfor %}
</address>
{% endif %}
{% if article.category %}
<div class="category">
Category: <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
</div>
{% endif %}
{% if article.tags %}
<div class="tags">
Tags:
{% for tag in article.tags %}
<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>
{% endfor %}
</div>
{% endif %}
</footer><!-- /.post-info -->
<div class="entry-content">
{{ article.content }}
</div><!-- /.entry-content -->
</section>
{% endblock %}

8
tlg-theme/example-templates/author.html

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - Articles by {{ author }}{% endblock %}
{% block content_title %}
<h2>Articles by {{ author }}</h2>
{% endblock %}

12
tlg-theme/example-templates/authors.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Authors{% endblock %}
{% block content %}
<h1>Authors on {{ SITENAME }}</h1>
<ul>
{% for author, articles in authors|sort %}
<li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}

59
tlg-theme/example-templates/base.html

@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
<!DOCTYPE html>
<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
<head>
{% block head %}
<title>{% block title %}{{ SITENAME }}{% endblock title %}</title>
<meta charset="utf-8" />
{% for sheet in CSS_FILE %}
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/{{ sheet }}" />
{% endfor %}
{% if FEED_ALL_ATOM %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Full Atom Feed" />
{% endif %}
{% if FEED_ALL_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Full RSS Feed" />
{% endif %}
{% if FEED_ATOM %}
<link href="{{ FEED_DOMAIN }}/{%if FEED_ATOM_URL %}{{ FEED_ATOM_URL }}{% else %}{{ FEED_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
{% endif %}
{% if FEED_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_RSS_URL %}{{ FEED_RSS_URL }}{% else %}{{ FEED_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
{% if CATEGORY_FEED_ATOM and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_ATOM_URL %}{{ CATEGORY_FEED_ATOM_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_ATOM|format(category.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Categories Atom Feed" />
{% endif %}
{% if CATEGORY_FEED_RSS and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_RSS_URL %}{{ CATEGORY_FEED_RSS_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_RSS|format(category.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Categories RSS Feed" />
{% endif %}
{% if TAG_FEED_ATOM and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_ATOM_URL %}{{ TAG_FEED_ATOM_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_ATOM|format(tag.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Tags Atom Feed" />
{% endif %}
{% if TAG_FEED_RSS and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_RSS_URL %}{{ TAG_FEED_RSS_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_RSS|format(tag.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Tags RSS Feed" />
{% endif %}
{% endblock head %}
</head>
<body id="index" class="container">
<header id="banner" class="navbar mb-2">
<section class="navbar-section">
<a class="navbar-brand text-bold mr-2" href="{{ SITEURL }}/">{{ SITENAME }}</a>
{% for p in pages %}
<a class="btn btn-link" href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a>
{% endfor %}
<a class="btn btn-link" href="./feed.rss">RSS</a>
</section>
</header><!-- /#banner -->
<div class="container grid-md">
{% block content %}
{% endblock %}
</div>
</body>
</html>

12
tlg-theme/example-templates/categories.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Categories{% endblock %}
{% block content %}
<h1>Categories on {{ SITENAME }}</h1>
<ul>
{% for category, articles in categories|sort %}
<li><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}

8
tlg-theme/example-templates/category.html

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ category }} category{% endblock %}
{% block content_title %}
<h2>Articles in the {{ category }} category</h2>
{% endblock %}

28
tlg-theme/example-templates/index.html

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block content %}
<section id="content">
{% block content_title %}
<h2>all posts</h2>
{% endblock %}
<ul id="post-list">
{% for article in articles_page.object_list %}
<li><article class="hentry">
<header>
<h2 class="entry-title">
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}"># {{ article.title }}</a>
</h2>
</header>
<footer class="post-info">
<time class="published" datetime="{{ article.date.isoformat() }}"> {{ article.date.strftime("%Y-%m-%d") }} </time>
</footer><!-- /.post-info -->
<div class="entry-content"> {{ article.summary }} </div><!-- /.entry-content -->
</article></li>
{% endfor %}
</ul><!-- /#posts-list -->
{% if articles_page.has_other_pages() %}
{% include 'pagination.html' %}
{% endif %}
</section><!-- /#content -->
{% endblock content %}

27
tlg-theme/example-templates/page.html

@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
{% extends "base.html" %}
{% block html_lang %}{{ page.lang }}{% endblock %}
{% block title %}{{ SITENAME }} - {{ page.title }}{%endblock%}
{% block head %}
{{ super() }}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(page) %}
{{ translations.entry_hreflang(page) }}
{% endif %}
{% endblock %}
{% block content %}
<h1>{{ page.title }}</h1>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(page) }}
{{ page.content }}
{% if page.modified %}
<p>
Last updated: {{ page.locale_modified }}
</p>
{% endif %}
{% endblock %}

11
tlg-theme/example-templates/pagination.html

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
{% if DEFAULT_PAGINATION %}
<p class="paginator">
{% if articles_page.has_previous() %}
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}">&laquo;</a>
{% endif %}
Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
{% if articles_page.has_next() %}
<a href="{{ SITEURL }}/{{ articles_next_page.url }}">&raquo;</a>
{% endif %}
</p>
{% endif %}

14
tlg-theme/example-templates/period_archives.html

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - {{ period | reverse | join(' ') }} archives{% endblock %}
{% block content %}
<h1>Archives for {{ period | reverse | join(' ') }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
{% endblock %}

7
tlg-theme/example-templates/tag.html

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ tag }} tag{% endblock %}
{% block content_title %}
<h2>Articles tagged with {{ tag }}</h2>
{% endblock %}

12
tlg-theme/example-templates/tags.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Tags{% endblock %}
{% block content %}
<h1>Tags for {{ SITENAME }}</h1>
<ul>
{% for tag, articles in tags|sort %}
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}

1
tlg-theme/static/css/spectre-exp.min.css vendored

File diff suppressed because one or more lines are too long

1
tlg-theme/static/css/spectre-icons.min.css vendored

File diff suppressed because one or more lines are too long

1
tlg-theme/static/css/spectre.min.css vendored

File diff suppressed because one or more lines are too long

79
tlg-theme/static/css/style.css

@ -0,0 +1,79 @@ @@ -0,0 +1,79 @@
/** Fonts and Colours **/
*{
color: white;
}
.button:hover, .active{
background-color: white;
color: #133567;
}
.button{
border: 1px solid white;
}
html {
font-family: sans-serif;
background-color: #133567;
}
h1, h2{
font-family: serif;
margin-top: 10px;
}
/** Structure **/
.container{
max-width: 900px;
padding: 0;
margin: auto;
}
header, footer {
display: block;
}
nav{
width: 300px;
display: inline-block;
margin: 0;
padding: 0;
vertical-align: top;
}
.content{
max-width: 580px;
margin-left: 10px;
display: inline-block;
}
footer img{
height:50px;
}
.page-content{
padding: 0;
margin:0;
}
.button{
margin: 10px 0px;
padding:5px 10px;
text-align: center;
font-size:1.2em;
display: block;
text-decoration: none;
}
.hidden {
display: none;
}
@media only screen and (max-width: 650px){
nav {
width: 100%;
}
}

13
tlg-theme/templates/archives.html

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Archives{% endblock %}
{% block content %}
<h1>Blog posts</h1>
<dl>
{% for article in dates %}
<dt>{{ article.date.strftime("%Y-%m-%d") }} <a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dt>
{% endfor %}
</dl>
{% endblock %}

67
tlg-theme/templates/article.html

@ -0,0 +1,67 @@ @@ -0,0 +1,67 @@
{% extends "base.html" %}
{% block html_lang %}{{ article.lang }}{% endblock %}
{% block title %}{{ SITENAME }} - {{ article.title }}{% endblock %}
{% block head %}
{{ super() }}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(article) %}
{{ translations.entry_hreflang(article) }}
{% endif %}
{% if article.description %}
<meta name="description" content="{{article.description}}" />
{% endif %}
{% for tag in article.tags %}
<meta name="tags" content="{{tag}}" />
{% endfor %}
{% endblock %}
{% block content %}
<section id="content" class="body">
<header>
<h2 class="entry-title">
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark"
title="Permalink to {{ article.title|striptags }}">{{ article.title }}</a></h2>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(article) }}
</header>
<footer class="post-info">
<time class="published" datetime="{{ article.date.isoformat() }}">
{{ article.locale_date }}
</time>
{% if article.modified %}
<time class="modified" datetime="{{ article.modified.isoformat() }}">
{{ article.locale_modified }}
</time>
{% endif %}
{% if article.authors %}
<address class="vcard author">
By {% for author in article.authors %}
<a class="url fn" href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a>
{% endfor %}
</address>
{% endif %}
{% if article.category %}
<div class="category">
Category: <a href="{{ SITEURL }}/{{ article.category.url }}">{{ article.category }}</a>
</div>
{% endif %}
{% if article.tags %}
<div class="tags">
Tags:
{% for tag in article.tags %}
<a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a>
{% endfor %}
</div>
{% endif %}
</footer><!-- /.post-info -->
<div class="entry-content">
{{ article.content }}
</div><!-- /.entry-content -->
</section>
{% endblock %}

8
tlg-theme/templates/author.html

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - Articles by {{ author }}{% endblock %}
{% block content_title %}
<h2>Articles by {{ author }}</h2>
{% endblock %}

12
tlg-theme/templates/authors.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Authors{% endblock %}
{% block content %}
<h1>Authors on {{ SITENAME }}</h1>
<ul>
{% for author, articles in authors|sort %}
<li><a href="{{ SITEURL }}/{{ author.url }}">{{ author }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}

85
tlg-theme/templates/base.html

@ -0,0 +1,85 @@ @@ -0,0 +1,85 @@
<!DOCTYPE html>
<html lang="{% block html_lang %}{{ DEFAULT_LANG }}{% endblock html_lang %}">
<head>
{% block head %}
<title>{% block title %}{{ SITENAME }}{% endblock title %}</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
{% for sheet in CSS_FILE %}
<link rel="stylesheet" href="{{ SITEURL }}/{{ THEME_STATIC_DIR }}/css/{{ sheet }}" />
{% endfor %}
{% if FEED_ALL_ATOM %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_ATOM_URL %}{{ FEED_ALL_ATOM_URL }}{% else %}{{ FEED_ALL_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Full Atom Feed" />
{% endif %}
{% if FEED_ALL_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_ALL_RSS_URL %}{{ FEED_ALL_RSS_URL }}{% else %}{{ FEED_ALL_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Full RSS Feed" />
{% endif %}
{% if FEED_ATOM %}
<link href="{{ FEED_DOMAIN }}/{%if FEED_ATOM_URL %}{{ FEED_ATOM_URL }}{% else %}{{ FEED_ATOM }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Atom Feed" />
{% endif %}
{% if FEED_RSS %}
<link href="{{ FEED_DOMAIN }}/{% if FEED_RSS_URL %}{{ FEED_RSS_URL }}{% else %}{{ FEED_RSS }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} RSS Feed" />
{% endif %}
{% if CATEGORY_FEED_ATOM and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_ATOM_URL %}{{ CATEGORY_FEED_ATOM_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_ATOM|format(category.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Categories Atom Feed" />
{% endif %}
{% if CATEGORY_FEED_RSS and category %}
<link href="{{ FEED_DOMAIN }}/{% if CATEGORY_FEED_RSS_URL %}{{ CATEGORY_FEED_RSS_URL|format(category.slug) }}{% else %}{{ CATEGORY_FEED_RSS|format(category.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Categories RSS Feed" />
{% endif %}
{% if TAG_FEED_ATOM and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_ATOM_URL %}{{ TAG_FEED_ATOM_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_ATOM|format(tag.slug) }}{% endif %}" type="application/atom+xml" rel="alternate" title="{{ SITENAME }} Tags Atom Feed" />
{% endif %}
{% if TAG_FEED_RSS and tag %}
<link href="{{ FEED_DOMAIN }}/{% if TAG_FEED_RSS_URL %}{{ TAG_FEED_RSS_URL|format(tag.slug) }}{% else %}{{ TAG_FEED_RSS|format(tag.slug) }}{% endif %}" type="application/rss+xml" rel="alternate" title="{{ SITENAME }} Tags RSS Feed" />
{% endif %}
{% endblock head %}
</head>
<body id="index">
<div class="container">
<header>
<h1 id="page-top">TOM LEE-GOUGH</h1>
<p><strong>accountancy services</strong></p>
<p>Darlington based, general accountancy practice. Get in contact to find out how we can help you.</p>
<div class="call-to-action">
<!-- <a class="button" href="mailto:info@tlg-accounting.co.uk">info@tlg-accounting.co.uk</a> -->
</div>
</header>
<div class="page-content">
<nav>
<a class="button" href="mailto:info@tlg-accounting.co.uk">info@tlg-accounting.co.uk</a>
{% for p in pages %}
<a class="button" href="{{ SITEURL }}/{{ p.url }}">{{ p.title }}</a>
{% endfor %}
<a class="button" href="../archives.html">Blog</a>
</nav>
<div class="content">
{% block content %}
{% endblock %}
</div>
</div>
<footer>
<div>
{% for link in LINKS %}
<a href="{{link[1]}}">{{link[0]}}</a>
{% if link != LINKS[-1] %}|{% endif %}
{% endfor %}
</div>
<!-- <p>&copy; 2017 - 2021 Tom Lee-Gough</p> -->
</footer>
</div>
</body>
</html>

12
tlg-theme/templates/categories.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Categories{% endblock %}
{% block content %}
<h1>Categories on {{ SITENAME }}</h1>
<ul>
{% for category, articles in categories|sort %}
<li><a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}

8
tlg-theme/templates/category.html

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
{% extends "index.html" %}
{% block title %}{{ SITENAME }} - {{ category }} category{% endblock %}
{% block content_title %}
<h2>Articles in the {{ category }} category</h2>
{% endblock %}

28
tlg-theme/templates/index.html

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block content %}
<section id="content">
{% block content_title %}
<h2>all posts</h2>
{% endblock %}
<ul id="post-list">
{% for article in articles_page.object_list %}
<li><article class="hentry">
<header>
<h2 class="entry-title">
<a href="{{ SITEURL }}/{{ article.url }}" rel="bookmark" title="Permalink to {{ article.title|striptags }}"># {{ article.title }}</a>
</h2>
</header>
<footer class="post-info">
<time class="published" datetime="{{ article.date.isoformat() }}"> {{ article.date.strftime("%Y-%m-%d") }} </time>
</footer><!-- /.post-info -->
<div class="entry-content"> {{ article.summary }} </div><!-- /.entry-content -->
</article></li>
{% endfor %}
</ul><!-- /#posts-list -->
{% if articles_page.has_other_pages() %}
{% include 'pagination.html' %}
{% endif %}
</section><!-- /#content -->
{% endblock content %}

27
tlg-theme/templates/page.html

@ -0,0 +1,27 @@ @@ -0,0 +1,27 @@
{% extends "base.html" %}
{% block html_lang %}{{ page.lang }}{% endblock %}
{% block title %}{{ SITENAME }} - {{ page.title }}{%endblock%}
{% block head %}
{{ super() }}
{% import 'translations.html' as translations with context %}
{% if translations.entry_hreflang(page) %}
{{ translations.entry_hreflang(page) }}
{% endif %}
{% endblock %}
{% block content %}
<h1>{{ page.title }}</h1>
{% import 'translations.html' as translations with context %}
{{ translations.translations_for(page) }}
{{ page.content }}
{% if page.modified %}
<p>
Last updated: {{ page.locale_modified }}
</p>
{% endif %}
{% endblock %}

11
tlg-theme/templates/pagination.html

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
{% if DEFAULT_PAGINATION %}
<p class="paginator">
{% if articles_page.has_previous() %}
<a href="{{ SITEURL }}/{{ articles_previous_page.url }}">&laquo;</a>
{% endif %}
Page {{ articles_page.number }} / {{ articles_paginator.num_pages }}
{% if articles_page.has_next() %}
<a href="{{ SITEURL }}/{{ articles_next_page.url }}">&raquo;</a>
{% endif %}
</p>
{% endif %}

14
tlg-theme/templates/period_archives.html

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - {{ period | reverse | join(' ') }} archives{% endblock %}
{% block content %}
<h1>Archives for {{ period | reverse | join(' ') }}</h1>
<dl>
{% for article in dates %}
<dt>{{ article.locale_date }}</dt>
<dd><a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dd>
{% endfor %}
</dl>
{% endblock %}

14
tlg-theme/templates/tag.html

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - {{ tag }} tag{% endblock %}
{% block content %}
<h2>Articles tagged with {{ tag }}</h2>
<dl>
{% for article in dates %}
<dt>{{ article.date.strftime("%Y-%m-%d") }} <a href="{{ SITEURL }}/{{ article.url }}">{{ article.title }}</a></dt>
<dd>{{ article.summary }}</dd>
{% endfor %}
</dl>
{% endblock %}

12
tlg-theme/templates/tags.html

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
{% extends "base.html" %}
{% block title %}{{ SITENAME }} - Tags{% endblock %}
{% block content %}
<h1>Tags for {{ SITENAME }}</h1>
<ul>
{% for tag, articles in tags|sort %}
<li><a href="{{ SITEURL }}/{{ tag.url }}">{{ tag }}</a> ({{ articles|count }})</li>
{% endfor %}
</ul>
{% endblock %}
Loading…
Cancel
Save