Notxor tiene un blog

Defenestrando la vida

Ledger-cli y el ledger-mode de Emacs

Notxor
2018-10-30

Hace un tiempo ya hablé de ledger-cli, una herramienta de gestión contable que funciona desde la línea de comandos y consiste básicamente en guardar la información en texto plano en un fichero ledger. Ledger se traduciría al «español contable» como libro diario, diario o mayor. Por lo tanto, todo el trabajo consiste básicamente en introducir los datos de forma ordenada con cualquier editor y luego extraerlos con ledger-cli de forma ordenada.

No quiero que este artículo sea específicamente contable. Mi idea es mostrar cómo voy haciendo para llevar un poco de control en mis cuentas con herramientas potentes pero que se manejan perfectamente en texto plano. ¿Por qué texto plano y contabilidad? Pues básicamente porque eso me permite acceder a mis datos siempre, desde cualquier dispositivo con cualquier editor que sea capaz de cargar texto. Además, el ejecutable ledger también lo puedes instalar en el termux de android® y sincronizar tu libro diario con cualquier herramienta que se te ocurra (yo lo hago con git, porque me permite controlar cuándo se hacen qué cambios y revertirlos si es necesario).

El fichero que se ha generando al escribir este artículo también se puede descargar del blog.

Emacs se ha convertido en mi editor favorito para todo y por tanto lo utilizo también para realizar mis apuntes contables. Además, tiene un modo que me facilita la vida. Lo primero será tener instalado en nuestro sistema la herramienta ledger-cli. Como eso depende básicamente de cada sistema operativo digo sólo las dos que yo he utilizado en mi OpenSuse y en el termux de android®:

sudo zypper install ledger

o en termux

apt install ledger

Después lo que necesitamos es instalar el modo de emacs que nos facilitará la vida:

M-x package-install RET ledger-mode RET

Y con esto ya tenemos todas las herramientas para comenzar a llevar nuestra contabilidad.

Crear nuestro libro mayor

Hay una serie de pasos que dar, aunque muy sencillos. Lo primer será crear un fichero de texto plano. Si en el nombre añadimos la extensión .ledger, emacs activará el modo mayor automáticamente. Sin embargo, es posible hacer lo mismo sin necesidad de poner esa extensión añadiendo como primera línea del fichero la siguiente:

; -*- Ledger -*-

Y ya está. Ya tienes tu fichero dispuesto a recoger todos los datos que podamos meter. Pero para que las cosas funcionen mejor podemos ajustar aún más las entradas.

Ajuste de moneda

ledger-cli soporta cualquier tipo de moneda, porque no tiene predefinida ninguna y por tanto es bueno configurar las monedas en las que trabajaremos. Lo digo en plural, porque podemos trabajar en varias a la vez en el mismo libro y llevar también un registros de valores de cambio y muchas otras cosas que exceden un artículo como éste. Para resumir comento el código que utilizo yo para trabajar (sólo en euros).

commodity €
    note Euros
    format 1.000,00€
    default

La divisa (commodity) es el símbolo € como dice la primera linea. No tiene más misterio: cualquier cifra que lleve un símbolo € se considerará una cantidad en esa divisa. La línea note la podemos ahorrar, es sólo un comentario que nos ayuda a saber qué tipo de divisa utilizamos. Con una moneda y su símbolo no tiene mucho sentido, pero es que podemos contabilizar con «latas de cerveza» y al definir su commodity necesitaremos más explicaciones de lo que significa y por qué lo utilizamos. La opción format establece con esa sintaxis tan simple que el separador de miles es el «.» y el de decimales la «,» y además que el símbolo lo colocaremos detrás. default le dice a ledger que si hay una cifra en algún sitio que no lleva el símbolo monetario, por defecto tomará esa como su commodity.

Definición de cuentas

Cuando definimos las cuentas tenemos a nuestro alcance muchas opciones, como definir qué tipo de moneda utilizaremos en esa cuenta. En mi caso, como sólo me manejo en euros no tiene mucho sentido todas esas opciones y lo más complicado que utilizo son algunos alias y algunas note. Pero lo más importante, es tenerlas ordenadas en los grupos principales contables y los nombres aquí, como todo en ledger son arbitrarios: lo que quiere decir que puedes utilizar los que quieras, pero para tener una contabilidad ajustada debes ser consistente con el nombre elegido.

Concretamente tengo las cuentas agrupadas en Activo, Pasivo, Ingresos, Gastos y Patrimonio.

Voy a poner un ejemplo de cuenta para que se vea cómo las tengo configuradas.

account Gastos:Otros Gastos:Metálico
    note Cuenta para anotar los gastos en metálico sin justificar
    alias Menudencias

Definir una cuenta es importante porque luego podemos exigir a ledger que sólo admita al extraer los datos las cuentas que tenemos en la cabecera. Eso hace que nos obliguemos a ser consistentes, que los errores tipográficos aparezcan a la primera de cambio y que los resúmenes de gastos o cualquier otro listado no sean infinitos con multitud de cuentas similares con leves matices.

Para aquellos que quieran ajustarse al Plan General Contable, nada nos impide nombrar una cuenta con números. Por ejemplo:

account 5.Cuentas financieras
    note Grupo 5 del Plan General Contable

account 5.Cuentas financieras:521.Deudas a corto plazo
    note Cuentas para las deudas a corto plazo del Grupo 5 del PGC

Pero eso es más técnico contable y no vamos a entrar en ello. Basta con saberlo, por si queremos utilizar ledger para asuntos más serios que llevar un poco de control sobre gastos que es para lo que lo utilizo yo.

Balance de apertura

¿Cómo iniciamos nuestro registro contable? Pues por el principio, obviamente. Pero si no lo hemos hecho desde el inicio de los tiempos, o por lo menos desde que tenemos uso de razón, lo más probable es que tengamos que iniciar la contabilidad no desde cero, sino de la situación donde nos encontremos. Por ejemplo, podríamos suponer una situación como la siguiente:

2018/10/30 Balance de apertura
    Activo:Bancos:Ladrones y cia               6,54€
    Activo:Bancos:El saqueador y cia         -25,84€
    Activo:Inmuebles:Casa                  2.160,04€
    Activo:Metálico                            0,47€
    Activo:Plan de Pensiones                  82,65€
    Pasivo:Hipoteca                       -1.372,23€
    Patrimonio:Balance Apertura

Lo que nos lleva a tener ya un asiento en nuestro diario, sin embargo, aún no he explicado cómo se hace eso de los asientos que no son para sentarse.

Anotar un asiento

Lo primero es saber qué es un asiento. Pues básicamente es la anotación de una transacción. Seguro que en cualquier manual de contabilidad se pueden encontrar mejores definiciones de las que yo puedo dar. Pero lo que necesitamos para definir esa transacción son básicamente: fecha, descripción, cuenta de entrada y cuenta de salida.

Vamos a suponer que comprado un poco de fruta y lo quiero anotar en mi diario y que me ha costado 1,27€. El comando para anotar es ledger-add-transaction y la podemos llamar con M-x de la línea de comandos de emacs, el atajo de teclado es C-c C-a. Emacs preguntará por una fecha, si no hemos introducido antes más transacciones nos sugerirá la fecha actual, pero si hemos metido más, nos sugerirá la última fecha introducida. También se pude ir al final del fichero y hacerlo a mano, escribiendo todo el texto a falta del automatismo, pero mejor dejar que emacs busque el sitio correspondiente a esa fecha para mantener ordenado el diario por fechas.

2018/10/30 Compra en la frutería
    ; Me he comprado un poco de fruta para variar
    Gastos:Alimentación                         1,27€
    Activo:Metálico                            -1,27€

En un fichero ledger-cli se comienza un asiento en una nueva línea comenzando por la fecha y una descripción de la transacción. Como se ve la fecha está ajustada en la izquierda y luego vienen tres líneas indentadas. La primera es un comentario porque su primer símbolo es ;. La siguiente línea anota 1,27€ a la cuenta de Gastos:Alimentación. Por tanto, la siguiente anotará -1,27€ en la cuenta de Activo:Metálico. Ledger también permite que la última línea aparezca sin valor, lo que hará es calcular el valor de la transacción y lo anotará balanceado en la última cuenta. Como vemos en el balance de apertura lo que ocurrirá es que el sistema anotará en Patrimonio:Balance Apertura el valor de -851,63€.

Mi recomendación es escribir y cuadrar el asiento manualmente para evitar errores. Porque, como se puede ver, el valor final de un asiento siempre es 0. Una transacción se llama transacción porque el dinero que entra por un lado sale por el otro. O dicho de otro modo, viendo el ejemplo, se han ido a Gastos:Alimentación 1,27€ que han salido como -1,27€ de Activo:Metálico.

He anotado la compra en una cuenta genérica de alimentación, si quiero ser más fino en las anotaciones, para saber cuánto gasto en cada tienda o con cada proveedor de servicios o con lo que sea, podría haber hecho una cuenta Gastos:Alimentación:Frutería y así en los informes de gastos que puedo generar me aparecerá el desglose con más detalles.

Anotaciones múltiples, diferidas y virtuales

Una anotación múltiple es similar a la que ya hemos visto en el balance de apertura. Se hacen anotaciones en diversas cuentas, unas suman otras restan, pero al final todo debe sumar 0 (eso sí es importante, hay que grabárselo a fuego en la memoria).

Pero puede ser que tengamos que hacer alguna anotación múltiple distinta, por ejemplo, cuando pagamos un bien con dinero de dos cuentas distintas, pero también puede ser una transacción con la misma cuenta. Imaginemos por ejemplo que jugamos a la lotería, bonoloto, primitiva o lo que sea, todas las semanas y un día nos pagan un premio de 30,00€. Podríamos hacer un asiento como el siguiente:

2018/10/31 Lotería
    Gastos:Lotería                             14,00€
    Gastos:Lotería                            -30,00€
    Activo:Metálico                            16,00€

Hay que hacer notar que los ingresos se anotan con un menos delante. Eso es porque se detraen de otra cuenta. Para no liarme pienso en esas cuentas como cuentas externas, aparecen en mi libro pero son de otra persona o ente. En este caso Gastos:Lotería es una cuenta la empresa pública Loterías y Apuestas del Estado, a la que yo le sumo activos cuando compro lotería y le resto activos cuando me pagan premios. Como estoy quitando activos, el premio, la cantidad la anoto en negativo. El caso es que al final en mi bolsillo han aparecido 16,00€; mi bolsillo se llama Activo:Metálico (por si había alguna duda). En el ejemplo, utilizo dos veces la misma cuenta para mostrar que aunque después de echar la lotería yo sólo veré 16€, en realidad la transacción ha sido más compleja: me tenías que pagar 30€ pero se han cobrado de ahí la lotería que he comprado.

En otras ocasiones no pagamos en el acto. Las tarjetas de crédito es lo que tienen, que las compras las realizamos hoy pero lo anotan en tu cuenta dentro de unos días (aunque sean de débito). Si eres ordenado con la contabilidad cuando haces un gasto, lo anotas en el diario. El problema es que luego vas a ajustar tus cuentas, consultas con el banco y como aún no han anotado esa compra que hiciste con tarjeta, las cuentas no te cuadran. Para eso se puede hacer una anotación que yo llamo diferida. Se hace la anotación pero se le advierte al programa que está pendiente de realizar. Vamos a poner un ejemplo: voy al supermercado y hago la compra semanal y como me ha subido mucho decido utilizar mi tarjeta de crédito porque no llevo efectivo suficiente, haré una anotación como la siguiente:

2018/10/31 * Compra semanal
    Gastos:Alimentación:Mencabrona             85,49€
    Activo:Bancos:Ladrones y cia              -85,49€

Nótese el * entre la fecha y la descripción. Además observaremos también que emacs ha cambiado los colores de esa entrada y la hace distinta para destacarla de las otras. Cuando hablemos de generar informes y hacer listados de las cuentas, veremos que podemos pedirle a ledger-cli que contabilice esas entradas o no y cómo podemos hacer para encontrarlas rápido y quitarles el * cuando ya son anotaciones efectivas. Hay mucho más juego con este tipo de anotaciones (pero yo aún no he necesitado de ello), siempre es bueno echarle un ojo a la documentación de ledger-cli para saber la cantidad de cosas que se pueden hacer.

También es posible que necesitemos utilizar alguna cuenta virtual. Voy a poner un ejemplo chorra: Contabilizo una hipoteca que tengo contratada y voy pagando mes a mes. Parte de lo que pago va a amortizar el préstamo hipotecario que lo tengo anotado en la cuenta Pasivo:Hipoteca y otra parte a pagar los intereses al banco. El caso es que al final, de mi cuenta bancaria desaparece la cantidad de 259,50€. Sin embargo, cuando hago una relación de gastos, el sistema sólo me contabilizará los Gastos:Intereses Hipoteca... Lo otro no es un gasto, es una inversión, me diría el director de la sucursal y yo le creí.

2018/10/31 Pago de hipoteca
    Pasivo:Hipoteca                           235,47€
    Gastos:Intereses Hipoteca                  24,03€
    Activo:Bancos:El saqueador y cia         -259,50€

¿Cómo hago para que cuando saque mi relación de gastos mensuales me contabilice lo que amortizo? Porque a final de mes sí lo tengo descontado de mis ingresos y tengo que contar con ello. Una solución posible es anotarlo virtualmente. Podemos abrir una cuenta Gastos:Hipoteca amortizado, por ejemplo y decirle al programa que lo tenga en cuenta, pero sólo como un recordatorio para mí. La anotación quedaría como sigue:

2018/10/31 Pago de hipoteca
    Pasivo:Hipoteca                           235,47€
    Gastos:Intereses Hipoteca                  24,03€
    Activo:Bancos:El saqueador y cia         -259,50€
    (Gastos:Hipoteca amortizado)              235,47€

En este caso vemos que todas las anotaciones no suman 0, pero es que la última no es una anotación real. Al poner la cuenta entre paréntesis le estamos diciendo al programa que es una cuenta virtual que la utilizaremos para realizar cálculos de forma sencilla, pero que en realidad no hay transacción. Podríamos incluso tener varias cuentas virtuales, en el caso, por ejemplo, de que la hipoteca está a nombre de dos personas y cada una paga su parte.

Como vemos el sistema de anotación es muy flexible y permite hacer muchas cosas. Cosas financiaras y complicadas que si queréis avanzar en ellas tendréis que leer en la documentación de ledger-cli. Para llevar mi control diario sobre mis gastos, con lo que he contado será suficiente.

Autocompletado

La tarea de hacer las anotaciones puede ser ardua y proclive a fallos si tengo que escribirlo todo. Sin embargo, el ledger-mode me proporciona una herramienta imprescindible: el autocompletado.

Se basa en que muchas transacciones son repetidas la mayor parte de las veces. Por ejemplo, si voy al supermercado a hacer la compra semanal tendré que hacer una anotación cada semana. Con un ejemplo lo veremos más claro.

  1. Inicio una transacción con C-c C-a aceptando la fecha corregida o escribiendo la correspondiente.
  2. A continuación de la fecha escribo Comp y pulso <TAB>. Automágicamente ledger-mode completa a «Compra en la frutería», pero como eso no es lo que quiero vuelvo a pulsar <TAB> y ahora sí aparece el buscado «Compra semanal».
  3. Ahora necesito que me escriba las cuentas correspondientes: C-c TAB y tengo copiada la última transacción.
  4. Modifico los valores y ya tengo la anotación hecha

Hay veces que la transacción es nueva y no hay ningún asiento que copiar. En esos casos ledger-mode también facilita la anotación sugiriendo las cuentas. Por ejemplo, hemos comprado algo que no es una compra periódica y queremos anotarlo. Vamos a probar anotando que hemos comprado unas castañas en el puesto de la esquina, pero nos da igual el detalle, lo vamos a anotar a nuestra cuenta de gastos en metálico sin justificar, porque es una menudencia.

  1. Inicio de la transacción con C-c C-a y completamos la fecha.
  2. Escribimos "Compra de castañas asadas" y <RET>
  3. Pulsamos <TAB> para indentar, pulsamos G <TAB> y el ledger-mode lo completará a Gastos:.
  4. Si no tenemos claro a qué subcuenta de Gastos vamos a anotarlo podemos ir dando a <TAB> para que vaya sugiriendo una tras otra.
  5. Como nosotros tenemos claro que la subcuenta será Otros Gastos, pulsamos O <TAB> y ledger-cli completará a Gastos:Otros Gastos: y si volvemos darle <TAB> añadirá el Metálico (porque no hay otras subcuentas de la subcuenta, si no hará un recorrido por ellas).

El procedimiento contado así parece engorroso pero a la segunda vez que lo utilizas todo ya sabes cómo funciona, porque es muy intuitivo. Es una forma de aligerar el trabajo cuando hay muchas anotaciones que realizar.

Generar informes

Hasta ahora hemos visto cómo introducir los datos en nuestro libro diario, ahora toca sacar de él información. Como antes comenzamos por las cuentas, vamos a hacer lo mismo. Hemos ido haciendo apuntes y anotando a cuentas que en realidad no hemos definido en la cabecera. ¿Cómo sabemos cuántas hay, cuántas he necesitado para la contabilidad hasta ahora? Muy fácil, se lo preguntaré a ledger-cli desde la linea de comandos:

ledger -f prueba-ledger.ledger accounts

Llamo al ejecutable ledger diciéndole que utilice el fichero de entrada -f prueba-ledger.ledger y que me liste las cuentas accounts.

El resultado será:

Activo:Bancos:El saqueador y cia
Activo:Bancos:Ladrones y cia
Activo:Inmuebles:Casa
Activo:Metálico
Activo:Plan de Pensiones
Gastos:Alimentación
Gastos:Alimentación:Mencabrona
Gastos:Hipoteca amortizado
Gastos:Intereses Hipoteca
Gastos:Lotería
Gastos:Otros Gastos:Metálico
Pasivo:Hipoteca
Patrimonio:Balance Apertura

Podemos utilizar este listado para generar nuestra lista de cuentas (si no las hemos ido definiendo cuando comenzamos la contabilidad). Como ya he dicho, una opción para encontrar errores de tecleo es utilizar la opción --strict cuando hagamos consultas de nuestras cuentas, eso hará que sólo se tengan en cuenta las anotaciones a cuentas definidas en la cabecera y que lance un error en las demás transacciones. Si no fuera un error, que hubiéramos decidido anotar en una nueva cuenta y se nos ha olvidado definirla, es el recordatorio perfecto para hacerlo.

El sistema de informes de ledger-cli es muy completo y extenso. Puede hacer también cálculos financieros, estudios de gastos, por meses, anuales, y un largo etcétera que se nos iría del objetivo de este minitutorial. Si alguien tiene curiosidad o necesidad de este tipo de cosas, la documentación de ledger-cli es muy completa y exhaustiva con ejemplos que ayudan a clarificar todas las cosas que puede hacer.

En mi caso tengo una serie de informes que me utilizo habitualmente, así que me he creado un archivo informes.el que puedo cargar cuando lo necesito. El contenido es el siguiente:

;;; Listados para ledger-mode
(require 'ledger-mode)

(setq ledger-reports
       (quote
        ((#("asiento apertura" 0 1
          (idx 0))
          "%(binary) -f %(ledger-file) equity --real --strict Activo Pasivo")
         (#("balance" 0 1
            (idx 1))
          "%(binary) -f %(ledger-file) bal --strict --real -y %Y/%m/%d")
         (#("registro" 0 1
            (idx 2))
          "%(binary) -f %(ledger-file) reg --strict --real -y %Y/%m/%d")
         (#("cuenta" 0 1
            (idx 3))
          "%(binary) -f %(ledger-file) reg %(account) --real -y %Y/%m/%d")
         (#("por meses" 0 1
            (idx 4))
          "%(binary) -f %(ledger-file) reg %(account) -M --real -y %Y/%m/%d")
         (#("resumen" 0 1
            (idx 5))
          "%(binary) -f %(ledger-file) bal Gastos Ingresos --collapse-if-zero -y %Y/%m/%d")
         (#("cierre" 0 1
            (idx 6))
          "%(binary) -f %(ledger-file) bal --real --strict --format \"    %-40(account) %10(market(display_total) * -1)\n%/\" --no-total --flat")
         (#("comparado" 0 1
            (idx 7))
          "%(binary) -f %(ledger-file) --real --strict cleared")
         (#("estudio de gastos" 0 1
            (idx 8))
          "%(binary) bal -f %(ledger-file) Gastos --current --format \"%-35((depth_spacer)+(partial_account)) %10(percent(market(display_total), market(parent.total))) %16(market(display_total))\n%/\""))))

Lo tengo en un fichero diferente y en código elisp para facilitar su carga cuando es necesario. Se puede tener en el fichero init.el, pero los informes suelen ser algo puntual, no necesito tener ese código cargado cada vez que inicio emacs, ni siquiera cuando estoy en ledger-mode, porque la mayor parte de las veces sólo se introducen datos. Necesitaré ver los informes, sólo cuando debo compara cuentas con las anotadas en el banco, por ejemplo. O cuando necesito saber en qué se ha gastado el dinero. Tan sólo hay que cargar el código con M-x load-file.

No voy a explicar todos los aspectos de los informes, porque cada uno tiene sus manías y le gusta ver la información de una forma distinta y hay tantas que son motivo de un capítulo completo en la documentación de ledger-cli. Sólo destacaré algunos aspectos muy concretos y útiles. Por ejemplo, una opción que se repite bastante en los informes es el formato de fecha -y %Y/%m/%d para ver las fechas en el formato ISO. Otra opción que se repite bastante es --real que le dice al sistema que tenga en cuenta sólo las transacciones reales y deje a un lado las virtuales, como vimos antes en la entrada que marcábamos como (Gastos:Hipoteca amortizado). La que más se repite es, sin duda, la opción --strict para que sólo haga listado con cuentas definidas.

Para comprobarlo vamos a hacer un balance habiendo introducido un error en una cuenta a propósito como sigue a continuación:

2018/10/31 Compra de chuches
    Gastos:Otros Gastos:Metálco                 2,30€
    Activo:Metálico

Si ahora lanzamos una consulta de balance que tenemos en ese fichero, el resultado será el siguiente:

Report: balance
Command: ledger -f /home/notxor/Sync/prueba-ledger.ledger bal --strict --real -y %Y/%m/%d
===================================================================================================================

Warning: "/home/notxor/Sync/prueba-ledger.ledger", line 61: Unknown account 'Gastos:Otros Gastos:Metálco'
           1.890,05€  Activo
            -364,29€    Bancos
            -285,34€      El saqueador y cia
             -78,95€      Ladrones y cia
           2.160,04€    Inmuebles:Casa
              11,65€    Metálico
              82,65€    Plan de Pensiones
              98,34€  Gastos
              86,76€    Alimentación
              85,49€      Mencabrona
              24,03€    Intereses Hipoteca
             -16,00€    Lotería
               3,55€    Otros Gastos
               2,30€      Metálco
               1,25€      Metálico
          -1.136,76€  Pasivo:Hipoteca
            -851,63€  Patrimonio:Balance Apertura
--------------------
                   0

Como vemos, lo hace, sin embargo nos aparece una línea de Warning que nos dice el fichero y la línea donde ha encontrado una cuenta desconocida.

Uno de los informes que más se utiliza es el que muestra un listado de una cuenta en concreto, por ejemplo, para cuadrar el valor que nos dice el banco que tenemos en la cuenta, con el valor que tenemos anotado, que como ya dije antes, no tiene por qué coincidir. Vamos a hacer un ejemplo:

  1. Lanzamos un informe con C-c C-o C-r seleccionamos cuenta.
  2. Decimos qué cuenta queremos, en nuestro caso: Activo:Bancos:Ladrones y cia. Además si estamos en el buffer de ledger situados en una línea con una cuenta determinada, ledger-mode nos sugerirá esa cuenta como primera opción. El resultado nos aparece en un buffer de informe:
Report: cuenta
Command: ledger -f /home/notxor/Sync/prueba-ledger.ledger reg Activo\:Bancos\:Ladrones\ y\ cia --real -y %Y/%m/%d
==================================================================================================================

2018/10/30 Balance de apertura           Activo:Bancos:Ladrones y cia                   6,54€             6,54€
2018/10/31 Compra semanal                Activo:Bancos:Ladrones y cia                 -85,49€           -78,95€

Como vemos, sólo hay dos registros y sabemos que tenemos un descubierto de -78,95€ aunque el banco nos dice que tenemos 6,54€ en ella. ¿Dónde está el descuadre? Si recordamos, habíamos anotado la Compra semanal como pendiente de anotar, que es lo que ha sucedido ahora. Para comprobar que es así:

  1. Situados en el buffer *Ledger Report* y pulsamos e.
  2. Modificamos el comando de informe añadiendo la opción -U y <RET>. Eso ocultará las transacciones pendientes de anotar.

Si no coincide volvemos a editar la consulta para que aparezcan y punteamos con la cuenta a ver qué transacciones se han anotado ya. Situados en el buffer de informe, pulsando <RET> en una de las líneas del informe, ledger-mode nos llevará al asiento correspondiente. Por lo que buscar una transacción es más sencillo de lo que parece cuando tenemos un fichero conteniendo la contabilidad de varios años, si podemos acotar por fechas: por ejemplo, para que sólo salgan las transacciones del mes de enero de este año se pueden utilizar las opciones -b 2018/01/01 y -e 2018/01/31. Como es lógico -b para el inicio (begin) y -e para el final (end) del periodo.

Cierre contable

Con periodicidad anual, generalmente, se hace un cierre contable para observar cómo van las cosas. Bueno, realmente se puede hacer cada vez que uno necesite echar un vistazo al estado de las cuentas. Para eso me creé un informe que llamé cierre. Lo destacable de este informe es que me hace el asiento de cierre automáticamente utilizando la opción --format que va acompañada de una expresión algo más compleja y por eso la explicaré aquí. El código en elisp se convertirá en

"    %-40(account) %10(market(display_total) * -1)\n"

El formato, primero deja cuatro espacios en blanco y luego hay una columna definida como %-40(account) es decir: el nombre de la cuenta con cuarenta caracteres de ancho alineados a la izquierda (por eso el -). La siguiente columna es %10(market(display_total) * -1)\n. Es decir: 10 caracteres de ancho y un cálculo que básicamente es cambiar de signo el valor total de la cuenta. El resultado en nuestro caso será:

Activo:Bancos:El saqueador y cia            285,34€
Activo:Bancos:Ladrones y cia                 78,95€
Activo:Inmuebles:Casa                    -2.160,04€
Activo:Metálico                             -11,65€
Activo:Plan de Pensiones                    -82,65€
Gastos:Alimentación                         -86,76€
Gastos:Alimentación:Mencabrona              -85,49€
Gastos:Intereses Hipoteca                   -24,03€
Gastos:Lotería                               16,00€
Gastos:Otros Gastos:Metálico                 -3,55€
Pasivo:Hipoteca                           1.136,76€
Patrimonio:Balance Apertura                 851,63€

Sin embargo, si la anotamos tal cual y actualizamos la consulta nos saltará un error, porque en la cuenta de Gastos:Alimentación está contada dos veces la compra en el Mencabrona de 85,49€ por lo que tendremos que ajustar esos errores antes de hacer el cierre anual.

Una vez hecho el ajuste contable queda hacer la apertura, y para ello también creé un informe que lo hace.

Conclusión

Con mi intención de llevar toda mi información en ficheros de texto plano, ledger-cli me facilita el trabajo contable. No necesito sofisticados programas de entorno gráfico con formatos cerrados y un gran gasto de recursos gráficos y de memoria.

Categoría: emacs contabilidad

Comentarios

Debido a algunos ataques mailintencionados a través de la herramienta de comentarios, he decidido no proporcionar dicha opción en el Blog. Si alguien quiere comentar algo, me puede encontrar en esta cuenta de Mastodon, también en esta otra cuenta de Mastodon y en Diaspora con el nick de Notxor.

Si usas habitualmente XMPP (si no, te recomiendo que lo hagas), puedes encontrar también un pequeño grupo en el siguiente enlace: notxor-tiene-un-blog@salas.suchat.org

Disculpen las molestias.