10 گام عملی برای بسته شدن سریع و قابل اعتماد ماهانه در Beancount
اگر دفتر کل شما به صورت متن ساده باشد، بسته شدن ماهانه میتواند هم سریع و هم قابل حسابرسی باشد. این فرآیند نیازی به شلوغی پر از صفحات گسترده و ماشینحسابها ندارد. این راهنما یک فرآیند تمیز و قابل تکرار را که برای Beancount و رابط وب آن، Fava، طراحی شده است، ارائه میدهد؛ فرآیندی که بر پایهٔ ادعاهای تراز، وارد کردن هوشمند و بررسیهای سبک ساخته شده است.
در اینجا فهرست بررسی برای یک بسته شدن بدون دردسر آمده است:
- جمعآوری صورتحسابها و وارد کردن تمام تراکنشهای خام.
- نرمالسازی پرداختکنندگان، توضیحات و متادیتا.
- تطبیق هر حساب نقدی، بانکی و اعتباری با ادعای
balance
. - همسانسازی انتقالها و جابجاییهای بینحسابی.
- بهروزرسانی قیمتها برای سرمایهگذاریها و تأیید ارزشگذاریها.
- پیوست یا منبع اسناد (رسیدها، فاکتورها) در دفتر کل.
- اجرای پرسوجوها و داشبوردها برای بررسی سود و زیان و انحرافها.
- ثبت هزینههای پیشدستی و تنظیمات لازم.
- اعتبارسنجی دفتر کل با بررسیهای خودکار.
- کامیت، برچسبگذاری و بایگانی ماه.
1. تعیین قوانین پایه (و استفاده مجدد از آنها)
یک بسته شدن منسجم با پایهای ثابت آغاز میشود. نمودار حسابها و گزینههای کلیدی Beancount باید بهصورت مرکزی تعریف شوند و به ندرت تغییر یابند. گزینههایی مانند operating_currency
و مدیریت documents
اطمینان میدهند که گزارشها و وارد کردنها هر بار بهصورت پیشبینیپذیر رفتار میکنند.
نکته: فایل گزینهها را مانند «زیرساخت» در نظر بگیرید. تغییر آن میتواند نحوهٔ محاسبهٔ اعداد شما را تغییر دهد. با دقت در Git نسخهبندی کنید.
2. همه چیز را وارد کنید — سپس دیگر بهصورت دستی وارد نکنید
اتوماتیکسازی وارد کردن دادهها بزرگترین سرعتبخش برای بسته شدن کتابهاست. از ابزارهای قدرتمند وارد کردن Beancount و واردکنندههای ساختهشده توسط جامعه برای دریافت خوراکهای بانکی، فایلهای CSV/OFX کارتهای اعتباری، دادههای کارگزاری و گزارشهای حقوق و دستمزد استفاده کنید.
هدف یک فرمان وارد کردن یکبار است که پستهای متوازن تولید میکند و فقط نیاز به بازبینی و کامیت دارد. این کار ورود دستی دادهها را که منبع اصلی خطاها و تأخیرهاست، حذف میکند.
3. نرمالسازی پرداختکنندگان و متادیتا در ابتدا
دادههای تمیز، دادههای قابل اعتماد هستند. پرداختکنندگان، روایتها و برچسبهای خود را در طول فرآیند وارد کردن استاندارد کنید تا جستجوها، قواعد و گزارشهای شما ماه به ماه دقیق بمانند.
سیستم افزونهٔ Beancount به شما اجازه میدهد تا تبدیلها و اعتبارسنجیهای سبک را هنگام بارگذاری فایلها اضافه کنید. این برای اعمال چکهای سفارشی سازگاری یا استفاده از افزونهٔ داخلی noduplicates
برای پرچمگذاری تراکنشهای تکراری پیش از تبدیل به مشکل، ایدهآل است.
4. تطبیق با ادعای balance
برای هر حسابی که صورتحساب دارد (چک، پسانداز، کارتهای اعتباری)، از دستور balance
در Beancount برای ادعای تراز بستهشده استفاده کنید. این خط ساده، تطبیق را از یک بررسی چشمی دستی به یک تست دقیق و خودکار تبدیل میکند.
; ادعا میکند که تراز دقیقاً 1234.56 در ابتدای روز است
2025-09-01 balance Assets:Bank:Checking 1234.56 USD
از آنجا که ترازها در ابتدای روز بررسی میشوند، استفاده از اولین روز ماه بعدی برای صورتحساب ماهانه راحتتر است. اگر تراز محاسبهشده توسط Beancount با ادعای شما مغایرت داشته باشد، خطای دقیقی دریافت میکنید و تاریخی برای شروع بررسی دارید. همیشه منبع حقیقت (تراکنشهای شما) را ابتدا اصلاح کنید؛ «نیرو» برای تطبیق ندهید.
5. همسانسازی انتقالهای بینحسابی
اطمینان حاصل کنید که هر انتقال در هر دو طرف تراکنش ظاهر شود. برای مثال، پرداختی از حساب جاری به کارت اعتباری باید در هر دو حساب ثبت شود. انتقالهای نامتناسب منبع رایجی برای سردردهای تطبیق هستند.
از دستور pad
فقط برای تنظیم ترازهای افتتاحیه تاریخی هنگام اولین تنظیم یک حساب استفاده کنید. این یک ابزار تنظیم است، نه یک تکیهگاه برای رفع اختلافات ماهانه.
6. تأیید موقعیتها و قیمتها برای سرمایهگذاریها
برای داشتن نمایی دقیق از دارایی خالص خود، بهروزرسانی ارزشهای بازار برای سرمایهگذاریها و ارزهای خارجی ضروری است. از دستور price
در Beancount برای ثبت این مقادیر بهعنوان تاریخ بستهشدن استفاده کنید.
2025-08-31 price VTI 290.14 USD
2025-08-31 price EUR 1.11 USD
ابزارهای زیادی میتوانند این قیمتها را بهصورت خودکار برای شما دریافت کنند. پس از بهروزرسانی، گزارشهای ترازنامه یا دارایی خالص را دوباره اجرا کنید تا تغییرات ارزشگذاری را ببینید.
7. پیوست رسیدها و اسناد منبع
یک مسیر حسابرسی تمیز با لینک کردن تراکنشها به اسناد منبع حفظ کنید. از گزینه documents
در فایل اصلی Beancount برای اشاره به آرشیو رسیدها و فاکتورها استفاده کنید.
option "documents" "/path/to/Finance/Documents"
اگر فایلهایتان را بر اساس تاریخ نامگذاری کنید (مثلاً 2025-08-13.vendor.receipt.pdf
)، Beancount و Fava میتوانند بهصورت خودکار آنها را کشف و لینک کنند و نمایش رسید برای هر تراکنش تنها با یک کلیک امکانپذیر میشود.
8. مرور ماه با Fava و BQL
یک حلقه بازخورد سریع حیاتی است. از Fava برای بازرسی بصری مالیاتان استفاده کنید. نمودارها و گزارشهای آن برای برش هزینهها بر اساس دستهبندی، بررسی روند درآمد و شناسایی ناهنجاریها در یک نگاه عالی هستند.
برای بررسیهای دقیقتر، از زبان پرسوجوی Beancount (BQL) استفاده کنید. این پرسوجو، برای مثال، یک تجزیه و تحلیل رتبهبندیشده از تمام هزینههای آگوست 2025 میدهد:
SELECT
account,
ROUND(SUM(position), 2) AS total
WHERE
date >= 2025-08-01 AND date < 2025-09-01
AND account 'Expenses'
GROUP BY
account
ORDER BY
total DESC;
9. ثبت هزینههای پیشدستی و تنظیمات
اگر از حسابداری بر پایهٔ تعهد استفاده میکنید، تنظیمات پایان ماه را بهصورت تراکنشهای واضح و تاریخدار ثبت کنید. این میتواند شامل هزینههای تعهدی (مانند قبض آب و برق که هنوز دریافت نکردهاید)، استهلاک هزینههای پیشپرداخت یا شناسایی درآمد باشد. آنها را ساده و با توضیح واضح در روایت بنویسید تا در بازبینیهای آینده بهراحتی قابل درک باشند.
10. اعتبارسنجی، برچسبگذاری و بایگانی
قبل از نهاییسازی ماه، یک بررسی نهایی برای یکپارچگی ساختاری انجام دهید:
bean-check your-ledger.beancount
این فرمان عدم تعادلها، ارجاع به حسابهای بازنشده و سایر خطاهای رایج را شناسایی میکند. هر چیزی که نشان دهد را اصلاح کنید.
پس از اطمینان از صحت همه چیز، تغییرات را در کنترل نسخه (مانند Git) با پیام واضح و برچسب، مثلاً close-2025-08
، کامیت کنید. در نهایت صورتحسابهای بانکی خود را بایگانی کنید و ماه را قفل کنید.
یک اسکریپت سادهٔ بسته شدن که میتوانید تطبیق دهید
میتوانید اکثر این گامها را با یک اسکریپت سادهٔ شل خودکار کنید. این کار بسته شدن را به یک فرمان تکرارپذیر تبدیل میکند.
#!/usr/bin/env bash
set -euo pipefail
# Example: ./close.sh 2025-08
MONTH=${1:?Please provide a month in YYYY-MM format}
LEDGER= /finance/ledger.beancount
# 1. Import new transactions
echo "Importing transactions for $MONTH..."
make import MONTH="$MONTH"
# 2. Update market prices for the last day of the month
PRICE_DATE=$(date -d "$MONTH-01 +1 month -1 day" +%F)
echo "Fetching prices for $PRICE_DATE..."
make prices DATE="$PRICE_DATE"
# 3. Validate the entire ledger
echo "Running bean-check..."
bean-check "$LEDGER"
# 4. Generate a key report (e.g., expense breakdown)
echo "Generating expense report for $MONTH..."
bean-query "$LEDGER" -f txt "
SELECT account, SUM(position)
WHERE date >= '${MONTH}-01' AND date < '${MONTH}-01' + 1 month
AND account 'Expenses'
GROUP BY account ORDER BY SUM(position) DESC;
" > "reports/${MONTH}-expenses.txt"
# 5. Commit and tag the close in Git
echo "Committing and tagging the close..."
git -C /finance add .
git -C /finance commit -m "Close ${MONTH}"
git -C /finance tag "close-${MONTH}"
echo "Month ${MONTH} is closed and tagged."
چرا این روش کار میکند
این فرآیند سریع و قابل اعتماد است زیرا بر پایهٔ چند اصل اساسی ساخته شده:
- ادعاها، نه نگاه چشمی: دستور
balance
تطبیق را به یک چک دقیق و خودکار تبدیل میکند. - ورودیهای تعیینپذیر: واردکنندههای خودکار و متادیتای نرمالشده دفتر کل شما را بازتولیدپذیر و سازگار میسازند.
- دادههای قابل کاوش: Fava و BQL ابزارهای قدرتمندی برای اعتبارسنجی نتایج و بررسی سریع ناهنجاریها فراهم میکنند.
- تغییرات حسابرسیشدنی: تنظیمات بهصورت ورودیهای متن ساده هستند و مرور و درک آنها ماهها یا سالها بعد آسان است.
یک بسته شدن ماهانه خوب بیشتر به لجستیک مربوط میشود. با Beancount میتوانید آن را به یک مراسم کوتاه و اسکریپتی تبدیل کنید: وارد کردن، ادعا، قیمتگذاری، پرسوجو و کامیت. گردش کار را ثابت نگه دارید و بسته شدن شما حتی با رشد پیچیدگی مالیتان نیز سریع خواهد ماند.