CLI Finance ツールの開始


動機



これは、beancount に大きく基づいた財務ツール プロジェクトですが、機能が少なく、複雑さが大幅に軽減されています. beancount リポジトリとドキュメントを確認した後、使用できる機能が他にもたくさんあることに気付きました.新しい言語である C# で新しいプロジェクトを作成しようとして、このプロジェクトが生まれました.

概要



これはコンソール アプリケーションです.現在のところ、主要な依存関係は System.CommandLine パッケージのみです.コマンド コードは namespace Controllers.Commands に記述されており、エントリの解析とフォーマットは namespace Controllers.VaultAccess に記述されています.

コマンド



これが私のコマンドの1つの例です.

using System;
using System.CommandLine;
using System.CommandLine.Invocation;
using Controllers.VaultAccess;
using Config;

namespace Controllers.Commands
{

    public class NewCommand : Command
    {

        public NewCommand() : base("new", "Create a new vault entry")
        {
            AddArgument(DetailsArgument());
            AddOption(DateOption());
            AddOption(DirectiveOption());
            AddOption(ValueOption());
            Handler = CommandHandler.Create((DateTime date, string directiveType, string details, double currency) =>
            {
                JournalEntry entry = new JournalEntry(date, directiveType, details, currency);
                Console.WriteLine(entry.ToString());
            });
        }


ロジックは未完成ですが、明確です.私のコマンド クラスは System.CommandLine.Command から継承し、初期化時にすべてのロジックを抽象化します.この形式を使用すると、オプションと引数を独自のプライベート メソッドにカプセル化できます.

 private Argument<string> DetailsArgument()
        {
            Argument<string> details = new Argument<string>("details");
            details.Description = "The details of this journal entry";

            return details;
        }

        private Option<DateTime> DateOption()
        {
            Option<DateTime> date = new Option<DateTime>("--date");
            date.AddAlias("-d");
            date.Description = "Date of entry";
            date.SetDefaultValue(DateTime.Now);

            return date;
        }


仕訳記入



Beancount は非常に成熟したプログラムであり、エントリの入力形式をテストして完成させました.私はそれらの入力フォーマットを一致させ、日誌エントリの入力、解析、フォーマット、および出力を処理する JournalEntry クラスを作成しました.
これは、ジャーナル ファイルに出力することを期待している形式の例です.<Date> <Directive> <Details> <Value><Currency>08/05/2021 open Liability:Food:Restaurant -35 USD
public class JournalEntry
    {
        private readonly int DATE_MAX_WIDTH = 13;
        private readonly int DIRECTIVE_MAX_WIDTH = 7;
        private readonly int DETAILS_MAX_WIDTH = 45;
        private DateTime entryDate { get; set; }
        private string directive { get; set; }
        private string details { get; set; }
        private double currency { get; set; }
        public JournalEntry(DateTime date, string dir, string det, double cur)
        {
            entryDate = date;
            directive = dir;
            details = det;
            currency = cur;
        }

        public override string ToString()
        {
            return string.Format("{0}{1}{2}{3}",
            entryDate.ToShortDateString().PadRight(DATE_MAX_WIDTH),
            directive.PadRight(DIRECTIVE_MAX_WIDTH),
            details.PadRight(DETAILS_MAX_WIDTH),
            currency);
        }


次のステップ



私がまだ実装していない最も難しい機能は会計ロジックであり、おそらくもっと重要なのは、さまざまな会計レポートを作成するための仕訳帳の各行の解析です.私は、すべてのオープン資産と負債、勘定残高、および支出の履歴に関するレポートを追加する予定です.
このプロジェクトの利点は、それが最初ではないということです.既存の会計ツールからロジックの一部をコピーして、それらを構築して改善することができます.

Github リポジトリ