Date | Comment |
---|---|
<2020-02-15 Sat> | First Version |
Name | My Fancy Project name |
Acronym | project-1 |
Start Data | 2022-01-01 |
Duration (months) | 2 |
Information necessary to put the project in context: pre-existing environments and tools, constraints, opportunities.
- What do we want to achieve?
- What will we achieve in the project?
All todo items here contribute to the project budget if they have an
effort property set. Effort can either be generic (meaning any
resource might work on the task; the average rate will be used) or
specific, if using properties such as EFFORT_<resource_name>
.
Remarks
- Use durations expressed in timing units (e.g., 4d, 10:10); plain numbers are interpreted as minutes
- Use either profiled or plain efforts; if an entry contains both, the plain effort entry is used.
In this task we will do such and such …
In this other task we will do such and such …
In this task we will do such and such …
This has to be filled by hand. In the future it might be interesting to try and integrate with a (Gantt) charting tool, such as Vega light or Task Juggler.
This section provides an overview of the todo items, together with deadline sand project costs.
We also have a column to count actual time, although we prefer to do the clocking on a different file (to keep things a bit tidier).
Budget rows have to be inserted by hand. VAT and Total are computed. In our experience the data computed from todos need some adjustments/grouping to make it into the budget.
You can use the previous (Budget by Item) or the last section (Budget Detailed Data) of this document to get summary data and put it in the budget.
! | Cost Item | Cost |
---|---|---|
Group 1 | 10500 | |
Total (Before VAT) | 10500.00 | |
VAT | 2310.00 | |
Total (with VAT) | 12810.00 |
Set the first two columns of this table and the other columns will be computed for you.
Date | Amount | Net | VAT | Payment |
---|---|---|---|---|
01/03/2022 | 50% | 5250.00 | 1155.00 | 6405.00 |
21/06/2022 | 10% | 1050.00 | 231.00 | 1281.00 |
21/11/2022 | 40% | 4200.00 | 924.00 | 5124.00 |
This section generates the plain-text accounting data we use with hledger. Project accounting is structure as follows:
- The project budget is split in equal parts for the duration of the project
- Each month we transfer from
revenues
toaccrued_work
- When we get paid, we move from
accrued_work
to thebank
account and we account for VAT
This works on the assumption that the project is paid for with a flat fee. If you are charging by time and expense, the data below should become the project budget and the valorization should be computed on the actual hours worked.
(setq project-name (nth 1 (nth 0 data)))
(setq project-acronym (nth 1 (nth 1 data)))
(setq start-date (nth 1 (nth 2 data)))
(setq months (nth 1 (nth 3 data)))
;; computed from the table, sum of net values
(setq amount (apply '+ (mapcar (lambda (x) (nth 2 x)) (cdr table))))
(defun avm/build-date (string)
(mapcar 'string-to-number
(list (substring string 0 4) (substring string 5 7) (substring string 8 10))))
(defun avm/emit-date (date)
(format "%4d-%02d-%02d" (nth 0 date) (nth 1 date) (nth 2 date)))
(defun avm/add-one-month (date)
(let ( (year (car date))
(month (cadr date))
(day (caddr date)) )
(let ( (new-month (+ month 1)) )
(if (> new-month 12)
(list (+ year 1) 1 day)
(list year new-month day)))))
(defun avm/emit-accrued-work-entry (date project acronym amount)
(format "%s ! %s\n %s\n %-30s %10.2f\n %-30s\n\n"
date
project
(concat "; project:" project-acronym)
"accrued_work"
amount
(concat "revenues:" (downcase project-acronym))))
(defun avm/emit-project (date project acronym total-amount months)
(let* ( (date (avm/build-date date))
(amount (/ total-amount months))
(remainder (- total-amount (* amount months))) )
(avm/emit-project-ll date project acronym amount remainder months)))
(defun avm/emit-project-ll (date project acronym amount remainder months)
(if (> months 1)
(concat
(avm/emit-accrued-work-entry (avm/emit-date date) project acronym amount)
(avm/emit-project-ll (avm/add-one-month date) project acronym amount remainder (- months 1)))
(avm/emit-accrued-work-entry (avm/emit-date date) project acronym (+ amount remainder))))
(defun avm/invert-date (date)
(concat (substring date 6 10) "-" (substring date 3 5) "-" (substring date 0 2)))
(defun avm/print-ledger-entry (row)
(let ( (date (nth 0 row))
(net (nth 2 row))
(vat (nth 3 row))
(gross (nth 4 row)) )
(format
"%s ! %s\n %s\n %-30s %10.2f\n %-30s %10.2f\n %-30s %10.2f\n\n"
(avm/invert-date date)
project-name
(concat "; project:" project-acronym)
"bank"
gross
"credits:vat"
(* -1 vat)
(concat "accrued_work:" (downcase project-acronym))
(* -1 net))))
;; this emits the accrued work
(princ (avm/emit-project start-date project-name project-acronym amount months))
;; this emits the payments
(mapcar 'princ (mapcar 'avm/print-ledger-entry (cdr table)))
Risk | Probability | Impact | Action Reference |
---|---|---|---|
##+INCLUDE: company_profile.org
ITEM | EFFORT | COST | TOTAL |
---|---|---|---|
Piano di lavoro | 0.00 | 0.00 |
ITEM | EFFORT | COST | TOTAL |
---|---|---|---|
Piano di lavoro | 0.00 | 0.00 |
Independent of the functional group.
A | EUR 0.00 |
B | EUR 0.00 |
C | EUR 0.00 |
ITEM | EFFORT | COST | TOTAL |
---|
ITEM | EFFORT | COST | TOTAL |
---|
ITEM | EFFORT | COST | TOTAL |
---|