Add Budget & Capex app guides (v5-v7) and budget-app zips (v1-v7)
This commit is contained in:
@@ -0,0 +1,728 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Budget & Capex app guide</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #f6f7f9; --surface: #ffffff; --surface-2: #eef1f5; --text: #1d1f23; --muted: #5f6570; --border: #d5dae1;
|
||||||
|
--primary: #1f3b63; --primary-soft: #e3ebf6; --accent: #e8632b; --accent-soft: #fdebe2; --green: #15803d;
|
||||||
|
--green-soft: #e1f3e7; --red: #b42318; --red-soft: #fbe4e2; --amber: #a15c07; --amber-soft: #fdf1dc; --line: #7a8494;
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme="light"]) {
|
||||||
|
--bg: #14161a; --surface: #1d2026; --surface-2: #262a32; --text: #e8eaee; --muted: #a0a7b3; --border: #383d48;
|
||||||
|
--primary: #8db4ee; --primary-soft: #23324a; --accent: #f39a6b; --accent-soft: #3b2a22; --green: #5ad38a;
|
||||||
|
--green-soft: #1d3326; --red: #f48a80; --red-soft: #3b2222; --amber: #e8b45c; --amber-soft: #3a2f1c; --line: #8c95a3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { -webkit-text-size-adjust: 100%; }
|
||||||
|
body { margin: 0; background: var(--bg); color: var(--text); font: 15px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
main { max-width: 1040px; margin: 0 auto; padding: 32px 20px 64px; }
|
||||||
|
h1 { font-size: 30px; line-height: 1.2; margin: 0 0 6px; }
|
||||||
|
h2 { font-size: 22px; margin: 48px 0 10px; padding-top: 8px; border-top: 1px solid var(--border); }
|
||||||
|
h3 { font-size: 16px; margin: 24px 0 6px; }
|
||||||
|
p { margin: 8px 0; max-width: 78ch; }
|
||||||
|
.lead { color: var(--muted); font-size: 16px; }
|
||||||
|
.muted { color: var(--muted); }
|
||||||
|
code, .mono { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13px; background: var(--surface-2); padding: 1px 5px; border-radius: 4px; }
|
||||||
|
.toc { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 20px; padding: 14px 18px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 20px 0; }
|
||||||
|
.toc a { color: var(--primary); text-decoration: none; }
|
||||||
|
.toc a:hover { text-decoration: underline; }
|
||||||
|
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 16px 18px; margin: 14px 0; }
|
||||||
|
figure { margin: 16px 0; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }
|
||||||
|
figure svg { width: 100%; height: auto; display: block; }
|
||||||
|
figcaption { color: var(--muted); font-size: 13px; margin-top: 8px; }
|
||||||
|
table { border-collapse: collapse; width: 100%; font-size: 14px; }
|
||||||
|
th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }
|
||||||
|
th { background: var(--surface-2); font-size: 12.5px; text-transform: uppercase; letter-spacing: .03em; color: var(--muted); }
|
||||||
|
.table-wrap { overflow-x: auto; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 14px 0; }
|
||||||
|
.table-wrap table th:first-child, .table-wrap table td:first-child { padding-left: 14px; }
|
||||||
|
.yes { color: var(--green); font-weight: 600; } .no { color: var(--muted); } .own { color: var(--amber); font-weight: 600; }
|
||||||
|
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
|
||||||
|
.example { background: var(--primary-soft); border-radius: 10px; padding: 12px 16px; margin: 12px 0; }
|
||||||
|
.example .calc { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13.5px; white-space: pre-wrap; }
|
||||||
|
.tag { display: inline-block; font-size: 12px; font-weight: 600; padding: 1px 8px; border-radius: 999px; background: var(--surface-2); color: var(--muted); }
|
||||||
|
ul { padding-left: 22px; } li { margin: 3px 0; }
|
||||||
|
/* diagram parts */
|
||||||
|
.bx { fill: var(--surface); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.bx-p { fill: var(--primary-soft); stroke: var(--primary); stroke-width: 1.5; }
|
||||||
|
.bx-a { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 1.5; }
|
||||||
|
.bx-g { fill: var(--green-soft); stroke: var(--green); stroke-width: 1.5; }
|
||||||
|
.bx-r { fill: var(--red-soft); stroke: var(--red); stroke-width: 1.5; }
|
||||||
|
.bx-y { fill: var(--amber-soft); stroke: var(--amber); stroke-width: 1.5; }
|
||||||
|
.bx-n { fill: var(--surface-2); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.zone { fill: none; stroke: var(--border); stroke-width: 1.5; stroke-dasharray: 6 5; }
|
||||||
|
.t { fill: var(--text); font: 600 14px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.ts { fill: var(--muted); font: 12.5px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.tz { fill: var(--muted); font: 600 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; letter-spacing: .05em; }
|
||||||
|
.ar { stroke: var(--line); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-d { stroke: var(--line); stroke-width: 1.4; fill: none; stroke-dasharray: 5 4; }
|
||||||
|
.ar-r { stroke: var(--red); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-g { stroke: var(--green); stroke-width: 1.8; fill: none; }
|
||||||
|
.lbl { fill: var(--muted); font: 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.head { fill: var(--line); } .head-r { fill: var(--red); } .head-g { fill: var(--green); }
|
||||||
|
@media (max-width: 720px) { .grid2 { grid-template-columns: 1fr; } h1 { font-size: 25px; } main { padding: 20px 16px 48px; } }
|
||||||
|
@media print {
|
||||||
|
body { background: #fff; font-size: 12.5px; }
|
||||||
|
main { max-width: none; padding: 0; }
|
||||||
|
h2 { break-before: page; border-top: 0; margin-top: 0; }
|
||||||
|
figure, .card, .example, .table-wrap, tr { break-inside: avoid; }
|
||||||
|
.toc { break-after: page; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<h1>Budget & Capex: how the app works</h1>
|
||||||
|
<p class="lead">Version 5.0 · a guide to what the app does, who can do what, how a budget moves from draft to approved, and how each field you change affects the numbers in the reports.</p>
|
||||||
|
<p class="muted">The screens are in Portuguese or English (PT/EN switch at the top). This guide uses the English names, with the Portuguese name in <em>italics</em> where it helps.</p>
|
||||||
|
|
||||||
|
<nav class="toc" aria-label="Contents">
|
||||||
|
<a href="#map">1. The app at a glance</a>
|
||||||
|
<a href="#arch">2. What runs on the server</a>
|
||||||
|
<a href="#data">3. What is stored</a>
|
||||||
|
<a href="#roles">4. Roles and permissions</a>
|
||||||
|
<a href="#life">5. A budget's life cycle</a>
|
||||||
|
<a href="#calc">6. How the numbers are calculated</a>
|
||||||
|
<a href="#fields">7. Every field and what it changes</a>
|
||||||
|
<a href="#months">8. Splitting a year into months</a>
|
||||||
|
<a href="#reports">9. Reports, downloads and email</a>
|
||||||
|
<a href="#excel">10. Excel: template, download, re-upload</a>
|
||||||
|
<a href="#reopen">11. Reopening an approved budget</a>
|
||||||
|
<a href="#admin">12. Admin: email, logs, backups, upgrades</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="map">1. The app at a glance</h2>
|
||||||
|
<p>Each department prepares one budget per year. A budget is a list of cost and revenue lines grouped by category. Each line has last year's actual amount, this year's base amount and an adjustment, and it is split over the months. From those lines the app produces two documents, on screen and in PDF and Excel: the <strong>Capex and Costs report</strong> (<em>Capex e Custos</em>) and the <strong>Monthly budget</strong> (<em>Orçamento mensal</em>).</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 430" role="img" aria-labelledby="map-t">
|
||||||
|
<title id="map-t">Pages of the app and who sees them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">EVERY USER</text>
|
||||||
|
<rect x="20" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="40" y="70" class="t">Budgets (Orçamentos)</text>
|
||||||
|
<text x="40" y="94" class="ts">List per department and year</text>
|
||||||
|
<text x="40" y="114" class="ts">New year · Import Excel · Excel template</text>
|
||||||
|
<text x="40" y="134" class="ts">Archived versions</text>
|
||||||
|
<text x="40" y="160" class="ts">→ open a budget to edit, approve,</text>
|
||||||
|
<text x="40" y="178" class="ts"> download, email, request reopening</text>
|
||||||
|
|
||||||
|
<rect x="350" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="370" y="70" class="t">Budget page</text>
|
||||||
|
<text x="370" y="94" class="ts">Lines by category, totals, year rate</text>
|
||||||
|
<text x="370" y="114" class="ts">Workflow steps and status</text>
|
||||||
|
<text x="370" y="134" class="ts">Download ▾ · Send by email · Upload Excel</text>
|
||||||
|
<text x="370" y="154" class="ts">History (changes and reopen requests)</text>
|
||||||
|
<text x="370" y="174" class="ts">Delete (administrators only)</text>
|
||||||
|
|
||||||
|
<rect x="680" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="700" y="70" class="t">Reports (Relatórios)</text>
|
||||||
|
<text x="700" y="94" class="ts">Capex and Costs · Monthly budget</text>
|
||||||
|
<text x="700" y="114" class="ts">Choose language and site</text>
|
||||||
|
<text x="700" y="134" class="ts">View online · PDF · Excel</text>
|
||||||
|
<text x="700" y="154" class="ts">Send by email</text>
|
||||||
|
<text x="700" y="174" class="ts">My profile: name, language, password</text>
|
||||||
|
|
||||||
|
<path d="M320,115 H346" class="ar" marker-end="url(#h)"/>
|
||||||
|
<path d="M650,115 H676" class="ar" marker-end="url(#h)"/>
|
||||||
|
|
||||||
|
<text x="20" y="236" class="tz">APPROVERS</text>
|
||||||
|
<rect x="20" y="248" width="300" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="40" y="276" class="t">Categories (Categorias)</text>
|
||||||
|
<text x="40" y="298" class="ts">Their own department's categories</text>
|
||||||
|
|
||||||
|
<text x="350" y="236" class="tz">ADMINISTRATORS</text>
|
||||||
|
<rect x="350" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="276" class="t">Departments</text>
|
||||||
|
<text x="368" y="298" class="ts">and their workflows</text>
|
||||||
|
<rect x="565" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="583" y="276" class="t">Categories and sites</text>
|
||||||
|
<text x="583" y="298" class="ts">all departments</text>
|
||||||
|
<rect x="780" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="798" y="276" class="t">Users</text>
|
||||||
|
<text x="798" y="298" class="ts">role, department, language</text>
|
||||||
|
<rect x="350" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="362" class="t">Activity (Atividade)</text>
|
||||||
|
<text x="368" y="384" class="ts">who did what, filters, CSV</text>
|
||||||
|
<rect x="675" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="693" y="362" class="t">Email</text>
|
||||||
|
<text x="693" y="384" class="ts">sending account · mail log</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Pages in the top menu. Approvers also see everything every user sees, and administrators see everything.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="arch">2. What runs on the server</h2>
|
||||||
|
<p>The app runs on one server on your network with Docker. People open it in a browser at <code>http://<server>:8080</code>. Nothing needs to be installed on the PCs.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 400" role="img" aria-labelledby="arch-t">
|
||||||
|
<title id="arch-t">Containers and how they connect</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="150" width="170" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="185" class="t">Browsers</text>
|
||||||
|
<text x="40" y="207" class="ts">PCs on the network</text>
|
||||||
|
|
||||||
|
<rect x="230" y="40" width="580" height="320" rx="14" class="zone"/>
|
||||||
|
<text x="250" y="66" class="tz">SERVER · DOCKER COMPOSE "budget-capex"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="278" y="183" class="t">web (Caddy)</text>
|
||||||
|
<text x="278" y="205" class="ts">screens, HTTPS,</text>
|
||||||
|
<text x="278" y="223" class="ts">passes /api on</text>
|
||||||
|
|
||||||
|
<rect x="460" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="478" y="183" class="t">api (Python)</text>
|
||||||
|
<text x="478" y="205" class="ts">rules, calculations,</text>
|
||||||
|
<text x="478" y="223" class="ts">PDF and Excel</text>
|
||||||
|
|
||||||
|
<rect x="660" y="150" width="130" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="678" y="183" class="t">db</text>
|
||||||
|
<text x="678" y="205" class="ts">PostgreSQL:</text>
|
||||||
|
<text x="678" y="223" class="ts">all the data</text>
|
||||||
|
|
||||||
|
<rect x="460" y="270" width="330" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="478" y="298" class="t">backup</text>
|
||||||
|
<text x="478" y="320" class="ts">nightly dump + one before every upgrade</text>
|
||||||
|
|
||||||
|
<rect x="840" y="80" width="140" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="113" class="t">Mail server</text>
|
||||||
|
<text x="858" y="135" class="ts">SMTP: send</text>
|
||||||
|
<text x="858" y="153" class="ts">IMAP: Sent copy</text>
|
||||||
|
|
||||||
|
<rect x="840" y="270" width="140" height="70" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="298" class="t">backups/</text>
|
||||||
|
<text x="858" y="320" class="ts">folder on disk</text>
|
||||||
|
|
||||||
|
<path d="M190,195 H256" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<text x="200" y="185" class="lbl">:8080</text>
|
||||||
|
<path d="M420,195 H456" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M620,195 H656" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M620,170 C700,120 760,125 836,125" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<text x="690" y="112" class="lbl">emails</text>
|
||||||
|
<path d="M725,240 V266" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M790,305 H836" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M540,240 V266" class="ar-d" marker-end="url(#h2)"/>
|
||||||
|
<text x="548" y="258" class="lbl">"back up first"</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Four containers. Your data lives in the db container's volume, not in the app folder, so replacing the folder with a new version keeps it. The dashed arrow is the request the api makes before it changes the database during an upgrade.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="data">3. What is stored</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 540" role="img" aria-labelledby="data-t">
|
||||||
|
<title id="data-t">Main records and how they relate</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h3" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="380" y="20" width="240" height="78" rx="12" class="bx-a"/>
|
||||||
|
<text x="400" y="50" class="t">Department</text>
|
||||||
|
<text x="400" y="72" class="ts">e.g. IT, F&B · name, active</text>
|
||||||
|
|
||||||
|
<rect x="20" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="40" y="180" class="t">User</text>
|
||||||
|
<text x="40" y="202" class="ts">role, department, language</text>
|
||||||
|
<text x="40" y="222" class="ts">belongs to one department</text>
|
||||||
|
|
||||||
|
<rect x="270" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="290" y="180" class="t">Workflow step</text>
|
||||||
|
<text x="290" y="202" class="ts">ordered; approved by the</text>
|
||||||
|
<text x="290" y="222" class="ts">dept's approvers or named users</text>
|
||||||
|
|
||||||
|
<rect x="520" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="180" class="t">Category</text>
|
||||||
|
<text x="540" y="202" class="ts">PT and EN name, cost/revenue,</text>
|
||||||
|
<text x="540" y="222" class="ts">order, show when empty</text>
|
||||||
|
|
||||||
|
<rect x="770" y="150" width="210" height="92" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="180" class="t">Budget (year)</text>
|
||||||
|
<text x="790" y="202" class="ts">year, title, year rate, status,</text>
|
||||||
|
<text x="790" y="222" class="ts">current step, source file</text>
|
||||||
|
|
||||||
|
<rect x="770" y="300" width="210" height="110" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="330" class="t">Line</text>
|
||||||
|
<text x="790" y="352" class="ts">category, site, prior actual,</text>
|
||||||
|
<text x="790" y="372" class="ts">base, adjustment, months,</text>
|
||||||
|
<text x="790" y="392" class="ts">remarks</text>
|
||||||
|
|
||||||
|
<rect x="520" y="300" width="220" height="70" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="330" class="t">Site</text>
|
||||||
|
<text x="540" y="352" class="ts">Sagres, Quinta, Chiado, Oriente</text>
|
||||||
|
|
||||||
|
<rect x="770" y="450" width="210" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="790" y="480" class="t">Reopen request</text>
|
||||||
|
<text x="790" y="502" class="ts">reason, status, decision</text>
|
||||||
|
|
||||||
|
<rect x="20" y="300" width="470" height="170" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="330" class="t">Shared by the whole app</text>
|
||||||
|
<text x="40" y="356" class="ts">Activity log: every action by every user</text>
|
||||||
|
<text x="40" y="378" class="ts">Mail settings: the sending account (passwords encrypted)</text>
|
||||||
|
<text x="40" y="400" class="ts">Mail log: every email sent and whether it arrived</text>
|
||||||
|
<text x="40" y="422" class="ts">Archived versions: replaced budgets, read-only</text>
|
||||||
|
<text x="40" y="444" class="ts">Sites are shared by all departments</text>
|
||||||
|
|
||||||
|
<path d="M430,98 L140,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M470,98 L390,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M530,98 L620,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M570,98 L860,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M875,242 V296" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="883" y="275" class="lbl">many</text>
|
||||||
|
<path d="M770,335 H744" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M740,225 L772,302" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M980,196 H994 V485 H984" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="900" y="440" class="lbl">many</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Solid arrows: "has many". Dashed: a line points to one category and optionally one site. A department's categories are its own, so an IT budget never shows F&B lines.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="roles">4. Roles and permissions</h2>
|
||||||
|
<p>Every user has one role and belongs to one department. Everyone can <strong>see and export every budget</strong>. Only the budget's own department can change or approve it.</p>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>What</th><th>Viewer</th><th>Editor</th><th>Approver</th><th>Admin</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>View budgets and reports, download PDF / Excel</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td></tr>
|
||||||
|
<tr><td>Send reports by email (once email is set up)</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Request reopening of an approved budget (with reason)</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Create, import, edit a draft budget; upload a changed file</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Submit a draft for review</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Approve or return a workflow step</td><td class="no">no</td><td class="no">no</td><td class="own">own dept*</td><td class="own">own dept*</td></tr>
|
||||||
|
<tr><td>Reopen directly, accept or decline reopen requests</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Manage categories</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Delete a budget (any status, typed confirmation)</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Departments, workflows, users, sites, email settings, activity and mail logs</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<p class="muted">* A workflow step can instead name specific users who approve it; then only those users can approve that step, whatever their role. An administrator can always return a budget in review to draft.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="life">5. A budget's life cycle</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 480" role="img" aria-labelledby="life-t">
|
||||||
|
<title id="life-t">Budget statuses and the actions that move between them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h4" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
<marker id="h4r" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-r"/></marker>
|
||||||
|
<marker id="h4g" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-g"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="40" class="ts">Create: New year (empty or copied from an earlier year) or Import Excel</text>
|
||||||
|
<path d="M90,50 V96" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="20" y="100" width="170" height="90" rx="14" class="bx-n"/>
|
||||||
|
<text x="40" y="135" class="t">Draft</text>
|
||||||
|
<text x="40" y="157" class="ts">editable by the</text>
|
||||||
|
<text x="40" y="175" class="ts">department</text>
|
||||||
|
|
||||||
|
<rect x="290" y="80" width="400" height="130" rx="14" class="bx-y"/>
|
||||||
|
<text x="310" y="110" class="t">In review</text>
|
||||||
|
<rect x="310" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="325" y="152" class="t">Step 1</text>
|
||||||
|
<text x="325" y="172" class="ts">e.g. IT director</text>
|
||||||
|
<rect x="455" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="470" y="152" class="t">Step 2</text>
|
||||||
|
<text x="470" y="172" class="ts">e.g. Finance</text>
|
||||||
|
<text x="590" y="160" class="t">… n</text>
|
||||||
|
<path d="M420,155 H451" class="ar" marker-end="url(#h4)"/>
|
||||||
|
<path d="M565,155 H585" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="790" y="100" width="190" height="90" rx="14" class="bx-g"/>
|
||||||
|
<text x="810" y="135" class="t">Approved</text>
|
||||||
|
<text x="810" y="157" class="ts">locked; view, export</text>
|
||||||
|
<text x="810" y="175" class="ts">and email only</text>
|
||||||
|
|
||||||
|
<path d="M190,135 H286" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="200" y="125" class="lbl">Submit</text>
|
||||||
|
<path d="M690,145 H786" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="702" y="135" class="lbl">Approve</text>
|
||||||
|
<text x="702" y="166" class="lbl">(last step)</text>
|
||||||
|
|
||||||
|
<path d="M330,210 C300,260 160,260 110,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="200" y="276" class="lbl">Return to draft (approver of the step, or admin)</text>
|
||||||
|
|
||||||
|
<path d="M885,190 C885,380 300,390 96,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="380" y="372" class="lbl">Reopen: approver/admin with a reason, or an accepted reopen request</text>
|
||||||
|
|
||||||
|
<rect x="20" y="396" width="300" height="66" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="424" class="t">Archived 🔒</text>
|
||||||
|
<text x="40" y="446" class="ts">replaced by an upload; read-only</text>
|
||||||
|
<path d="M50,190 V392" class="ar-d" marker-end="url(#h4)"/>
|
||||||
|
<text x="58" y="330" class="lbl">Upload a file for</text>
|
||||||
|
<text x="58" y="346" class="lbl">the same year</text>
|
||||||
|
|
||||||
|
<rect x="660" y="406" width="320" height="56" rx="12" class="bx-r"/>
|
||||||
|
<text x="680" y="440" class="t">Delete: administrators only, any status</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Only a draft can be changed. Each approval moves the budget to the next workflow step; the last approval makes it Approved. A department with no steps configured is approved in one step by its approvers.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="calc">6. How the numbers are calculated</h2>
|
||||||
|
<p>Every total in the app and in the reports is built from the lines, in this order. Change any input on the left, and everything to its right follows.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 470" role="img" aria-labelledby="calc-t">
|
||||||
|
<title id="calc-t">From a line's fields to the report totals</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h5" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">YOU TYPE</text>
|
||||||
|
<text x="300" y="28" class="tz">THE APP WORKS OUT</text>
|
||||||
|
<text x="760" y="28" class="tz">YOU SEE</text>
|
||||||
|
|
||||||
|
<rect x="20" y="44" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="70" class="t">Prior-year actual</text>
|
||||||
|
<text x="36" y="91" class="ts">number or 12*839,67</text>
|
||||||
|
|
||||||
|
<rect x="20" y="122" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="148" class="t">Base (without adjustment)</text>
|
||||||
|
<text x="36" y="169" class="ts">number or calculation</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="226" class="t">Adjustment</text>
|
||||||
|
<text x="36" y="247" class="ts">year rate · % · factor · none</text>
|
||||||
|
|
||||||
|
<rect x="20" y="278" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="304" class="t">Year rate (budget)</text>
|
||||||
|
<text x="36" y="325" class="ts">Inflation + adjustments %</text>
|
||||||
|
|
||||||
|
<rect x="20" y="356" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="382" class="t">Months</text>
|
||||||
|
<text x="36" y="403" class="ts">12 · chosen months · typed</text>
|
||||||
|
|
||||||
|
<rect x="300" y="200" width="160" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="316" y="226" class="t">Factor</text>
|
||||||
|
<text x="316" y="247" class="ts">e.g. 1,055 or 1,15</text>
|
||||||
|
|
||||||
|
<rect x="510" y="122" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="148" class="t">Adjusted amount</text>
|
||||||
|
<text x="526" y="169" class="ts">base × factor, to cents</text>
|
||||||
|
|
||||||
|
<rect x="510" y="44" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="70" class="t">Change € and %</text>
|
||||||
|
<text x="526" y="91" class="ts">adjusted − prior</text>
|
||||||
|
|
||||||
|
<rect x="510" y="356" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="382" class="t">12 monthly amounts</text>
|
||||||
|
<text x="526" y="403" class="ts">in cents, add up exactly</text>
|
||||||
|
|
||||||
|
<rect x="760" y="44" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="72" class="t">Category totals</text>
|
||||||
|
<text x="776" y="94" class="ts">sum of its lines</text>
|
||||||
|
<text x="776" y="114" class="ts">(filtered by site if chosen)</text>
|
||||||
|
|
||||||
|
<rect x="760" y="160" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="188" class="t">Budget totals</text>
|
||||||
|
<text x="776" y="210" class="ts">costs and revenue,</text>
|
||||||
|
<text x="776" y="230" class="ts">prior → adjusted, change</text>
|
||||||
|
|
||||||
|
<rect x="760" y="276" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="304" class="t">Capex and Costs report</text>
|
||||||
|
<text x="776" y="326" class="ts">year totals and charts</text>
|
||||||
|
|
||||||
|
<rect x="760" y="362" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="390" class="t">Monthly budget</text>
|
||||||
|
<text x="776" y="412" class="ts">Jan … Dec per line</text>
|
||||||
|
|
||||||
|
<path d="M240,231 H296" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,309 C270,309 270,250 296,246" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<text x="246" y="348" class="lbl">only for "year rate"</text>
|
||||||
|
<path d="M460,231 C490,231 485,160 506,158" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,153 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,75 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,122 V110" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,184 V352" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,387 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,75 H756" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,153 C730,153 730,100 756,100" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,144 V156" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,260 V272" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,387 C730,387 730,397 756,397" class="ar" marker-end="url(#h5)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>With <strong>Monthly amounts</strong> (typed months) the path is different: the year total is simply the sum of the twelve months, and Base and Adjustment are not used.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<h3>The adjustment and the factor</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Adjustment (<em>Ajuste</em>)</th><th>Factor used</th><th>Example, base 96 532,00 €</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>Year rate (<em>Taxa do ano</em>)</td><td>1 + the budget's year rate</td><td>rate 5,5 % → × 1,055 = <strong>101 841,26 €</strong></td></tr>
|
||||||
|
<tr><td>Percent (<em>%</em>)</td><td>1 + adjustment value ÷ 100</td><td>value 15 → × 1,15 = <strong>111 011,80 €</strong></td></tr>
|
||||||
|
<tr><td>Factor (<em>Fator ×</em>)</td><td>the adjustment value</td><td>value 2,055 (hardware price rise) → <strong>198 373,26 €</strong></td></tr>
|
||||||
|
<tr><td>None (<em>Sem ajuste</em>)</td><td>1</td><td><strong>96 532,00 €</strong></td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="example">
|
||||||
|
<strong>Worked example (IT 2027, "Mobile phone subscriptions")</strong>
|
||||||
|
<div class="calc">Prior-year actual 96 532,00 €
|
||||||
|
Base 96 532,00 €
|
||||||
|
Adjustment Factor × 1,15
|
||||||
|
Adjusted 96 532,00 × 1,15 = 111 011,80 €
|
||||||
|
Change 111 011,80 − 96 532,00 = +14 479,80 € (+15,00 %)
|
||||||
|
Months chosen: Jan–Apr → 27 752,95 € each, May–Dec 0</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>Rounding rules</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Each line's adjusted amount is rounded to cents before it is added up, as the finance reports do. Totals are therefore exact sums of the lines you see.</li>
|
||||||
|
<li>Monthly amounts are in cents. The rounding difference goes to the last month (December, or the last chosen month), so the twelve months always add up to the adjusted amount.</li>
|
||||||
|
<li>Change % is blank when the prior-year actual is zero.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Typing amounts</h3>
|
||||||
|
<p>Amount fields work like Excel: <code>12*839,67+3292,56</code> or <code>=5512*12</code>. Both <code>1 234,56</code> and <code>1,234.56</code> are understood. The calculation is kept, so you can see later how a figure was built.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="fields">7. Every field and what it changes</h2>
|
||||||
|
|
||||||
|
<h3>On a budget</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Year</strong></td><td>The budget year; one current budget per department and year.</td><td>Column headings ("2026 actual", "2027 adjusted"), report titles, file names.</td></tr>
|
||||||
|
<tr><td><strong>Title</strong></td><td>Name shown in lists and reports.</td><td>Budget list, report headers, email subject suggestion.</td></tr>
|
||||||
|
<tr><td><strong>Inflation + adjustments (%)</strong> <em>(Taxa do ano)</em></td><td>The year rate.</td><td>Every line whose adjustment is "Year rate": their factor, adjusted amount, months, and so all category and budget totals and both reports. Lines with %, factor or none are not affected.</td></tr>
|
||||||
|
<tr><td><strong>Copy from an earlier year</strong> (when creating)</td><td>Starts the new year from another year's lines.</td><td>Each copied line's prior actual and base both start at last year's adjusted amount; adjustment type, months and site are kept. Replace the actual with the real figure.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a line</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Line</strong> (name) and <strong>Description</strong></td><td>Labels.</td><td>Text in the budget and the reports only.</td></tr>
|
||||||
|
<tr><td><strong>Category</strong></td><td>Which group the line belongs to (your department's categories).</td><td>Moves the amounts from one category total to another: category pages and charts in Capex and Costs, grouping in the Monthly budget. Budget totals stay the same, unless the category is a revenue category, in which case the amount counts as revenue instead of cost.</td></tr>
|
||||||
|
<tr><td><strong>Site</strong> <em>(Unidade)</em></td><td>Sagres, Quinta, Chiado, Oriente, or Group.</td><td>What appears when a page or report is filtered by site. "Group" lines appear only in the all-sites view.</td></tr>
|
||||||
|
<tr><td><strong>Prior-year actual</strong></td><td>What was spent last year.</td><td>The "prior" column, change € and change %, category and budget prior totals, and the comparison charts. Does <em>not</em> change the new year's amount.</td></tr>
|
||||||
|
<tr><td><strong>Base</strong> <em>(sem ajuste)</em></td><td>The new year's amount before the adjustment.</td><td>Adjusted amount → months → every total for the new year → both reports.</td></tr>
|
||||||
|
<tr><td><strong>Adjustment</strong> and its <strong>value</strong></td><td>How the base becomes the adjusted amount (see the table above).</td><td>Factor → adjusted amount → months → totals → reports.</td></tr>
|
||||||
|
<tr><td><strong>Reason for adjustment</strong></td><td>Why it went up or down.</td><td>Shown under the line and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Months</strong></td><td>How the year amount is spread: split over 12, split over chosen months, or typed monthly amounts.</td><td>Only the Monthly budget's month columns and the monthly totals. The year total does not change (except with typed amounts, where the year total <em>is</em> the sum of the months).</td></tr>
|
||||||
|
<tr><td><strong>Remarks</strong></td><td>Free notes.</td><td>Shown on the line; no effect on numbers.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a category</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What changes</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Name (PT / EN)</strong></td><td>The heading in the language of the screen or the report.</td></tr>
|
||||||
|
<tr><td><strong>Section: cost or revenue</strong></td><td>Whether its lines count in the cost totals or the revenue totals.</td></tr>
|
||||||
|
<tr><td><strong>Order</strong></td><td>The order of categories on screen and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Show when empty</strong></td><td>Whether a category with no lines still appears (with zero) in the budget and reports.</td></tr>
|
||||||
|
<tr><td><strong>Active</strong></td><td>Inactive categories can't be chosen for new lines. Existing lines keep them. A category with lines can be deactivated, but not deleted.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="months">8. Splitting a year into months</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 300" role="img" aria-labelledby="mo-t">
|
||||||
|
<title id="mo-t">The three ways to split a line into months</title>
|
||||||
|
<text x="20" y="30" class="t">Split over 12 <tspan class="ts"> (Dividir por 12) · 12 000,00 €</tspan></text>
|
||||||
|
<g transform="translate(20,44)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-p"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">1 000</text><text x="88" y="37">1 000</text><text x="168" y="37">1 000</text><text x="248" y="37">1 000</text><text x="328" y="37">1 000</text><text x="408" y="37">1 000</text><text x="488" y="37">1 000</text><text x="568" y="37">1 000</text><text x="648" y="37">1 000</text><text x="728" y="37">1 000</text><text x="808" y="37">1 000</text><text x="888" y="37">1 000</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="128" class="t">Split over chosen months <tspan class="ts"> (Dividir pelos meses escolhidos) · Jan–Apr ticked</tspan></text>
|
||||||
|
<g transform="translate(20,142)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-n"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">3 000</text><text x="88" y="37">3 000</text><text x="168" y="37">3 000</text><text x="248" y="37">3 000</text></g>
|
||||||
|
<g class="ts"><text x="328" y="37">0</text><text x="408" y="37">0</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">0</text><text x="728" y="37">0</text><text x="808" y="37">0</text><text x="888" y="37">0</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="226" class="t">Monthly amounts <tspan class="ts"> (Valores mensais) · each month typed; the year total is their sum</tspan></text>
|
||||||
|
<g transform="translate(20,240)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-y"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">500</text><text x="88" y="37">500</text><text x="168" y="37">2 000</text><text x="248" y="37">800</text><text x="328" y="37">800</text><text x="408" y="37">800</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">1 600</text><text x="728" y="37">800</text><text x="808" y="37">800</text><text x="888" y="37">3 400</text></g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<figcaption>The first two keep the year total (base × adjustment) and only decide <em>when</em> it is spent. Quick buttons on the line pick a quarter (Q1–Q4) or a half-year (H1, H2). Switching a line from typed months to a split keeps its year total as the base.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reports">9. Reports, downloads and email</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Capex and Costs <span class="tag">Capex e Custos</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Totals: prior-year actual vs adjusted, change € and %</li>
|
||||||
|
<li>Chart of each category, last year vs this year</li>
|
||||||
|
<li>Chart of the change by category</li>
|
||||||
|
<li>One page per category with its lines and reasons</li>
|
||||||
|
<li>Summary table</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Monthly budget <span class="tag">Orçamento mensal</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Every line with its twelve months and year total</li>
|
||||||
|
<li>Category subtotals and monthly totals</li>
|
||||||
|
<li>Option: include empty categories</li>
|
||||||
|
<li>Excel version keeps live formulas</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p>On the <strong>Reports</strong> page you pick the budget, the <strong>language</strong> (Portuguese or English) and the <strong>site</strong>; the same choice applies to viewing online, PDF, Excel and email. On a <strong>budget page</strong>, <strong>Download ▾</strong> offers the editable budget file and both reports, and <strong>Send by email</strong> lets you attach any of them. That works in every status, including draft and approved.</p>
|
||||||
|
<p>Sending by email asks for recipients (To, Cc, "send me a copy"), a subject and a message, and which files to attach. The email goes out from the account the administrator set up, a copy is saved in that mailbox's Sent folder, and the mail log records it.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="excel">10. Excel: template, download, re-upload</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 340" role="img" aria-labelledby="xl-t">
|
||||||
|
<title id="xl-t">Download, change and upload a budget file</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h6" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="40" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="38" y="72" class="t">Draft budget</text>
|
||||||
|
<text x="38" y="94" class="ts">IT 2027 "Budget 2027"</text>
|
||||||
|
<text x="38" y="114" class="ts">in the app</text>
|
||||||
|
|
||||||
|
<rect x="270" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="288" y="72" class="t">Download ▾</text>
|
||||||
|
<text x="288" y="94" class="ts">Budget file</text>
|
||||||
|
<text x="288" y="114" class="ts mono">Orcamento_IT_2027.xlsx</text>
|
||||||
|
|
||||||
|
<rect x="520" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="538" y="72" class="t">Change it in Excel</text>
|
||||||
|
<text x="538" y="94" class="ts">lines, amounts, months</text>
|
||||||
|
<text x="538" y="114" class="ts">same file name</text>
|
||||||
|
|
||||||
|
<rect x="770" y="40" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="788" y="72" class="t">Upload Excel</text>
|
||||||
|
<text x="788" y="94" class="ts">pop-up: "The file</text>
|
||||||
|
<text x="788" y="114" class="ts">already exists" · OK</text>
|
||||||
|
|
||||||
|
<path d="M220,85 H266" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M470,85 H516" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M720,85 H766" class="ar" marker-end="url(#h6)"/>
|
||||||
|
|
||||||
|
<rect x="520" y="200" width="460" height="100" rx="12" class="bx-g"/>
|
||||||
|
<text x="538" y="232" class="t">New current budget</text>
|
||||||
|
<text x="538" y="254" class="ts">the lines from your file; same title "Budget 2027"</text>
|
||||||
|
<text x="538" y="274" class="ts">"Loaded from Orcamento_IT_2027.xlsx" · editable draft</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="450" height="112" rx="12" class="bx-n"/>
|
||||||
|
<text x="38" y="232" class="t">Old version, archived 🔒</text>
|
||||||
|
<text x="38" y="254" class="ts">renamed "Budget 2027 (2026-10-28 23:00)"</text>
|
||||||
|
<text x="38" y="274" class="ts mono">Orcamento_IT_2027_2026-10-28_2300.xlsx</text>
|
||||||
|
<text x="38" y="296" class="ts">locked: view, export, email; admin may delete</text>
|
||||||
|
|
||||||
|
<path d="M875,130 V196" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M800,130 C700,170 400,160 250,196" class="ar-d" marker-end="url(#h6)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Nothing is lost: the version you replace is kept, renamed with the date and time, and locked. Only a draft can be replaced. An approved or in-review budget must be reopened first. Archived versions are listed under Budgets → "Show archived versions".</figcaption>
|
||||||
|
</figure>
|
||||||
|
<p><strong>Excel template</strong> (Budgets → <em>Modelo Excel</em>) gives a workbook for a department and year, blank or pre-filled from an existing budget, in PT or EN. It has an Instructions sheet and a Lines sheet with drop-down lists for category, site and adjustment, twelve month columns, and a last column <em>Split over months</em> where you can write <code>1-4</code> or <code>Jan, Fev, Mar, Abr</code>. Unknown categories are created on import; anything skipped is listed. The original "Budget para 2027" workbook layout can also be imported.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reopen">11. Reopening an approved budget</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 250" role="img" aria-labelledby="ro-t">
|
||||||
|
<title id="ro-t">Reopen request flow</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h7" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="70" width="190" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="38" y="102" class="t">Approved budget</text>
|
||||||
|
<text x="38" y="124" class="ts">any user presses</text>
|
||||||
|
<text x="38" y="142" class="ts">"Request reopening"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="70" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="278" y="102" class="t">Reason (mandatory)</text>
|
||||||
|
<text x="278" y="124" class="ts">at least 5 characters;</text>
|
||||||
|
<text x="278" y="142" class="ts">request is pending</text>
|
||||||
|
|
||||||
|
<rect x="520" y="70" width="210" height="90" rx="12" class="bx"/>
|
||||||
|
<text x="538" y="102" class="t">Approvers + admins</text>
|
||||||
|
<text x="538" y="124" class="ts">see it on the budget,</text>
|
||||||
|
<text x="538" y="142" class="ts">get an email</text>
|
||||||
|
|
||||||
|
<rect x="780" y="20" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="798" y="52" class="t">Accept and reopen</text>
|
||||||
|
<text x="798" y="74" class="ts">budget back to draft;</text>
|
||||||
|
<text x="798" y="92" class="ts">requester emailed</text>
|
||||||
|
|
||||||
|
<rect x="780" y="130" width="200" height="90" rx="12" class="bx-r"/>
|
||||||
|
<text x="798" y="162" class="t">Decline</text>
|
||||||
|
<text x="798" y="184" class="ts">reason required; stays</text>
|
||||||
|
<text x="798" y="202" class="ts">approved; requester emailed</text>
|
||||||
|
|
||||||
|
<path d="M210,115 H256" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M470,115 H516" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,100 C755,90 755,70 776,66" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,130 C755,140 755,170 776,174" class="ar" marker-end="url(#h7)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>An approver or administrator of the department can also reopen directly with <strong>Reopen</strong>, giving a reason; that also answers an open request. One request can be pending at a time. All requests, decisions and reasons stay in the budget's History.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="admin">12. Admin: email, logs, backups, upgrades</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Email → Sending account</h3>
|
||||||
|
<ul>
|
||||||
|
<li>SMTP server, port, security (STARTTLS 587 / SSL 465 / none), username and password</li>
|
||||||
|
<li>Sender address and name, reply-to, signature</li>
|
||||||
|
<li>Copy in the Sent folder over IMAP (found automatically, or named)</li>
|
||||||
|
<li><strong>Test connection</strong> signs in only; <strong>Send test email</strong> sends one</li>
|
||||||
|
<li>Turning email on adds "Send by email" for everyone</li>
|
||||||
|
</ul>
|
||||||
|
<p class="muted">Gmail already keeps its own copy, so turn the Sent-folder option off there.</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Logs</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Activity</strong>: sign-ins (and failed ones), every change to budgets and lines, imports, approvals, reopen requests, archiving, deletions, report views, downloads and emails, admin changes. Filter and export to CSV.</li>
|
||||||
|
<li><strong>Email → Mail log</strong>: who sent what to whom, attachments, delivered or failed, Sent-folder copy saved or not. Export to CSV.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Backups</h3>
|
||||||
|
<ul>
|
||||||
|
<li>A database dump every night at <code>BACKUP_TIME</code> into <code>backups/</code>, kept <code>BACKUP_KEEP_DAYS</code> days</li>
|
||||||
|
<li>An extra one, <code>…_before_upgrade.sql.gz</code>, before every upgrade that changes the database</li>
|
||||||
|
<li>Restore: <code>docker compose exec backup restore.sh /backups/<file></code></li>
|
||||||
|
<li>Copy <code>backups/</code> to another disk or NAS regularly</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Upgrading to a new version</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Unzip the new version over the app folder, keeping <code>.env</code> and <code>backups/</code></li>
|
||||||
|
<li>Run <code>docker compose up -d --build</code></li>
|
||||||
|
</ol>
|
||||||
|
<p>The api asks for a backup, waits for it, then updates the database. If the backup fails, it does not upgrade. Never run <code>docker compose down -v</code>: <code>-v</code> deletes the data.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="muted" style="margin-top:40px">Budget & Capex · version 5.0.0 · guide written 28 October 2026.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
@@ -0,0 +1,733 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Budget & Capex app guide</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #f6f7f9; --surface: #ffffff; --surface-2: #eef1f5; --text: #1d1f23; --muted: #5f6570; --border: #d5dae1;
|
||||||
|
--primary: #1f3b63; --primary-soft: #e3ebf6; --accent: #e8632b; --accent-soft: #fdebe2; --green: #15803d;
|
||||||
|
--green-soft: #e1f3e7; --red: #b42318; --red-soft: #fbe4e2; --amber: #a15c07; --amber-soft: #fdf1dc; --line: #7a8494;
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme="light"]) {
|
||||||
|
--bg: #14161a; --surface: #1d2026; --surface-2: #262a32; --text: #e8eaee; --muted: #a0a7b3; --border: #383d48;
|
||||||
|
--primary: #8db4ee; --primary-soft: #23324a; --accent: #f39a6b; --accent-soft: #3b2a22; --green: #5ad38a;
|
||||||
|
--green-soft: #1d3326; --red: #f48a80; --red-soft: #3b2222; --amber: #e8b45c; --amber-soft: #3a2f1c; --line: #8c95a3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { -webkit-text-size-adjust: 100%; }
|
||||||
|
body { margin: 0; background: var(--bg); color: var(--text); font: 15px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
main { max-width: 1040px; margin: 0 auto; padding: 32px 20px 64px; }
|
||||||
|
h1 { font-size: 30px; line-height: 1.2; margin: 0 0 6px; }
|
||||||
|
h2 { font-size: 22px; margin: 48px 0 10px; padding-top: 8px; border-top: 1px solid var(--border); }
|
||||||
|
h3 { font-size: 16px; margin: 24px 0 6px; }
|
||||||
|
p { margin: 8px 0; max-width: 78ch; }
|
||||||
|
.lead { color: var(--muted); font-size: 16px; }
|
||||||
|
.muted { color: var(--muted); }
|
||||||
|
code, .mono { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13px; background: var(--surface-2); padding: 1px 5px; border-radius: 4px; }
|
||||||
|
.toc { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 20px; padding: 14px 18px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 20px 0; }
|
||||||
|
.toc a { color: var(--primary); text-decoration: none; }
|
||||||
|
.toc a:hover { text-decoration: underline; }
|
||||||
|
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 16px 18px; margin: 14px 0; }
|
||||||
|
figure { margin: 16px 0; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }
|
||||||
|
figure svg { width: 100%; height: auto; display: block; }
|
||||||
|
figcaption { color: var(--muted); font-size: 13px; margin-top: 8px; }
|
||||||
|
table { border-collapse: collapse; width: 100%; font-size: 14px; }
|
||||||
|
th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }
|
||||||
|
th { background: var(--surface-2); font-size: 12.5px; text-transform: uppercase; letter-spacing: .03em; color: var(--muted); }
|
||||||
|
.table-wrap { overflow-x: auto; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 14px 0; }
|
||||||
|
.table-wrap table th:first-child, .table-wrap table td:first-child { padding-left: 14px; }
|
||||||
|
.yes { color: var(--green); font-weight: 600; } .no { color: var(--muted); } .own { color: var(--amber); font-weight: 600; }
|
||||||
|
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
|
||||||
|
.example { background: var(--primary-soft); border-radius: 10px; padding: 12px 16px; margin: 12px 0; }
|
||||||
|
.example .calc { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13.5px; white-space: pre-wrap; }
|
||||||
|
.tag { display: inline-block; font-size: 12px; font-weight: 600; padding: 1px 8px; border-radius: 999px; background: var(--surface-2); color: var(--muted); }
|
||||||
|
ul { padding-left: 22px; } li { margin: 3px 0; }
|
||||||
|
/* diagram parts */
|
||||||
|
.bx { fill: var(--surface); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.bx-p { fill: var(--primary-soft); stroke: var(--primary); stroke-width: 1.5; }
|
||||||
|
.bx-a { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 1.5; }
|
||||||
|
.bx-g { fill: var(--green-soft); stroke: var(--green); stroke-width: 1.5; }
|
||||||
|
.bx-r { fill: var(--red-soft); stroke: var(--red); stroke-width: 1.5; }
|
||||||
|
.bx-y { fill: var(--amber-soft); stroke: var(--amber); stroke-width: 1.5; }
|
||||||
|
.bx-n { fill: var(--surface-2); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.zone { fill: none; stroke: var(--border); stroke-width: 1.5; stroke-dasharray: 6 5; }
|
||||||
|
.t { fill: var(--text); font: 600 14px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.ts { fill: var(--muted); font: 12.5px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.tz { fill: var(--muted); font: 600 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; letter-spacing: .05em; }
|
||||||
|
.ar { stroke: var(--line); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-d { stroke: var(--line); stroke-width: 1.4; fill: none; stroke-dasharray: 5 4; }
|
||||||
|
.ar-r { stroke: var(--red); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-g { stroke: var(--green); stroke-width: 1.8; fill: none; }
|
||||||
|
.lbl { fill: var(--muted); font: 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.head { fill: var(--line); } .head-r { fill: var(--red); } .head-g { fill: var(--green); }
|
||||||
|
@media (max-width: 720px) { .grid2 { grid-template-columns: 1fr; } h1 { font-size: 25px; } main { padding: 20px 16px 48px; } }
|
||||||
|
@media print {
|
||||||
|
body { background: #fff; font-size: 12.5px; }
|
||||||
|
main { max-width: none; padding: 0; }
|
||||||
|
h2 { break-before: page; border-top: 0; margin-top: 0; }
|
||||||
|
figure, .card, .example, .table-wrap, tr { break-inside: avoid; }
|
||||||
|
.toc { break-after: page; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<h1>Budget & Capex: how the app works</h1>
|
||||||
|
<p class="lead">Version 6.0 · a guide to what the app does, who can do what, how a budget moves from draft to approved, and how each field you change affects the numbers in the reports.</p>
|
||||||
|
<p class="muted">The screens are in Portuguese or English (PT/EN switch at the top). This guide uses the English names, with the Portuguese name in <em>italics</em> where it helps.</p>
|
||||||
|
|
||||||
|
<nav class="toc" aria-label="Contents">
|
||||||
|
<a href="#map">1. The app at a glance</a>
|
||||||
|
<a href="#arch">2. What runs on the server</a>
|
||||||
|
<a href="#data">3. What is stored</a>
|
||||||
|
<a href="#roles">4. Roles and permissions</a>
|
||||||
|
<a href="#life">5. A budget's life cycle</a>
|
||||||
|
<a href="#calc">6. How the numbers are calculated</a>
|
||||||
|
<a href="#fields">7. Every field and what it changes</a>
|
||||||
|
<a href="#months">8. Splitting a year into months</a>
|
||||||
|
<a href="#reports">9. Reports, downloads and email</a>
|
||||||
|
<a href="#excel">10. Excel: template, download, re-upload</a>
|
||||||
|
<a href="#reopen">11. Reopening an approved budget</a>
|
||||||
|
<a href="#admin">12. Admin: email, logs, backups, upgrades</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="map">1. The app at a glance</h2>
|
||||||
|
<p>Each department prepares one budget per year. A budget is a list of cost and revenue lines grouped by category. Each line has last year's actual amount, this year's base amount and an adjustment, and it is split over the months. From those lines the app produces two documents, on screen and in PDF and Excel: the <strong>Capex and Costs report</strong> (<em>Capex e Custos</em>) and the <strong>Monthly budget</strong> (<em>Orçamento mensal</em>).</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 430" role="img" aria-labelledby="map-t">
|
||||||
|
<title id="map-t">Pages of the app and who sees them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">EVERY USER</text>
|
||||||
|
<rect x="20" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="40" y="70" class="t">Budgets (Orçamentos)</text>
|
||||||
|
<text x="40" y="94" class="ts">List per department and year</text>
|
||||||
|
<text x="40" y="114" class="ts">New year · Import Excel · Excel template</text>
|
||||||
|
<text x="40" y="134" class="ts">Archived versions</text>
|
||||||
|
<text x="40" y="160" class="ts">→ open a budget to edit, approve,</text>
|
||||||
|
<text x="40" y="178" class="ts"> download, email, request reopening</text>
|
||||||
|
|
||||||
|
<rect x="350" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="370" y="70" class="t">Budget page</text>
|
||||||
|
<text x="370" y="94" class="ts">Lines by category, totals, year rate</text>
|
||||||
|
<text x="370" y="114" class="ts">Workflow steps and status</text>
|
||||||
|
<text x="370" y="134" class="ts">Download ▾ · Send by email · Upload Excel</text>
|
||||||
|
<text x="370" y="154" class="ts">History (changes and reopen requests)</text>
|
||||||
|
<text x="370" y="174" class="ts">Delete (administrators only)</text>
|
||||||
|
|
||||||
|
<rect x="680" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="700" y="70" class="t">Reports (Relatórios)</text>
|
||||||
|
<text x="700" y="94" class="ts">Capex and Costs · Monthly budget</text>
|
||||||
|
<text x="700" y="114" class="ts">Choose language and site</text>
|
||||||
|
<text x="700" y="134" class="ts">View online · PDF · Excel</text>
|
||||||
|
<text x="700" y="154" class="ts">Send by email</text>
|
||||||
|
<text x="700" y="174" class="ts">My profile: name, language, password</text>
|
||||||
|
|
||||||
|
<path d="M320,115 H346" class="ar" marker-end="url(#h)"/>
|
||||||
|
<path d="M650,115 H676" class="ar" marker-end="url(#h)"/>
|
||||||
|
|
||||||
|
<text x="20" y="236" class="tz">APPROVERS</text>
|
||||||
|
<rect x="20" y="248" width="300" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="40" y="276" class="t">Categories (Categorias)</text>
|
||||||
|
<text x="40" y="298" class="ts">Their own department's categories</text>
|
||||||
|
|
||||||
|
<rect x="20" y="334" width="300" height="70" rx="12" class="bx-g"/>
|
||||||
|
<text x="40" y="362" class="t">Upper Management: read-only</text>
|
||||||
|
<text x="40" y="384" class="ts">Budgets + Reports only, all departments</text>
|
||||||
|
|
||||||
|
<text x="350" y="236" class="tz">ADMINISTRATORS</text>
|
||||||
|
<rect x="350" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="276" class="t">Departments</text>
|
||||||
|
<text x="368" y="298" class="ts">and their workflows</text>
|
||||||
|
<rect x="565" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="583" y="276" class="t">Categories and sites</text>
|
||||||
|
<text x="583" y="298" class="ts">all departments</text>
|
||||||
|
<rect x="780" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="798" y="276" class="t">Users</text>
|
||||||
|
<text x="798" y="298" class="ts">role, department, language</text>
|
||||||
|
<rect x="350" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="362" class="t">Activity (Atividade)</text>
|
||||||
|
<text x="368" y="384" class="ts">who did what, filters, CSV</text>
|
||||||
|
<rect x="675" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="693" y="362" class="t">Email</text>
|
||||||
|
<text x="693" y="384" class="ts">sending account · mail log</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Pages in the top menu. Upper Management sees only Budgets and Reports, for every department, and can view, download and email but not change anything. Approvers also see everything every user sees, and administrators see everything.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="arch">2. What runs on the server</h2>
|
||||||
|
<p>The app runs on one server on your network with Docker. People open it in a browser at <code>http://<server>:8080</code>. Nothing needs to be installed on the PCs.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 400" role="img" aria-labelledby="arch-t">
|
||||||
|
<title id="arch-t">Containers and how they connect</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="150" width="170" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="185" class="t">Browsers</text>
|
||||||
|
<text x="40" y="207" class="ts">PCs on the network</text>
|
||||||
|
|
||||||
|
<rect x="230" y="40" width="580" height="320" rx="14" class="zone"/>
|
||||||
|
<text x="250" y="66" class="tz">SERVER · DOCKER COMPOSE "budget-capex"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="278" y="183" class="t">web (Caddy)</text>
|
||||||
|
<text x="278" y="205" class="ts">screens, HTTPS,</text>
|
||||||
|
<text x="278" y="223" class="ts">passes /api on</text>
|
||||||
|
|
||||||
|
<rect x="460" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="478" y="183" class="t">api (Python)</text>
|
||||||
|
<text x="478" y="205" class="ts">rules, calculations,</text>
|
||||||
|
<text x="478" y="223" class="ts">PDF and Excel</text>
|
||||||
|
|
||||||
|
<rect x="660" y="150" width="130" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="678" y="183" class="t">db</text>
|
||||||
|
<text x="678" y="205" class="ts">PostgreSQL:</text>
|
||||||
|
<text x="678" y="223" class="ts">all the data</text>
|
||||||
|
|
||||||
|
<rect x="460" y="270" width="330" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="478" y="298" class="t">backup</text>
|
||||||
|
<text x="478" y="320" class="ts">nightly dump + one before every upgrade</text>
|
||||||
|
|
||||||
|
<rect x="840" y="80" width="140" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="113" class="t">Mail server</text>
|
||||||
|
<text x="858" y="135" class="ts">SMTP: send</text>
|
||||||
|
<text x="858" y="153" class="ts">IMAP: Sent copy</text>
|
||||||
|
|
||||||
|
<rect x="840" y="270" width="140" height="70" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="298" class="t">backups/</text>
|
||||||
|
<text x="858" y="320" class="ts">folder on disk</text>
|
||||||
|
|
||||||
|
<path d="M190,195 H256" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<text x="200" y="185" class="lbl">:8080</text>
|
||||||
|
<path d="M420,195 H456" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M620,195 H656" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M620,170 C700,120 760,125 836,125" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<text x="690" y="112" class="lbl">emails</text>
|
||||||
|
<path d="M725,240 V266" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M790,305 H836" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M540,240 V266" class="ar-d" marker-end="url(#h2)"/>
|
||||||
|
<text x="548" y="258" class="lbl">"back up first"</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Four containers. Your data lives in the db container's volume, not in the app folder, so replacing the folder with a new version keeps it. The dashed arrow is the request the api makes before it changes the database during an upgrade.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="data">3. What is stored</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 540" role="img" aria-labelledby="data-t">
|
||||||
|
<title id="data-t">Main records and how they relate</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h3" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="380" y="20" width="240" height="78" rx="12" class="bx-a"/>
|
||||||
|
<text x="400" y="50" class="t">Department</text>
|
||||||
|
<text x="400" y="72" class="ts">e.g. IT, F&B · name, active</text>
|
||||||
|
|
||||||
|
<rect x="20" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="40" y="180" class="t">User</text>
|
||||||
|
<text x="40" y="202" class="ts">role, department, language</text>
|
||||||
|
<text x="40" y="222" class="ts">one department (optional for Upper Mgmt)</text>
|
||||||
|
|
||||||
|
<rect x="270" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="290" y="180" class="t">Workflow step</text>
|
||||||
|
<text x="290" y="202" class="ts">ordered; approved by the</text>
|
||||||
|
<text x="290" y="222" class="ts">dept's approvers or named users</text>
|
||||||
|
|
||||||
|
<rect x="520" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="180" class="t">Category</text>
|
||||||
|
<text x="540" y="202" class="ts">PT and EN name, cost/revenue,</text>
|
||||||
|
<text x="540" y="222" class="ts">order, show when empty</text>
|
||||||
|
|
||||||
|
<rect x="770" y="150" width="210" height="92" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="180" class="t">Budget (year)</text>
|
||||||
|
<text x="790" y="202" class="ts">year, title, year rate, status,</text>
|
||||||
|
<text x="790" y="222" class="ts">current step, source file</text>
|
||||||
|
|
||||||
|
<rect x="770" y="300" width="210" height="110" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="330" class="t">Line</text>
|
||||||
|
<text x="790" y="352" class="ts">category, site, prior actual,</text>
|
||||||
|
<text x="790" y="372" class="ts">base, adjustment, months,</text>
|
||||||
|
<text x="790" y="392" class="ts">remarks</text>
|
||||||
|
|
||||||
|
<rect x="520" y="300" width="220" height="70" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="330" class="t">Site</text>
|
||||||
|
<text x="540" y="352" class="ts">Sagres, Quinta, Chiado, Oriente</text>
|
||||||
|
|
||||||
|
<rect x="770" y="450" width="210" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="790" y="480" class="t">Reopen request</text>
|
||||||
|
<text x="790" y="502" class="ts">reason, status, decision</text>
|
||||||
|
|
||||||
|
<rect x="20" y="300" width="470" height="170" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="330" class="t">Shared by the whole app</text>
|
||||||
|
<text x="40" y="356" class="ts">Activity log: every action by every user</text>
|
||||||
|
<text x="40" y="378" class="ts">Mail settings: the sending account (passwords encrypted)</text>
|
||||||
|
<text x="40" y="400" class="ts">Mail log: every email sent and whether it arrived</text>
|
||||||
|
<text x="40" y="422" class="ts">Archived versions: replaced budgets, read-only</text>
|
||||||
|
<text x="40" y="444" class="ts">Sites are shared by all departments</text>
|
||||||
|
|
||||||
|
<path d="M430,98 L140,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M470,98 L390,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M530,98 L620,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M570,98 L860,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M875,242 V296" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="883" y="275" class="lbl">many</text>
|
||||||
|
<path d="M770,335 H744" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M740,225 L772,302" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M980,196 H994 V485 H984" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="900" y="440" class="lbl">many</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Solid arrows: "has many". Dashed: a line points to one category and optionally one site. A department's categories are its own, so an IT budget never shows F&B lines.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="roles">4. Roles and permissions</h2>
|
||||||
|
<p>Every user has one role and belongs to one department. Everyone can <strong>see and export every budget</strong>, and switch between departments with the department list on the Budgets page. Only the budget's own department can change or approve it.</p>
|
||||||
|
<div class="card"><strong>Upper Management</strong> (<em>Gestão de Topo</em>, new in version 6) is a read-only role for directors. These users see every department and start on <em>All departments</em>. They can open any budget and its reports, download them (the budget file, PDF and Excel) and send them by email. They cannot create, import, edit, upload, submit, approve, reopen, request reopening or delete, they never count as approvers, and their menu shows only Budgets and Reports. A department is optional for them.</div>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>What</th><th>Viewer</th><th>Upper Mgmt</th><th>Editor</th><th>Approver</th><th>Admin</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>View budgets and reports, download PDF / Excel</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td></tr>
|
||||||
|
<tr><td>Send reports by email (once email is set up)</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Request reopening of an approved budget (with reason)</td><td class="yes">yes</td><td class="no">no</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Create, import, edit a draft budget; upload a changed file</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Submit a draft for review</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Approve or return a workflow step</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept*</td><td class="own">own dept*</td></tr>
|
||||||
|
<tr><td>Reopen directly, accept or decline reopen requests</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Manage categories</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Delete a budget (any status, typed confirmation)</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Departments, workflows, users, sites, email settings, activity and mail logs</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<p class="muted">* A workflow step can instead name specific users who approve it; then only those users can approve that step, whatever their role (Upper Management users can never be named). An administrator can always return a budget in review to draft.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="life">5. A budget's life cycle</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 480" role="img" aria-labelledby="life-t">
|
||||||
|
<title id="life-t">Budget statuses and the actions that move between them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h4" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
<marker id="h4r" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-r"/></marker>
|
||||||
|
<marker id="h4g" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-g"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="40" class="ts">Create: New year (empty or copied from an earlier year) or Import Excel</text>
|
||||||
|
<path d="M90,50 V96" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="20" y="100" width="170" height="90" rx="14" class="bx-n"/>
|
||||||
|
<text x="40" y="135" class="t">Draft</text>
|
||||||
|
<text x="40" y="157" class="ts">editable by the</text>
|
||||||
|
<text x="40" y="175" class="ts">department</text>
|
||||||
|
|
||||||
|
<rect x="290" y="80" width="400" height="130" rx="14" class="bx-y"/>
|
||||||
|
<text x="310" y="110" class="t">In review</text>
|
||||||
|
<rect x="310" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="325" y="152" class="t">Step 1</text>
|
||||||
|
<text x="325" y="172" class="ts">e.g. IT director</text>
|
||||||
|
<rect x="455" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="470" y="152" class="t">Step 2</text>
|
||||||
|
<text x="470" y="172" class="ts">e.g. Finance</text>
|
||||||
|
<text x="590" y="160" class="t">… n</text>
|
||||||
|
<path d="M420,155 H451" class="ar" marker-end="url(#h4)"/>
|
||||||
|
<path d="M565,155 H585" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="790" y="100" width="190" height="90" rx="14" class="bx-g"/>
|
||||||
|
<text x="810" y="135" class="t">Approved</text>
|
||||||
|
<text x="810" y="157" class="ts">locked; view, export</text>
|
||||||
|
<text x="810" y="175" class="ts">and email only</text>
|
||||||
|
|
||||||
|
<path d="M190,135 H286" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="200" y="125" class="lbl">Submit</text>
|
||||||
|
<path d="M690,145 H786" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="702" y="135" class="lbl">Approve</text>
|
||||||
|
<text x="702" y="166" class="lbl">(last step)</text>
|
||||||
|
|
||||||
|
<path d="M330,210 C300,260 160,260 110,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="200" y="276" class="lbl">Return to draft (approver of the step, or admin)</text>
|
||||||
|
|
||||||
|
<path d="M885,190 C885,380 300,390 96,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="380" y="372" class="lbl">Reopen: approver/admin with a reason, or an accepted reopen request</text>
|
||||||
|
|
||||||
|
<rect x="20" y="396" width="300" height="66" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="424" class="t">Archived 🔒</text>
|
||||||
|
<text x="40" y="446" class="ts">replaced by an upload; read-only</text>
|
||||||
|
<path d="M50,190 V392" class="ar-d" marker-end="url(#h4)"/>
|
||||||
|
<text x="58" y="330" class="lbl">Upload a file for</text>
|
||||||
|
<text x="58" y="346" class="lbl">the same year</text>
|
||||||
|
|
||||||
|
<rect x="660" y="406" width="320" height="56" rx="12" class="bx-r"/>
|
||||||
|
<text x="680" y="440" class="t">Delete: administrators only, any status</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Only a draft can be changed. Each approval moves the budget to the next workflow step; the last approval makes it Approved. A department with no steps configured is approved in one step by its approvers.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="calc">6. How the numbers are calculated</h2>
|
||||||
|
<p>Every total in the app and in the reports is built from the lines, in this order. Change any input on the left, and everything to its right follows.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 470" role="img" aria-labelledby="calc-t">
|
||||||
|
<title id="calc-t">From a line's fields to the report totals</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h5" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">YOU TYPE</text>
|
||||||
|
<text x="300" y="28" class="tz">THE APP WORKS OUT</text>
|
||||||
|
<text x="760" y="28" class="tz">YOU SEE</text>
|
||||||
|
|
||||||
|
<rect x="20" y="44" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="70" class="t">Prior-year actual</text>
|
||||||
|
<text x="36" y="91" class="ts">number or 12*839,67</text>
|
||||||
|
|
||||||
|
<rect x="20" y="122" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="148" class="t">Base (without adjustment)</text>
|
||||||
|
<text x="36" y="169" class="ts">number or calculation</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="226" class="t">Adjustment</text>
|
||||||
|
<text x="36" y="247" class="ts">year rate · % · factor · none</text>
|
||||||
|
|
||||||
|
<rect x="20" y="278" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="304" class="t">Year rate (budget)</text>
|
||||||
|
<text x="36" y="325" class="ts">Inflation + adjustments %</text>
|
||||||
|
|
||||||
|
<rect x="20" y="356" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="382" class="t">Months</text>
|
||||||
|
<text x="36" y="403" class="ts">12 · chosen months · typed</text>
|
||||||
|
|
||||||
|
<rect x="300" y="200" width="160" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="316" y="226" class="t">Factor</text>
|
||||||
|
<text x="316" y="247" class="ts">e.g. 1,055 or 1,15</text>
|
||||||
|
|
||||||
|
<rect x="510" y="122" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="148" class="t">Adjusted amount</text>
|
||||||
|
<text x="526" y="169" class="ts">base × factor, to cents</text>
|
||||||
|
|
||||||
|
<rect x="510" y="44" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="70" class="t">Change € and %</text>
|
||||||
|
<text x="526" y="91" class="ts">adjusted − prior</text>
|
||||||
|
|
||||||
|
<rect x="510" y="356" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="382" class="t">12 monthly amounts</text>
|
||||||
|
<text x="526" y="403" class="ts">in cents, add up exactly</text>
|
||||||
|
|
||||||
|
<rect x="760" y="44" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="72" class="t">Category totals</text>
|
||||||
|
<text x="776" y="94" class="ts">sum of its lines</text>
|
||||||
|
<text x="776" y="114" class="ts">(filtered by site if chosen)</text>
|
||||||
|
|
||||||
|
<rect x="760" y="160" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="188" class="t">Budget totals</text>
|
||||||
|
<text x="776" y="210" class="ts">costs and revenue,</text>
|
||||||
|
<text x="776" y="230" class="ts">prior → adjusted, change</text>
|
||||||
|
|
||||||
|
<rect x="760" y="276" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="304" class="t">Capex and Costs report</text>
|
||||||
|
<text x="776" y="326" class="ts">year totals and charts</text>
|
||||||
|
|
||||||
|
<rect x="760" y="362" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="390" class="t">Monthly budget</text>
|
||||||
|
<text x="776" y="412" class="ts">Jan … Dec per line</text>
|
||||||
|
|
||||||
|
<path d="M240,231 H296" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,309 C270,309 270,250 296,246" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<text x="246" y="348" class="lbl">only for "year rate"</text>
|
||||||
|
<path d="M460,231 C490,231 485,160 506,158" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,153 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,75 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,122 V110" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,184 V352" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,387 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,75 H756" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,153 C730,153 730,100 756,100" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,144 V156" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,260 V272" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,387 C730,387 730,397 756,397" class="ar" marker-end="url(#h5)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>With <strong>Monthly amounts</strong> (typed months) the path is different: the year total is simply the sum of the twelve months, and Base and Adjustment are not used.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<h3>The adjustment and the factor</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Adjustment (<em>Ajuste</em>)</th><th>Factor used</th><th>Example, base 96 532,00 €</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>Year rate (<em>Taxa do ano</em>)</td><td>1 + the budget's year rate</td><td>rate 5,5 % → × 1,055 = <strong>101 841,26 €</strong></td></tr>
|
||||||
|
<tr><td>Percent (<em>%</em>)</td><td>1 + adjustment value ÷ 100</td><td>value 15 → × 1,15 = <strong>111 011,80 €</strong></td></tr>
|
||||||
|
<tr><td>Factor (<em>Fator ×</em>)</td><td>the adjustment value</td><td>value 2,055 (hardware price rise) → <strong>198 373,26 €</strong></td></tr>
|
||||||
|
<tr><td>None (<em>Sem ajuste</em>)</td><td>1</td><td><strong>96 532,00 €</strong></td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="example">
|
||||||
|
<strong>Worked example (IT 2027, "Mobile phone subscriptions")</strong>
|
||||||
|
<div class="calc">Prior-year actual 96 532,00 €
|
||||||
|
Base 96 532,00 €
|
||||||
|
Adjustment Factor × 1,15
|
||||||
|
Adjusted 96 532,00 × 1,15 = 111 011,80 €
|
||||||
|
Change 111 011,80 − 96 532,00 = +14 479,80 € (+15,00 %)
|
||||||
|
Months chosen: Jan–Apr → 27 752,95 € each, May–Dec 0</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>Rounding rules</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Each line's adjusted amount is rounded to cents before it is added up, as the finance reports do. Totals are therefore exact sums of the lines you see.</li>
|
||||||
|
<li>Monthly amounts are in cents. The rounding difference goes to the last month (December, or the last chosen month), so the twelve months always add up to the adjusted amount.</li>
|
||||||
|
<li>Change % is blank when the prior-year actual is zero.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Typing amounts</h3>
|
||||||
|
<p>Amount fields work like Excel: <code>12*839,67+3292,56</code> or <code>=5512*12</code>. Both <code>1 234,56</code> and <code>1,234.56</code> are understood. The calculation is kept, so you can see later how a figure was built.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="fields">7. Every field and what it changes</h2>
|
||||||
|
|
||||||
|
<h3>On a budget</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Year</strong></td><td>The budget year; one current budget per department and year.</td><td>Column headings ("2026 actual", "2027 adjusted"), report titles, file names.</td></tr>
|
||||||
|
<tr><td><strong>Title</strong></td><td>Name shown in lists and reports.</td><td>Budget list, report headers, email subject suggestion.</td></tr>
|
||||||
|
<tr><td><strong>Inflation + adjustments (%)</strong> <em>(Taxa do ano)</em></td><td>The year rate.</td><td>Every line whose adjustment is "Year rate": their factor, adjusted amount, months, and so all category and budget totals and both reports. Lines with %, factor or none are not affected.</td></tr>
|
||||||
|
<tr><td><strong>Copy from an earlier year</strong> (when creating)</td><td>Starts the new year from another year's lines.</td><td>Each copied line's prior actual and base both start at last year's adjusted amount; adjustment type, months and site are kept. Replace the actual with the real figure.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a line</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Line</strong> (name) and <strong>Description</strong></td><td>Labels.</td><td>Text in the budget and the reports only.</td></tr>
|
||||||
|
<tr><td><strong>Category</strong></td><td>Which group the line belongs to (your department's categories).</td><td>Moves the amounts from one category total to another: category pages and charts in Capex and Costs, grouping in the Monthly budget. Budget totals stay the same, unless the category is a revenue category, in which case the amount counts as revenue instead of cost.</td></tr>
|
||||||
|
<tr><td><strong>Site</strong> <em>(Unidade)</em></td><td>Sagres, Quinta, Chiado, Oriente, or Group.</td><td>What appears when a page or report is filtered by site. "Group" lines appear only in the all-sites view.</td></tr>
|
||||||
|
<tr><td><strong>Prior-year actual</strong></td><td>What was spent last year.</td><td>The "prior" column, change € and change %, category and budget prior totals, and the comparison charts. Does <em>not</em> change the new year's amount.</td></tr>
|
||||||
|
<tr><td><strong>Base</strong> <em>(sem ajuste)</em></td><td>The new year's amount before the adjustment.</td><td>Adjusted amount → months → every total for the new year → both reports.</td></tr>
|
||||||
|
<tr><td><strong>Adjustment</strong> and its <strong>value</strong></td><td>How the base becomes the adjusted amount (see the table above).</td><td>Factor → adjusted amount → months → totals → reports.</td></tr>
|
||||||
|
<tr><td><strong>Reason for adjustment</strong></td><td>Why it went up or down.</td><td>Shown under the line and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Months</strong></td><td>How the year amount is spread: split over 12, split over chosen months, or typed monthly amounts.</td><td>Only the Monthly budget's month columns and the monthly totals. The year total does not change (except with typed amounts, where the year total <em>is</em> the sum of the months).</td></tr>
|
||||||
|
<tr><td><strong>Remarks</strong></td><td>Free notes.</td><td>Shown on the line; no effect on numbers.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a category</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What changes</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Name (PT / EN)</strong></td><td>The heading in the language of the screen or the report.</td></tr>
|
||||||
|
<tr><td><strong>Section: cost or revenue</strong></td><td>Whether its lines count in the cost totals or the revenue totals.</td></tr>
|
||||||
|
<tr><td><strong>Order</strong></td><td>The order of categories on screen and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Show when empty</strong></td><td>Whether a category with no lines still appears (with zero) in the budget and reports.</td></tr>
|
||||||
|
<tr><td><strong>Active</strong></td><td>Inactive categories can't be chosen for new lines. Existing lines keep them. A category with lines can be deactivated, but not deleted.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="months">8. Splitting a year into months</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 300" role="img" aria-labelledby="mo-t">
|
||||||
|
<title id="mo-t">The three ways to split a line into months</title>
|
||||||
|
<text x="20" y="30" class="t">Split over 12 <tspan class="ts"> (Dividir por 12) · 12 000,00 €</tspan></text>
|
||||||
|
<g transform="translate(20,44)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-p"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">1 000</text><text x="88" y="37">1 000</text><text x="168" y="37">1 000</text><text x="248" y="37">1 000</text><text x="328" y="37">1 000</text><text x="408" y="37">1 000</text><text x="488" y="37">1 000</text><text x="568" y="37">1 000</text><text x="648" y="37">1 000</text><text x="728" y="37">1 000</text><text x="808" y="37">1 000</text><text x="888" y="37">1 000</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="128" class="t">Split over chosen months <tspan class="ts"> (Dividir pelos meses escolhidos) · Jan–Apr ticked</tspan></text>
|
||||||
|
<g transform="translate(20,142)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-n"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">3 000</text><text x="88" y="37">3 000</text><text x="168" y="37">3 000</text><text x="248" y="37">3 000</text></g>
|
||||||
|
<g class="ts"><text x="328" y="37">0</text><text x="408" y="37">0</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">0</text><text x="728" y="37">0</text><text x="808" y="37">0</text><text x="888" y="37">0</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="226" class="t">Monthly amounts <tspan class="ts"> (Valores mensais) · each month typed; the year total is their sum</tspan></text>
|
||||||
|
<g transform="translate(20,240)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-y"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">500</text><text x="88" y="37">500</text><text x="168" y="37">2 000</text><text x="248" y="37">800</text><text x="328" y="37">800</text><text x="408" y="37">800</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">1 600</text><text x="728" y="37">800</text><text x="808" y="37">800</text><text x="888" y="37">3 400</text></g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<figcaption>The first two keep the year total (base × adjustment) and only decide <em>when</em> it is spent. Quick buttons on the line pick a quarter (Q1–Q4) or a half-year (H1, H2). Switching a line from typed months to a split keeps its year total as the base.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reports">9. Reports, downloads and email</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Capex and Costs <span class="tag">Capex e Custos</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Totals: prior-year actual vs adjusted, change € and %</li>
|
||||||
|
<li>Chart of each category, last year vs this year</li>
|
||||||
|
<li>Chart of the change by category</li>
|
||||||
|
<li>One page per category with its lines and reasons</li>
|
||||||
|
<li>Summary table</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Monthly budget <span class="tag">Orçamento mensal</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Every line with its twelve months and year total</li>
|
||||||
|
<li>Category subtotals and monthly totals</li>
|
||||||
|
<li>Option: include empty categories</li>
|
||||||
|
<li>Excel version keeps live formulas</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p>On the <strong>Reports</strong> page you pick the budget, the <strong>language</strong> (Portuguese or English) and the <strong>site</strong>; the same choice applies to viewing online, PDF, Excel and email. On a <strong>budget page</strong>, <strong>Download ▾</strong> offers the editable budget file and both reports, and <strong>Send by email</strong> lets you attach any of them. That works in every status, including draft and approved.</p>
|
||||||
|
<p>Sending by email asks for recipients (To, Cc, "send me a copy"), a subject and a message, and which files to attach. The email goes out from the account the administrator set up, a copy is saved in that mailbox's Sent folder, and the mail log records it.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="excel">10. Excel: template, download, re-upload</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 340" role="img" aria-labelledby="xl-t">
|
||||||
|
<title id="xl-t">Download, change and upload a budget file</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h6" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="40" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="38" y="72" class="t">Draft budget</text>
|
||||||
|
<text x="38" y="94" class="ts">IT 2027 "Budget 2027"</text>
|
||||||
|
<text x="38" y="114" class="ts">in the app</text>
|
||||||
|
|
||||||
|
<rect x="270" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="288" y="72" class="t">Download ▾</text>
|
||||||
|
<text x="288" y="94" class="ts">Budget file</text>
|
||||||
|
<text x="288" y="114" class="ts mono">Orcamento_IT_2027.xlsx</text>
|
||||||
|
|
||||||
|
<rect x="520" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="538" y="72" class="t">Change it in Excel</text>
|
||||||
|
<text x="538" y="94" class="ts">lines, amounts, months</text>
|
||||||
|
<text x="538" y="114" class="ts">same file name</text>
|
||||||
|
|
||||||
|
<rect x="770" y="40" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="788" y="72" class="t">Upload Excel</text>
|
||||||
|
<text x="788" y="94" class="ts">pop-up: "The file</text>
|
||||||
|
<text x="788" y="114" class="ts">already exists" · OK</text>
|
||||||
|
|
||||||
|
<path d="M220,85 H266" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M470,85 H516" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M720,85 H766" class="ar" marker-end="url(#h6)"/>
|
||||||
|
|
||||||
|
<rect x="520" y="200" width="460" height="100" rx="12" class="bx-g"/>
|
||||||
|
<text x="538" y="232" class="t">New current budget</text>
|
||||||
|
<text x="538" y="254" class="ts">the lines from your file; same title "Budget 2027"</text>
|
||||||
|
<text x="538" y="274" class="ts">"Loaded from Orcamento_IT_2027.xlsx" · editable draft</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="450" height="112" rx="12" class="bx-n"/>
|
||||||
|
<text x="38" y="232" class="t">Old version, archived 🔒</text>
|
||||||
|
<text x="38" y="254" class="ts">renamed "Budget 2027 (2026-10-28 23:00)"</text>
|
||||||
|
<text x="38" y="274" class="ts mono">Orcamento_IT_2027_2026-10-28_2300.xlsx</text>
|
||||||
|
<text x="38" y="296" class="ts">locked: view, export, email; admin may delete</text>
|
||||||
|
|
||||||
|
<path d="M875,130 V196" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M800,130 C700,170 400,160 250,196" class="ar-d" marker-end="url(#h6)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Nothing is lost: the version you replace is kept, renamed with the date and time, and locked. Only a draft can be replaced. An approved or in-review budget must be reopened first. Archived versions are listed under Budgets → "Show archived versions".</figcaption>
|
||||||
|
</figure>
|
||||||
|
<p><strong>Excel template</strong> (Budgets → <em>Modelo Excel</em>) gives a workbook for a department and year, blank or pre-filled from an existing budget, in PT or EN. It has an Instructions sheet and a Lines sheet with drop-down lists for category, site and adjustment, twelve month columns, and a last column <em>Split over months</em> where you can write <code>1-4</code> or <code>Jan, Fev, Mar, Abr</code>. Unknown categories are created on import; anything skipped is listed. The original "Budget para 2027" workbook layout can also be imported.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reopen">11. Reopening an approved budget</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 250" role="img" aria-labelledby="ro-t">
|
||||||
|
<title id="ro-t">Reopen request flow</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h7" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="70" width="190" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="38" y="102" class="t">Approved budget</text>
|
||||||
|
<text x="38" y="124" class="ts">any user but Upper Mgmt</text>
|
||||||
|
<text x="38" y="142" class="ts">clicks "Request reopening"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="70" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="278" y="102" class="t">Reason (mandatory)</text>
|
||||||
|
<text x="278" y="124" class="ts">at least 5 characters;</text>
|
||||||
|
<text x="278" y="142" class="ts">request is pending</text>
|
||||||
|
|
||||||
|
<rect x="520" y="70" width="210" height="90" rx="12" class="bx"/>
|
||||||
|
<text x="538" y="102" class="t">Approvers + admins</text>
|
||||||
|
<text x="538" y="124" class="ts">see it on the budget,</text>
|
||||||
|
<text x="538" y="142" class="ts">get an email</text>
|
||||||
|
|
||||||
|
<rect x="780" y="20" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="798" y="52" class="t">Accept and reopen</text>
|
||||||
|
<text x="798" y="74" class="ts">budget back to draft;</text>
|
||||||
|
<text x="798" y="92" class="ts">requester emailed</text>
|
||||||
|
|
||||||
|
<rect x="780" y="130" width="200" height="90" rx="12" class="bx-r"/>
|
||||||
|
<text x="798" y="162" class="t">Decline</text>
|
||||||
|
<text x="798" y="184" class="ts">reason required; stays</text>
|
||||||
|
<text x="798" y="202" class="ts">approved; requester emailed</text>
|
||||||
|
|
||||||
|
<path d="M210,115 H256" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M470,115 H516" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,100 C755,90 755,70 776,66" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,130 C755,140 755,170 776,174" class="ar" marker-end="url(#h7)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>An approver or administrator of the department can also reopen directly with <strong>Reopen</strong>, giving a reason; that also answers an open request. One request can be pending at a time. All requests, decisions and reasons stay in the budget's History.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="admin">12. Admin: email, logs, backups, upgrades</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Email → Sending account</h3>
|
||||||
|
<ul>
|
||||||
|
<li>SMTP server, port, security (STARTTLS 587 / SSL 465 / none), username and password</li>
|
||||||
|
<li>Sender address and name, reply-to, signature</li>
|
||||||
|
<li>Copy in the Sent folder over IMAP (found automatically, or named)</li>
|
||||||
|
<li><strong>Test connection</strong> signs in only; <strong>Send test email</strong> sends one</li>
|
||||||
|
<li>Turning email on adds "Send by email" for everyone, Upper Management included</li>
|
||||||
|
</ul>
|
||||||
|
<p class="muted">Gmail already keeps its own copy, so turn the Sent-folder option off there.</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Logs</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Activity</strong>: sign-ins (and failed ones), every change to budgets and lines, imports, approvals, reopen requests, archiving, deletions, report views, downloads and emails, admin changes. Filter and export to CSV.</li>
|
||||||
|
<li><strong>Email → Mail log</strong>: who sent what to whom, attachments, delivered or failed, Sent-folder copy saved or not. Export to CSV.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Backups</h3>
|
||||||
|
<ul>
|
||||||
|
<li>A database dump every night at <code>BACKUP_TIME</code> into <code>backups/</code>, kept <code>BACKUP_KEEP_DAYS</code> days</li>
|
||||||
|
<li>An extra one, <code>…_before_upgrade.sql.gz</code>, before every upgrade that changes the database</li>
|
||||||
|
<li>Restore: <code>docker compose exec backup restore.sh /backups/<file></code></li>
|
||||||
|
<li>Copy <code>backups/</code> to another disk or NAS regularly</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Upgrading to a new version</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Unzip the new version over the app folder, keeping <code>.env</code> and <code>backups/</code></li>
|
||||||
|
<li>Run <code>docker compose up -d --build</code></li>
|
||||||
|
</ol>
|
||||||
|
<p>The api asks for a backup, waits for it, then updates the database. If the backup fails, it does not upgrade. Never run <code>docker compose down -v</code>: <code>-v</code> deletes the data.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="muted" style="margin-top:40px">Budget & Capex · version 6.0.0 · guide updated 28 October 2026.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
@@ -0,0 +1,815 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>Budget & Capex app guide</title>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: #f6f7f9; --surface: #ffffff; --surface-2: #eef1f5; --text: #1d1f23; --muted: #5f6570; --border: #d5dae1;
|
||||||
|
--primary: #1f3b63; --primary-soft: #e3ebf6; --accent: #e8632b; --accent-soft: #fdebe2; --green: #15803d;
|
||||||
|
--green-soft: #e1f3e7; --red: #b42318; --red-soft: #fbe4e2; --amber: #a15c07; --amber-soft: #fdf1dc; --line: #7a8494;
|
||||||
|
}
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme="light"]) {
|
||||||
|
--bg: #14161a; --surface: #1d2026; --surface-2: #262a32; --text: #e8eaee; --muted: #a0a7b3; --border: #383d48;
|
||||||
|
--primary: #8db4ee; --primary-soft: #23324a; --accent: #f39a6b; --accent-soft: #3b2a22; --green: #5ad38a;
|
||||||
|
--green-soft: #1d3326; --red: #f48a80; --red-soft: #3b2222; --amber: #e8b45c; --amber-soft: #3a2f1c; --line: #8c95a3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
* { box-sizing: border-box; }
|
||||||
|
html { -webkit-text-size-adjust: 100%; }
|
||||||
|
body { margin: 0; background: var(--bg); color: var(--text); font: 15px/1.6 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
main { max-width: 1040px; margin: 0 auto; padding: 32px 20px 64px; }
|
||||||
|
h1 { font-size: 30px; line-height: 1.2; margin: 0 0 6px; }
|
||||||
|
h2 { font-size: 22px; margin: 48px 0 10px; padding-top: 8px; border-top: 1px solid var(--border); }
|
||||||
|
h3 { font-size: 16px; margin: 24px 0 6px; }
|
||||||
|
p { margin: 8px 0; max-width: 78ch; }
|
||||||
|
.lead { color: var(--muted); font-size: 16px; }
|
||||||
|
.muted { color: var(--muted); }
|
||||||
|
code, .mono { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13px; background: var(--surface-2); padding: 1px 5px; border-radius: 4px; }
|
||||||
|
.toc { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 20px; padding: 14px 18px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 20px 0; }
|
||||||
|
.toc a { color: var(--primary); text-decoration: none; }
|
||||||
|
.toc a:hover { text-decoration: underline; }
|
||||||
|
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 16px 18px; margin: 14px 0; }
|
||||||
|
figure { margin: 16px 0; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }
|
||||||
|
figure svg { width: 100%; height: auto; display: block; }
|
||||||
|
figcaption { color: var(--muted); font-size: 13px; margin-top: 8px; }
|
||||||
|
table { border-collapse: collapse; width: 100%; font-size: 14px; }
|
||||||
|
th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }
|
||||||
|
th { background: var(--surface-2); font-size: 12.5px; text-transform: uppercase; letter-spacing: .03em; color: var(--muted); }
|
||||||
|
.table-wrap { overflow-x: auto; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; margin: 14px 0; }
|
||||||
|
.table-wrap table th:first-child, .table-wrap table td:first-child { padding-left: 14px; }
|
||||||
|
.yes { color: var(--green); font-weight: 600; } .no { color: var(--muted); } .own { color: var(--amber); font-weight: 600; }
|
||||||
|
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
|
||||||
|
.example { background: var(--primary-soft); border-radius: 10px; padding: 12px 16px; margin: 12px 0; }
|
||||||
|
.example .calc { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 13.5px; white-space: pre-wrap; }
|
||||||
|
.tag { display: inline-block; font-size: 12px; font-weight: 600; padding: 1px 8px; border-radius: 999px; background: var(--surface-2); color: var(--muted); }
|
||||||
|
ul { padding-left: 22px; } li { margin: 3px 0; }
|
||||||
|
/* diagram parts */
|
||||||
|
.bx { fill: var(--surface); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.bx-p { fill: var(--primary-soft); stroke: var(--primary); stroke-width: 1.5; }
|
||||||
|
.bx-a { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 1.5; }
|
||||||
|
.bx-g { fill: var(--green-soft); stroke: var(--green); stroke-width: 1.5; }
|
||||||
|
.bx-r { fill: var(--red-soft); stroke: var(--red); stroke-width: 1.5; }
|
||||||
|
.bx-y { fill: var(--amber-soft); stroke: var(--amber); stroke-width: 1.5; }
|
||||||
|
.bx-n { fill: var(--surface-2); stroke: var(--border); stroke-width: 1.5; }
|
||||||
|
.zone { fill: none; stroke: var(--border); stroke-width: 1.5; stroke-dasharray: 6 5; }
|
||||||
|
.t { fill: var(--text); font: 600 14px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.ts { fill: var(--muted); font: 12.5px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.tz { fill: var(--muted); font: 600 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; letter-spacing: .05em; }
|
||||||
|
.ar { stroke: var(--line); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-d { stroke: var(--line); stroke-width: 1.4; fill: none; stroke-dasharray: 5 4; }
|
||||||
|
.ar-r { stroke: var(--red); stroke-width: 1.6; fill: none; }
|
||||||
|
.ar-g { stroke: var(--green); stroke-width: 1.8; fill: none; }
|
||||||
|
.lbl { fill: var(--muted); font: 12px system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
|
||||||
|
.head { fill: var(--line); } .head-r { fill: var(--red); } .head-g { fill: var(--green); }
|
||||||
|
@media (max-width: 720px) { .grid2 { grid-template-columns: 1fr; } h1 { font-size: 25px; } main { padding: 20px 16px 48px; } }
|
||||||
|
@media print {
|
||||||
|
body { background: #fff; font-size: 12.5px; }
|
||||||
|
main { max-width: none; padding: 0; }
|
||||||
|
h2 { break-before: page; border-top: 0; margin-top: 0; }
|
||||||
|
figure, .card, .example, .table-wrap, tr { break-inside: avoid; }
|
||||||
|
.toc { break-after: page; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main>
|
||||||
|
|
||||||
|
<h1>Budget & Capex: how the app works</h1>
|
||||||
|
<p class="lead">Version 7.0 · a guide to what the app does, who can do what, how a budget moves from draft to approved, and how each field you change affects the numbers in the reports.</p>
|
||||||
|
<p class="muted">The screens are in Portuguese or English (PT/EN switch at the top). This guide uses the English names, with the Portuguese name in <em>italics</em> where it helps.</p>
|
||||||
|
|
||||||
|
<nav class="toc" aria-label="Contents">
|
||||||
|
<a href="#map">1. The app at a glance</a>
|
||||||
|
<a href="#arch">2. What runs on the server</a>
|
||||||
|
<a href="#data">3. What is stored</a>
|
||||||
|
<a href="#roles">4. Roles and permissions</a>
|
||||||
|
<a href="#life">5. A budget's life cycle</a>
|
||||||
|
<a href="#calc">6. How the numbers are calculated</a>
|
||||||
|
<a href="#fields">7. Every field and what it changes</a>
|
||||||
|
<a href="#months">8. Splitting a year into months</a>
|
||||||
|
<a href="#reports">9. Reports, downloads and email</a>
|
||||||
|
<a href="#excel">10. Excel: template, download, re-upload</a>
|
||||||
|
<a href="#reopen">11. Reopening an approved budget</a>
|
||||||
|
<a href="#admin">12. Admin: email, logs, backups, upgrades</a>
|
||||||
|
<a href="#signin">13. Signing in, MFA, appearance, picture</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="map">1. The app at a glance</h2>
|
||||||
|
<p>Each department prepares one budget per year. A budget is a list of cost and revenue lines grouped by category. Each line has last year's actual amount, this year's base amount and an adjustment, and it is split over the months. From those lines the app produces two documents, on screen and in PDF and Excel: the <strong>Capex and Costs report</strong> (<em>Capex e Custos</em>) and the <strong>Monthly budget</strong> (<em>Orçamento mensal</em>).</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 430" role="img" aria-labelledby="map-t">
|
||||||
|
<title id="map-t">Pages of the app and who sees them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">EVERY USER</text>
|
||||||
|
<rect x="20" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="40" y="70" class="t">Budgets (Orçamentos)</text>
|
||||||
|
<text x="40" y="94" class="ts">List per department and year</text>
|
||||||
|
<text x="40" y="114" class="ts">New year · Import Excel · Excel template</text>
|
||||||
|
<text x="40" y="134" class="ts">Archived versions</text>
|
||||||
|
<text x="40" y="160" class="ts">→ open a budget to edit, approve,</text>
|
||||||
|
<text x="40" y="178" class="ts"> download, email, request reopening</text>
|
||||||
|
|
||||||
|
<rect x="350" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="370" y="70" class="t">Budget page</text>
|
||||||
|
<text x="370" y="94" class="ts">Lines by category, totals, year rate</text>
|
||||||
|
<text x="370" y="114" class="ts">Workflow steps and status</text>
|
||||||
|
<text x="370" y="134" class="ts">Download ▾ · Send by email · Upload Excel</text>
|
||||||
|
<text x="370" y="154" class="ts">History (changes and reopen requests)</text>
|
||||||
|
<text x="370" y="174" class="ts">Delete (administrators only)</text>
|
||||||
|
|
||||||
|
<rect x="680" y="40" width="300" height="150" rx="12" class="bx-p"/>
|
||||||
|
<text x="700" y="70" class="t">Reports (Relatórios)</text>
|
||||||
|
<text x="700" y="94" class="ts">Capex and Costs · Monthly budget</text>
|
||||||
|
<text x="700" y="114" class="ts">Choose language and site</text>
|
||||||
|
<text x="700" y="134" class="ts">View online · PDF · Excel</text>
|
||||||
|
<text x="700" y="154" class="ts">Send by email</text>
|
||||||
|
<text x="700" y="174" class="ts">My profile: picture, MFA, theme</text>
|
||||||
|
|
||||||
|
<path d="M320,115 H346" class="ar" marker-end="url(#h)"/>
|
||||||
|
<path d="M650,115 H676" class="ar" marker-end="url(#h)"/>
|
||||||
|
|
||||||
|
<text x="20" y="236" class="tz">APPROVERS</text>
|
||||||
|
<rect x="20" y="248" width="300" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="40" y="276" class="t">Categories (Categorias)</text>
|
||||||
|
<text x="40" y="298" class="ts">Their own department's categories</text>
|
||||||
|
|
||||||
|
<rect x="20" y="334" width="300" height="70" rx="12" class="bx-g"/>
|
||||||
|
<text x="40" y="362" class="t">Upper Management: read-only</text>
|
||||||
|
<text x="40" y="384" class="ts">Budgets + Reports only, all departments</text>
|
||||||
|
|
||||||
|
<text x="350" y="236" class="tz">ADMINISTRATORS</text>
|
||||||
|
<rect x="350" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="276" class="t">Departments</text>
|
||||||
|
<text x="368" y="298" class="ts">and their workflows</text>
|
||||||
|
<rect x="565" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="583" y="276" class="t">Categories and sites</text>
|
||||||
|
<text x="583" y="298" class="ts">all departments</text>
|
||||||
|
<rect x="780" y="248" width="200" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="798" y="276" class="t">Users</text>
|
||||||
|
<text x="798" y="298" class="ts">role, department, MFA on/off</text>
|
||||||
|
<rect x="350" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="368" y="362" class="t">Activity (Atividade)</text>
|
||||||
|
<text x="368" y="384" class="ts">who did what, filters, CSV</text>
|
||||||
|
<rect x="675" y="334" width="305" height="70" rx="12" class="bx-a"/>
|
||||||
|
<text x="693" y="362" class="t">Email</text>
|
||||||
|
<text x="693" y="384" class="ts">sending account · mail log</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Pages in the top menu. Upper Management sees only Budgets and Reports, for every department, and can view, download and email but not change anything. Approvers also see everything every user sees, and administrators see everything.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="arch">2. What runs on the server</h2>
|
||||||
|
<p>The app runs on one server on your network with Docker. People open it in a browser at <code>http://<server>:8080</code>. Nothing needs to be installed on the PCs.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 400" role="img" aria-labelledby="arch-t">
|
||||||
|
<title id="arch-t">Containers and how they connect</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="150" width="170" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="185" class="t">Browsers</text>
|
||||||
|
<text x="40" y="207" class="ts">PCs on the network</text>
|
||||||
|
|
||||||
|
<rect x="230" y="40" width="580" height="320" rx="14" class="zone"/>
|
||||||
|
<text x="250" y="66" class="tz">SERVER · DOCKER COMPOSE "budget-capex"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="278" y="183" class="t">web (Caddy)</text>
|
||||||
|
<text x="278" y="205" class="ts">screens, HTTPS,</text>
|
||||||
|
<text x="278" y="223" class="ts">passes /api on</text>
|
||||||
|
|
||||||
|
<rect x="460" y="150" width="160" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="478" y="183" class="t">api (Python)</text>
|
||||||
|
<text x="478" y="205" class="ts">rules, calculations,</text>
|
||||||
|
<text x="478" y="223" class="ts">PDF and Excel</text>
|
||||||
|
|
||||||
|
<rect x="660" y="150" width="130" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="678" y="183" class="t">db</text>
|
||||||
|
<text x="678" y="205" class="ts">PostgreSQL:</text>
|
||||||
|
<text x="678" y="223" class="ts">all the data</text>
|
||||||
|
|
||||||
|
<rect x="460" y="270" width="330" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="478" y="298" class="t">backup</text>
|
||||||
|
<text x="478" y="320" class="ts">nightly dump + one before every upgrade</text>
|
||||||
|
|
||||||
|
<rect x="840" y="80" width="140" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="113" class="t">Mail server</text>
|
||||||
|
<text x="858" y="135" class="ts">SMTP: send</text>
|
||||||
|
<text x="858" y="153" class="ts">IMAP: Sent copy</text>
|
||||||
|
|
||||||
|
<rect x="840" y="270" width="140" height="70" rx="12" class="bx-n"/>
|
||||||
|
<text x="858" y="298" class="t">backups/</text>
|
||||||
|
<text x="858" y="320" class="ts">folder on disk</text>
|
||||||
|
|
||||||
|
<path d="M190,195 H256" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<text x="200" y="185" class="lbl">:8080</text>
|
||||||
|
<path d="M420,195 H456" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M620,195 H656" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M620,170 C700,120 760,125 836,125" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<text x="690" y="112" class="lbl">emails</text>
|
||||||
|
<path d="M725,240 V266" class="ar" marker-end="url(#h2)" marker-start="url(#h2)"/>
|
||||||
|
<path d="M790,305 H836" class="ar" marker-end="url(#h2)"/>
|
||||||
|
<path d="M540,240 V266" class="ar-d" marker-end="url(#h2)"/>
|
||||||
|
<text x="548" y="258" class="lbl">"back up first"</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Four containers. Your data lives in the db container's volume, not in the app folder, so replacing the folder with a new version keeps it. The dashed arrow is the request the api makes before it changes the database during an upgrade.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="data">3. What is stored</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 540" role="img" aria-labelledby="data-t">
|
||||||
|
<title id="data-t">Main records and how they relate</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h3" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="380" y="20" width="240" height="78" rx="12" class="bx-a"/>
|
||||||
|
<text x="400" y="50" class="t">Department</text>
|
||||||
|
<text x="400" y="72" class="ts">e.g. IT, F&B · name, active</text>
|
||||||
|
|
||||||
|
<rect x="20" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="40" y="180" class="t">User</text>
|
||||||
|
<text x="40" y="202" class="ts">role, department, picture</text>
|
||||||
|
<text x="40" y="222" class="ts">MFA, theme, language</text>
|
||||||
|
|
||||||
|
<rect x="270" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="290" y="180" class="t">Workflow step</text>
|
||||||
|
<text x="290" y="202" class="ts">ordered; approved by the</text>
|
||||||
|
<text x="290" y="222" class="ts">dept's approvers or named users</text>
|
||||||
|
|
||||||
|
<rect x="520" y="150" width="220" height="92" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="180" class="t">Category</text>
|
||||||
|
<text x="540" y="202" class="ts">PT and EN name, cost/revenue,</text>
|
||||||
|
<text x="540" y="222" class="ts">order, show when empty</text>
|
||||||
|
|
||||||
|
<rect x="770" y="150" width="210" height="92" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="180" class="t">Budget (year)</text>
|
||||||
|
<text x="790" y="202" class="ts">year, title, year rate, status,</text>
|
||||||
|
<text x="790" y="222" class="ts">current step, source file</text>
|
||||||
|
|
||||||
|
<rect x="770" y="300" width="210" height="110" rx="12" class="bx-p"/>
|
||||||
|
<text x="790" y="330" class="t">Line</text>
|
||||||
|
<text x="790" y="352" class="ts">category, site, prior actual,</text>
|
||||||
|
<text x="790" y="372" class="ts">base, adjustment, months,</text>
|
||||||
|
<text x="790" y="392" class="ts">remarks</text>
|
||||||
|
|
||||||
|
<rect x="520" y="300" width="220" height="70" rx="12" class="bx"/>
|
||||||
|
<text x="540" y="330" class="t">Site</text>
|
||||||
|
<text x="540" y="352" class="ts">Sagres, Quinta, Chiado, Oriente</text>
|
||||||
|
|
||||||
|
<rect x="770" y="450" width="210" height="70" rx="12" class="bx-y"/>
|
||||||
|
<text x="790" y="480" class="t">Reopen request</text>
|
||||||
|
<text x="790" y="502" class="ts">reason, status, decision</text>
|
||||||
|
|
||||||
|
<rect x="20" y="300" width="470" height="170" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="330" class="t">Shared by the whole app</text>
|
||||||
|
<text x="40" y="356" class="ts">Activity log: every action by every user</text>
|
||||||
|
<text x="40" y="378" class="ts">Mail settings: the sending account (passwords encrypted)</text>
|
||||||
|
<text x="40" y="400" class="ts">Mail log: every email sent and whether it arrived</text>
|
||||||
|
<text x="40" y="422" class="ts">Archived versions: replaced budgets, read-only</text>
|
||||||
|
<text x="40" y="444" class="ts">Sites are shared by all departments</text>
|
||||||
|
|
||||||
|
<path d="M430,98 L140,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M470,98 L390,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M530,98 L620,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M570,98 L860,146" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<path d="M875,242 V296" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="883" y="275" class="lbl">many</text>
|
||||||
|
<path d="M770,335 H744" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M740,225 L772,302" class="ar-d" marker-end="url(#h3)"/>
|
||||||
|
<path d="M980,196 H994 V485 H984" class="ar" marker-end="url(#h3)"/>
|
||||||
|
<text x="900" y="440" class="lbl">many</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Solid arrows: "has many". Dashed: a line points to one category and optionally one site. A department's categories are its own, so an IT budget never shows F&B lines.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="roles">4. Roles and permissions</h2>
|
||||||
|
<p>Every user has one role and belongs to one department. Everyone can <strong>see and export every budget</strong>, and switch between departments with the department list on the Budgets page. Only the budget's own department can change or approve it.</p>
|
||||||
|
<div class="card"><strong>Upper Management</strong> (<em>Gestão de Topo</em>, new in version 6) is a read-only role for directors. These users see every department and start on <em>All departments</em>. They can open any budget and its reports, download them (the budget file, PDF and Excel) and send them by email. They cannot create, import, edit, upload, submit, approve, reopen, request reopening or delete, they never count as approvers, and their menu shows only Budgets and Reports. A department is optional for them.</div>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>What</th><th>Viewer</th><th>Upper Mgmt</th><th>Editor</th><th>Approver</th><th>Admin</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>View budgets and reports, download PDF / Excel</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td><td class="yes">all</td></tr>
|
||||||
|
<tr><td>Send reports by email (once email is set up)</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Request reopening of an approved budget (with reason)</td><td class="yes">yes</td><td class="no">no</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Create, import, edit a draft budget; upload a changed file</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Submit a draft for review</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Approve or return a workflow step</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept*</td><td class="own">own dept*</td></tr>
|
||||||
|
<tr><td>Reopen directly, accept or decline reopen requests</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Manage categories</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="own">own dept</td><td class="yes">any</td></tr>
|
||||||
|
<tr><td>Delete a budget (any status, typed confirmation)</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Own profile: picture, light/dark mode, language, password, turn own MFA on or off</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>See who has MFA on; reset another user's MFA</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
<tr><td>Departments, workflows, users, sites, email settings, activity and mail logs</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="no">no</td><td class="yes">yes</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<p class="muted">* A workflow step can instead name specific users who approve it; then only those users can approve that step, whatever their role (Upper Management users can never be named). An administrator can always return a budget in review to draft.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="life">5. A budget's life cycle</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 480" role="img" aria-labelledby="life-t">
|
||||||
|
<title id="life-t">Budget statuses and the actions that move between them</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h4" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
<marker id="h4r" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-r"/></marker>
|
||||||
|
<marker id="h4g" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-g"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="40" class="ts">Create: New year (empty or copied from an earlier year) or Import Excel</text>
|
||||||
|
<path d="M90,50 V96" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="20" y="100" width="170" height="90" rx="14" class="bx-n"/>
|
||||||
|
<text x="40" y="135" class="t">Draft</text>
|
||||||
|
<text x="40" y="157" class="ts">editable by the</text>
|
||||||
|
<text x="40" y="175" class="ts">department</text>
|
||||||
|
|
||||||
|
<rect x="290" y="80" width="400" height="130" rx="14" class="bx-y"/>
|
||||||
|
<text x="310" y="110" class="t">In review</text>
|
||||||
|
<rect x="310" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="325" y="152" class="t">Step 1</text>
|
||||||
|
<text x="325" y="172" class="ts">e.g. IT director</text>
|
||||||
|
<rect x="455" y="125" width="110" height="60" rx="10" class="bx"/>
|
||||||
|
<text x="470" y="152" class="t">Step 2</text>
|
||||||
|
<text x="470" y="172" class="ts">e.g. Finance</text>
|
||||||
|
<text x="590" y="160" class="t">… n</text>
|
||||||
|
<path d="M420,155 H451" class="ar" marker-end="url(#h4)"/>
|
||||||
|
<path d="M565,155 H585" class="ar" marker-end="url(#h4)"/>
|
||||||
|
|
||||||
|
<rect x="790" y="100" width="190" height="90" rx="14" class="bx-g"/>
|
||||||
|
<text x="810" y="135" class="t">Approved</text>
|
||||||
|
<text x="810" y="157" class="ts">locked; view, export</text>
|
||||||
|
<text x="810" y="175" class="ts">and email only</text>
|
||||||
|
|
||||||
|
<path d="M190,135 H286" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="200" y="125" class="lbl">Submit</text>
|
||||||
|
<path d="M690,145 H786" class="ar-g" marker-end="url(#h4g)"/>
|
||||||
|
<text x="702" y="135" class="lbl">Approve</text>
|
||||||
|
<text x="702" y="166" class="lbl">(last step)</text>
|
||||||
|
|
||||||
|
<path d="M330,210 C300,260 160,260 110,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="200" y="276" class="lbl">Return to draft (approver of the step, or admin)</text>
|
||||||
|
|
||||||
|
<path d="M885,190 C885,380 300,390 96,194" class="ar-r" marker-end="url(#h4r)"/>
|
||||||
|
<text x="380" y="372" class="lbl">Reopen: approver/admin with a reason, or an accepted reopen request</text>
|
||||||
|
|
||||||
|
<rect x="20" y="396" width="300" height="66" rx="12" class="bx-n"/>
|
||||||
|
<text x="40" y="424" class="t">Archived 🔒</text>
|
||||||
|
<text x="40" y="446" class="ts">replaced by an upload; read-only</text>
|
||||||
|
<path d="M50,190 V392" class="ar-d" marker-end="url(#h4)"/>
|
||||||
|
<text x="58" y="330" class="lbl">Upload a file for</text>
|
||||||
|
<text x="58" y="346" class="lbl">the same year</text>
|
||||||
|
|
||||||
|
<rect x="660" y="406" width="320" height="56" rx="12" class="bx-r"/>
|
||||||
|
<text x="680" y="440" class="t">Delete: administrators only, any status</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Only a draft can be changed. Each approval moves the budget to the next workflow step; the last approval makes it Approved. A department with no steps configured is approved in one step by its approvers.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="calc">6. How the numbers are calculated</h2>
|
||||||
|
<p>Every total in the app and in the reports is built from the lines, in this order. Change any input on the left, and everything to its right follows.</p>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 470" role="img" aria-labelledby="calc-t">
|
||||||
|
<title id="calc-t">From a line's fields to the report totals</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h5" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<text x="20" y="28" class="tz">YOU TYPE</text>
|
||||||
|
<text x="300" y="28" class="tz">THE APP WORKS OUT</text>
|
||||||
|
<text x="760" y="28" class="tz">YOU SEE</text>
|
||||||
|
|
||||||
|
<rect x="20" y="44" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="70" class="t">Prior-year actual</text>
|
||||||
|
<text x="36" y="91" class="ts">number or 12*839,67</text>
|
||||||
|
|
||||||
|
<rect x="20" y="122" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="148" class="t">Base (without adjustment)</text>
|
||||||
|
<text x="36" y="169" class="ts">number or calculation</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="226" class="t">Adjustment</text>
|
||||||
|
<text x="36" y="247" class="ts">year rate · % · factor · none</text>
|
||||||
|
|
||||||
|
<rect x="20" y="278" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="304" class="t">Year rate (budget)</text>
|
||||||
|
<text x="36" y="325" class="ts">Inflation + adjustments %</text>
|
||||||
|
|
||||||
|
<rect x="20" y="356" width="220" height="62" rx="10" class="bx-a"/>
|
||||||
|
<text x="36" y="382" class="t">Months</text>
|
||||||
|
<text x="36" y="403" class="ts">12 · chosen months · typed</text>
|
||||||
|
|
||||||
|
<rect x="300" y="200" width="160" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="316" y="226" class="t">Factor</text>
|
||||||
|
<text x="316" y="247" class="ts">e.g. 1,055 or 1,15</text>
|
||||||
|
|
||||||
|
<rect x="510" y="122" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="148" class="t">Adjusted amount</text>
|
||||||
|
<text x="526" y="169" class="ts">base × factor, to cents</text>
|
||||||
|
|
||||||
|
<rect x="510" y="44" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="70" class="t">Change € and %</text>
|
||||||
|
<text x="526" y="91" class="ts">adjusted − prior</text>
|
||||||
|
|
||||||
|
<rect x="510" y="356" width="190" height="62" rx="10" class="bx-p"/>
|
||||||
|
<text x="526" y="382" class="t">12 monthly amounts</text>
|
||||||
|
<text x="526" y="403" class="ts">in cents, add up exactly</text>
|
||||||
|
|
||||||
|
<rect x="760" y="44" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="72" class="t">Category totals</text>
|
||||||
|
<text x="776" y="94" class="ts">sum of its lines</text>
|
||||||
|
<text x="776" y="114" class="ts">(filtered by site if chosen)</text>
|
||||||
|
|
||||||
|
<rect x="760" y="160" width="220" height="100" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="188" class="t">Budget totals</text>
|
||||||
|
<text x="776" y="210" class="ts">costs and revenue,</text>
|
||||||
|
<text x="776" y="230" class="ts">prior → adjusted, change</text>
|
||||||
|
|
||||||
|
<rect x="760" y="276" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="304" class="t">Capex and Costs report</text>
|
||||||
|
<text x="776" y="326" class="ts">year totals and charts</text>
|
||||||
|
|
||||||
|
<rect x="760" y="362" width="220" height="70" rx="10" class="bx-g"/>
|
||||||
|
<text x="776" y="390" class="t">Monthly budget</text>
|
||||||
|
<text x="776" y="412" class="ts">Jan … Dec per line</text>
|
||||||
|
|
||||||
|
<path d="M240,231 H296" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,309 C270,309 270,250 296,246" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<text x="246" y="348" class="lbl">only for "year rate"</text>
|
||||||
|
<path d="M460,231 C490,231 485,160 506,158" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,153 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,75 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,122 V110" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M605,184 V352" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M240,387 H506" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,75 H756" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,153 C730,153 730,100 756,100" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,144 V156" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M868,260 V272" class="ar" marker-end="url(#h5)"/>
|
||||||
|
<path d="M700,387 C730,387 730,397 756,397" class="ar" marker-end="url(#h5)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>With <strong>Monthly amounts</strong> (typed months) the path is different: the year total is simply the sum of the twelve months, and Base and Adjustment are not used.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<h3>The adjustment and the factor</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Adjustment (<em>Ajuste</em>)</th><th>Factor used</th><th>Example, base 96 532,00 €</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td>Year rate (<em>Taxa do ano</em>)</td><td>1 + the budget's year rate</td><td>rate 5,5 % → × 1,055 = <strong>101 841,26 €</strong></td></tr>
|
||||||
|
<tr><td>Percent (<em>%</em>)</td><td>1 + adjustment value ÷ 100</td><td>value 15 → × 1,15 = <strong>111 011,80 €</strong></td></tr>
|
||||||
|
<tr><td>Factor (<em>Fator ×</em>)</td><td>the adjustment value</td><td>value 2,055 (hardware price rise) → <strong>198 373,26 €</strong></td></tr>
|
||||||
|
<tr><td>None (<em>Sem ajuste</em>)</td><td>1</td><td><strong>96 532,00 €</strong></td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="example">
|
||||||
|
<strong>Worked example (IT 2027, "Mobile phone subscriptions")</strong>
|
||||||
|
<div class="calc">Prior-year actual 96 532,00 €
|
||||||
|
Base 96 532,00 €
|
||||||
|
Adjustment Factor × 1,15
|
||||||
|
Adjusted 96 532,00 × 1,15 = 111 011,80 €
|
||||||
|
Change 111 011,80 − 96 532,00 = +14 479,80 € (+15,00 %)
|
||||||
|
Months chosen: Jan–Apr → 27 752,95 € each, May–Dec 0</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>Rounding rules</h3>
|
||||||
|
<ul>
|
||||||
|
<li>Each line's adjusted amount is rounded to cents before it is added up, as the finance reports do. Totals are therefore exact sums of the lines you see.</li>
|
||||||
|
<li>Monthly amounts are in cents. The rounding difference goes to the last month (December, or the last chosen month), so the twelve months always add up to the adjusted amount.</li>
|
||||||
|
<li>Change % is blank when the prior-year actual is zero.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Typing amounts</h3>
|
||||||
|
<p>Amount fields work like Excel: <code>12*839,67+3292,56</code> or <code>=5512*12</code>. Both <code>1 234,56</code> and <code>1,234.56</code> are understood. The calculation is kept, so you can see later how a figure was built.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="fields">7. Every field and what it changes</h2>
|
||||||
|
|
||||||
|
<h3>On a budget</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Year</strong></td><td>The budget year; one current budget per department and year.</td><td>Column headings ("2026 actual", "2027 adjusted"), report titles, file names.</td></tr>
|
||||||
|
<tr><td><strong>Title</strong></td><td>Name shown in lists and reports.</td><td>Budget list, report headers, email subject suggestion.</td></tr>
|
||||||
|
<tr><td><strong>Inflation + adjustments (%)</strong> <em>(Taxa do ano)</em></td><td>The year rate.</td><td>Every line whose adjustment is "Year rate": their factor, adjusted amount, months, and so all category and budget totals and both reports. Lines with %, factor or none are not affected.</td></tr>
|
||||||
|
<tr><td><strong>Copy from an earlier year</strong> (when creating)</td><td>Starts the new year from another year's lines.</td><td>Each copied line's prior actual and base both start at last year's adjusted amount; adjustment type, months and site are kept. Replace the actual with the real figure.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a line</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What it does</th><th>What changes when you edit it</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Line</strong> (name) and <strong>Description</strong></td><td>Labels.</td><td>Text in the budget and the reports only.</td></tr>
|
||||||
|
<tr><td><strong>Category</strong></td><td>Which group the line belongs to (your department's categories).</td><td>Moves the amounts from one category total to another: category pages and charts in Capex and Costs, grouping in the Monthly budget. Budget totals stay the same, unless the category is a revenue category, in which case the amount counts as revenue instead of cost.</td></tr>
|
||||||
|
<tr><td><strong>Site</strong> <em>(Unidade)</em></td><td>Sagres, Quinta, Chiado, Oriente, or Group.</td><td>What appears when a page or report is filtered by site. "Group" lines appear only in the all-sites view.</td></tr>
|
||||||
|
<tr><td><strong>Prior-year actual</strong></td><td>What was spent last year.</td><td>The "prior" column, change € and change %, category and budget prior totals, and the comparison charts. Does <em>not</em> change the new year's amount.</td></tr>
|
||||||
|
<tr><td><strong>Base</strong> <em>(sem ajuste)</em></td><td>The new year's amount before the adjustment.</td><td>Adjusted amount → months → every total for the new year → both reports.</td></tr>
|
||||||
|
<tr><td><strong>Adjustment</strong> and its <strong>value</strong></td><td>How the base becomes the adjusted amount (see the table above).</td><td>Factor → adjusted amount → months → totals → reports.</td></tr>
|
||||||
|
<tr><td><strong>Reason for adjustment</strong></td><td>Why it went up or down.</td><td>Shown under the line and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Months</strong></td><td>How the year amount is spread: split over 12, split over chosen months, or typed monthly amounts.</td><td>Only the Monthly budget's month columns and the monthly totals. The year total does not change (except with typed amounts, where the year total <em>is</em> the sum of the months).</td></tr>
|
||||||
|
<tr><td><strong>Remarks</strong></td><td>Free notes.</td><td>Shown on the line; no effect on numbers.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3>On a category</h3>
|
||||||
|
<div class="table-wrap">
|
||||||
|
<table>
|
||||||
|
<thead><tr><th>Field</th><th>What changes</th></tr></thead>
|
||||||
|
<tbody>
|
||||||
|
<tr><td><strong>Name (PT / EN)</strong></td><td>The heading in the language of the screen or the report.</td></tr>
|
||||||
|
<tr><td><strong>Section: cost or revenue</strong></td><td>Whether its lines count in the cost totals or the revenue totals.</td></tr>
|
||||||
|
<tr><td><strong>Order</strong></td><td>The order of categories on screen and in the reports.</td></tr>
|
||||||
|
<tr><td><strong>Show when empty</strong></td><td>Whether a category with no lines still appears (with zero) in the budget and reports.</td></tr>
|
||||||
|
<tr><td><strong>Active</strong></td><td>Inactive categories can't be chosen for new lines. Existing lines keep them. A category with lines can be deactivated, but not deleted.</td></tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="months">8. Splitting a year into months</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 300" role="img" aria-labelledby="mo-t">
|
||||||
|
<title id="mo-t">The three ways to split a line into months</title>
|
||||||
|
<text x="20" y="30" class="t">Split over 12 <tspan class="ts"> (Dividir por 12) · 12 000,00 €</tspan></text>
|
||||||
|
<g transform="translate(20,44)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-p"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-p"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">1 000</text><text x="88" y="37">1 000</text><text x="168" y="37">1 000</text><text x="248" y="37">1 000</text><text x="328" y="37">1 000</text><text x="408" y="37">1 000</text><text x="488" y="37">1 000</text><text x="568" y="37">1 000</text><text x="648" y="37">1 000</text><text x="728" y="37">1 000</text><text x="808" y="37">1 000</text><text x="888" y="37">1 000</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="128" class="t">Split over chosen months <tspan class="ts"> (Dividir pelos meses escolhidos) · Jan–Apr ticked</tspan></text>
|
||||||
|
<g transform="translate(20,142)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-a"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-n"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-n"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">3 000</text><text x="88" y="37">3 000</text><text x="168" y="37">3 000</text><text x="248" y="37">3 000</text></g>
|
||||||
|
<g class="ts"><text x="328" y="37">0</text><text x="408" y="37">0</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">0</text><text x="728" y="37">0</text><text x="808" y="37">0</text><text x="888" y="37">0</text></g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
<text x="20" y="226" class="t">Monthly amounts <tspan class="ts"> (Valores mensais) · each month typed; the year total is their sum</tspan></text>
|
||||||
|
<g transform="translate(20,240)">
|
||||||
|
<rect x="0" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="80" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="160" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="240" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="320" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="400" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="480" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="560" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="640" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="720" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="800" y="0" width="74" height="44" rx="6" class="bx-y"/><rect x="880" y="0" width="74" height="44" rx="6" class="bx-y"/>
|
||||||
|
<g class="ts"><text x="8" y="18">Jan</text><text x="88" y="18">Feb</text><text x="168" y="18">Mar</text><text x="248" y="18">Apr</text><text x="328" y="18">May</text><text x="408" y="18">Jun</text><text x="488" y="18">Jul</text><text x="568" y="18">Aug</text><text x="648" y="18">Sep</text><text x="728" y="18">Oct</text><text x="808" y="18">Nov</text><text x="888" y="18">Dec</text></g>
|
||||||
|
<g class="t"><text x="8" y="37">500</text><text x="88" y="37">500</text><text x="168" y="37">2 000</text><text x="248" y="37">800</text><text x="328" y="37">800</text><text x="408" y="37">800</text><text x="488" y="37">0</text><text x="568" y="37">0</text><text x="648" y="37">1 600</text><text x="728" y="37">800</text><text x="808" y="37">800</text><text x="888" y="37">3 400</text></g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
<figcaption>The first two keep the year total (base × adjustment) and only decide <em>when</em> it is spent. Quick buttons on the line pick a quarter (Q1–Q4) or a half-year (H1, H2). Switching a line from typed months to a split keeps its year total as the base.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reports">9. Reports, downloads and email</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Capex and Costs <span class="tag">Capex e Custos</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Totals: prior-year actual vs adjusted, change € and %</li>
|
||||||
|
<li>Chart of each category, last year vs this year</li>
|
||||||
|
<li>Chart of the change by category</li>
|
||||||
|
<li>One page per category with its lines and reasons</li>
|
||||||
|
<li>Summary table</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Monthly budget <span class="tag">Orçamento mensal</span></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Every line with its twelve months and year total</li>
|
||||||
|
<li>Category subtotals and monthly totals</li>
|
||||||
|
<li>Option: include empty categories</li>
|
||||||
|
<li>Excel version keeps live formulas</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p>On the <strong>Reports</strong> page you pick the budget, the <strong>language</strong> (Portuguese or English) and the <strong>site</strong>; the same choice applies to viewing online, PDF, Excel and email. On a <strong>budget page</strong>, <strong>Download ▾</strong> offers the editable budget file and both reports, and <strong>Send by email</strong> lets you attach any of them. That works in every status, including draft and approved.</p>
|
||||||
|
<p>Sending by email asks for recipients (To, Cc, "send me a copy"), a subject and a message, and which files to attach. The email goes out from the account the administrator set up, a copy is saved in that mailbox's Sent folder, and the mail log records it.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="excel">10. Excel: template, download, re-upload</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 340" role="img" aria-labelledby="xl-t">
|
||||||
|
<title id="xl-t">Download, change and upload a budget file</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h6" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="40" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="38" y="72" class="t">Draft budget</text>
|
||||||
|
<text x="38" y="94" class="ts">IT 2027 "Budget 2027"</text>
|
||||||
|
<text x="38" y="114" class="ts">in the app</text>
|
||||||
|
|
||||||
|
<rect x="270" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="288" y="72" class="t">Download ▾</text>
|
||||||
|
<text x="288" y="94" class="ts">Budget file</text>
|
||||||
|
<text x="288" y="114" class="ts mono">Orcamento_IT_2027.xlsx</text>
|
||||||
|
|
||||||
|
<rect x="520" y="40" width="200" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="538" y="72" class="t">Change it in Excel</text>
|
||||||
|
<text x="538" y="94" class="ts">lines, amounts, months</text>
|
||||||
|
<text x="538" y="114" class="ts">same file name</text>
|
||||||
|
|
||||||
|
<rect x="770" y="40" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="788" y="72" class="t">Upload Excel</text>
|
||||||
|
<text x="788" y="94" class="ts">pop-up: "The file</text>
|
||||||
|
<text x="788" y="114" class="ts">already exists" · OK</text>
|
||||||
|
|
||||||
|
<path d="M220,85 H266" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M470,85 H516" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M720,85 H766" class="ar" marker-end="url(#h6)"/>
|
||||||
|
|
||||||
|
<rect x="520" y="200" width="460" height="100" rx="12" class="bx-g"/>
|
||||||
|
<text x="538" y="232" class="t">New current budget</text>
|
||||||
|
<text x="538" y="254" class="ts">the lines from your file; same title "Budget 2027"</text>
|
||||||
|
<text x="538" y="274" class="ts">"Loaded from Orcamento_IT_2027.xlsx" · editable draft</text>
|
||||||
|
|
||||||
|
<rect x="20" y="200" width="450" height="112" rx="12" class="bx-n"/>
|
||||||
|
<text x="38" y="232" class="t">Old version, archived 🔒</text>
|
||||||
|
<text x="38" y="254" class="ts">renamed "Budget 2027 (2026-10-28 23:00)"</text>
|
||||||
|
<text x="38" y="274" class="ts mono">Orcamento_IT_2027_2026-10-28_2300.xlsx</text>
|
||||||
|
<text x="38" y="296" class="ts">locked: view, export, email; admin may delete</text>
|
||||||
|
|
||||||
|
<path d="M875,130 V196" class="ar" marker-end="url(#h6)"/>
|
||||||
|
<path d="M800,130 C700,170 400,160 250,196" class="ar-d" marker-end="url(#h6)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>Nothing is lost: the version you replace is kept, renamed with the date and time, and locked. Only a draft can be replaced. An approved or in-review budget must be reopened first. Archived versions are listed under Budgets → "Show archived versions".</figcaption>
|
||||||
|
</figure>
|
||||||
|
<p><strong>Excel template</strong> (Budgets → <em>Modelo Excel</em>) gives a workbook for a department and year, blank or pre-filled from an existing budget, in PT or EN. It has an Instructions sheet and a Lines sheet with drop-down lists for category, site and adjustment, twelve month columns, and a last column <em>Split over months</em> where you can write <code>1-4</code> or <code>Jan, Fev, Mar, Abr</code>. Unknown categories are created on import; anything skipped is listed. The original "Budget para 2027" workbook layout can also be imported.</p>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="reopen">11. Reopening an approved budget</h2>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 250" role="img" aria-labelledby="ro-t">
|
||||||
|
<title id="ro-t">Reopen request flow</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h7" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="70" width="190" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="38" y="102" class="t">Approved budget</text>
|
||||||
|
<text x="38" y="124" class="ts">any user but Upper Mgmt</text>
|
||||||
|
<text x="38" y="142" class="ts">clicks "Request reopening"</text>
|
||||||
|
|
||||||
|
<rect x="260" y="70" width="210" height="90" rx="12" class="bx-y"/>
|
||||||
|
<text x="278" y="102" class="t">Reason (mandatory)</text>
|
||||||
|
<text x="278" y="124" class="ts">at least 5 characters;</text>
|
||||||
|
<text x="278" y="142" class="ts">request is pending</text>
|
||||||
|
|
||||||
|
<rect x="520" y="70" width="210" height="90" rx="12" class="bx"/>
|
||||||
|
<text x="538" y="102" class="t">Approvers + admins</text>
|
||||||
|
<text x="538" y="124" class="ts">see it on the budget,</text>
|
||||||
|
<text x="538" y="142" class="ts">get an email</text>
|
||||||
|
|
||||||
|
<rect x="780" y="20" width="200" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="798" y="52" class="t">Accept and reopen</text>
|
||||||
|
<text x="798" y="74" class="ts">budget back to draft;</text>
|
||||||
|
<text x="798" y="92" class="ts">requester emailed</text>
|
||||||
|
|
||||||
|
<rect x="780" y="130" width="200" height="90" rx="12" class="bx-r"/>
|
||||||
|
<text x="798" y="162" class="t">Decline</text>
|
||||||
|
<text x="798" y="184" class="ts">reason required; stays</text>
|
||||||
|
<text x="798" y="202" class="ts">approved; requester emailed</text>
|
||||||
|
|
||||||
|
<path d="M210,115 H256" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M470,115 H516" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,100 C755,90 755,70 776,66" class="ar" marker-end="url(#h7)"/>
|
||||||
|
<path d="M730,130 C755,140 755,170 776,174" class="ar" marker-end="url(#h7)"/>
|
||||||
|
</svg>
|
||||||
|
<figcaption>An approver or administrator of the department can also reopen directly with <strong>Reopen</strong>, giving a reason; that also answers an open request. One request can be pending at a time. All requests, decisions and reasons stay in the budget's History.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="admin">12. Admin: email, logs, backups, upgrades</h2>
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Email → Sending account</h3>
|
||||||
|
<ul>
|
||||||
|
<li>SMTP server, port, security (STARTTLS 587 / SSL 465 / none), username and password</li>
|
||||||
|
<li>Sender address and name, reply-to, signature</li>
|
||||||
|
<li>Copy in the Sent folder over IMAP (found automatically, or named)</li>
|
||||||
|
<li><strong>Test connection</strong> signs in only; <strong>Send test email</strong> sends one</li>
|
||||||
|
<li>Turning email on adds "Send by email" for everyone, Upper Management included</li>
|
||||||
|
</ul>
|
||||||
|
<p class="muted">Gmail already keeps its own copy, so turn the Sent-folder option off there.</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Logs</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Activity</strong>: sign-ins (and failed ones), every change to budgets and lines, imports, approvals, reopen requests, archiving, deletions, report views, downloads and emails, admin changes. Filter and export to CSV.</li>
|
||||||
|
<li><strong>Email → Mail log</strong>: who sent what to whom, attachments, delivered or failed, Sent-folder copy saved or not. Export to CSV.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Backups</h3>
|
||||||
|
<ul>
|
||||||
|
<li>A database dump every night at <code>BACKUP_TIME</code> into <code>backups/</code>, kept <code>BACKUP_KEEP_DAYS</code> days</li>
|
||||||
|
<li>An extra one, <code>…_before_upgrade.sql.gz</code>, before every upgrade that changes the database</li>
|
||||||
|
<li>Restore: <code>docker compose exec backup restore.sh /backups/<file></code></li>
|
||||||
|
<li>Copy <code>backups/</code> to another disk or NAS regularly</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Upgrading to a new version</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Unzip the new version over the app folder, keeping <code>.env</code> and <code>backups/</code></li>
|
||||||
|
<li>Run <code>docker compose up -d --build</code></li>
|
||||||
|
</ol>
|
||||||
|
<p>The api asks for a backup, waits for it, then updates the database. If the backup fails, it does not upgrade. Never run <code>docker compose down -v</code>: <code>-v</code> deletes the data.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ============================================================ -->
|
||||||
|
<h2 id="signin">13. Signing in, MFA, appearance and picture</h2>
|
||||||
|
<p>MFA (two-step sign-in, <em>autenticação em dois passos</em>) is optional and each user turns it on for themselves. With MFA on, someone who learns a password still cannot sign in without the user's phone.</p>
|
||||||
|
<figure>
|
||||||
|
<svg viewBox="0 0 1000 360" role="img" aria-labelledby="si-t">
|
||||||
|
<title id="si-t">Sign-in with and without MFA</title>
|
||||||
|
<defs>
|
||||||
|
<marker id="h9" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head"/></marker>
|
||||||
|
<marker id="h9g" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-g"/></marker>
|
||||||
|
<marker id="h9r" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" class="head-r"/></marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="20" y="110" width="180" height="90" rx="12" class="bx-p"/>
|
||||||
|
<text x="38" y="142" class="t">Email + password</text>
|
||||||
|
<text x="38" y="164" class="ts">wrong: "invalid</text>
|
||||||
|
<text x="38" y="182" class="ts">credentials", logged</text>
|
||||||
|
|
||||||
|
<rect x="250" y="110" width="160" height="90" rx="12" class="bx-n"/>
|
||||||
|
<text x="268" y="142" class="t">MFA on?</text>
|
||||||
|
<text x="268" y="164" class="ts">set per user in</text>
|
||||||
|
<text x="268" y="182" class="ts">My profile</text>
|
||||||
|
|
||||||
|
<rect x="460" y="100" width="260" height="110" rx="12" class="bx-y"/>
|
||||||
|
<text x="478" y="130" class="t">Verification code</text>
|
||||||
|
<text x="478" y="152" class="ts">6 digits from the app, changes</text>
|
||||||
|
<text x="478" y="170" class="ts">every 30 s, works only once;</text>
|
||||||
|
<text x="478" y="188" class="ts">or a recovery code (xxxx-xxxx)</text>
|
||||||
|
|
||||||
|
<rect x="460" y="260" width="260" height="80" rx="12" class="bx-r"/>
|
||||||
|
<text x="478" y="290" class="t">5 wrong codes in a row</text>
|
||||||
|
<text x="478" y="312" class="ts">code sign-in locked for 5 minutes</text>
|
||||||
|
|
||||||
|
<rect x="770" y="110" width="210" height="90" rx="12" class="bx-g"/>
|
||||||
|
<text x="788" y="142" class="t">Signed in</text>
|
||||||
|
<text x="788" y="164" class="ts">session lasts</text>
|
||||||
|
<text x="788" y="182" class="ts">SESSION_HOURS</text>
|
||||||
|
|
||||||
|
<path d="M200,155 H246" class="ar" marker-end="url(#h9)"/>
|
||||||
|
<path d="M410,155 H456" class="ar" marker-end="url(#h9)"/>
|
||||||
|
<text x="420" y="146" class="lbl">yes</text>
|
||||||
|
<path d="M330,110 V50 H875 V106" class="ar-g" marker-end="url(#h9g)"/>
|
||||||
|
<text x="560" y="42" class="lbl">no MFA: straight in</text>
|
||||||
|
<path d="M720,155 H766" class="ar-g" marker-end="url(#h9g)"/>
|
||||||
|
<text x="726" y="146" class="lbl">right</text>
|
||||||
|
<path d="M590,210 V256" class="ar-r" marker-end="url(#h9r)"/>
|
||||||
|
<text x="598" y="240" class="lbl">wrong</text>
|
||||||
|
</svg>
|
||||||
|
<figcaption>The code step appears only for users who turned MFA on. A code is accepted if it is the current one or the one just before or after, so a phone clock that is slightly off still works.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<div class="grid2">
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Turning MFA on (My profile)</h3>
|
||||||
|
<ol>
|
||||||
|
<li>Install an authenticator app on the phone: Microsoft Authenticator, Google Authenticator, Authy, 1Password…</li>
|
||||||
|
<li>In <strong>My profile</strong>, press <strong>Turn on MFA</strong> and scan the QR code (or type the key shown).</li>
|
||||||
|
<li>Type the 6-digit code the app shows and press <strong>Confirm and turn on</strong>. MFA is only on after this step.</li>
|
||||||
|
<li>Save the 8 <strong>recovery codes</strong>. Each one works once, for when the phone is not at hand. They are not shown again; <em>New recovery codes</em> replaces them.</li>
|
||||||
|
</ol>
|
||||||
|
<p class="muted">Turning MFA off needs the password and a code.</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">For administrators</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>Users</strong> has an MFA column: <em>On</em> or <em>Off</em> for each user.</li>
|
||||||
|
<li>Someone lost their phone and recovery codes: <strong>Users → Edit → Reset MFA</strong>. They sign in with the password and can turn MFA on again.</li>
|
||||||
|
<li>MFA secrets are stored encrypted with <code>SECRET_KEY</code>. Keep the same <code>.env</code> when upgrading, or everyone's MFA has to be reset.</li>
|
||||||
|
<li>The Activity log records MFA turned on or off, resets, wrong codes and recovery codes used.</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Light and dark mode</h3>
|
||||||
|
<p>The round button in the top bar (and on the sign-in page) cycles <strong>Automatic → Light → Dark</strong>. Automatic follows the computer's setting. The same choice is in <strong>My profile → Appearance</strong>, and it is saved with the user, so it follows them to other computers. Reports in PDF and Excel are not affected.</p>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<h3 style="margin-top:0">Profile picture</h3>
|
||||||
|
<p>In <strong>My profile</strong>, <strong>Choose picture</strong> takes a JPG, PNG, GIF or WebP of up to 5 MB. It is cropped to a square from the centre and reduced to 256 px. It shows in the top bar and in the users list; without one, the user's initials are shown. Pictures are stored in the database, so they are in the backups. <strong>Remove</strong> deletes it.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="muted" style="margin-top:40px">Budget & Capex · version 7.0.0 · guide updated 29 October 2026.</p>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user