تحلیل مالی بلادرنگ با Fava و Beancount
مقدمه
Beancount یک سیستم حسابداری دوطرفه متنباز است که از فایلهای متنی ساده (plain text) به عنوان دفتر کل استفاده میکند. این سیستم بر سادگی، شفافیت و انعطافپذیری در ردیابی امور مالی تأکید دارد. Fava یک رابط کاربری تحت وب قدرتمند برای Beancount است که محیطی تعاملی برای مشاهده گزارشها، تصویرسازیها و مدیریت دفتر کل شما فراهم میکند. در این گزارش، ما قابلیتهای اصلی Beancount و Fava و نحوه دستیابی به تحلیلهای مالی بلادرنگ یا نزدیک به بلادرنگ را با این ابزارها بررسی میکنیم. ما نکاتی درباره تنظیمات اتوماسیون و بهروزرسانی دادهها، ویژگیهای تصویرسازی Fava (برای مشاهده فوری جریان نقدی و شناسایی روندها)، ادغام با داشبوردهای خارجی (مانند Grafana، Metabase و غیره)، نمونههایی از داشبوردها و افزونههای سفارشی، موارد استفاده در امور مالی شخصی و کسبوکارهای کوچک، مقایسه با سایر پلتفرمها (مانند Power BI و QuickBooks) و مزایا و معایب استفاده از Fava+Beancount برای بینشهای مبتنی بر داده را پوشش میدهیم.
قابلیتهای کلیدی Beancount و Fava
Beancount (موتور حسابداری متنساده)
- دفتر کل دوطرفه در متن ساده: Beancount تراکنشها را در یک فایل متنی با پسوند
.beancount(یا چندین فایل متصل به هم) ذخیره میکند. هر تراکنش باید تراز باشد (مجموع بدهکار = مجموع بستانکار) تا یکپارچگی حسابداری حفظ شود. فرمت متن ساده به این معناست که دادههای شما توسط انسان قابل خواندن است، قابلیت کنترل نسخه را دارد و به هیچ فروشنده خاصی وابسته نیست. - حسابهای منعطف و سلسلهمراتب: شما میتوانید هر حسابی (مانند
Assets:Bank:CheckingیاExpenses:Food:Coffee) را در یک ساختار درختی تعریف کنید. Beancount تعصبی روی چیدمان حسابهای شما ندارد، بنابراین برای امور مالی شخصی، دفاتر کسبوکارهای کوچک، سرمایهگذاریها و غیره مناسب است؛ در واقع این سیستم "منعطف است: برای امور مالی شخصی، دفترداری کسبوکارهای کوچک، کریپتو، سرمایهگذاری در بورس و موارد دیگر کاربرد دارد." - چندین ارز و کالا: Beancount پشتیبانی درجهیکی از ارزهای مختلف و کالاها (مانند سهام و کریپتو) دارد. شما میتوانید تراکنشها را با ارزهای مختلف ثبت کنید، نرخهای ارز (Price directives) را تعریف کنید و بهای تمام شده را رهگیری نمایید. این سیستم میتواند گزارشها را بر اساس «بهای تمام شده» یا «ارزش بازار» (در صورت وجود دادههای قیمتی) ارائه دهد که آن را برای سبدهای سرمایهگذاری و امور مالی بینالمللی ایدهآل میکند.
- بررسیها و کنترلهای خودکار: این سیستم از تاییدیه تراز (balance assertions) پشتیبانی میکند (شما میتوانید اعلام کنید که مانده یک حساب در یک تاریخ خاص چقدر باید باشد و اگر مطابقت نداشته باشد، Beancount خطا میدهد) و همچنین از تراکنشهای ترازکننده برای بستن دفاتر حمایت میکند. علاوه بر این، از ثبتهای افتتاحیه/اختتامیه حقوق صاحبان سهام و محاسبه سود انباشته برای بستن دوره مالی پشتیبانی میکند. این ویژگیها کمک میکنند تا دفاتر شما منسجم باقی بمانند و خطاها در مراحل اولیه شناسایی شوند.
- موتور پرسوجو و گزارشگیری قدرتمند: Beancount دارای یک زبان پرسوجو به نام BQL (Beancount Query Language) و ابزارهای خط فرمان مانند
bean-balance،bean-registerوbean-queryبرای تولید گزارش است. شما میتوانید برای دریافت گزارشهای سفارشی (مانند لیست هزینهها بر اساس ذینفع، یا جریان نقدی یک دوره خاص) از دفتر کل پرسوجو کنید – در واقع با دفتر کل مانند یک پایگاه داده رفتار میکنید. این سیستم حتی با هزاران تراکنش نیز سریع عمل میکند و میتواند خروجی CSV یا حتی مستقیم به Excel/LibreOffice (با افزونههای اختیاری) ارائه دهد. - قابلیت گسترش از طریق افزونهها: Beancount با زبان پایتون نوشته شده است و اجازه میدهد با استفاده از افزونههای (plugins) سفارشی، عملکردهای آن را گسترش دهید. افزونهها میتوانند قوانین یا محاسبات اضافی را هنگام پردازش فایل اعمال کنند. (برای مثال، افزونههایی برای مدیریت دستههای مالیاتی یا اطمینان از اینکه هیچ خریدی بدون قیمت ثبت نشده باشد وجود دارد.) سیستم افزونهها و API پایتون به کاربران حرفهای اجازه میدهد رفتارهای سفارشی را برنامهنویسی کرده یا Beancount را با سیستمهای دیگر ادغام کنند.
- واردکنندهها برای دادههای خارجی: یک ویژگی کاربردی کلیدی، چارچوب ingest در Beancount برای وارد کردن دادهها (مثلاً از صورتحسابهای بانکی) است. شما میتوانید افزونههای واردکنندهای بنویسید یا از موارد موجود استفاده کنید که فایلهای CSV، OFX، صورتحسابهای PDF و غیره را تجزیه کرده و آنها را به ورودیهای Beancount تبدیل میکنند. این موضوع برای اتوماسیون حیاتی است.
- قابل حسابرسی و سازگار با کنترل نسخه: از آنجا که دادهها به صورت متن ساده هستند، میتوانید دفتر کل خود را در Git یا سایر سیستمهای کنترل نسخه نگه دارید. هر تغییری شفاف است و تاریخچه کامل ویرایشها را در اختیار دارید. این امر حسابرسی یا بررسی تغییرات را بسیار ساده میکند (بسیاری از کاربران تغییرات هر روز را در یک مخزن Git ثبت میکنند که یک گزارش غیرقابل دستکاری از تمام ورودیهای مالی فراهم میکند). این سطح از شفافیت تفاوت بزرگی با نرمافزارهای حسابداری بسته ایجاد میکند – "بدون وابستگی به SaaS؛ فقط حسابداری پاک و شفاف با گزارشگیری قدرتمند."
Fava (رابط تحت وب برای Beancount)
- رابط کاربری وب تعاملی: Fava یک سرور وب محلی فراهم میکند که دفتر کل Beancount شما را به یک رابط کاربری غنی تبدیل میکند. این ابزار گزارشهای اصلی (صورت سود و زیان، ترازنامه و غیره)، ریز حسابها و دفتر روزنامه را با کنترلهای تعاملی در مرورگر نمایش میدهد. در مقایسه با خط فرمان، این رابط کاربری پویا و کاربرپسند است. شما آن را با یک دستور ساده
fava yourfile.beancountاجرا میکنید و یک اپلیکیشن وب برای دفاتر مالی خود خواهید داشت. - گرافها و نمودارهای داخلی: Fava نمودارهایی را برای کمک به تصویرسازی دادههای شما تولید میکند. به عنوان مثال، شامل نمودار خطی ارزش خالص (Net Worth) در طول زمان، نمودارهای میلهای برای مقایسه درآمد در برابر هزینهها در هر ماه، و نمودارهای دایرهای/درختی برای تفکیک هزینهها است. این تصاویر با دادههای شما بهروز میشوند و از نماهای مختلف (مانند «بهای تمام شده» در مقابل «ارزش بازار» برای سرمایهگذاریها) پشتیبانی میکنند.
- فیلتر کردن و جستجو: در بالای صفحات Fava، یک نوار فیلتر به شما اجازه میدهد دادههای خود را به صورت بلادرنگ کالبدشکافی کنید. شما میتوانید بر اساس زمان (سال، فصل، ماه)، عبارات باقاعده (regex) حسابها، ذینفع، شرح تراکنش، یا برچسبها/لینکها فیلتر انجام دهید. این کار بازرسی بلادرنگ دادهها را آسان میکند – مثلاً به سرعت با فیلتر کردن "Tag=Travel" و "Year=2025" تمام هزینههای سفر در سال ۲۰۲۵ را با مجموع مبالغ مشاهده کنید. این رابط از طریق نوار فیلتر یا صفحه Query (جایی که میتوانید مستقیماً دستورات BQL را اجرا کنید) از پرسوجوهای پیچیده پشتیبانی میکند.
- پشتیبانی از چندین فایل و تجمیع: Fava میتواند چندین فایل Beancount را به طور همزمان بارگذاری کند (مفید برای زمانی که دفاتر جداگانه دارید) و بین آنها جابهجا شود. همچنین در صورت نیاز میتواند آنها را تجمیع کند (مثلاً مشاهده همزمان دفاتر شخصی و تجاری).
- ورود و ویرایش دادهها: به شکلی منحصربهفرد، Fava فقط خواندنی نیست؛ بلکه دارای یک ویرایشگر و فرم ورود تراکنش است. شما میتوانید تراکنشهای جدید را از طریق یک فرم وب اضافه کنید (که ورودی را در فایل
.beancountشما درج میکند). همچنین میتوانید فایل منبع را در یک ویرایشگر خارجی از داخل Fava باز کنید. Fava حتی برای کاربران حرفهای از میانبرهای کیبورد "به سبک Gmail" پشتیبانی میکند (با زدن کلید?در رابط کاربری میتوانید آنها را ببینید). این قابلیت Fava را به یک سیستم حسابدا ری سبک تبدیل میکند که در آن میتوانید دادهها را از همان رابط کاربری وارد و مشاهده کنید. - گزارشها و جزئیات حسابها: Fava گزارشهای استاندارد حسابداری را ارائه میدهد: صورت سود و زیان (P&L)، ترازنامه، تراز آزمایشی و لیستی از داراییها برای سرمایهگذاریها. ترازنامه و صورت سود و زیان تعاملی هستند؛ میتوانید روی یک حساب کلیک کنید تا وارد جزئیات آن شوید، یا بین نمای بهای تمام شده و ارزش بازار برای داراییها جابهجا شوید. Fava همچنین در صورت داشتن دادههای قیمتی، "سود تحققنیافته" سرمایهگذاریها را نشان میدهد. این ابزار نمای دفتر روزنامه از تمام ورودیها را تولید کرده و اجازه میدهد آن را بر اساس معیارهای مختلف فیلتر کنید (بسیار عالی برای پیدا کردن تراکنشهای خاص).
- مدیریت اسناد: اگر رسیدها یا صورتحسابها را ضمیمه کنید، Fava به سازماندهی آنها کمک میکند. Beancount مفهومی به نام پوشه اسناد دارد و Fava به شما اجازه میدهد فایلها را روی حسابها یا تراکنشها بکشید و رها کنید (Drag-and-drop) – سیستم آنها را ذخیره کرده و یک ورودی سند در دفتر کل شما اضافه میکند. این ویژگی برای پیوند دادن اسناد پشتیبان با دادههای دفتر کل بسیار کاربردی است.
- سفارشیسازی از طریق اکستنشنها: Fava را میتوان با افزونههایی (نوشته شده به زبان پایتون) برای افزودن گزارشها یا عملکردهای جدید گسترش داد. برخی اکستنشنها به صورت پیشفرض همراه برنامه هستند (مانند گزارش لیست سبد سهام). طراحی Fava اجازه میدهد صفحات جدید و حتی جاوااسکریپت سفارشی را از طریق API اکستنشن خود تزریق کنید. این یعنی اگر تحلیل یا داشبورد خاصی به صورت داخلی وجود نداشته باشد، یک کاربر پیشرفته میتواند آن را اضافه کند.
- عملکرد: Fava کارآمد است؛ دادهها را در حافظه بارگذاری کرده و صفحات را به سرعت نمایش میدهد. تجزیه و تحلیل زیرساختی Beancount بسیار سریع است (در نسخههای جدید با C++ بهینه شده است)، بنابراین حتی دفتر کلهای بزرگ در یک یا دو ثانیه بارگذاری میشوند. در عمل، Fava میتواند دفتر کلهای شخصی چندین ساله را مدیریت کند، هرچند فایلهای بسیار بزرگ (دهها هزار تراکنش) ممکن است از برخی بهینهسازیها (مانند بایگانی کردن ورودیهای قدیمی) بهرهمند شوند.
- دسترسی تحت وب و قابلیت جابهجایی: با اجرای Fava روی یک سرور یا حتی لپتاپ خود، میتوانید از هر مرورگری به امور مالی خود دسترسی داشته باشید. برخی کاربران Fava را روی یک سرور خصوصی یا Raspberry Pi میزبانی میکنند تا بتوانند در حال حرکت امور مالی خود را چک کنند (احتمالاً با ایمنسازی پشت یک رمز عبور یا VPN، زیرا Fava سیستم احراز هویت داخلی ندارد). این کار در واقع به شما یک "اپلیکیشن وب" میزبانی شده توسط خودتان برای امور مالیتان میدهد، بدون اینکه دادههایتان را در اختیار شخص ثالث قرار دهید.
به طور خلاصه، Beancount زیربنای محکمی برای حسابداری شفاف و متنمحور با قوانین دقیق دوطرفه و پشتیبانی از چندین ارز فراهم میکند. Fava با ارائه یک رابط کاربری قابل دسترس همراه با بینشهای فوری (گزارشها، نمودارها) و توانایی تعامل با دادهها، بر روی این پایه بنا شده است. این دو در کنار هم یک سیستم حسابداری و تحلیلی بسیار منعطف را تشکیل میدهند که شما کنترل کامل آن را از ابتدا تا انتها در دست دارید.
تحلیل و آنالیز آنی (یا نزدیک به آنی) با Beancount و Fava
دستیابی به تحلیل و آنالیز آنی یا نزدیک به آنی با Beancount و Fava مستلزم خودکارسازی جریان دادهها به دفتر کل و اطمینان از نمایش اطلاعات ب هروز توسط ابزارهاست. بهطور پیشفرض، Beancount یک فرآیند دستهای (batch) است (شما ورودیها را به فایل اضافه میکنید و سپس گزارشها را مشاهده میکنید) و Fava تغییرات را شناسایی کرده و نیاز به بازخوانی (refresh) دارد. با این حال، با تنظیمات صحیح، میتوانید بهروزرسانیها را سادهسازی کنید تا تراکنشها و تغییرات جدید تقریباً بلافاصله ظاهر شوند.
تشخیص تغییرات فایل: Fava فایل دفتر کل را برای تغییرات زیر نظر میگیرد. اگر فایل .beancount (یا فایلهای ضمیمه) را در یک ویرایشگر تغییر دهید، Fava بنر «تغییرات شناسایی شد - برای بارگذاری مجدد کلیک کنید» را نشان میدهد. با کلیک کردن (یا فشردن دکمه بازخوانی)، دادهها را مجدداً بارگذاری کرده و نما را بهروز میکند. در عمل، این بارگذاری مجدد بسیار سریع است (معمولاً برای دفترهای کل معمولی کمتر از یک ثانیه زمان میبرد). این بدان معناست که اگر فایل دفتر کل شما بهطور مکرر بهروز شود، Fava میتواند به عنوان یک داشبورد زنده عمل کند. (در حالت دیباگ، Fava حتی میتواند با تغییرات فایل بهطور خودکار بازخوانی شود، اگرچه بهطور پیشفرض برای جلوگیری از اختلال در مشاهده شما، منتظر تأیید کاربر میماند.)
خط لوله واردات/بهروزرسانی مداوم: برای دریافت دادههای آنی، باید اضافه شد ن تراکنشها به فایل Beancount را خودکار کنید. چند استراتژی رایج وجود دارد:
-
وظایف واردات زمانبندیشده (Cron): بسیاری از کاربران یک کرونجاب (یا وظیفه زمانبندیشده) تنظیم میکنند تا تراکنشهای جدید را بهطور دورهای (مثلاً هر شب یا هر ساعت) از مؤسسات مالی دریافت کرده و به دفتر کل اضافه کند. به عنوان مثال، میتوانید از افزونههای واردکننده (importer plugins) Beancount برای دریافت آخرین تراکنشهای بانکی از طریق API یا دانلود OFX استفاده کنید. یکی از کاربران Beancount یک خط لوله خودکارسازی ساخته است که دفتر حسابداریاش خودش را بهروز میکند: «دیدن اینکه دفتر حسابداریام بدون دخالت من و در یک قالب باز بهروز میشود، برایم لذت محض است». این کار با اتصال به APIهای بانکی و زمانبندی بهروزرسانیهای منظم انجام شده است. ابزارهایی مانند
bean-fetch(برای OFX) یا اسکریپتهای پایتون سفارشی با استفاده از APIهای بانکی (مانند Plaid) میتوانند طبق برنامه اجرا شده و ورودیهای جدید را در دفتر کل بنویسند. پس از هر واردات زمانبندیشده، اگر Fava در حال اجرا باشد، میتوانید به سادگی Fava را بازخوانی کنید تا دادههای جدید را ببینید. -
شنودگرهای فایل و تریگرها (File Watchers): به جای برنامههای زمانی، میتوانید از شنودگرهای فایل برای واکنش به رویدادها استفاده کنید. برای مثال، اگر بانک شما میتواند صورتحساب روزانه را برایتان ایمیل کند یا شما یک فایل CSV را در پوشهای قرار میدهید، یک اسکریپت میتواند آن فایل را شناسایی کرده (با استفاده از
inotifyدر لینوکس یا موارد مشابه) و بلافاصله روتین واردات را اجرا کند و سپس به Fava سیگنال دهد که بازخوانی شود. در حالی که Fava هنوز از ارسال بازخوانی زنده به مرورگر پشتیبانی نمیکند، حداقل دادههای شما بهروز خواهد بود تا دفعه بعد که صفحه را چک میکنید یا روی بازخوانی کلیک میکنید، اطلاعات جاری باشد. برخی از پروژههای جامعه فراتر میروند: برای ledger (پسرعموی Beancount)، یک کاربر سرور کوچکی ساخته است که دادههای ledger را بهصورت آنی در Grafana نمایش میدهد، که نشان میدهد رویکرد مشابهی را میتوان با Beancount نیز اتخاذ کرد – در واقع ساختن یک دیمون (daemon) که دادهها را بهطور مداوم به داشبوردهای شما تغذیه میکند. -
ادغام مستقیم API: به جای عبور از فایلها، کاربران پیشرفته ممکن است مستقیماً به APIهای بانکی (مانند Plaid یا APIهای بانکداری باز منطقهای) متصل شوند تا تراکنشها را بهطور مکرر دریافت کنند. یک فرد با انگیزه میتواند واردات «زنده» را در یک حلقه (با محدودیت نرخ مناسب) اسکریپتنویسی کند – و در واقع هر چند دقیقه یک بار وضعیت بانک را برای دادههای جدید بررسی کند. هیچچیز مانع شما برای «ثبتنام در Plaid API و انجام همان [خودکارسازی] بهصورت محلی» نیست. هر تراکنش جدید میتواند به محض رسیدن به فایل Beancount اضافه شود. با این رویکرد، Fava واقعاً به یک داشبورد آنی برای حسابهای شما تبدیل میشود که با فیدهای بهروز در اپلیکیشنهای تجاری رقابت میکند.
بازخوانی دادهها در Fava: هنگامی که دادههای شما در حال بهروزرسانی هستند، نمایش آنها در Fava ساده است: یک بازخوانی مرورگر (F5) یا کلیک بر روی بنر بازخوانی، آخرین وضعیت دفتر کل را بارگذاری میکند. اگر ترجیح میدهید حتی کلیک هم نکنید، اجرای Fava با سوئیچ --debug قابلیت بازخوانی خودکار را برای توسعه افزونه فعال میکند که برخی از آن برای اجبار به بازخوانی فوری صفحه هنگام تغییرات استفاده کردهاند. متناوباً، اگر در حال ساخت یک فرانتاند سفارشی هستید، میتوانید آن را طوری تنظیم کنید که یک API کوچک را فراخوانی کند که آخرین موجودی یا موارد مشابه را از دفتر کل طبق برنامه برمیگرداند.
محاسبات فوری: تجزیه و تحلیل سریع Beancount به این معنی است که حتی اگر فایل دفتر کل خود را هر چند دقیقه یک بار بهروز کنید، چرخه دریافت داده ← بهروزرسانی فای ل ← بازخوانی Fava بسیار سریع است. به عنوان مثال، یک کاربر خاطرنشان میکند که بازخوانی Fava پس از ویرایش فایل «بهسختی قابل تشخیص است... قطعاً کمتر از یک ثانیه» برای دفترهای کل با اندازه معقول. بنابراین، میتوانید یک پنجره Fava را باز نگه دارید و بهطور دورهای دکمه بازخوانی را بزنید تا یک داشبورد زنده را شبیهسازی کنید. (برای یک تجربه واقعاً زنده، میتوان اسکریپت کوچکی برای بازخوانی خودکار مرورگر نوشت یا از ویژگی بازخوانی خودکار مرورگر در هر N ثانیه استفاده کرد.)
مغایرتگیری و هشدارها: برای اعتماد به دادههای آنی، باید موجودیها را نیز بهطور مکرر مغایرتگیری کنید. Beancount این کار را با تأییدیههای موجودی (balance assertions) و یک «نشانگر بهروز بودن» آسان میکند. در واقع، Fava نشانگرهای رنگی در کنار حسابها ارائه میدهد اگر آنها را با متادیتای خاصی علامتگذاری کنید (مثلاً میتوانید یک حساب را با متادیتای fava-uptodate علامتگذاری کنید و Fava بر اساس اینکه آخرین ورودی یک بررسی موجودی اخیر است یا خیر، آن را به رنگ قرمز/زرد/سبز در میآورد). این میتواند برای دیدن سریع اینکه آیا موجودی یک حساب در دفتر کل با آخرین صورتحساب بانک مطابقت دارد یا خیر، استفاده شود. در یک تنظیمات نزدیک به آنی، ممکن است بررسیهای مو جودی روزانه را خودکار کنید (به طوری که هر صبح، دفتر کل دارای موجودی بسته شده دیروز بانک برای هر حساب باشد). نشانگر Fava سپس به شما میگوید که آیا واردات خودکار شما چیزی را از قلم انداخته است یا اختلافی وجود دارد، که باعث ایجاد اطمینان از دقیق بودن دادههای «زندهای» که میبینید میشود.
مثال خودکارسازی: فرض کنید بهروزرسانیهای روزانه جریان وجوه نقد را میخواهید. میتوانید یک کرونجاب تنظیم کنید تا هر شب ساعت ۳ بامداد اجرا شود: این کار یک اسکریپت پایتون را اجرا میکند که از API بانک شما برای دریافت تراکنشهای روز گذشته استفاده میکند، آنها را در import_today.beancount مینویسد و سپس آن فایل را به دفتر کل اصلی شما ضمیمه میکند. همچنین یک تأییدیه موجودی برای پایان روز مینویسد. وقتی بیدار میشوید، Fava را باز میکنید – تمام تراکنشها تا دیروز را نشان میدهد و میبینید که درآمد/هزینه ماه جاری بهروز شده است. اگر در طول روز هزینهای انجام دادید، میتوانید آن را بهصورت دستی اضافه کنید (مثلاً از طریق فرم تراکنش جدید Fava در گوشی خود) یا منتظر واردات شبانه بمانید. این رویکرد ترکیبی (بیشتر خودکار، با قابلیت اضافه کردن دستی موارد خاص) تصویری نزدیک به واقعیت ارائه میدهد. رویکرد دیگر این است که صفحه Journal در Fava را باز بگذارید و از آن به عنوان دفتر روزنامه استفاده کنید: همانطور که خرج میکنید، سریعاً تراکنش را ثبت میکنید (مانند وارد کردن در دسته چک) – در این صورت خود شما فید آنی هستید. این روش دستیتر است، اما برخی کاربران از آگاهیبخشی آن لذت میبرند. برای بهروزرسانیهای واقعاً جریانی بدون مراحل دستی، باید روی اسکریپتنویسی سرمایهگذاری کنید و احتمالاً از APIهای شخص ثالث همانطور که بحث شد استفاده کنید.
بهطور خلاصه، با ترکیب خودکارسازی واردات Beancount با بازخوانی سریع Fava، میتوانید به دادههای مالی نزدیک به آنی دست یابید. ممکن است دستیابی به همان سطح از فید زنده مانند سرویسی مثل QuickBooks (که بهطور خودکار فیدهای بانکی را میکشد) «به سادگی فشردن یک دکمه» نباشد، اما امکانپذیر است – و مهمتر از آن، شما کنترل کامل و شفافیت فرآیند را حفظ میکنید. همانطور که یکی از طرفداران حسابداری متنساده اشاره کرده است، کمی تلاش اولیه میتواند سیستمی خودکار ایجاد کند که «بسیار بهتر از راهحلهای تجاری و به مراتب منعطفتر و توسعهپذیرتر» است. در بخش بعدی، خواهیم دید که چگونه قابلیتهای بصریسازی Fava به شما اجازه میدهد بلافاصله از این دادههای بهروز استفاده کنید و تراکنشهای خام را به بینشهای مالی تبدیل کنید.
قابلیتهای بصریسازی در فاوا (جریانهای نقدی، روندها، بازرسی لحظهای)
(GitHub - beancount/fava: Fava - web interface for Beancount) گزارش صورت سود و زیان فاوا (در رابط کاربری وب) از بصریسازیهای غنی مانند نقشههای درختی (در تصویر) و نمودارهای خورشیدی برای درک سریع ترکیب درآمد و هزینهها پشتیبانی میکند. در این نقشه درختی، هر مستطیل نشاندهنده یک دستهبندی هزینه است که اندازه آن بر اساس مبلغ تعیین شده است – شما میتوانید بلافاصله ببینید که اجاره (بلاک سبز بزرگ) بخش عمده هزینهها را تشکیل میدهد. نوار فیلتر بالایی و کنترلها (بالا سمت راست) امکان تغییر ارز، نوع نمودار و بازه زمانی (به عنوان مثال مشاهده دادههای ماهانه) را فراهم میکنند. فاوا همچنین نمودارهای خطی (مانند ارزش خالص در طول زمان) و نمودارهای میلهای (مانند درآمد در مقابل هزینهها به تفکیک ماه) را برای کمک به شناسایی روندها در دادههای مالی شما ارائه میدهد.
یکی از بزرگترین نقاط قوت فاوا، تبدیل آنی دادههای دفتر کل به گزارشهای بصری و تعاملی است. به محض بارگذاری دفتر کل، فاوا نمودارهایی تولید میکند که درک جریانهای نقدی و روندها را در یک نگاه آسان میسازد:
-
نقشه درختی/خورشیدی درآمد و هزینهها: در صفحه صورت سود و زیان (Income Statement)، فاوا میتواند درآمد و هزینههای شما را به صورت نمودار نقشه درختی (Treemap) یا خورشیدی (Sunburst) نمایش دهد. اینها برای بصریسازی جریان نقدی "در یک نگاه" عالی هستند. به عنوان مثال، اگر هزینههای ماهانه شما به صورت یک نقشه درختی نشان داده شود، مساحت هر مستطیل با مقدار آن دسته از هزینهها مطابقت دارد. بلاکهای بزرگ فوراً نشان میدهند که بخش عمده پول شما کجا خرج شده است (مثلاً اجاره یا وام، مالیات و غیره)، در حالی که بلاکهای کوچکتر هزینههای جزئی را نشان میدهند. این قابلیت برای شناسایی روندها در مخارج بسیار مفید است – اگر بلاک "غذای بیرون" هر ماه بزرگتر شده باشد، شما آن را به صورت بصری متوجه خواهید شد. میتوانید به نمودار خورشیدی سوئیچ کنید تا سلسلهم راتب هزینهها را ببینید (مثلاً حلقه بیرونی ممکن است زیرمجموعههایی مانند خواربار در مقابل رستوران را در دسته مواد غذایی نشان دهد). این نمودارها برای هر دورهای که فیلتر کردهاید (یک ماه، سال تا به امروز و غیره) بهروزرسانی میشوند و بصریسازی آنی جریان نقدی را برای آن دوره فراهم میکنند. یکی از کاربران انجمن حسابداری متنمحور خاطرنشان کرده است: «من استفاده زیادی از نقشههای درختی درآمد و هزینه میکنم. آنها حس بصری فوقالعادهای از جابجاییهای مالی ما میدهند.» – این نوع درک فوری دقیقاً همان چیزی است که نمودارهای فاوا هدف قرار دادهاند.
-
ارزش خالص و مانده حساب در طول زمان: فاوا یک نمودار خطی برای ارزش خالص (Net Worth) در طول زمان (در صفحه "ترازنامه" یا "آمار") ارائه میدهد. این نمودار مجموع داراییهای شما منهای بدهیها را در هر نقطه از زمان (به صورت روزانه، هفتگی یا ماهانه) ترسیم میکند. این ابزار برای شناسایی روندها بینظیر است – میتوانید مسیر حرکت امور مالی خود را ببینید (مثلاً صعود پایدار، یا افت در زمانهای خاص). اگر سرمایهگذاری دارید، میتوانید بین نمایش ارزش بر اساس قیمت تمامشده در مقابل قیمت بازار (در صورت ثبت دادههای قیمت) جابجا شوید – به عنوان مثال، ممکن است ببینید ارزش خالص شما با قیمت بازار با نوسانات بورس تغییر میکند، در حالی که با قیمت تمامشده منحنی نرمتری دارد. فاوا همچنین میتواند مانده حسابها را در طول زمان نمایش دهد. اگر روی یک حساب کلیک کنید (مثلاً Assets:Bank:Checking)، صفحه حساب نموداری از تاریخچه مانده آن حساب را نشان میدهد. شما میتوانید فوراً بررسی کنید که حساب نقدی شما چگونه تغییر میکند – که در واقع یک نمودار جریان نقدی است (شیب خط مانده، نشاندهنده جریان نقدی خالص است). اگر روند نزولی دارد، متوجه میشوید که در آن دوره بیش از درآمدتان خرج کردهاید. با بررسی این روندها، ممکن است الگوهایی مانند «هر آذرماه پسانداز من کم میشود (هزینههای یلدا یا تعطیلات)» یا «سرمایهگذاریهای من در این فصل رشد شدیدی داشته است» را شناسایی کنید.
-
نمودارهای میلهای برای مقایسه دورهای: در نمای صورت سود و زیان، فاوا تبهایی برای "سود ماهانه"، "درآمد ماهانه"، "هزینههای ماهانه" و غیره دارد. انتخاب این گزینهها نمودارهای میلهای را به تفکیک ماه نشان میدهد. برای مثال، سود خالص ماهانه مازاد یا کسری هر ماه را به صورت یک میله نشان میدهد و مقایسه عملکرد در ماههای مختلف را آسان میکند. میتوانید به سرعت موارد پرت را شناسایی کنید (مثلاً یک میله منفی بزرگ در فروردین به معنای آن است که آن ماه ضرر یا هزینه غیرمعمولی داشته است). به همین ترتیب، نمودار میلهای "هزینههای ماهانه" هزینهها را بر اساس دستهبندی در هر ماه دستهبندی یا گروه میبندی میکند تا بتوانید ببینید کدام دستهها نوسان دارند. این برای شناسایی روندها در طول زمان عالی است – مثلاً ممکن است متوجه شوید هزینههای "سفر" شما هر تابستان اوج میگیرد، یا قبضهای "آب و برق" در زمستان بیشتر است. فاوا اساساً برخی از قابلیتهای یک اپلیکیشن بودجهبندی (رهگیری روندها) را با قابلیت سفارشیسازی کامل (چون خودتان دستهها را تعریف میکنید) در اختیارتان قرار میدهد.
-
فیلتر کردن لحظهای و بازرسی دادهها: بصریسازیها در فاوا ایستا نیستند؛ آنها در تعامل با سیستم فیلتر فاوا عمل میکنند. فرض کنید میخواهید یک سناریوی خاص را بررسی کنید: «جریانهای نقدی فصلی من فقط برای حسابهای تجاریام چگونه است؟» میتوانید فیلتر زمان را روی Q1 2025 تنظیم کنید و حسابها را به سلسلهمراتب تجاری خود (Business) محدود کنید – فاوا فوراً نمودارها را برای نشان دادن درآمد خالص، نقشه درختی هزینهها و غیره، اما فقط برای آن زیرمجموعه، بهروزرسانی میکند. این برش و تحلیل تعاملی به این معنی است که میتوانید تحلیلهای موردی (ad-hoc) را بسیار سریع و بدون نوشتن پرسوجو (Query) انجام دهید. نمای دفتر روزنامه (Journal) نیز از فیلتر زنده پشتیبانی میکند: میتوانید بر اساس نام طرف حساب یا بخشی از شرح تراکنش جستجو کنید و لیست فیلتر شده تراکنشها را بلافاصله ببینید. اگر به دادههای لحظهای نگاه میکنید (مثلاً تراکنشهای هفته گذشته را همین الان وارد کردهاید)، میتوانید با تگی مانند
#uncategorizedفیلتر کنید تا تراکنشهای جدیدی که نیاز به دستهبندی دارند را ببینید، یا با@pending(اگر ورودیهای معلق را علامتگذاری میکنید) ببینید چه مواردی هنوز تسویه نشدهاند. این قابلیت بازرسی لحظهای به اطمینان از کیفیت دادهها نیز کمک میکند – زیرا میتوانید ناهنجاریها را در لحظه شناسایی و رفع کنید. -
صورت جریان وجوه نقد (غیرمستقیم): اگرچه Beancount/Fava به صورت پیشفرض صورت جریان وجوه نقد رسمی (تفکیک عملیاتی/سرمایهگذاری/تأمین مالی) تولید نمیکند، اما میتوانید با پرسوجوهای سفارشی یا ساختاربندی حسابها آن را شبیهسازی کنید. برای مثال، میتوانید تراکنشهای خاصی را تگ کنید یا از حسابهای مشخصی برای سرمایهگذاری و تأمین مالی استفاده کنید و سپس مجموع آنها را گزارش بگیرید. رابط پرسوجوی فاوا به شما اجازه میدهد یک کوئری BQL مانند این اجرا کنید:
SELECT sum(amount) WHERE account ~ "Assets:Bank" AND year = 2025تا جریان نقدی سال را به دست آورید. با این حال، اکثر کاربران شخصی ترکیب روندهای مانده حساب و نمودارهای درآمد/هزینه را برای درک جریانهای نقدی کافی میدانند. -
بصریسازی داراییها و پورتفولیو: در صفحه Holdings، فاوا لیست داراییهای فعلی شما از کالاها و ارزها (مانند سهام، اوراق قرضه، رمزارز) را با مقادیر، بهای تمامشده، ارزش بازار و سودهای تحققنیافته نشان میدهد. اگرچه این یک جدول است و نه یک نمودار، اما برای بازرسی لحظهای وضعیت پورتفولیو بسیار مفید است. برخی افزونهها (مانند fava-investor) بصریسازیهای بیشتری برای پورتفولیوها اضافه میکنند، مانند نمودارهای دایرهای تخصیص دارایی یا نمودارهای عملکرد. حتی بدون افزونه، میتوانید ببینید که مثلاً ارزش پورتفولیو سهام شما با آخرین قیمتها چگونه تغییر میکند – اگر قیمتها را به طور منظم بهروزرسانی کنید (که میتواند روزانه خودکار شود)، نمودارهای فاوا ارزش بازار لحظهای سرمایهگذاریهای شما را منعکس میکنند.
در عمل، گزارشهای بصری فاوا به همان سرعتی که دادههای زیرساختی تغییر میکنند، بهروز میشوند. به محض اضافه شدن یک تراکنش جدید و بارگذاری مجدد صفحه، نمودارها دوباره محاسبه میشوند. نیازی به پردازش طولانی نیست. این بدان معناست که اگر یک خط لوله نیمهخودکار دارید که دادهها را در طول روز تغذیه میکند، میتوانید فاوا را باز نگه دارید و به طور دورهای دکمه رفرش را بزنید تا نمودارهای بهروز شده را دریافت کنید – که در واقع یک نظارت مالی لحظهای است.
به عنوان مثال، تصور کنید یک کسبورفت کوچک را اداره میکنید و میخواهید نقدینگی موجود و هزینههای روزانه را نظارت کنید. میتوانید فاوا را روی یک داشبورد سفارشی باز کنید (شاید با استفاده از یک افزونه یا صفحه پرسوجو) که "مانده حساب نقدی امروز" و "هزینهها – امروز در مقابل دیروز" را نشان دهد. هر بار که پس از ورود دادههای جدید رفرش میکنید، شاهد بهروزرسانی آن اعداد خواهید بود. این مشابه همان چیزی است که داشبوردهای گرانقیمت لحظهای ارائه میدهند، اما با استفاده از ابزارهای متنباز. تفاوت در این است که شما ممکن است نیاز داشته باشید به صورت دستی رفرش کنید یا رفرشهای زمانبندی شده تنظیم کنید، در حالی که آن ابزارها بهروزرسانیها را به صورت خودکار ارسال میکنند. اما از نظر عملکردی، بینشی که به دست میآورید یکسان است، با این مزیت اضافه که میتوانید روی هر عددی در فاوا کلیک کنید تا تراکنشهای زیرمجموعه آن را ببینید – چیزی که بسیاری از داشبوردهای BI فاقد آن هستند.
به طور خلاصه، فاوا دادههای حسابداری شما را به بینشهای بصری فوری تبدیل میکند: تفکیک جریانهای نقدی، خطوط روند، مقایسههای دورهای و فیلتر کردن تعاملی همگی به شما کمک میکنند تا داستان پشت اعداد را ببینید. چه در حال بازرسی مخارج هفته گذشته برای یافتن ناهنجاریها باشید و چه در حال بررسی روندهای چندساله ارزش خالص، نمودارها و گزارشهای فاوا وضوح را در لحظه (به محض حضور دادههای شما) فراهم میکنند. در ادامه، خواهیم دید که چگونه میتوانید این قابلیتها را گسترش دهید یا در صورت نیاز به تحلیلهای سفارشیتر، آنها را با ابزارهای خارجی ادغام کنید.
ادغام با داشبوردها و ابزارهای تجسم داده خارجی
در حالی که Fava مجموعهای غنی از گزارشها و نمودارهای داخلی را ارائه میدهد، ممکن است بخواهید دادههای Beancount را با سایر ابزارهای هوش تجاری (BI) یا ابزارهای داشبورد مانند Grafana، Metabase یا فرانتاندهای وب سفارشی (مانند یک اپلیکیشن React) ادغام کنید. انگیزه این کار میتواند ترکیب دادههای مالی با سایر منابع داده، استفاده از قابلیتهای پیشرفته ترسیم نمودار، یا به اشتراکگذاری داشبوردها با دیگران در قالبی متفاوت باشد. به لطف ماهیت باز Beancount، روشهای متعددی برای دستیابی به این ادغام وجود دارد:
-
ادغام با پایگاه داده (BeanSQL / Beanpost): یک رویکرد مستقیم، صادر کردن (export) یا همگامسازی دفتر کل Beancount با یک پایگاه داده SQL است. پس از انتقال به SQL، هر ابزار BI میتواند دادهها را پرسوجو کند. در واقع، اعضای جامعه ابزارهایی برای این کار ایجاد کردهاند. به عنوان مثال، Beanpost یک پروژه آزمایشی است که دفتر کل Beancount را در یک پایگاه داده PostgreSQL کپی میکند و بخش زیادی از منطق Beancount را به صورت توابع SQL پیادهسازی میکند. این ابزار «یک بکاند منعطف فراهم میکند که میتواند با ابزارهای دیگر مانند اپلیکیشنهای وب یا سیستمهای گزارشگیری ادغام شود.» شما میتوانید Beanpost را برای همگامسازی مداوم دفتر کل متنی خود با Postgres اجرا کنید. سپس، ابزاری مانند Metabase یا Tableau میتواند به آن پایگاه داده Postgres متصل شود و شما میتوانید هر نمودار یا داشبوردی که دوست دارید بسازید (که با بهروزرسانی پایگاه داده، بهطور زنده بهروز میشود). یکی از کاربران گزارش داده است که از Postgres + PostGraphile برای ارائه خودکار یک API GraphQL برای دادههای دفتر کل استفاده کرده و سپس یک فرانتاند سفارشی React روی آن نوشته است – که اساساً با دفتر کل مانند یک سرویس وب رفتار میکند. این رویکرد برای مواردی که رابط کاربری Fava کافی نیست (مانند دسترسی چند کاربره یا رابطهای کاربری مناسبتر برای موبایل) پاسخگو است. این روش از نظر مهندسی سنگینتر است، اما پتانسیل بالایی را نشان میدهد: شما میتوانید Beancount را نسبتاً آسان با پشتههای وب مدرن ادغام کنید. یک نسخه سبکتر، استفاده از پشتیبانی داخلی Beancount از SQLite است – اجرای پرسوجویی مانند
bean-query -e ledger.beancount "SELECT ..."میتواند نتایج را خروجی دهد، یا استفاده از API پایتون Beancount برای دریافت دادهها و درج آنها در یک پایگاه داده SQLite. برخی افراد از SQLite به عنوان واسط برای اتصال به ابزارهایی مانند Metabase (که میتواند فایلهای SQLite را بخواند) استفاده میکنند. -
Grafana (داشبوردهای سری زمانی): Grafana برای مانیتورینگ و دادههای سری زمانی محبوب است. دادههای مالی در طول زمان (هزینهها، موجودیها) را میتوان به عنوان سری زمانی در نظر گرفت. بحثهایی در جامعه کاربران درباره اتصال Beancount به Grafana وجود داشته است. یک ایده، ساخت یک پلاگین منبع داده (Data Source Plugin) برای Grafana بود که بتواند پرسوجوهای BQL را بهطور لحظهای روی فایل Beancount اجرا کند. این کار به پنلهای Grafana اجازه میدهد تا به طور مستقیم مواردی مانند «موجودی حساب جاری» را به صورت یک گیج (gauge) یا «هزینههای ۳۰ روز گذشته» را به صورت نمودار، با پرسوجو از دفتر کل نمایش دهند. تا کنون (۲۰۲۵)، پلاگین اختصاصی منتشر نشده است، اما علاقهمندان راهحلهای موردی ساختهاند. برای مثال، کاربری به نام aquilax یک سرور ساده ساخته است که دادههای Ledger CLI را در دسترس Grafana قرار میدهد و آن را با نام grafana-ledger-datasource-server به اشتراک گذاشته است. مفهوم مشابهی را میتوان برای Beancount به کار برد: شما یک سرور HTTP کوچک در پایتون مینویسید که دفتر کل Beancount را بارگذاری میکند (با استفاده از API پایتون برای پرسوجوی دادهها) و نقاط انتهایی (endpoints) ایجاد میکند که فریمهای داده JSON را برای Grafana برمیگرداند. Grafana یک پلاگین منبع داده JSON عمومی دارد که میتواند دادهها را از این API دریافت کند. در عمل، این بدان معناست که شما میتوانید یک داشبورد Grafana با پنلهایی مانند «درآمد ماهیانه (نمودار میلهای)» یا «موجودی نقدی روزانه (نمودار خطی)» طراحی کنید و این پنلها دادهها را از API مبتنی بر Beancount شما واکشی کنند. Grafana گزینههای تجسم غنی (یادداشتها، آستانهها، ترکیب با معیارهای سرور و غیره) را فراهم میکند. Andreas Gerstmayr (یکی از نگهدارندگان Fava) دقیقاً همین رویکرد را پیشنهاد کرد و حتی ذکر کرد که یک افزونه Fava به نام fava-dashboards ایجاد کرده است (توضیحات بیشتر در ادامه) تا نمودارها را از پرسوجوهای BQL رندر کند، که جایگزینی برای راهاندازی کامل Grafana است. اگر رابط کاربری Grafana را ترجیح میدهید، ادغام امکانپذیر است – فقط نیاز به ساخت پل ارتباطی داده دارد.
-
Metabase (پرسوجوها و داشبوردهای موردی): Metabase یک ابزار BI کاربرپسند است که به شما اجازه میدهد بدون کدنویسی، پرسوجو اجرا کنید و داشبورد بسازید. اگر دفتر کل خود را به یک قالب رابطهای صادر کنید (از طریق Beanpost یا با نوشتن جداول تراکنشها، ثبتها و غیره)، میتوانید Metabase را به آن پایگاه داده متصل کنید. شما میتوانید جداول سفارشی مانند
expenses (date, category, amount)را از دفتر کل خود ایجاد کنید و سپس در Metabase به راحتی نمودار بسازید (مثلاً یک نمودار دایرهای از هزینهها به تفکیک دستهبندی برای ماه گذشته). مزیت این کار این است که کاربران غیرفنی (یا همکاران) میتوانند از طریق رابط گرافیکی Metabase با دادهها تعامل داشته باشند بدون اینکه نیازی به لمس فایل Beancount داشته باشند. عیب آن این است که باید فرآیند صادر کردن/همگامسازی را نگهداری کنید. برخی کاربران تبدیل خودکار شبانه دفتر کل Beancount به SQLite را پیادهسازی کردهاند و سپس به Metabase اجازه میدهند SQLite را بخواند؛ برخی دیگر ممکن است از رویکرد Postgres استفاده کنند. نکته کلیدی این است که قابلیت حمل دادههای Beancount این امکان را فراهم میکند – شما آزادید دادهها را به هر شکلی که ابزار خارجی شما نیاز دارد، کپی کنید. -
فرانتاندهای سفارشی / اپلیکیشنها: اگر نیازهای خاصی دارید، همیشه میتوانید یک اپلیکیشن سفارشی روی Beancount بنویسید. کتابخانه پایتون Beancount به شما اجازه دسترسی به تمام ورودیهای تجزیه شده، موجودیها و غیره را میدهد، بنابراین یک فریمورک وب پایتون (Flask, Django, FastAPI) میتواند برای ساخت یک برنامه اختصاصی استفاده شود. به عنوان مثال، یک کسبوکارهای کوچک ممکن است داشبوردی بسازد که معیارهای KPI (مانند حاشیه سود ناخالص، فروش روزانه و غیره) را با پرسوجو از دفتر کل و شاید ترکیب با دادههای غیر دفتری (مانند تعداد مشتریان خدماترسانی شده) نشان دهد. یکی از اعضای جامعه یک رابط کاربری وب مناسب موبایل ساخت زیرا Fava برای همسرشان بصری نبود – آنها از دفتر کل در یک پایگاه داده برای هدایت این رابط کاربری سفارشی بهره بردند. اگر JavaScript/TypeScript را ترجیح میدهید، میتوانید از ابزاری برای تبدیل دفتر کل به JSON استفاده کنید و از آنجا شروع به ساخت کنید. پروژههایی مانند beancount-web یا beancount-query-server در جامعه کاربران مطرح شدهاند تا دادههای Beancount را از طریق یک API ارائه دهند، اگرچه از API خود Fava (اگر در حالت "headless" اجرا شود) نیز میتوان استفاده کرد – Fava در داخل خود یک نقطه انتهایی API برای پرسوجوها دارد.
-
ادغام با Excel/PowerBI: شایان ذکر است که حتی میتوانید با Excel یا PowerBI ادغام شوید. Beancount (و Fava از طریق یک افزونه) میتواند نتایج پرسوجو را به فایلهای CSV یا Excel صادر کند. یک گردش کار میتواند به این صورت باشد: یک فرآیند شبانه، یک فایل Excel از شاخصهای مالی کلیدی را از Beancount تولید میکند و PowerBI برای وارد کردن آن فایل تنظیم میشود. این روش کمی غیرمستقیم است، اما برای سازمانهایی که از قبل به شدت از Excel/PowerBI استفاده میکنند، یک ادغام کمچالش محسوب میشود. PowerBI همچنین از منابع داده پایتون پشتیبانی میکند، بنابراین میتوان یک اسکریپت کوتاه پایتون نوشت که پرسوجوهای BQL را اجرا کرده و از آن به عنوان منبع داده در PowerBI استفاده کرد و به یک اتصال مستقیم دست یافت.
مطالعه موردی – ایده ادغام با Grafana: جاش، یکی از کاربران Beancount، در لیست ایمیل درباره ارسال معیارهای Beancount به Prometheus و مشاهده آنها در Grafana سوال کرد. توسعهدهندگان اصلی پاسخ دادند که به جای کپی کردن دادهها در Prometheus، رویکرد بهتر یک پلاگین یا سرویس Grafana است که مستقیماً از دفتر کل Beancount پرسوجو کند. آندریاس افزونه fava-dashboards خود را به اشتراک گذاشت که نمودارهای سفارشی را به عنوان یک راهکار نمونه در داخل خود Fava رندر میکند. نتیجه این است که شما گزینههایی دارید – یا از طریق زیرساختهای BI موجود (Prometheus+Grafana یا SQL+Metabase) ادغام شوید یا Fava را برای رفع نیازهای خود گسترش دهید (در بخش بعدی به این موضوع خواهیم پرداخت).
ملاحظات امنیتی و چند کاربره: هنگام ادغام در ابزارهای خارجی، مراقب حساسیت دادهها باشید. متن ساده Beancount اغلب حاوی اطلاعات مالی خصوصی است، بنابراین هر سروری که آن را در معرض دید قرار میدهد باید ایمن (دارای احراز هویت) باشد. اگر دادهها را به یک ابزار BI ابری منتقل کنید، ممکن است مقداری از حریم خصوصی خود را از دست بدهید. ابزارهای خود-میزبانی (نسخههای متنباز Grafana/Metabase) میتوانند به صورت محلی اجرا شوند تا این خطر کاهش یابد. همچنین، اگر چندین نفر نیاز به مشاهده داشبوردها دارند، یک داشبورد خارجی فقط-خواندنی (read-only) ممکن است به دادن دسترسی Fava به همه (جایی که ممکن است در صورت عدم دقت دادهها را ویرایش کنند) ترجیح داده شود. به عنوان مثال، یک استارتاپ میتواند در داخل از Beancount استفاده کند اما از Metabase استفاده کند تا مدیران بخشها بتوانند هزینهها را در مقابل بودجه ببینند بدون اینکه به فایلهای دفتر کل دست بزنند.
به طور خلاصه، Beancount و Fava با دیگران به خوبی تعامل دارند. شما میتوانید با مقدار کمی کد واسط از کل اکوسیستم ابزارهای داده بهره ببرید: دادههای دفتر کل را برای ابزارهای BI به یک پایگاه داده SQL بفرستید، آنها را از طریق API برای اپلیکیشنهای وب ارائه دهید، یا حتی از کتابخانههای تخصصی برای استریم کردن آنها به سیستمهای سری زمانی استفاده کنید. این انعطافپذیری به این معنی است که اگر تصاویر داخلی Fava نیاز خاصی را برآورده نکرد، هرگز به بنبست نمیخورید – همیشه میتوانید در حالی که به استفاده از Beancount به عنوان منبع واحد حقیقت (source of truth) ادامه میدهید، با پلتفرم دیگری ادغام شوید. در مرحله بعد، نگاهی به گسترش خود Fava با پلاگینها و داشبوردهای سفارشی خواهیم داشت که اغلب اگر فقط به چند ویژگی اضافی نیاز دارید، راه آسانتری نسبت به ادغام خارجی است.
داشبوردهای سفارشی و گسترش Fava با پلاگینها (نمونه کدها)
Fava بهگونهای طراحی شده است که قابلگسترش باشد: شما میتوانید با نوشتن پلاگینهای Fava (اکستنشنها) به زبان پایتون، صفحات، نمودارها و رفتارهای جدیدی به آن اضافه کنید. این امر به شما اجازه میدهد رابط کاربری وب را بدون نیاز به ساخت یک اپلیکیشن مجزا، مطابق با نیازهای خاص خود سفارشیسازی کنید. ما دو مسیر کلیدی را برای سفارشیسازی بررسی خواهیم کرد: (۱) استفاده یا نوشتن اکستنشنهای Fava، و (۲) راهاندازی داشبوردهای سفارشی از طریق پلاگینهای جامعه کاربری مانند fava-dashboards.
اکستنشنهای Fava (پلاگینهای سفارشی)
یک اکستنشن Fava در اصل یک ماژول پایتون است که زیرکلاسی از FavaExtensionBase را تعریف میکند. هنگامی که Fava شروع به کار میکند، میتواند این ماژول را بارگذاری کرده و با اپلیکیشن ادغام کند. اکستنشنها میتوانند صفحات گزارش جدید ثبت کنند، به رویدادها متصل شوند و حتی شامل جاوااسکریپت سفارشی برای تعاملپذیری باشند. برخی اکستنشنها به صورت داخلی با Fava ارائه میشوند (مثلاً portfolio_list برای صفحه نمای کلی سبد سهام). بقیه را میتوان از طریق pip نصب کرد یا از ابتدا نوشت.
برای فعالسازی یک اکستنشن، از دستور سفارشی (custom directive) Beancount در فایل دفتر کل خود استفاده میکنید:
2010-01-01 custom "fava-extension" "my_extension_module" "{'option': 'value'}"
این دستور به Fava میگوید که ماژول داده شده را بارگذاری کند. برای مثال، اکستنشن داخلی Portfolio List نیز به روشی مشابه فعال میشود. اگر اکستنشنی را از طریق pip نصب کردهاید، باید نام ماژول آن را در اینجا بیاورید. بخش JSON اختیاری در انتها، تنظیمات مربوط به اکستنشن است (که به صورت رشته به آن پاس داده میشود).
مثال – اکستنشن ثبت خودکار (Auto-Commit): Fava یک اکستنشن نمونه به نام fava.ext.auto_commit (به صورت داخلی) دارد که وقتی فایلی را از طریق ویرایشگر Fava ویرایش میکنید، تغییرات را بهطور خودکار در سیستم کنترل نسخه (VCS) ثبت (commit) میکند. اگر بخواهید از آن استفاده کنید، این خط را اضافه میکنید:
2025-01-01 custom "fava-extension" "fava.ext.auto_commit" "{'repo': '/path/to/git/repo'}"
این اکستنشن یک هوک (hook) ثبت میکند که پس از هر بار ویرایش فایل، عملیات git commit را انجام دهد. این مثال نشان میدهد که چگونه اکستنشنها میتوانند به رویدادهای Fava (در اینجا، پس از ذخیره فایل) متصل شوند.
مثال – اکستنشن لیست سبد سهام (Portfolio List): این اکستنشن صفحهای اضافه میکند که سرمایهگذاریهای شما را بر اساس کلاس دارایی و غیره دستهبندی کرده و نشان میدهد. این اکستنشن دارای مقدار report_title = "Portfolio List" است و شامل یک قالب (template) برای رندر کردن دادهها میباشد. Fava آن را شناسایی کرده و یک ورودی جدید به نام "Portfolio List" در نوار کناری زیر بخش گزارشها (Reports) اضافه میکند. این اکستنشن همچنین شامل مقداری جاوااسکریپت (با تنظیم has_js_module = True) برای بهبود صفحه است (شاید برای نمودارهای تعاملی در آن صفحه). برای فعالسازی آن (اگر به صورت پیشفرض فعال نبود)، به این صورت عمل میکنید:
2025-01-01 custom "fava-extension" "fava.ext.portfolio_list"
(در این مورد نیازی به تنظیمات نیست.)
نوشتن یک اکستنشن سفارشی: فرض کنید یک صفحه گزارش سفارشی میخواهید، مثلاً "تحلیل سررسید دریافتنیها" (Receivables Aging) برای فاکتورها. میتوانید فایلی به نام receivables.py ایجاد کنید:
# receivables.py
from fava.ext import FavaExtensionBase
class ReceivablesReport(FavaExtensionBase):
report_title = "Receivables Aging"
def on_page_load(self):
# این میتواند هوکی برای جمعآوری دادهها باشد
pass
همچنین باید یک فایل templates/ReceivablesReport.html برای تعریف HTML صفحه بسازید. در آن قالب، میتوانید به self.ledger (شیء دفتر کل Beancount) دسترسی داشته باشید و محاسبات را انجام دهید. برای مثال، در تراکنشها پیمایش کنید تا مواردی که به عنوان فاکتور تگ شدهاند و هنوز پر داخت نشدهاند را پیدا کنید و آنها را بر اساس سن (تاریخ) گروهبندی کنید. پس از نوشتن این اکستنشن، آن را به دفتر کل خود اضافه میکنید:
2025-01-01 custom "fava-extension" "receivables"
(با فرض اینکه receivables.py در دایرکتوری فایل Beancount یا در PYTHONPATH باشد، Fava میتواند آن را با نام پیدا کند). با شروع Fava، اکنون صفحه "Receivables Aging" را مشاهده خواهید کرد.
در پسزمینه، Fava متدهای اکستنشن شما را در زمانهای مناسب فراخوانی میکند. شما میتوانید متدهایی مانند after_load_file (برای انجام محاسبات پس از بارگذاری دفتر کل) را بازنویسی کنید یا از هوکهایی مانند before_request استفاده کنید. اکستنشن همچنین در صورت نیاز میتواند مسیرها (routes) یا نقاط پایانی API تعریف کند، اما معمولاً استفاده از هوکهای ارائه شده و یک قالب کافی است.
م ستندات Fava اشاره میکنند که سیستم اکستنشن هنوز در حال تکامل است، اما کاملاً قابل استفاده است. در واقع، بسیاری از ویژگیهای پیشرفته ابتدا به عنوان اکستنشن نمونهسازی شدهاند.
داشبوردهای سفارشی با fava-dashboards (اکستنشن جامعه کاربری)
بهجای نوشتن یک اکستنشن از ابتدا، میتوانید از پلاگین fava-dashboards که توسط یکی از نگهدارندگان Fava ساخته شده است، استفاده کنید. این اکستنشن به شما اجازه میدهد داشبوردهای دلخواه خود را از طریق یک فایل تنظیمات YAML (یا JSON)، با ترکیبی از متن، جداول و نمودارها که توسط پرسوجوهای BQL قدرت گرفتهاند، تعریف کنید. این در واقع راهی برای ایجاد "صفحات" جدید در Fava است که شامل چندین پنل سفارشی هستند.
نصب و راهاندازی: ابتدا بسته را نصب میکنید (مثلاً pip install fava-dashboards). سپس در فایل Beancount خود، آن را با یک دستور سفارشی که به فایل تنظیمات داشبوردهای شما اشاره دارد، فعال میکنید. برای مثال:
2010-01-01 custom "fava-extension" "fava_dashboards" "{ 'config': '/path/to/dashboards.yaml' }"
(fava-dashboards/README.md at main · andreasgerstmayr/fava-dashboards · GitHub). این دستور به Fava میگوید که اکستنشن را بارگذاری کرده و از فایل YAML شما برای تنظیمات استفاده کند.
فرمت YAML داشبوردها: در فایل dashboards.yaml یک یا چند داشبورد و پنلهای آنها را تعریف میکنید. برای نمونه:
dashboards:
- title: "Cash Flow Dashboard"
panels:
- title: "Net Cash This Month"
width: 50%
queries:
- bql: "SELECT sum(position) WHERE account ~ 'Income' OR account ~ 'Expenses'"
type: "jinja2"
template: "<h1>{{ panel.queries[0].result | float }} USD</h1>"
- title: "Cash Balance Trend"
width: 50%
queries:
- bql: "SELECT date, balance WHERE account = 'Assets:Bank:Checking'"
type: "echarts"
script: |
const dates = {{ panel.queries[0].result | safe }}.map(row => row[0]);
const balances = {{ panel.queries[0].result | safe }}.map(row => row[1]);
return {
xAxis: { type: 'category', data: dates },
yAxis: { type: 'value' },
series: [{ data: balances, type: 'line' }]
};
این یک مثال فرضی برای نمایش قابلیتهاست. پنل اول خالص وجه نقد (درآمد منهای هزینهها) را برای فیلتر فعلی محاسبه کرده و آن را به صورت یک عدد بزرگ نمایش میدهد (با استفاده از قالب Jinja2). پنل دوم یک پرسوجو برای دریافت موجودی روزانه حساب جاری اجرا کرده و سپس از اسکریپت ECharts (یک کتابخانه نمودار جاوااسکریپتی) برای ترسیم نمودار خطی استفاده میکند. fava-dashboards از انواع پنلها پشتیبانی میکند: html, jinja2, echarts, d3_sankey و غیره، و دادهها را در اختیار اسکریپتها قرار میدهد. در اصل، این ابزار به شما انعطافپذیری کامل برای طراحی داشبورد با اجزای متعدد را میدهد – بدون اینکه نیاز باشد یک اکستنشن کامل Fava را از ابتدا بنویسید.
هنگامی که صفحه داشبورد را در Fava باز میکنید، اکستنشن مسئولیت رندر کردن آنها را بر عهده میگیرد. شما میتوانید چندین داشبورد بسازید (هر کدام به صورت یک تب یا صفحه جداگانه ظاهر میشو ند). این برای ایجاد داشبوردهای مالی سفارشی بسیار قدرتمند است. برای مثال، میتوانید داشبورد "بودجه در مقابل واقعیت" بسازید: یک پنل جدولی از بودجه در برابر هزینههای واقعی هر دسته را نشان میدهد (از طریق پرسوجویی که دو مجموعه حساب را مقایسه میکند)، پنل دیگر نمودار میلهای هزینههای سال جاری در مقایسه با سال قبل را نشان میدهد و غیره. همه اینها تنها با تنظیمات و حداقل اسکریپتنویسی، و با بهرهگیری از دادههای دفتر کل شما از طریق BQL امکانپذیر است.
نمونه کد – فعالسازی fava-dashboards: همانطور که در بالا نشان داده شد، اضافه کردن اکستنشن تنها یک خط در دفتر کل شماست. برای تکمیل موضوع، در اینجا یک مثال حداقلی در متن آورده شده است:
option "title" "My Ledger"
option "operating_currency" "USD"
plugin "beancount.plugins.auto_accounts" ; (باز کردن خودکار حسابها)
1970-01-01 custom "fava-extension" "fava_dashboards" "{ 'config': 'dashboards.yaml' }"
و در فایل dashboards.yaml:
dashboards:
- title: "Overview"
panels:
- title: "Net Worth"
queries:
- bql: "select sum(position) where account ~ 'Assets|Liabilities'"
type: "jinja2"
template: "<div>Net Worth: {{ panel.queries[0].result[0,0] }}</div>"
(این مثال ارزش خالص را در یک div ساده نشان میدهد؛ یک مثال واقعی ظاهر بهتری خواهد داشت و پنلهای بیشتری اضافه میکند.)
با این تنظیمات، وقتی Fava را اجرا میکنید و به داشبورد "Overview" میروید، ارزش خالص محاسبه شده شما را نشان میدهد. سپس میتوانید قالب را اصلاح کنید یا در صورت نیاز نمودار اضافه کنید.
سایر اکستنشنهای قابل توجه: علاوه بر fava-dashboards، پلاگینهایی مانند fava-investor وجود دارند که تحلیلهای پیشرفته سرمایهگذاری را ارائه میدهند (نمودارهای تخصیص دارایی، ابزارهای برداشت ضرر مالیاتی و غیره). فعالسازی fava-investor (پس از pip install fava-investor) چندین صفحه گزارش مربوط به سرمایهگذاری اضافه میکند. مورد دیگر fava-review است (برای مرور تراکنشها در طول زمان) و موارد دیگر. جامعه کاربری لیست "awesome-beancount" را نگهداری میکند که شامل پلاگینها و ابزارهای مختلف است. با مرور این لیست، ممکن است اکستنشن از پیش ساخته شدهای پیدا کنید که نیازهای شما را برآورده کند.
چه زمانی گسترش دهیم و چه زمانی به صورت خارجی ادغام کنیم: بهطور کلی، اگر نیاز شما صرفاً ارائه یا محاسبات روی دادههای موجود در دفتر کل است، اکستنشن Fava ایدهآل است (همه چیز را در یک جا نگه میدارد، به فیلترها احترام میگذارد و غیره). اگر نیاز شما شامل ترکیب دادههای خارجی است یا به رابط کاربری بسیار متفاوتی نیاز دارید، ادغام خارجی (بخش قبلی) ممکن است توجیه داشته باشد. برای مثال، نمایش آمار وبسایت در کنار امور مالی – در Grafana یا Metabase بهتر است؛ اما اضافه کردن یک شاخص کلیدی عملکرد (KPI) مالی یا گزارش جدید – به عنوان پلاگین Fava بهتر است.
مثال – یک KPI سفارشی در Fava: فرض کنید میخواهید "نرخ پسانداز" (درصد درآمد پسانداز شده) را پیگیری کنید. میتوانید این کار را با اکستنشنی انجام دهید که آن را محاسبه کرده و در یک کادر کوچک در صفحه اصلی نشان دهد. یا با fava-dashboards، یک پنل میتواند از نوع Jinja2 باشد که با پرسوجوی مجموع درآمد و مجموع هزینهها، مقدار Savings Rate: X% را خروجی دهد. تزریق این نوع معیارهای سفارشی با این ابزارها بسیار آسان است، در حالی که در یک سیستم بسته مانند QuickBooks ممکن است ایجاد یک معیار جدید در داشبورد غیرممکن باشد.
برای نشان دادن اینکه چقدر میتواند مختصر باشد، در اینجا یک شبهکد با استفاده از fava-dashboards در YAML آورده شده است:
- title: "Savings Rate"
panels:
- title: "Savings Rate"
queries:
- bql: "SELECT sum(position) WHERE account ~ 'Income'"
- bql: "SELECT sum(position) WHERE account ~ 'Expenses'"
type: "jinja2"
template: |
{% set income = panel.queries[0].result[0][0] %}
{% set expense = -panel.queries[1].result[0][0] %} {# هزینهها در صورتحساب درآمد منفی هستند #}
{% set rate = (income - expense) / income * 100 if income != 0 else 0 %}
<h3>Savings Rate: {{ rate|round(1) }}%</h3>
این کد نرخ پسانداز را محاسبه کرده (با فرض اینکه مجموع حسابهای درآمدی مثبت و هزینهها در متن پرسوجوی BQL منفی به دست میآیند) و آن را نمایش میدهد.
نکته کلیدی: Fava یک ابزار ایستا نیست – بلکه یک پلتفرم توسعهپذیر است. با کمی کدنویسی پایتون یا حتی فقط کد تنظیمات، میتوانید آن را به میزان گستردهای سفارشی کنید. بسیاری از کاربران اسکریپتها یا اکستنشنهای کوچکی را در انجمنها به اشتراک میگذارند تا کارهایی مانند نمایش صورتحسابهای آتی، تولید فاکتورهای PDF از تراکنشها یا ادغام Beancount با کتابخانههای محاسبات مالیاتی را انجام دهند. وقتی برای یادگیری یا استفاده از این اکستنشنها وقت میگذارید، صاحب یک سیستم تحلیل مالی بسیار اختصاصی میشوید بدون اینکه نیاز باشد همه چیز را از صفر شروع کنید.
موارد استفاده: امور مالی شخصی در مقابل حسابداری کسبوکارهای کوچک
Beancount و Fava میتوانند برای هر دو نوع حسابداری شخصی و کسبوکارهای کوچک مورد استفاده قرار گیرند، اما موارد استفاده و مزایای آنها در هر بخش تفاوتهای اندکی در اولویتبندی دارد:
امور مالی شخصی
برای افراد، ترکیب Beancount+Fava در ارائه دید کامل و بینش عمیق نسبت به امور مالی فردی بدون تکیه بر اپلیکیشنهای اختصاصی میدرخشد. موارد استفاده رایج در امور مالی شخصی عبارتند از:
-
ردیابی هزینهها و بودجهبندی: بسیاری از کاربران از Beancount برای ثبت تکتک هزینهها و سپس تحلیل الگوهای مخ ارج استفاده میکنند. با Fava، آنها میتوانند ببینند که پول در هر ماه به کجا میرود (نمودار درختی هزینهها) و با مقایسه مقادیر واقعی با مقادیر مورد انتظار، بودجه را ردیابی کنند (برخی این کار را از طریق افزونه Budgets یا کوئریهای سفارشی انجام میدهند). یکی از کاربران توضیح داده است که پس از استفاده از Beancount، «تحلیل دادههای مالی (مخارج، بخششها، مالیات و غیره) بسیار ساده شده است. انجام این کار با Fava آسان است، اما با اسکریپتنویسی هم به راحتی انجام میشود... من یک اسکریپت پایتون دارم که دادهها را با استفاده از BQL از Beancount استخراج میکند و سپس از کتابخانه pandas برای تهیه گزارش استفاده میکنم.» این نشان میدهد که کاربران شخصی چگونه از رابط کاربری داخلی و هم از توانایی اسکریپتنویسی برای تحلیلهای سفارشی بهره میبرند.
-
ردیابی ارزش خالص دارایی و اهداف: از آنجایی که میتوانید تمام داراییها (حسابهای بانکی، سرمایهگذاریها و حتی داراییهای فیزیکی) را در یک دفتر کل بگنجانید، نمای واحدی از ارزش خالص دارایی (Net Worth) خود خواهید داشت. علاقهمندان به امور مالی شخصی از این قابلیت برای ردیابی پیشرفت به سمت اهداف (مانند «عدد استقلال مالی» یا بازپرداخت بدهی) استفاده میکنند. نمودارهای Fava که ارزش خالص دارایی را در طول زمان نشان میدهند بسیار انگیزهبخش هستند؛ شما به معنای واقعی کلمه میتوانید منحنی ثروت خود را ببینید. ردیابی بدهیهایی مانند وامهای دانشجویی یا وام مسکن در Beancount و بهروزرسانی مانده آنها رایج است؛ سپس دفتر کل تصویر کاملی از سلامت مالی ارائه میدهد.
-
سرمایهگذاریها و رمزارزها: استفاده شخصی اغلب به ردیابی سبد سهام نیز گسترش مییابد. Beancount میتواند سهام، رمزارز و موارد دیگر را با محاسبات مبنای هزینه (Cost Basis) و سود محققشده (از طریق افزونهها یا کوئریها) مدیریت کند. مزیت آن نسبت به سایت کارگزاری این است که میتوانید تمام حسابها را تجمیع کرده و تخصیص واقعی داراییها را ببینید. به عنوان مثال، افزونه fava-investor توسط یکی از اعضای جامعه برای انجام تحلیل سرمایهگذاری در Fava ساخته شده است که شامل مواردی مانند نمودارهای درختی تخصیص دارایی و شاخصهای عملکرد است. اینها کارهایی هستند که معمولاً سرمایهگذاران آماتور در اکسل انجام میدهند؛ Beancount روشی دقیقتر و خودکارتر ارائه میدهد. یک پست وبلاگی با عنوان «Beancount: حسابداری دیفای برای تازهواردها» حتی استفاده از آن را برای ردیابی تراکنشهای ارز دیجیتال و ییلد فارمینگ (Yield Farming) نشان میدهد که گویای انعطافپذیری آن در سناریوهای م درن امور مالی شخصی است.
-
امور مالی شخصی چندارزی: اگر در خارج از کشور زندگی میکنید یا سرمایهگذاریهای خارجی دارید، Beancount بسیار کاربردی است زیرا میتواند ارزها را تبدیل و تجمیع کند. کاربران اشاره کردهاند که «بسیاری از نرمافزارهای حسابداری در مدیریت چندارزی ضعیف هستند... با Beancount، میتوانید هر کالایی (Commodity) که میخواهید تعریف کنید» و گزارشها را به ارز دلخواه خود دریافت کنید. برای یک کاربر شخصی که مثلاً حقوق دلاری دریافت میکند اما هزینههایش به یورو است، این یک مزیت بزرگ محسوب میشود.
-
ثبت وقایع زندگی و دفتر خاطرات: یک مورد استفاده غیرمتعارف اما واقعی: برخی از کاربران با دفتر کل مانند یک لاگ ثبت وقایع زندگی رفتار میکنند و تراکنشها را با رویدادهای زندگی (مانند
#weddingیا#vacation2025) برچسبگذاری میکنند. سپس از آن برای محاسبه هزینههای رویدادها یا حتی به عنوان دفتر خاطرات فعالیتها استفاده میکنند (فرادادههای مالی به عنوان نمادی از رویدادهای زندگی). فرمت متنساده و قابلیت برچسبگذاری، این کار را به شکلی ممکن میسازد که ابزارهای سنتی به راحتی اجازه نمیدهند. -
سادگی و مالکیت: امور مالی شخصی به ذهنیت افراد نیز مربوط میشود. بسیاری Beancount را انتخاب میکنند چون «میخواستند مالک این دادهها باشند و به راحتی آنها را تحلیل کنند و نمیخواستند درگیر حق اشتراک یا محدودیتهای یک شرکت خاص شوند». توقف فعالیت اخیر Mint.com (یک ابزار بودجهبندی رایگان محبوب) باعث شده علاقهمندان برای پایداری طولانیمدت به سمت حسابداری متنساده بروند. با Beancount، آنها میدانند که ۲۰ سال دیگر هم میتوانند دفتر کل خود را باز کنند. برای امور مالی یک فرد، دادههای Beancount (که شاید از طریق Dropbox یا Git همگامسازی شده باشند) و رابط وب Fava (که میتواند به صورت محلی یا روی یک سرور شخصی اجرا شود) تعادلی بین راحتی و کنترل ایجاد میکنند که در جای دیگر به سختی یافت میشود.
چالشهای احتمالی برای استفاده شخصی: تنظیمات اولیه و یادگیری دفترداری دوطرفه میتواند برای برخی یک مانع باشد. اما منابع بسیاری (مانند آموزشهای Beancount و انجمنهای گفتگو) به کاربران جدید کمک میکنند. پس از تنظیم، نگهداری آن میتواند تا حد زیادی خودکار شود که برای کسی که امور مالی خانواده را با حداقل تلاش مدیریت میکند، عالی است.