حسابهای پرداختنی (AP) پولی است که کسبوکار شما به تأمینکنندگان خود برای کالاها یا خدماتی که قبلاً دریافت کردهاید اما هنوز پرداخت نکردهاید، بدهکار است. در دنیای حسابداری، AP بهعنوان یک بدهی جاری در ترازنامه شما طبقهبندی میشود—مبلغی که معمولاً ظرف یک سال آینده و اغلب طی ۳۰ تا ۶۰ روز باید پرداخت شود.
این مفهوم در حسابداری تعهدی مرکزی است، جایی که هزینه و بدهی متناظر را همان لحظهای که صورتحساب میرسد ثبت میکنید، نه زمانی که واقعاً پول را ارسال میکنید. این راهنما به شما نشان میدهد که چگونه کل گردش کار AP را بهطور تمیز و کارآمد با استفاده از ابزار حسابداری متنمحور Beancount مدیریت کنید.
خلاصه سریع
قبل از پرداختن به جزئیات، اجازه دهید موارد ضروری را پوشش دهیم:
- حسابهای پرداختنی (AP) نشاندهنده بدهیهای کوتاهمدت شما به فروشندگان است. آن را در بخش
Liabilitiesترازنامه خود خواهید یافت. - تعهدی در مقابل نقدی: AP مفهومی است که فقط در صورت نگهداری دفاتر بر مبنای تعهدی وجود دارد. Beancount کاملاً از گردشهای کاری تعهدی پشتیبانی میکند و رابط وب آن، Fava، بدهیهای شما را بهدرستی نمایش میدهد.
- AP در مقابل AR: ساده است: پرداختنیها چیزهایی هستند که شما بدهکارید، در حالی که دریافتنیها (AR) چیزهایی هستند که دیگران به شما بدهکارند.
محل قرارگیری AP در Beancount (و Fava)
برای شروع پیگیری AP، ابتدا باید یک حساب برای آن در دفتر کل خود تعریف کنید. یک قرارداد استاندارد این است:
Liabilities:AccountsPayable
میتوانید بهصورت اختیاری زیرحسابهایی برای فروشندگان اصلی ایجاد کنید (مثلاً Liabilities:AccountsPayable:ForestPaintSupply).
در Fava، این حساب در ترازنامه شما تحت Liabilities ظاهر میشود. میتوانید روی آن کلیک کنید تا جزئیات را ببینید و اقلام ثبتشدهای که مانده حساب را تشکیل میدهند مشاهده کنید. حتی میتوانید این را در دفتر کل مثال عمومی Fava ببینید که شامل یک حساب Liabilities:AccountsPayable است.
قرارداد علامت: Beancount مانده بدهیها را بهصورت بستانکار (اعداد منفی) ذخیره میکند. مانده -500.00 USD در Liabilities:AccountsPayable به این معنی است که شما $۵۰۰ بدهکارید. گزارش اقلام باز زیر علامت را با -SUM(number) معکوس میکند تا هر صورتحساب پرداختنشده یک مبلغ باقیمانده مثبت نشان دهد. یک صورتحساب کاملاً تسویهشده به صفر جمع میشود و توسط HAVING حذف میشود.
اجزای سازنده Beancount که استفاده خواهید کرد
یک گردش کار قوی AP در Beancount بر چند ویژگی اصلی تکیه دارد:
- حسابها: شما عمدتاً از حساب
Liabilities:AccountsPayable، یک حساب نقدی مانندAssets:Bank:Checkingو حسابهای هزینه مختلف خود (مثلاًExpenses:Supplies) استفاده خواهید کرد. - فراداده: میتوانید دادههای کلید-مقدار را به هر تراکنش پیوست کنید. برای AP، از فرادادههایی مانند
invoice:،due:،terms:وdocument:استفاده خواهید کرد.option "documents"را روی یک پوشه تنظیم کنید تا Beancount بتواند فایلها را آنجا شناسایی کند؛ در Fava، رها کردن یک فایل روی یک ردیف دفتر کل، یک ورود فرادادهdocument:درج میکند و فعال کردنplugin "fava.plugins.link_documents"آن ورودیها را به دستورات Document شناساییشده پیوند میدهد. - برچسبها و پیوندها: از
#tags(مانند#ap) برای فیلتر کردن آسان و^links(مانند^INV-10455) برای اتصال برنامهنویسانه یک صورتحساب و پرداخت بعدی آن استفاده کنید. این یک مسیر حسابرسی واضح و قابل پیگیری در دفتر کل ایجاد میکند—اما پیوندها به تنهایی برای پرسوجوی صورتحساب باز زیر کافی نیستند. - پرسوجوها (BQL): زبان پرسوجوی شبیه SQL بیکانت (BQL) به شما امکان میدهد گزارشهای قدرتمندی اجرا کنید، مانند فهرست کردن تمام پرداختنیهای باز مرتبشده بر اساس تاریخ سررسید، مستقیماً از خط فرمان با
bean-queryیا در صفحه "Query" فاوا.
هویت صورتحساب (الزامی برای پرسوجوهای صورتحساب باز): هر صورتحساب و هر پرداخت تسویهکننده—کامل، جزئی یا با تخفیف زودهنگام—باید همان فراداده تراکنش invoice: و due: را به همراه همان ^link داشته باشد. پرسوجو بر اساس payee، any_meta('invoice') و any_meta('due') گروهبندی میشود. اگر پرداختی آن کلیدها را حذف کند، ثبت AP آن در یک گروه جداگانه (payee, null, null) قرار میگیرد و یک صورتحساب تسویهشده همچنان باز به نظر میرسد. (payee, invoice) را در بین فروشندگان یکتا نگه دارید. فیلدهای اختیاری مخصوص صورتحساب مانند terms: و document: نیازی به تکرار روی پرداختها ندارند.
گردش کار اصلی AP در Beancount
مدیریت AP در دفتر کل شما شامل دو یا سه مرحله کلیدی است: ثبت صورتحساب، پرداخت آن و گاهی مدیریت پرداختهای جزئی یا تخفیفها.
۱) ثبت صورتحساب فروشنده (این بدهی را ایجاد میکند)
ابتدا، وقتی صورتحساب میرسد، هزینه را ثبت کرده و پرداختنی را ایجاد میکنید.
; Optionally set your documents folder in your main Beancount file:
option "documents" "documents"
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
terms: "2/10, n/30"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USDاین ورود واحد دو کار حیاتی انجام میدهد:
- بلافاصله هزینه $۵۰۰ را در دوره صحیح (اوت) شناسایی میکند—فقط یک بار. هزینه را در زمان پرداخت دوباره ثبت نکنید.
- به AP مبلغ $۵۰۰ بستانکار میکند (
-500.00 USD)، و ثبت میکند که آن مبلغ را به Forest Paint Supply بدهکارید.
پیوند ^INV-10455 به همراه فراداده invoice: / due: هویت صورتحساب را تشکیل میدهند. هر پرداخت بعدی این صورتحساب باید هر سه مورد را دوباره استفاده کند.
۲) پرداخت صورتحساب (این بدهی را تسویه میکند)
وقتی صورتحساب را پرداخت میکنید، تراکنشی ایجاد میکنید که پول را از حساب بانکی شما برای تسویه بدهی منتقل میکند. invoice: و due: را از صورتحساب روی پرداخت کپی کنید تا هر دو ثبت یک گروه پرسوجو مشترک داشته باشند.
الف) پرداخت استاندارد (بدون تخفیف):
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDاین ورود مانده AP شما را به اندازه $۵۰۰ و مانده حساب چکی شما را به همان میزان کاهش میدهد. بدهی این صورتحساب اکنون تسویه شده است (مجموع AP گروه صفر است). هزینه روی صورتحساب اوت باقی میماند—پرداخت به Expenses: دست نمیزند.
ب) تخفیف پرداخت زودهنگام (مثلاً "2/10, n/30")—دقیقاً یک روش را انتخاب کنید:
اگر شرایط "2/10, n/30" باشد، اگر ظرف ۱۰ روز پرداخت کنید، میتوانید ۲٪ تخفیف بگیرید. برای صورتحساب $۵۰۰ ما، این یک تخفیف $۱۰ است. کد زیر دو جایگزین متقابل انحصاری نشان میدهد: گزینه ۱ فعال است؛ گزینه ۲ کاملاً کامنت شده است تا یک paste نتواند هر دو را ثبت کند. برای استفاده از گزینه ۲ به جای آن، گزینه ۱ را کامنت کرده و گزینه ۲ را از کامنت خارج کنید. هرگز هر دو را فعال نگذارید—این کار AP را دو بار تسویه میکند و منفعت $۱۰ دومی اختراع میکند. اینکه از کدام حساب درآمد در مقابل هزینه استفاده میکنید، یک انتخاب سیاست حسابداری برای دفاتر شماست؛ Beancount یکی را بر دیگری الزام نمیکند.
; Pick EXACTLY ONE of the two transactions below for a given invoice.
; Do not paste both into the same ledger — that clears AP twice.
; Option 1: Record the discount as other income
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USDدر هر یک از دو جایگزین به تنهایی، کل بدهی $۵۰۰ را تسویه میکنید، مانده بانکی خود را به اندازه $۴۹۰ که واقعاً پرداخت کردهاید کاهش میدهید و منفعت $۱۰ را حساب میکنید. تراکنش پرداخت کامل استاندارد را با جایگزین انتخابشده عوض کنید—پرداخت تخفیف را روی پرداخت نقدی $۵۰۰ سوار نکنید و این کد را با بخش ۲الف برای همان صورتحساب ترکیب نکنید.
۳) مدیریت پرداختهای جزئی
در هر قسط از همان هویت invoice: / due: / ^link استفاده کنید تا هر پرداخت همان گروه صورتحساب باز را کاهش دهد.
; Invoice for $1,200
2025-08-10 * "Acme Parts" "INV-9001" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Expenses:Parts 1200.00 USD
Liabilities:AccountsPayable -1200.00 USD
; First payment of $400
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
; Final payment of $800
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USDپس از پرداخت اول، مجموع AP گروه صورتحساب -800.00 USD است (هنوز $۸۰۰ بدهکارید). پس از پرداخت نهایی صفر میشود. فیلتر کردن دفتر کل با ^INV-9001 همچنان تاریخچه کامل را نشان میدهد.
پرسوجوهای مفید (BQL)
میتوانید این پرسوجوها را در تب "Query" فاوا یا از خط فرمان با bean-query اجرا کنید (مرجع BQL). در زیر با Beancount 3.2.3 و beanquery 0.2.0 تأیید شده است.
نکته: تابع
any_meta()ابتدا یک کلید فراداده را روی ثبت (posting) جستجو میکند و سپس به تراکنش برمیگردد—بنابراین مقادیرinvoice:/due:در سطح تراکنش در مجموعه نتایج ظاهر میشوند.
AP باز بر اساس فروشنده (نمای مانده):
این پرسوجو موجودی بدهی هر تأمینکننده را جمع میزند. مجموع بستانکار (منفی) همان چیزی است که هنوز به آن فروشنده بدهکارید.
SELECT payee, COST(SUM(position)) AS amount
WHERE account ~ "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;صورتحسابهای باز تا تاریخ مشخص (گزارش اقلام باز):
گزارش اقلام باز به این سؤال پاسخ میدهد که «چه چیزی پرداختنشده باقی مانده است؟» باید (۱) در یک تاریخ مبنای صریح قطع شود تا پرداختهای بعدی نتوانند یک snapshot قبلی را بیصدا پاک کنند، (۲) بر اساس هویت صورتحساب مشترک (payee + invoice: + due:) گروهبندی شود، (۳) گروههای تسویهشده (صفر) را حذف کند و (۴) یک مبلغ باقیمانده مثبت نشان دهد—نه یک بستانکار AP امضاشده خام.
تاریخ گزارشدهی که در سراسر زیر استفاده شده است: 2025-09-04.
دفتر کل شروعکننده AP قابل دانلود
accounts-payable-starter.bean را دانلود کنید—یک دفتر کل خودکفا که از کد کامل زیر تولید شده است (افتتاح حسابها، وجه نقد افتتاحیه فرضی، صورتحسابهای تسویهشده / جزئی / پرداختنشده، تا تاریخ 2025-09-04). هر نام و مبلغ داده نمونه فرضی است. هیچ PDF صورتحساب، پوشه اسناد یا فایل دیگری برای اعتبارسنجی یا پرسوجو از آن لازم نیست.
اجرای اول از یک پوشه موقت تمیز (با پین Beancount 3.2.3 / beanquery 0.2.0):
# Save the download as accounts-payable-starter.bean in this directory, then:
uvx --from beancount==3.2.3 bean-check accounts-payable-starter.bean
uvx --from beanquery==0.2.0 --with beancount==3.2.3 bean-query accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"bean-check با کد خروج ۰ و بدون خروجی خارج میشود. پرسوجو پنج ردیف باز را در جدول مورد انتظار زیر برمیگرداند (Forest غایب است؛ Acme باقیمانده 800.00؛ مجموع باقیماندههای مثبت = 1500.00). دانلود تعهدشده را با yarn generate:ap-starter پس از ویرایش کد بازتولید کنید؛ yarn generate:ap-starter --check اگر مصنوع کهنه باشد ناموفق میشود.
این فیکسچر کامل را paste کنید (افتتاحها + وجه نقد افتتاحیه + سه شکل صورتحساب، به علاوه ردیفهای سررسید-امروز / معوق / لبه برای پیری). جایگزینهای تخفیف زودهنگام برای INV-10455 کاملاً کامنت میمانند—دقیقاً یکی را فقط در صورتی فعال کنید که پرداخت استاندارد Forest را جایگزین کنید؛ هرگز هر دو گزینه تخفیف را همراه با آن پرداخت فعال نگذارید.
; accounts-payable-starter — complete runnable AP workflow
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Equity:Opening-Balances USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
2025-01-01 open Expenses:Parts USD
2025-01-01 open Expenses:Office USD
2025-01-01 open Income:Discounts:Payables USD
; Fictional opening cash — enough to cover every payment in this ledger
2025-01-01 * "Opening balance"
Assets:Bank:Checking 5000.00 USD
Equity:Opening-Balances -5000.00 USD
; Settled before as-of — must disappear from the open report
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
; Early-payment discount alternatives for INV-10455 — mutually exclusive with
; the standard payment above AND with each other. To take 2/10 instead: delete
; (or comment out) the 2025-09-01 payment, then uncomment EXACTLY ONE option.
; Never leave both options active — that clears AP twice.
;
; Option 1: Record the discount as other income
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Income:Discounts:Payables -10.00 USD
;
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USD
; Partial before as-of; final $800 payment is AFTER 2025-09-04
2025-08-10 * "Acme Parts" "INV-9001" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Expenses:Parts 1200.00 USD
Liabilities:AccountsPayable -1200.00 USD
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD
; Unpaid — not yet due as of 2025-09-04
2025-08-15 * "Bright Office Co" "INV-220" ^INV-220
invoice: "INV-220"
due: "2025-09-14"
Expenses:Office 300.00 USD
Liabilities:AccountsPayable -300.00 USD
; Unpaid — due today (as-of == due)
2025-08-20 * "Helix Industries" "INV-440" ^INV-440
invoice: "INV-440"
due: "2025-09-04"
Expenses:Parts 200.00 USD
Liabilities:AccountsPayable -200.00 USD
; Unpaid — 30 days overdue as of 2025-09-04
2025-07-06 * "Metro Hardware" "INV-77" ^INV-77
invoice: "INV-77"
due: "2025-08-05"
Expenses:Parts 150.00 USD
Liabilities:AccountsPayable -150.00 USD
; Overpayment — credit balance (not an amount due; see edge cases)
2025-08-01 * "Credit Vendor" "INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Expenses:Parts 100.00 USD
Liabilities:AccountsPayable -100.00 USD
2025-08-18 * "Credit Vendor" "Overpay INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Liabilities:AccountsPayable 150.00 USD
Assets:Bank:Checking -150.00 USD
; Missing due metadata — still open; age into a separate bucket, do not drop
2025-08-12 * "No Due Co" "INV-ND" ^INV-ND
invoice: "INV-ND"
Expenses:Office 50.00 USD
Liabilities:AccountsPayable -50.00 USDپرسوجوی اقلام باز (beanquery 0.2.0 از HAVING SUM(number) < 0 پشتیبانی میکند؛ از مقایسه یک inventory با 0 با COST(SUM(position)) != 0 پشتیبانی نمیکند):
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
-SUM(number) AS outstanding
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) < 0
ORDER BY due, payee;ردیفهای مورد انتظار تا 2025-09-04 (بهطور مستقل از تراکنشها مشتق شده است: صورتحساب − پرداختهای تاریخگذاری ≤ تاریخ مبنا؛ Forest به صفر میرسد و غایب است):
| payee | invoice | due | outstanding |
|---|---|---|---|
| No Due Co | INV-ND | (خالی) | 50.00 |
| Metro Hardware | INV-77 | 2025-08-05 | 150.00 |
| Helix Industries | INV-440 | 2025-09-04 | 200.00 |
| Acme Parts | INV-9001 | 2025-09-09 | 800.00 |
| Bright Office Co | INV-220 | 2025-09-14 | 300.00 |
مجموع باقیماندههای مثبت = 1,500.00. صورتحساب $۵۰۰ Forest حذف شده است. Acme همچنان $۸۰۰ نشان میدهد ($۱٬۲۰۰ − $۴۰۰)؛ پرداخت $۸۰۰ در 2025-09-05 بعد از تاریخ مبنا است، بنابراین نمیتواند این snapshot را ببندد.
تطبیق با بدهی AP در همان نقطه برش:
SELECT COST(SUM(position)) AS ap_balance
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04;مورد انتظار: ap_balance = (-1450.00 USD). بهطور مستقل: باقیمانده باز $۱٬۵۰۰ منهای بستانکار فروشنده $۵۰ (در زیر) = $۱٬۴۵۰ بدهی ← موجودی بدهی -1450.00 USD.
تاریخ مبنا را یک روز بعد ببرید (date <= 2025-09-05) و پرسوجوی اقلام باز را دوباره اجرا کنید: ردیف Acme ناپدید میشود (پرداخت نهایی شامل میشود) و ap_balance به (-650.00 USD) تبدیل میشود. پرداختی بعد از تاریخ گزارشدهی هرگز گزارش قبلی را بازنویسی نمیکند.
بستانکارهای فروشنده / پرداختهای اضافی: HAVING SUM(number) < 0 فقط مبالغی را نگه میدارد که هنوز بدهکارید. یک پرداخت اضافی مجموع AP گروه را مثبت میکند. آنها را جداگانه فهرست کنید—مانده AP مثبت را بهعنوان «مبلغ سررسید» تلقی نکنید:
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
SUM(number) AS credit
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) > 0
ORDER BY payee;مورد انتظار: یک ردیف—Credit Vendor / INV-C1 / 2025-08-20 / credit = 50.00 (شما $۵۰ اضافه پرداخت کردهاید).
due: از دست رفته: INV-ND همچنان در گزارش باز با due خالی ظاهر میشود. آن را در یک سطل اختصاصی missing-due (در زیر) پیر کنید؛ هرگز آن را بیصدا حذف نکنید.
فهرست صورتحسابهای دارای PDF پیوست:
SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account ~ "^Liabilities:AccountsPayable"
ORDER BY date DESC;محل مشاهده AP در Fava
- ترازنامه: به
Balance Sheet→Liabilities→AccountsPayableبروید تا مانده کل را ببینید و به جزئیات تراکنش نفوذ کنید. - دفتر کل: دفتر کل را با
account:Liabilities:AccountsPayableیا یک پیوند خاص مانند^INV-xxxxفیلتر کنید تا چرخه عمر کامل یک صورتحساب را ببینید. - اسناد: با تنظیم
option "documents"، Beancount فایلها را در آن درخت شناسایی میکند. نماهای Documents فاوا و پلاگینlink_documents(به بالا مراجعه کنید) آن فایلها را به تراکنشهایی که فرادادهdocument:دارند متصل میکنند.
پیری AP، گردش و آگاهی از جریان نقدی
برنامه پیری (صادرات قابل تکرار + سطلها): beanquery 0.2.0 میتواند ردیفهای اقلام باز بالا را تولید کند، اما یک عبارت سطل پیری داخلی روی فراداده due ارائه نمیدهد. گزارش باز را صادر کنید، سپس بهصورت قطعی در برابر همان تاریخ مبنا سطلبندی کنید.
bean-query -f csv -o open-ap.csv accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"ستونهای CSV: payee, invoice, due, outstanding.
قانون سطل برای تاریخ مبنا D = 2025-09-04 و due هر ردیف (ISO YYYY-MM-DD):
| شرط | سطل |
|---|---|
due خالی | missing-due |
due > D | not-yet-due |
due == D | due-today |
1 ≤ (D − due) ≤ 30 | 1-30-overdue |
31 ≤ (D − due) ≤ 60 | 31-60-overdue |
(D − due) ≥ 61 | 61+-overdue |
پایتون فشرده (فقط کتابخانه استاندارد) که آن جدول را پیادهسازی میکند:
from datetime import date
AS_OF = date(2025, 9, 4)
# Apply bucket() to each CSV row's due column (ISO YYYY-MM-DD or empty).
def bucket(due: str | None) -> str:
if not due:
return "missing-due"
days = (AS_OF - date.fromisoformat(due)).days
if days < 0:
return "not-yet-due"
if days == 0:
return "due-today"
if days <= 30:
return "1-30-overdue"
if days <= 60:
return "31-60-overdue"
return "61+-overdue"پیری مورد انتظار برای ردیفهای باز تا 2025-09-04:
| invoice | due | روزهای معوق | سطل | outstanding |
|---|---|---|---|---|
| INV-ND | (خالی) | — | missing-due | 50.00 |
| INV-77 | 2025-08-05 | 30 | 1-30-overdue | 150.00 |
| INV-440 | 2025-09-04 | 0 | due-today | 200.00 |
| INV-9001 | 2025-09-09 | −5 | not-yet-due | 800.00 |
| INV-220 | 2025-09-14 | −10 | not-yet-due | 300.00 |
سررسید-امروز در «جاری» تلفیق نمیشود: due == تاریخ مبنا سطل خودش است. سررسید-نشده نیاز به due > تاریخ مبنا دارد.
- نسبت گردش AP:
کل خریدهای تأمینکننده ÷ میانگین AP. یک معیار مرتبط، روزهای پرداختمانده (DPO)، تقریباً365 ÷ نسبت گردشاست. - اگر نمیتوانید بهموقع پرداخت کنید: AP برای بدهی کوتاهمدت است. اگر فروشنده با بازپرداخت رسمی بلندمدت موافقت کند، از AP به یک اسکناس پرداختنی بازطبقهبندی کنید—همان هویت صورتحساب را در تبدیل حفظ کنید تا گروه AP تسویه شود.
2025-10-01 * "Helix Industries" "Convert overdue AP to 12-month note" ^INV-1110
invoice: "INV-1110"
due: "2025-09-15"
Liabilities:AccountsPayable 2000.00 USD
Liabilities:NotesPayable -2000.00 USDبهترین شیوهها برای AP در دفتر کل متنمحور
- بدون کاغذ بروید: PDFهای صورتحساب را در درخت اسناد خود ذخیره کنید و با کلید فراداده
document:پیوست کنید (و آپلود Fava /link_documentsوقتی از Fava استفاده میکنید). - هویت صورتحساب را روی پرداختها دوباره استفاده کنید: همان
invoice:،due:و^linkرا روی صورتحساب و هر پرداختی که آن را تسویه میکند قرار دهید. - گزارش در برابر تاریخ مبنا: پرسوجوهای اقلام باز و پیری را با
date <= YYYY-MM-DDقطع کنید تا پرداخت بعدی نتواند snapshot قبلی را بازنویسی کند؛ با همانDپیر کنید. - فراداده را مرتب نگه دارید: استفاده مداوم از
invoice:،due:وterms:جستجو، پرسوجوها و بررسیهای مالی را بهبود میبخشد. - تعهدی تا آخر: اگر گزارشدهی مفید AP میخواهید، متعهد شوید که دفاتر خود را بر مبنای تعهدی نگه دارید. Beancount و Fava ماندههای تعهدی را در ترازنامه بدون پلاگینهای خاص مدیریت میکنند.
شروعکننده کپی-پیست: صورتحساب فروشنده + پرداخت
برای گردش کار کامل اقلام باز (تسویهشده + جزئی + پرداختنشده، تاریخ مبنا، پیری)، شروعکننده AP قابل دانلود بالا را ترجیح دهید. جفت حداقلی صورتحساب+پرداخت زیر همچنان هویت را روی هر دو پا نشان میدهد—ابتدا حسابها را باز کنید (یا این افتتاحها را در دفتر کل اصلی خود بگنجانید). فراداده اختیاری document: در اینجا حذف شده است تا هیچ چیزی خارج از دفتر کل لازم نباشد.
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
; ---- Bill ----
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
; ---- Payment (no discount) ----
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDبا Beancount 3.2.3 و beanquery 0.2.0، بارگذاری این شروعکننده هیچ خطایی تولید نمیکند، حساب AP به صفر خالص میشود و پرسوجوی invoice+due یک گروه واحد (Forest Paint Supply, INV-10455, 2025-09-04) برمیگرداند که مبلغ آن خالی است (تسویهشده)—نه یک ردیف صورتحسابشده به اضافه یک ردیف پرداخت یتیم (…, null, null).
این راهنما برای اهداف آموزشی است و مشاوره مالیاتی، حقوقی یا مالی محسوب نمیشود.
مراجع و مطالعه بیشتر:
- نحو زبان Beancount — حسابها، فراداده، برچسبها، پیوندها و اسناد (تأیید شده در 2026-09-11)
- مرجع زبان پرسوجوی Beancount (BQL) (تأیید شده در 2026-09-11)
- ویژگیهای Fava — آپلود اسناد و
link_documents(تأیید شده در 2026-09-11) any_meta()برای پرسوجوی فراداده تراکنش/ثبت (Martin Blais، فهرست پستی Beancount؛ تأیید شده در 2026-09-11)
