You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

299 lines
14 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Introducing Elbank</title>
<meta name="description" content="Elbank is a new Emacs package I’ve been working on lately. It’s a personal finances and budgeting package for Emacs that uses Weboob for scraping data from b...">
<link rel="shortcut icon" type="image/png" href="/favicon.png"/>
<link href="https://fonts.googleapis.com/css?family=Fira+Mono|Gentium+Book+Basic|Lato" rel="stylesheet">
<link rel="stylesheet" href="/assets/main.css">
<link rel="stylesheet" href="/css/cafe.css">
<link rel="canonical" href="https://emacs.cafe/elbank/emacs/2017/11/30/elbank-intro.html">
<link rel="alternate" type="application/rss+xml" title="Emacs café" href="/feed.xml">
</head>
<body>
<header class="site-header" role="banner">
<div class="wrapper">
<a class="site-title" href="/"><img src="/img/emacscafe.png"/>Emacs café</a>
<nav class="site-nav">
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger">
<span class="menu-icon">
<svg viewBox="0 0 18 15" width="18px" height="15px">
<path fill="#424242" d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z"/>
<path fill="#424242" d="M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z"/>
<path fill="#424242" d="M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z"/>
</svg>
</span>
</label>
<div class="trigger">
<a class="page-link" href="/about/">About Emacs café</a>
</div>
</nav>
</div>
</header>
<main class="page-content" aria-label="Content">
<div class="wrapper">
<article class="post" itemscope itemtype="http://schema.org/BlogPosting">
<header class="post-header">
<h1 class="post-title" itemprop="name headline">Introducing Elbank</h1>
<p class="post-meta">
<time datetime="2017-11-30T14:28:00+01:00" itemprop="datePublished">
Nov 30, 2017
</time>
<span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">Nicolas Petton</span></span>
</p>
</header>
<div class="post-content" itemprop="articleBody">
<p><a href="https://github.com/NicolasPetton/elbank">Elbank</a> is a new Emacs package I’ve
been working on lately. It’s a <em>personal finances</em> and <em>budgeting</em> package for
Emacs that uses <a href="https://weboob.org">Weboob</a> for scraping data from bank
websites.</p>
<p><img src="/img/elbank-overview.png" alt="Overview buffer" /></p>
<p>I started building Elbank after using <a href="https://github.com/ledger/ledger">Ledger</a>
for several years. While Ledger is a real gem, I didn’t want to spend time
doing bookkeeping anymore.</p>
<p>Instead, I wanted a simple reporting tool that would automatically scrap data
and build reports within Emacs from it.</p>
<h2 id="setting-up-weboob">Setting up Weboob</h2>
<p>To use Elbank, you will first have to <a href="https://weboob.org/install">install
Weboob</a>. Weboob is a collection of applications
used to interact with websites from the command-line. Elbank uses the banking
application named <code class="highlighter-rouge">boobank</code> to scrap data.</p>
<p>The list of currently supported bank websites is available <a href="http://weboob.org/applications/boobank">on this
page</a>.</p>
<p>Fortunately, installing Weboob should be a breeze as there are
<a href="http://weboob.org/install">packages</a> for most GNU/Linux distros, and an
<a href="http://formulae.brew.sh/formula/weboob">homebrew formula</a> for Mac users.</p>
<p>Once Weboob is installed, run <code class="highlighter-rouge">boobank</code> in a console to setup your accounts.</p>
<h2 id="installing-elbank">Installing Elbank</h2>
<p>You can now install elbank from <a href="https://melpa.org">MELPA</a><sup id="fnref:1"><a href="#fn:1" class="footnote">1</a></sup> by
running <code class="highlighter-rouge">M-x package-install RET elbank RET</code>, and voila!</p>
<h2 id="using-elbank">Using Elbank</h2>
<h3 id="the-overview-buffer">The overview buffer</h3>
<p>Run <code class="highlighter-rouge">M-x elbank-overview</code> to get started. The overview buffer lists all
accounts as custom reports and budgets.</p>
<p>Press <code class="highlighter-rouge">u</code> to import the bank statements from your bank website.</p>
<p>You can click on each account or report displayed in the buffer to open them.</p>
<h2 id="categorizing-transactions">Categorizing transactions</h2>
<p>Transaction categories is an important aspect of Elbank. Categories make it
possible to filter and budget.</p>
<p>Transactions are automatically categorized when reporting, using the custom
variable <code class="highlighter-rouge">elbank-categories</code>.</p>
<p>Here’s an example value for <code class="highlighter-rouge">elbank-categories</code>, you should adjust it based on
your own transactions and categorizing needs.</p>
<div class="language-emacs-lisp highlighter-rouge"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">elbank-categories</span>
<span class="o">'</span><span class="p">((</span><span class="s">"Expenses:Food"</span> <span class="o">.</span> <span class="p">(</span><span class="s">"^supermarket"</span>
<span class="s">"^restaurant"</span>
<span class="s">"Local store XXX"</span>
<span class="s">"Bakery XXX"</span><span class="p">))</span>
<span class="p">(</span><span class="s">"Expenses:Rent"</span> <span class="o">.</span> <span class="p">(</span><span class="s">"Real Estate Agency XXX"</span><span class="p">))</span>
<span class="p">(</span><span class="s">"Income:Salary"</span> <span class="o">.</span> <span class="p">(</span><span class="s">"Bank transfer from Company XXX"</span><span class="p">))))</span>
</code></pre>
</div>
<p>Each transaction’s text is matched against the regular expressions of
<code class="highlighter-rouge">elbank-categories</code>, the first match defines the category of a transaction.</p>
<h3 id="reports">Reports</h3>
<p>Evaluate <code class="highlighter-rouge">M-x elbank-report</code> to create a new report. The command will ask you
for an account, period and category, which are all optional.</p>
<p><img src="/img/elbank-report-example.png" alt="Report" /></p>
<p>Here’s the list of keybindings available in a report buffer:</p>
<ul>
<li><code class="highlighter-rouge">f c</code>: Filter the transactions by category</li>
<li><code class="highlighter-rouge">f a</code>: Only show transactions in a specified account</li>
<li><code class="highlighter-rouge">f p</code>: Select the period of the report</li>
<li><code class="highlighter-rouge">G</code>: Group transactions by some property</li>
<li><code class="highlighter-rouge">S</code>: Sort transactions</li>
<li><code class="highlighter-rouge">s</code>: Reverse the sort order</li>
<li><code class="highlighter-rouge">M-p</code>: Move backward by one period (month or year)</li>
<li><code class="highlighter-rouge">M-n</code>: Move forward by one period (month or year)</li>
</ul>
<p>You can also customize the variable <code class="highlighter-rouge">elbank-saved-monthly-reports</code> and
<code class="highlighter-rouge">elbank-saved-yearly-reports</code> to conveniently get a quick list of commonly used
reports from the overview buffer.</p>
<h3 id="budgeting">Budgeting</h3>
<p>The custom variable <code class="highlighter-rouge">elbank-budget</code> is used to define a monthy budget. It
defines how much money we want to spend by category of transaction, like
<code class="highlighter-rouge">"Food"</code> or <code class="highlighter-rouge">"Rent"</code>.</p>
<div class="language-emacs-lisp highlighter-rouge"><pre class="highlight"><code><span class="p">(</span><span class="k">setq</span> <span class="nv">elbank-budget</span> <span class="o">'</span><span class="p">((</span><span class="s">"Expenses:Food"</span> <span class="o">.</span> <span class="mi">300</span><span class="p">)</span>
<span class="p">(</span><span class="s">"Expenses:Rent"</span> <span class="o">.</span> <span class="mi">450</span><span class="p">)</span>
<span class="p">(</span><span class="s">"Expenses:Transport"</span> <span class="o">.</span> <span class="mi">120</span><span class="p">)</span>
<span class="p">(</span><span class="s">"Expenses:Utilities"</span> <span class="o">.</span> <span class="mi">145</span><span class="p">)))</span>
</code></pre>
</div>
<p>Note that budgeted amounts are positive numbers while expenses have negative
values.</p>
<p>Press <code class="highlighter-rouge">b</code> from the overview buffer or evaluate <code class="highlighter-rouge">M-x elbank-budget-report</code> to see
your expenses based on your budget.</p>
<p><img src="/img/elbank-budget-report.png" alt="Budget report" /></p>
<p>You can switch periods with <code class="highlighter-rouge">M-p</code> and <code class="highlighter-rouge">M-n</code> the same way as in report buffers.</p>
<h2 id="conclusion">Conclusion</h2>
<p>That’s all for now!</p>
<p>Elbank is still in its infancy, but I’m already using it daily. If you find any
bug or would like to suggest improvements, feel free to open a ticket on the
<a href="https://github.com/NicolasPetton/elbank">GitHub project</a>.</p>
<div class="footnotes">
<ol>
<li id="fn:1">
<p>As of today, the package is not yet in MELPA, but a <a href="https://github.com/melpa/melpa/pull/5157">pull
request</a> is in review to add it to
the repository.&nbsp;<a href="#fnref:1" class="reversefootnote">&#8617;</a></p>
</li>
</ol>
</div>
</div>
<div id="disqus_thread"></div>
<script>
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
var disqus_shortname = 'emacs-cafe';
/* * * DON'T EDIT BELOW THIS LINE * * */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
</article>
</div>
</main>
<footer class="site-footer">
<div class="wrapper">
<h2 class="footer-heading">Emacs café</h2>
<div class="footer-col-wrapper">
<div class="footer-col footer-col-1">
<ul class="contact-list">
<li>
Emacs café
</li>
<li><a href="mailto:nicolas@petton.fr">nicolas@petton.fr</a></li>
</ul>
</div>
<div class="footer-col footer-col-2">
<ul class="social-media-list">
<li>
<a href="https://github.com/NicolasPetton"><span class="icon icon--github"><svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"/></svg>
</span><span class="username">NicolasPetton</span></a>
</li>
<li>
<a href="https://twitter.com/NicolasPetton"><span class="icon icon--twitter"><svg viewBox="0 0 16 16" width="16px" height="16px"><path fill="#828282" d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"/></svg>
</span><span class="username">NicolasPetton</span></a>
</li>
</ul>
</div>
<div class="footer-col footer-col-3">
<p>A blog about Emacs, mostly focused on JavaScript development, by Nicolas Petton.
</p>
</div>
</div>
</div>
</footer>
</body>
</html>