| HLEDGER(1) | hledger User Manuals | HLEDGER(1) |
نام (NAME)
hledger - یک برنامه حسابداری متنساده، قدرتمند و کاربرپسند (نسخه خط فرمان)
خلاصه دستور (SYNOPSIS)
hledger
یا
hledger COMMAND [OPTS] [ARGS]
توضیحات (DESCRIPTION)
برنامه hledger مجموعهای پایدار، کاربرپسند و چندسکویی از برنامهها برای ردیابی پول، زمان یا هر کالای دیگر با استفاده از حسابداری دوطرفه (دوبل) و یک قالب فایل ساده و قابل ویرایش است. hledger از ledger(1) الهام گرفته شده و تا حد زیادی با آن سازگار است، و قابلیت تبدیل دوطرفه بالایی با beancount(1) دارد.
این راهنما مربوط به رابط خط فرمان hledger نسخه ۱.۵۲ است. همچنین گزینههای مشترک، قالبهای فایل و مفاهیم استفادهشده توسط تمام برنامههای hledger را شرح میدهد. این مستند حتی ممکن است بهطور اتفاقی نکاتی از دفترداری/حسابداری را نیز به شما بیاموزد! برای استفاده کاربردی از hledger نیازی نیست همه مطالب اینجا را بدانید، اما هرگاه سؤالی درباره قابلیتها داشته باشید، این سند پاسخگوی آن خواهد بود. این مستند مفصل است، بنابراین در صورت نیاز میتوانید از بخشهایی بگذرید یا آن را گذرا مرور کنید. میتوانید آن را در hledger.org یا به عنوان یک راهنمای info یا صفحه man در سیستم خود بخوانید. همچنین میتوانید با اجرای دستورهای زیر، نسخهای درونبرنامهای را در موضوع مورد نظر باز کنید:
hledger --man [CMD]، hledger --info [CMD] یا hledger help [TOPIC].
(و برای راهنمای خلاصهتر، hledger --tldr [CMD] را امتحان کنید.)
وظیفه اصلی رابط خط فرمان hledger خواندن فایلهای متنساده توصیفکننده تراکنشهای مالی، پردازش و محاسبه اعداد، و چاپ یک گزارش کاربردی در ترمینال (یا ذخیره آن به صورت HTML ،CSV ،JSON یا SQL) است. گزارشهای متعددی در قالب زیردستورها در دسترس هستند. hledger همچنین سایر فایلهای اجرایی hledger-* را به عنوان زیردستورهای اضافی شناسایی میکند.
hledger معمولاً از فایل دفتر روزنامهای (journal) که توسط متغیر محیطی LEDGER_FILE مشخص شده است میخواند (و به آن اضافه میکند) (با پیشفرض $HOME/.hledger.journal)؛ یا میتوانید فایلها را با گزینههای -f مشخص کنید. این برنامه همچنین میتواند فایلهای timeclock، فایلهای timedot یا هر فایل CSV/SSV/TSV دارای فیلد تاریخ را بخواند.
در اینجا یک فایل دفتر روزنامه کوچک آمده است که یک تراکنش را شرح میدهد:
-
2015-10-16 bought food expenses:food $10 assets:cash
تراکنشها جابهجاییهای تاریخدار پول (یا موارد دیگر) میان دو یا چند حساب (accounts) هستند: حسابهای بانکی، کیف پول شما، دستهبندیهای درآمد/هزینه، افراد و غیره. میتوانید هر نام حسابی که میخواهید انتخاب کنید و از : برای مشخص کردن زیرحسابها بهره ببرید. باید حداقل دو فاصله (space) میان نام حساب و مبلغ وجود داشته باشد. مقادیر مثبت، ورودی به آن حساب (بدهکار) و مقادیر منفی، خروجی از آن (بستانکار) هستند. (در نتیجه، برخی گزارشها مانده حسابهای درآمد، بدهی و حقوق صاحبان سهام را به عنوان اعداد منفی نشان میدهند؛ این امر طبیعی است.)
دستور add در hledger میتواند به شما در افزودن تراکنشها کمک کند، یا میتوانید سایر رابطهای کاربری ورود داده مانند hledger-web یا hledger-iadd را نصب کنید. برای تغییرات گستردهتر و بهینهتر، از یک ویرایشگر متن استفاده کنید: Emacs + ledger-mode، VIM + vim-ledger، یا VS Code + hledger-vscode چند انتخاب خوب هستند (ببینید https://hledger.org/editors.html).
برای شروع، hledger add را اجرا کرده و اعلانها را دنبال کنید، یا چند مدخل مانند نمونه بالا را در $HOME/.hledger.journal ذخیره کنید، سپس دستورهایی مانند زیر را امتحان نمایید:
-
$ hledger print -x $ hledger aregister assets $ hledger balance $ hledger balancesheet $ hledger incomestatement
برای مشاهده فهرست دستورها، hledger را اجرا کنید. همچنین بخشهای "Starting a journal file" و "Setting opening balances" را در PART 5: COMMON TASKS ببینید..SH "بخش ۱: رابط کاربری (PART 1: USER INTERFACE)"
ورودی (INPUT)
دستور hledger با هر بار اجرا، یک یا چند فایل داده را میخواند. میتوانید یک فایل را با استفاده از -f مشخص کنید، مانند زیر:
-
$ hledger -f FILE [-f FILE2 ...] print
فایلها اغلب در قالب دفتر روزنامه (journal) برنامه hledger و با پسوند فایل .journal هستند (.hledger یا .j نیز کار میکنند)؛ این فایلها تراکنشها را مانند یک دفتر روزنامه عمومی حسابداری توصیف میکنند.
هنگامی که هیچ فایلی مشخص نشده باشد، hledger به دنبال .hledger.journal در پوشه خانگی (home) شما میگردد.
اما بیشتر افراد ترجیح میدهند فایلهای مالی را در یک پوشه اختصاصی، احتمالاً همراه با سامانه کنترل نسخه نگهداری کنند. همچنین، شروع یک فایل روزنامه جدید در هر سال رایج است (اجباری نیست، اما به سریع و منظم ماندن کارها کمک میکند). بنابراین ما معمولاً با تنظیم متغیر محیطی LEDGER_FILE روی مقداری مانند ~/finance/2023.journal، فایل روزنامه متفاوتی را پیکربندی میکنیم. برای اطلاعات بیشتر در مورد نحوه انجام این کار در سیستم خود، به Common tasks > Setting LEDGER_FILE مراجعه کنید.
کدگذاری متن (Text encoding)
برنامه hledger انتظار دارد ورودیهای غیر ascii با کدگذاری متنی locale سیستم قابل رمزگشایی باشند. (برای فایلهای CSV/SSV/TSV، این مورد میتواند با قاعده CSV encoding لغو شود.)
بنابراین، تلاش برای خواندن فایلهای غیر ascii که دارای کدگذاری متنی نادرست هستند، یا زمانی که هیچ locale سیستمی پیکربندی نشده است، با شکست مواجه خواهد شد. برای رفع این مشکل، locale سیستم خود را به درستی پیکربندی کنید و/یا فایلها را به کدگذاری متنی سیستم خود تبدیل کنید (با استفاده از iconv در unix، یا powershell یا notepad در ویندوز). برای نکات بیشتر به Install: Text encoding مراجعه کنید.
خروجی hledger از کدگذاری locale سیستم استفاده خواهد کرد.
مستندات و فایلهای نمونه hledger اغلب از کدگذاری UTF-8 استفاده میکنند.
قالبهای داده (Data formats)
معمولاً فایل داده در قالب journal متعلق به hledger است، اما میتواند در هر یک از قالبهای فایل پشتیبانیشده باشد که در حال حاضر عبارتند از:
| خواننده (Reader): | نوع داده (Reads): | استفاده خودکار برای پسوندهای: |
| journal | فایلهای دفتر روزنامه hledger و برخی دفاتر روزنامه Ledger، برای تراکنشها | .journal .j .hledger .ledger |
| timeclock | فایلهای timeclock، برای ثبت دقیق زمان | .timeclock |
| timedot | فایلهای timedot، برای ثبت تقریبی زمان | .timedot |
| csv | مقادیر جداشده با کاما یا سایر جداکنندهها، برای وارد کردن دادهها | .csv |
| ssv | مقادیر جداشده با نقطه ویرگول (semicolon) | .ssv |
| tsv | مقادیر جداشده با تب (tab) | .tsv |
| rules | مقادیر جداشده با CSV/SSV/TSV/غیره، روش جایگزین | .rules |
این قالبها در ادامه با جزئیات بیشتری توضیح داده شدهاند.
برنامه hledger قالب را بر اساس پسوندهای فایل نشاندادهشده در بالا به طور خودکار تشخیص میدهد. اگر نتواند پسوند فایل را تشخیص دهد، قالب journal را فرض میکند. بنابراین برای فایلهای غیر journal، استفاده از یک پسوند فایل شناختهشده مهم است تا خواندن فایل با موفقیت انجام شود یا پیامهای خطای مرتبط نمایش داده شوند.
همچنین میتوانید با قرار دادن نام قالب و یک دونقطه در ابتدای مسیر فایل، استفاده از یک خواننده/قالب خاص را اجبار کنید. به عنوان مثال، برای خواندن یک فایل .dat حاوی مقادیر جداشده با تب:
-
$ hledger -f tsv:/some/file.dat stats نام فایل - به معنی ورودی استاندارد است: -
$ cat FILE | hledger -f- print
در صورت خواندن دادههای غیر از journal به این روش، باید قالب را به عنوان یک پیشوند مشخص کنید، مانند timeclock: در اینجا:
-
$ echo 'i 2009/13/1 08:00:00' | hledger print -f timeclock:-
چندین فایل (Multiple files)
میتوانید چند گزینهٔ -f را مشخص کنید تا چندین فایل به عنوان یک journal بزرگ خوانده شوند. هنگام انجام این کار، توجه داشته باشید که برخی ویژگیها (توضیح داده شده در زیر) تحت تأثیر قرار خواهند گرفت:
- بررسیهای تراز (balance assertions) تأثیر تراکنشهای فایلهای قبلی را نخواهند دید. (معمولاً این موضوع مشکلی ایجاد نمیکند زیرا هر فایل ماندههای ابتدای دورهٔ متناظر خود را تنظیم میکند.)
- برخی دستورالعملها (directives) روی فایلهای قبلی یا بعدی تأثیر نخواهند گذاشت.
در صورت نیاز، میتوانید این مشکل را با استفاده از یک فایل والد (parent file) که سایر فایلها را در بر میگیرد، یا با چسباندن فایلها به یکدیگر دور بزنید؛ به عنوان مثال: cat a.journal b.journal | hledger -f- CMD.
حالت سختگیرانه (Strict mode)
نرمافزار hledger فایلهای ورودی را برای اطمینان از معتبر بودن دادهها بررسی میکند. بهطور پیشفرض، مهمترین خطاها شناسایی میشوند، در حالی که همچنان فایلهای journal ساده را بدون نیاز به اعلانهای فراوان میپذیرد:
- آیا فایلهای ورودی با نحو (syntax) معتبر، قابل تجزیه هستند؟
- آیا همهٔ تراکنشها تراز هستند؟
- آیا تمام بررسیهای تراز با موفقیت تأیید میشوند؟
با پرچم -s/--strict، بررسیهای بیشتری انجام میشود:
- آیا همهٔ حسابهایی که در آنها تراکنشی ثبت شده، با یک دستورالعمل account اعلان شدهاند؟ (بررسی خطای حساب)
- آیا همهٔ کالاها با یک دستورالعمل commodity اعلان شدهاند؟ (بررسی خطای کالا)
- آیا همهٔ تبدیلهای کالا به صراحت اعلان شدهاند؟
میتوانید از دستور check برای اجرای بررسیهای جداگانه استفاده کنید - مواردی که در بالا ذکر شد و چند مورد بیشتر.
دستورها (COMMANDS)
نرمافزار hledger زیردستورهای متنوعی را برای انجام کارها ارائه میدهد. بیشتر این دستورها فایل journal را تغییر نمیدهند؛ آنها فقط فایل را میخوانند و یک گزارش در خروجی ارائه میدهند. چند دستور به افزودن دادهها و مدیریت فایل کمک میکنند. برخی از دستورهای پرکاربرد عبارتند از add، print، register، balancesheet و incomestatement.
برای نمایش خلاصهای از دستورها، hledger را بدون هیچ آرگومانی اجرا کنید. میتوانید همین خلاصهٔ دستورها را در ابتدای بخش ۴: دستورها (PART 4: COMMANDS) در ادامه مشاهده کنید.
برای استفاده از یک دستور خاص، این فرمان را اجرا کنید: hledger CMD [CMDOPTS] [CMDARGS]،
- مقدار CMD نام کامل دستور، یا اختصار استاندارد آن است که در فهرست دستورها نمایش داده شده، یا هر پیشوند بدون ابهامی از نام آن دستور است.
- مقدار CMDOPTS گزینههای خاص دستور هستند (در صورت وجود). گزینههای خاص هر دستور باید حتماً بعد از نام دستور نوشته شوند. مثال: hledger print -x.
- مقدار CMDARGS آرگومانهای اضافی دستور هستند (در صورت وجود). بیشتر دستورهای hledger آرگومانهایی را در قالب یک پرسوجو (query) میپذیرند تا دادهها را به نحوی محدود کنند. مثال: hledger reg assets:checking.
برای مشاهدهٔ فهرست گزینهها، آرگومانها و مستندات یک دستور در ترمینال، دستور hledger CMD -h را اجرا کنید. مثال: hledger bal -h..SS دستورهای افزونه (Add-on commands) علاوه بر دستورهای داخلی، میتوانید دستورهای افزونه را نیز نصب کنید که در فهرست دستورهای hledger نیز نمایش داده خواهند شد. برخی از اینها را میتوان بهصورت بستههای جداگانه نصب کرد؛ موارد دیگر را میتوان در دایرکتوری bin/ از hledger یافت که مستندات آنها در https://hledger.org/scripts.html آمده است.
دستورهای افزونه برنامهها یا اسکریپتهایی در PATH پوستهٔ شما هستند که نام آنها با "hledger-" آغاز میشود و بدون پسوند یا با یک پسوند شناختهشده (".bat"، ".com"، ".exe"، ".hs"، ".js"، ".lhs"، ".lua"، ".php"، ".pl"، ".py"، ".rb"، ".rkt" یا ".sh") به پایان میرسد، و (در unix و mac) دارای مجوز اجرا برای کاربر جاری هستند.
میتوانید دستورهای افزونه را مستقیماً اجرا کنید: hledger-ui --watch.
یا میتوانید آنها را مانند دستورهای داخلی با خود hledger اجرا کنید: hledger ui --watch. در این حالت از فایل پیکربندی hledger استفاده خواهد شد، بنابراین میتوانید گزینههای سفارشی افزونه را در آنجا تنظیم کنید. (پیش از hledger نسخهٔ 1.50، آرگومان -- پیش از گزینههای افزونه لازم بود، اما اکنون دیگر نیازی نیست.)
گزینهها (OPTIONS)
برای مشاهدهٔ راهنمای عمومی خط فرمان، hledger -h را اجرا کنید. گزینهها را میتوان قبل یا بعد از نام دستور درج کرد. این گزینهها مختص واسط خط فرمان hledger هستند:
-
پرچمها: --conf=CONFFILE استفاده از گزینههای اضافی تعریفشده در این فایل کانفیگ. در صورت مشخص نشدن، به سمت بالا و در دایرکتوری کانفیگ XDG به دنبال hledger.conf (یا .hledger.conf در $HOME) میگردد. -n --no-conf نادیدهگرفتن هرگونه فایل پیکربندی
و گزینههای عمومی زیر بین بیشتر دستورهای hledger مشترک هستند:
-
پرچمهای عمومی ورودی/تبدیل داده: -f --file=[FMT:]FILE خواندن داده از FILE، یا از stdin اگر FILE برابر - باشد، با استنتاج قالب از پسوند یا پیشوند :FMT. میتواند بیش از یک بار مشخص شود. در صورت عدم تعیین، از $LEDGER_FILE یا $HOME/.hledger.journal میخواند. --rules=RULESFILE استفاده از قواعد تعریفشده در این فایل برای تبدیل فایلهای بعدی CSV/SSV/TSV. در صورت مشخص نشدن، برای هر FILE.csv از FILE.csv.rules استفاده میکند. --alias=A=B|/RGX/=RPL تبدیل نام حسابها از A به B، یا با جایگزینی تطابقهای عبارت باقاعده --auto تولید ثبتهای اضافی با اعمال قواعد ثبت خودکار ("=") بر روی تمام تراکنشها --forecast[=PERIOD] تولید تراکنشهای اضافی از روی قواعد دورهای ("~")، از پس از آخرین تراکنش عادی تا ۶ ماه بعد از اکنون. یا در طول PERIOD مشخصشده (علامت مساوی الزامی است). قواعد ثبت خودکار نیز بر روی این تراکنشها اعمال خواهند شد. در hledger-ui، همچنین تراکنشهای دارای تاریخ آینده را در آغاز نمایان میکند. -I --ignore-assertions بررسی نکردن گزارههای تراز بهطور پیشفرض --txn-balancing=... نحوهٔ بررسی تراز بودن تراکنشها: 'old': استفاده از دقت نمایش سراسری 'exact': استفاده از دقت تراکنش (پیشفرض) --infer-costs استنتاج ثبتهای ارزش ویژه تبدیل از هزینهها --infer-equity استنتاج هزینهها از ثبتهای ارزش ویژه تبدیل --infer-market-prices استنتاج قیمتهای بازار از هزینهها --pivot=TAGNAME استفاده از فیلد یا برچسبی دیگر بهعنوان نام حسابها -s --strict انجام بررسیهای خطای بیشتر (و لغو اثر -I) --verbose-tags افزودن برچسبهای نشاندهندهٔ دادههای تولید/ویرایششده پرچمهای عمومی خروجی/گزارشگیری (پشتیبانیشده در برخی دستورها): -b --begin=DATE شامل کردن ثبتها/تراکنشها در این تاریخ یا پس از آن -e --end=DATE شامل کردن ثبتها/تراکنشها پیش از این تاریخ (همراه با بازهٔ گزارش، با پایان زیردورهٔ بعدی تنظیم خواهد شد) -D --daily گزارش چنددورهای با بازهٔ ۱ روزه -W --weekly گزارش چنددورهای با بازهٔ ۱ هفتهای -M --monthly گزارش چنددورهای با بازهٔ ۱ ماهه -Q --quarterly گزارش چنددورهای با بازهٔ ۱ فصلی (سهماهه) -Y --yearly گزارش چنددورهای با بازهٔ ۱ ساله -p --period=PERIODEXP تنظیم تاریخ شروع، تاریخ پایان، و/یا بازهٔ گزارش، با انعطافپذیری بیشتر --today=DATE بازنویسی تاریخ امروز (بر تاریخهای نسبی اثر میگذارد) --date2 تطابق/استفاده از تاریخهای ثانویه بهجای آن (منسوخ) -U --unmarked فقط شامل کردن ثبتها/تراکنشهای بدون علامت -P --pending فقط شامل کردن ثبتها/تراکنشهای در انتظار -C --cleared فقط شامل کردن ثبتها/تراکنشهای تسویهشده (پرچمهای -U/-P/-C میتوانند ترکیب شوند) -R --real فقط شامل کردن ثبتهای غیرمجازی -E --empty نمایش موارد صفر، که معمولاً پنهان هستند. در hledger-ui و hledger-web عکس این عمل میکند. --depth=DEPTHEXP اگر یک عدد (یا NUM-) باشد: نمایش فقط NUM سطح بالای حسابها. اگر REGEXP=NUM باشد، محدودیت فقط بر حسابهای منطبق با عبارت باقاعده اعمال میشود. -B --cost نمایش مبالغ تبدیلشده به مبلغ هزینه/فروش آنها -V --market نمایش مبالغ تبدیلشده به ارزش آنها در پایان دوره(ها) در کالای ارزشگذاری پیشفرض آنها. معادل با --value=end. -X --exchange=COMM نمایش مبالغ تبدیلشده به ارزش آنها در پایان دوره(ها) در کالای مشخصشده. معادل با --value=end,COMM. --value=WHEN[,COMM] نمایش مبالغ تبدیلشده به ارزش آنها در تاریخ(های) مشخصشده در کالای ارزشگذاری پیشفرض یا یک کالای مشخصشده. مقدار WHEN میتواند چنین باشد: 'then': ارزش در تاریخهای تراکنش 'end': ارزش در پایان دوره(ها) 'now': ارزش امروز YYYY-MM-DD: ارزش در تاریخ معین -c --commodity-style=S بازنویسی سبک نمایش یک کالا. مثال: -c '.' یا -c '1.000,00 EUR' --pretty[=YN] استفاده از نویسههای کادرسازی در خروجی متنی؟ میتواند 'y'/'yes' یا 'n'/'no' باشد. در صورت تعیین YN، علامت مساوی الزامی است. پرچمهای عمومی راهنما: -h --help نمایش راهنمای خط فرمان --tldr نمایش مثالهای دستور با tldr --info نمایش دفترچهٔ راهنما با info --man نمایش دفترچهٔ راهنما با man --version نمایش اطلاعات نسخه --debug=[1-9] نمایش این میزان از خروجی اشکالزدایی (پیشفرض: 1) --pager=YN استفاده از صفحهبند در صورت نیاز؟ y/yes (پیشفرض) یا n/no --color=YNA --colour استفاده از رنگ ANSI؟ y/yes، n/no، یا auto (پیشفرض)
معمولاً hledger هر پیشوند بدون ابهامی از پرچم را میپذیرد؛ برای نمونه میتوانید بهجای --tldr بنویسید --tl یا بهجای --dry-run بنویسید --dry.
میتوانید پرچمهای کوتاهی را که آرگومان دریافت نمیکنند با یکدیگر ترکیب کنید؛ برای نمونه میتوانید بهجای -M -A -S -T بنویسید -MAST. پرچمهایی که نیازمند آرگومان هستند را نمیتوان به این صورت ترکیب کرد (-If FILE کار نخواهد کرد).
اگر یک گزینه بیش از یک بار در خط فرمان درج شود، معمولاً آخرین مورد (راستترین) اولویت دارد. بههمین ترتیب، اگر پرچمهای مانعةالجمع با هم استفاده شوند، پرچم راستتر اعمال میشود. (هنگامی که پرچمها مانعةالجمع باشند، معمولاً در --help یک پیشوند گروهی خواهند داشت.)
در بیشتر دستورها، آرگومانها بهعنوان یک پرسوجوی hledger تفسیر میشوند که دادهها را پالایش میکند. برخی از پرسوجوها را میتوان هم با گزینهها و هم با آرگومانها بیان کرد.
در ادامه نکتههای بیشتری برای استفاده از واسط خط فرمان آورده شده است - هر زمان که به آنها نیاز داشتید میتوانید آنها را مطالعه کنید..SS نویسههای خاص در دستوراتی که در خط فرمان تایپ میکنید، نویسههای خاصی دارای معنای ویژه هستند و گاهی لازم است با افزودن یک بکاسلش در ابتدا یا قرار دادن درون نقلقول، "گریزانده" یا "نقلقول" شوند.
اگر بتوانید استفاده از نویسههای خاص را در دادههای خود به حداقل برسانید، کمتر با این موضوع سر و کار خواهید داشت. به عنوان مثال، میتوانید به جای فاصله در نام حسابها از خط تیرهٔ - یا زیرخط _ استفاده کنید، و در مقادیر نیز از کد ارزی USD به جای نماد ارزی $ بهره ببرید.
اما اگر ترجیح میدهید از نامهای حساب دارای فاصله و $ استفاده کنید، مشکلی نیست. فقط از این موضوع آگاه باشید تا در صورت نیاز بتوانید به این سند مراجعه کنید. (بیشتر این مثالها روی یونیکس آزمایش شدهاند؛ اگر در ویندوز هستید ممکن است برخی جزئیات نیاز به انطباق داشته باشند.)
گریزاندن نویسههای خاص پوسته
اینها برخی از نویسههایی هستند که ممکن است برای پوستهٔ شما (برنامهای که خطوط فرمان را تفسیر میکند) معنای ویژهای داشته باشند:
- فاصله (SPACE)، <، >، (، )، |، \، %
- $ اگر بعد از آن یک نویسهٔ کلمهای (word character) بیاید
بنابراین برای مثال، برای تطبیق یک نام حساب حاوی فاصله، مانند "credit card"، این را ننویسید:
-
$ hledger register credit card
در عوض، نام را درون تکنقلقول قرار دهید:
-
$ hledger register 'credit card'
در یونیکس یا PowerShell ویندوز، اگر از نقلقول دوگانه استفاده کنید، پوستهٔ شما بیسر و صدا $ را به عنوان جایگزینی متغیر در نظر میگیرد. بنابراین احتمالاً باید از نقلقول دوگانه پرهیز کنید، مگر اینکه خواهان این رفتار باشید، مثلاً در یک اسکریپت:
-
$ hledger register "assets:$SOMEACCT"
اما در پنجرههای قدیمیتر CMD.EXE ویندوز، باید از نقلقول دوگانه استفاده کنید:
-
C:\Users\Me> hledger register "credit card"
در یونیکس یا PowerShell ویندوز، به عنوان جایگزینی برای نقلقولها میتوانید قبل از هر نویسهٔ خاص یک بکاسلش بنویسید:
-
$ hledger register credit\ card
در نهایت، از آنجا که آرگومانهای پرسوجوی hledger عبارتهای باقاعده هستند (که در زیر توضیح داده شدهاند)، میتوانید آن فاصله را با . که با هر نویسهای مطابقت دارد نیز پر کنید:
-
$ hledger register credit.card
گریزاندن نویسههای خاص در عبارتهای باقاعده
برخی نویسهها همچنین در عبارتهای باقاعده (که آرگومانهای hledger معمولاً چنین هستند) معنای ویژهای دارند. این نویسهها عبارتند از:
- •
- .، ^، $، [، ]، (، )، |، \
برای گریزاندن یکی از اینها، یک \ قبل از آن بنویسید. اما توجه داشته باشید که این علاوه بر گریزاندن پوسته در بالا است. بنابراین برای نویسههایی که هم برای پوسته و هم برای عبارتهای باقاعده خاص هستند، مانند \ و $، گاهی به دو سطح گریزاندن نیاز خواهید داشت.
برای مثال، یک گزارش تراز که از پرسوجوی cur: استفاده کرده و آن را فقط به ارز $ محدود میکند، باید به این صورت نوشته شود:
-
$ hledger balance cur:\\$
توضیح:
- 1.
- افزودن یک بکاسلش \ قبل از علامت دلار $ برای محافظت از آن در برابر عبارتهای باقاعده (تا به صورت تحتاللفظی و بدون معنای ویژه مطابقت داده شود).
- 2.
- افزودن یک بکاسلش دیگر قبل از آن بکاسلش، برای محافظت از آن در برابر پوسته (تا پوسته آن را مصرف نکند).
- 3.
- در این مورد نیازی به محافظت از $ در برابر پوسته نیست، زیرا پس از آن نویسهٔ کلمهای نیامده است؛ اما انجام این کار هم بیضرر است.
اما روش دیگری نیز برای نوشتن آن وجود دارد که معمولاً سادهتر است: افزودن بکاسلش برای گریز از عبارتهای باقاعده، و سپس محصور کردن آن در نقلقول برای گریز از پوسته:
-
$ hledger balance cur:'\$' گزینهها و آرگومانهای hledger گاهی در جاهایی به جز خط فرمان به کار میروند که قوانین گریز دادن/نقلقول (escaping/quoting) در آنها متفاوت است. برای نمونه، نقلقول با بکاسلش ممکن است در دسترس نباشد. در اینجا یک راهنمای مرجع سریع آورده شده است:
| در شل unix | از نقلقول تکی و/یا بکاسلش (یا نقلقول دوتایی برای جایگذاری متغیرها) استفاده کنید |
| در powershell ویندوز | از نقلقول تکی (یا نقلقول دوتایی برای جایگذاری متغیرها) استفاده کنید |
| در cmd ویندوز | از نقلقول دوتایی استفاده کنید |
| در اعلان فیلتر hledger-ui | از نقلقول تکی یا دوتایی استفاده کنید |
| در فرم جستجوی hledger-web | از نقلقول تکی یا دوتایی استفاده کنید |
| در یک فایل آرگومان | از فاصله استفاده نکنید، گریزدهی پوسته (shell-escape) انجام ندهید، گریزدهی عبارات منظم (regex-escape) را انجام دهید، در هر سطر یک آرگومان/گزینه بنویسید |
| در یک فایل پیکربندی | از نقلقول تکی یا دوتایی استفاده کنید و کل آرگومان را درون آن قرار دهید ('desc:a b' نه desc:'a b') |
| در ghci (محیط REPL زبان Haskell) | از نقلقول دوتایی استفاده کنید و کل آرگومان را درون آن قرار دهید |
کاراکترهای یونیکد
انتظار میرود hledger کاراکترهای غیر ascii را به درستی پردازش کند:
- آنها باید در فایلهای ورودی و در خط فرمان توسط تمامی ابزارهای hledger (مانند add، iadd، فرمهای جستجو/افزودن/ویرایش hledger-web و غیره) به درستی تجزیه شوند
- آنها باید توسط تمامی ابزارهای hledger به درستی نمایش داده شوند و چینش متن روی صفحه حفظ شود.
این امر نیازمند یک محیط به خوبی پیکربندیشده است. در اینجا چند نکته آورده شده است:
- یک locale برای سیستم باید پیکربندی شود تا بتواند کاراکترهای مورد استفاده را رمزگشایی کند. این مورد حیاتی است - بخش Text encoding و Install: Text encoding را ببینید.
- نرمافزار ترمینال شما (مانند Terminal.app، iTerm، CMD.exe، xterm و...) باید از یونیکد پشتیبانی کند. در ویندوز ممکن است نیاز به استفاده از Windows Terminal داشته باشید.
- ترمینال باید از قلمی استفاده کند که حاوی گلیفهای یونیکد مورد نیاز باشد.
- ترمینال باید طوری پیکربندی شود که کاراکترهای عریض (wide characters) را با عرض دوگانه نمایش دهد (جهت حفظ چینش گزارشها).
- در ویندوز، برای دستیابی به بهترین نتیجه باید hledger را در همان محیطی اجرا کنید که در آن ساخته شده است. به عنوان نمونه، hledger ساختهشده در محیط استاندارد CMD.EXE (مانند باینریهای موجود در صفحه دانلود ما) ممکن است در هنگام اجرا در ترمینال cygwin یا msys با مشکلات نمایشی مواجه شود و بالعکس. (به عنوان نمونه #961 را ببینید)..SS "عبارات باقاعده (Regular expressions)" یک عبارت باقاعده (regexp) قطعهمتن کوچکی است که در آن نویسههای خاصی (مانند .، ^، $، +، *، ()، |، []، \) معانی ویژهای دارند و زبان کوچکی را برای تطبیق دقیق متن تشکیل میدهند - که در hledger و جاهای دیگر بسیار کاربردی است. برای یادگیری کامل دربارهٔ آنها، از regular-expressions.info بازدید کنید.
ابزار hledger هر زمان که الگویی را برای تطبیق چیزی وارد کنید، از عبارات باقاعده پشتیبانی میکند؛ برای مثال در آرگومانهای جستار (query)، نامهای مستعار حساب، قواعد if در CSV، فرم جستجوی hledger-web، جستجوی / در hledger-ui و غیره. ممکن است لازم باشد آنها را داخل نقلقول (کوتیشن) قرار دهید، بهویژه در خط فرمان (به بخش نویسههای خاص در بالا مراجعه کنید). چند مثال در ادامه آمده است:
جستارهای نام حساب (برای استفاده در خط فرمان داخل نقلقول قرار گرفتهاند):
-
عبارت باقاعده: تطابقها: ------------------- ------------------------------------------------------------ bank assets:bank, assets:bank:savings, expenses:art:banksy, ... :bank assets:bank:savings, expenses:art:banksy :bank: assets:bank:savings '^bank' هیچکدام ( ^ با ابتدای متن مطابقت مییابد ) 'bank$' assets:bank ( $ با انتهای متن مطابقت مییابد ) 'big \$ bank' big $ bank ( \ معنای ویژهٔ نویسه بعدی را غیرفعال میکند ) '\bbank\b' assets:bank, assets:bank:savings ( \b با مرزهای کلمه تطابق دارد ) '(sav|check)ing' saving یا checking ( (|) با هر یک از دو حالت تطابق مییابد ) 'saving|checking' saving یا checking ( پرانتزهای بیرونی لازم نیستند ) 'savings?' saving یا savings ( ? با ۰ یا ۱ مورد از مورد پیشین تطابق مییابد ) 'my +bank' my bank, my bank, ... ( + با ۱ یا چند مورد از مورد پیشین تطابق مییابد ) 'my *bank' mybank, my bank, my bank, ... ( * با ۰ یا چند مورد از مورد پیشین تطابق مییابد ) 'b.nk' bank, bonk, b nk, ... ( . با هر نویسهای مطابقت دارد )
برخی جستارهای دیگر:
-
desc:'amazon|amzn|audible' تراکنشهای Amazon cur:EUR مبالغی با نماد کالای حاوی EUR cur:'\$' مبالغی با نماد کالای حاوی $ cur:'^\$$' فقط مبالغ $، نه مثلاً AU$ یا CA$ cur:....? مبالغی با نمادهای ۴ نویسهای یا بیشتر tag:.=202[1-3] مواردی با هر برچسبی که مقدار آن شامل 2021، 2022 یا 2023 باشد
نامهای مستعار حساب: پذیرش . بهجای : بهعنوان جداکنندهٔ حساب:
-
alias /\./=: تمام نقطهها در نامهای حساب را با دونقطه جایگزین میکند
نمایش چندین حساب سطح اول بهصورت ترکیبشده در یک حساب:
-
--alias='/^[^:]+/=combined' ( [^:] با هر نویسهای غیر از : تطابق دارد )
نمایش حسابها با حذف بخش سطح دوم:
-
--alias '/^([^:]+):[^:]+/ = \1' یک حساب سطح اول و یک حساب سطح دوم را تطبیق میدهد و آنها را فقط با حساب سطح اول جایگزین میکند ( \1 در متن جایگزینی بهمعنای "هر آنچه با نخستین بخش پرانتزدار عبارت باقاعده تطابق یافته" است )
قواعد CSV: تطبیق رکوردهای CSV حاوی کدهای MCC مرتبط با غذاخوری:
-
if \?MCC581[124]
تطبیق رکوردهای CSV با مبلغی مشخص در حوالی پایان یا آغاز ماه:
-
if %amount \b3\.99 & %date (29|30|31|01|02|03)$ عبارتهای باقاعده hledger از کتابخانه regex-tdfa میآیند. اگر آنطور که انتظار دارید عمل نمیکنند، دانستن دقیق مواردی که پشتیبانی میکنند مهم است:
- 1.
-
آنها به بزرگی و کوچکی حروف حساس نیستند (case insensitive).
- 2.
-
آنها تطبیق درونی هستند (نیازی نیست کل رشته مورد تطبیق را پوشش دهند).
- 3.
-
آنها از نوع POSIX ERE (عبارتهای باقاعده توسعهیافته) هستند.
- 4.
-
آنها همچنین از مرزهای کلمه گنو پشتیبانی میکنند (\b، \B، \<، \>).
- 5.
-
ارجاعهای به عقب (backreferences) هنگام جایگزینی متن در نامهای مستعار حساب یا قوانین CSV پشتیبانی میشوند؛ در این بخشها میتوان از ارجاعهای به عقب در رشته جایگزین برای ارجاع به گروههای گیرنده (capturing groups) در عبارت باقاعده جستجو استفاده کرد. در غیر این صورت، اگر \1 را بنویسید، با رقم 1 تطبیق مییابد.
- 6.
-
آنها از کمّیتسنجهای تنبل (*?)، تغییردهندههای حالت ((?s))، کلاسهای نویسه (\w، \d) یا هر چیز دیگری که در بالا ذکر نشده است پشتیبانی نمیکنند.
- 7.
-
آنها ممکن است (احتمالاً نه) بهدرستی از متنهای راستبهچپ یا دوجهته پشتیبانی نکنند.
چند نکته قابل توجه:
-
در دستورالعمل alias و گزینه --alias، عبارتهای باقاعده باید درون اسلشهای رو به جلو قرار گیرند (/REGEX/). در جاهای دیگر در hledger، این کار الزامی نیست.
-
در پرسوجوها، برای تطبیق یک فرانویسه عبارت باقاعده مانند $ به عنوان یک نویسه لفظی، یک بکاسلش در ابتدا قرار دهید. به عنوان مثال برای جستجوی مبالغ دارای علامت دلار در hledger-web، بنویسید cur:\$.
-
در خط فرمان، برخی از فرانویسهها مانند $ معنای خاصی برای شل دارند و بنابراین باید حداقل یک بار دیگر گریز داده شوند. بخش نویسههای خاص (Special characters) را ببینید.
فایلهای آرگومان (Argument files)
شما میتوانید مجموعهای از گزینهها و آرگومانهای خط فرمان را در یک فایل ذخیره کرده و سپس با نوشتن @FILE.args به عنوان یک آرگومان دستور hledger از آنها استفاده کنید. پسوند فایل .args مرسوم است، اما الزامی نیست. در یک فایل آرگومان:
- هر خط میتواند شامل یک آرگومان، پرچم یا گزینه باشد.
- خطوط خالی یا خطوطی که با # شروع میشوند نادیده گرفته میشوند.
- پرچم و مقدار یک گزینه باید با = به یکدیگر متصل شوند.
- مقدار یک گزینه یا یک آرگومان میتواند حاوی فاصله باشد. از نقلقولهای تکی یا جفتی استفاده نکنید.
- و بهطور کلی، از یک سطح نقلقول/گریز کمتر نسبت به خط فرمان استفاده کنید. به عنوان مثال cur:\$، نه cur:\\$ مانند آنچه در خط فرمان است.
برای مثال:
-
# cash.args assets:cash assets:charles schwab:sweep cur:\$ -c=$1.
-
$ hledger bal @cash.args
فایلهای پیکربندی (Config files)
با hledger نسخه 1.40 به بالا، میتوانید گزینهها و آرگومانهای اضافی خط فرمان را در یک فایل پیکربندی کاملتر hledger ذخیره کنید. در اینجا یک مثال کوچک آمده است:
-
# General options are listed first, and used with hledger commands that support them. --pretty # Options following a `[COMMAND]` heading are used with that hledger command only. [print] --explicit --infer-costs
برای استفاده از یک فایل پیکربندی، آن را با گزینه --conf مشخص کنید. گزینههای آن در نزدیکی ابتدای خط فرمان شما درج میشوند، بنابراین در صورت نیاز میتوانید آنها را با گزینههای خط فرمان بازنویسی کنید.
یا میتوانید با ایجاد hledger.conf در دایرکتوری جاری یا دایرکتوریهای بالاتر، یا .hledger.conf در دایرکتوری خانگی خود (~/.hledger.conf)، یا hledger.conf در دایرکتوری پیکربندی XDG خود (~/.config/hledger/hledger.conf)، یک فایل پیکربندی خودکار تنظیم کنید که هر زمان hledger را اجرا میکنید مورد استفاده قرار گیرد.
در اینجا یک نمونه پیکربندی دیگر وجود دارد که میتوانید از آن شروع کنید: https://github.com/simonmichael/hledger/blob/master/hledger.conf.sample
شما میتوانید نه تنها گزینهها، بلکه آرگومانها را نیز در فایل پیکربندی قرار دهید. اگر اولین کلمه در بخش بالایی (عمومی) یک فایل پیکربندی با خط تیره شروع نشود (مانند: print)، به عنوان آرگومان دستور در نظر گرفته میشود (و هر آرگومانی را در خط فرمان لغو میکند).
در رایانههای یونیکس، میتوانید یک خط shebang در بالای فایل پیکربندی اضافه کنید، مجوز اجرا را روی فایل تنظیم کرده و مانند یک اسکریپت از آن استفاده کنید. برای مثال (-S در برخی سیستمعاملها مورد نیاز است):
-
#!/usr/bin/env -S hledger --conf
شما میتوانید با افزودن پرچم -n/--no-conf به خط فرمان، فایلهای پیکربندی را نادیده بگیرید. این قابلیت هنگام استفاده از hledger در اسکریپتها یا هنگام عیبیابی مفید است. هنگامی که هر دو گزینه --conf و --no-conf استفاده شوند، گزینه سمت راستی اولویت دارد.
برای بررسی نحوه پردازش فایلهای پیکربندی، از --debug یا --debug=8 استفاده کنید. یا دستور setup را اجرا کنید که هرگونه فایل پیکربندی فعال را نمایش میدهد. (برخلاف سایر دستورات، خود setup تحت تأثیر فایلهای پیکربندی قرار نمیگیرد.)
هشدار!
قابلیتهای زیادی در hledger وجود ندارند که نیازمند هشدار باشند، اما این یکی هست!
فایلهای پیکربندی خودکار در عین راحتی، hledger را کمتر قابل پیشبینی و اتکا میکنند. ساختن یک فایل پیکربندی که رفتار یک گزارش را تغییر دهد یا اسکریپتها/برنامههای متکی بر hledger شما را به روشهایی خراب کند که بعداً شما را شگفتزده کند، آسان است.
اگر این را نمیخواهید:
- 1.
- فقط فایل hledger.conf را روی سیستم خود ایجاد نکنید.
- 2.
- همچنین مراقب دایرکتوریهای دانلودشده که ممکن است حاوی یک فایل hledger.conf باشند باشید.
- 3.
- همچنین اگر در حال اشتراکگذاری اسکریپتها، مثالها یا پشتیبانی هستید، توجه داشته باشید که دیگران ممکن است یک فایل hledger.conf داشته باشند.
برعکس، هنگامی که تصمیم به استفاده از این قابلیت گرفتید، سعی کنید به یاد داشته باشید:
- 1.
- هر زمان که یک دستور hledger طبق انتظار کار نکرد، دوباره آن را با -n (--no-conf) اجرا کنید تا ببینید آیا فایل پیکربندی مقصر بوده است یا خیر.
- 2.
- هر زمان که hledger را از یک اسکریپت فراخوانی میکنید، در نظر بگیرید که آیا آن فراخوانی باید از -n استفاده کند یا خیر.
- 3.
- در مورد آنچه در فایل پیکربندی خود قرار میدهید محتاط باشید؛ سعی کنید تأثیر آن را بر تمام گزارشهای خود در نظر بگیرید.
- 4.
- برای عیبیابی تأثیر فایلهای پیکربندی، با --debug یا --debug 8 اجرا کنید.
قابلیت فایل پیکربندی در hledger 1.40 اضافه شد..SS "تکمیل خودکار در پوسته (Shell completions)" اگر از پوستههای bash یا zsh استفاده میکنید، میتوانید در صورت تمایل تکمیل خودکار حساس به متن را برای خطوط فرمان hledger تنظیم کنید. فشردن hledger<SPACE><TAB><TAB> (که باید تمام دستورات hledger را فهرست کند) یا hledger reg acct:<TAB><TAB> (که باید نام حسابهای سطح بالای شما را فهرست کند) را امتحان کنید. اگر تکمیل خودکار کار نمیکند، یا برای جزئیات بیشتر، به Install > Shell completions مراجعه کنید.
خروجی (OUTPUT)
مقصد خروجی (Output destination)
دستورات hledger خروجی خود را بهطور پیشفرض به ترمینال ارسال میکنند. البته میتوانید با استفاده از نحو استاندارد پوسته، آن را تغییر مسیر دهید، مثلاً به درون یک فایل:
-
$ hledger print > foo.txt
برخی از دستورات (print، register، stats و دستورات balance) گزینهٔ -o/--output-file را نیز ارائه میدهند که همین کار را بدون نیاز به پوسته انجام میدهد. به عنوان مثال:
-
$ hledger print -o foo.txt $ hledger print -o - # write to stdout (the default)
قالب خروجی (Output format)
برخی از دستورات انواع دیگری از خروجی را نیز ارائه میدهند، نه فقط متن روی ترمینال. در اینجا آن دستورات و قالبهایی که در حال حاضر پشتیبانی میشوند آورده شده است:
| command | txt | html | csv/tsv | fods | beancount | sql | json |
| aregister | Y | Y | Y | Y | Y | ||
| balance | Y | Y | Y | Y | Y | ||
| balancesheet | Y | Y | Y | Y | Y | ||
| balancesheetequity | Y | Y | Y | Y | Y | ||
| cashflow | Y | Y | Y | Y | Y | ||
| incomestatement | Y | Y | Y | Y | Y | ||
| Y | Y | Y | Y | Y | Y | Y | |
| register | Y | Y | Y | Y | Y |
همچنین میتوانید با اجرای hledger CMD -h و بررسی گزینهٔ -O/--output-format=FMT ببینید که یک دستور از چه قالبهای خروجی پشتیبانی میکند،.PP میتوانید قالب خروجی را با استفاده از آن گزینه تعیین کنید:
-
$ hledger print -O csv # print CSV to standard output
یا با انتخاب یک پسوند نام فایل مناسب به کمک گزینهٔ -o/--output-file=FILE.FMT:
-
$ hledger balancesheet -o foo.csv # write CSV to foo.csv
در صورت نیاز، گزینهٔ -O میتواند با -o ترکیب شود تا پسوند فایل را لغو و جایگزین کند:
-
$ hledger balancesheet -o foo.txt -O csv # write CSV to foo.txt
در ادامه نکاتی پیرامون قالبهای مختلف خروجی آمده است.
خروجی متنی (Text output)
این حالت پیشفرض است: خروجی گزارش به صورت متن ساده و خوانا برای انسان، مناسب برای مشاهده با قلمی با عرض یکسان (monospace) در یک ترمینال. اگر دادههای شما حاوی نویسههای یونیکد یا عریض هستند، به ترمینال و قلمی نیاز خواهید داشت که آنها را به درستی نمایش دهند. (این امر ممکن است در MS Windows چالشبرانگیز باشد.)
برخی از گزارشها (register، aregister) به طور معمول از تمام عرض پنجره استفاده میکنند. اگر این حالت به درستی کار نمیکند یا مایل به تغییر آن هستید، میتوانید از گزینهٔ -w/--width استفاده کنید.
گزارشهای ترازنامه و موجودی (balance، balancesheet، incomestatement...) به هر میزان عرض که نیاز داشته باشند استفاده میکنند. گزارشهای چنددورهای و چندارزی اغلب میتوانند از عرض پنجره فراتر بروند. علاوه بر استفاده از یک صفحهبند (pager)، فنون کاربردی برای این وضعیت عبارتند از: --layout=bare، -X COMM، cur:، --transpose، --tree، --depth، --drop، تغییر وضعیت به خروجی html و غیره.
نویسههای رسم کادر (Box-drawing characters)
برنامهٔ hledger به طور پیشفرض حاشیههای جدول را به شکل ساده رسم میکند تا خطر بروز مشکلات نمایشی ناشی از عدم پشتیبانی ترمینال یا قلم از نویسههای رسم کادر به حداقل برسد.
اما ترمینال و قلم شما احتمالاً از آنها پشتیبانی میکنند؛ بنابراین توصیه میکنیم از پرچم --pretty برای نمایش جدولهای زیباتر در ترمینال استفاده کنید. این پرچم گزینهٔ مناسبی برای افزودن به فایل پیکربندی hledger شما است.
رنگ (Colour)
ابزار hledger تلاش میکند پشتیبانی از رنگهای ANSI و استایلهای متنی را به صورت خودکار شناسایی کند و در مواقع مناسب آن را به کار گیرد. (در حال حاضر، این قابلیت به صورت حداقلی استفاده میشود: برخی گزارشها اعداد منفی را با رنگ قرمز نمایش میدهند و خروجی راهنما از متن برجسته (bold) برای تأکید بهره میبرد.)
شما میتوانید با تنظیم متغیر محیطی NO_COLOR برای غیرفعال کردن آن، یا با استفاده از گزینهٔ --color/--colour (احتمالاً در فایل پیکربندیتان) همراه با مقدار y/yes یا n/no جهت اجبار به فعال یا غیرفعال بودن، این رفتار را تغییر دهید.
صفحهبندی (Paging)
در محیطهای شبهیونیکس (unix-like)، هنگام نمایش خروجیهای حجیم (در هر قالبی) در ترمینال، hledger تلاش میکند در صورت لزوم از یک صفحهبند استفاده کند. (میتوانید این قابلیت را با گزینهٔ --pager=no، مثلاً در فایل پیکربندی خود، غیرفعال کنید.)
صفحهبند هر بار یک صفحه از متن را نشان میدهد و به شما امکان میدهد برای دیدن متن بیشتر به بخشهای مختلف پیمایش کنید. هنگام فعال بودن آن، معمولاً کلید SPACE صفحهٔ بعدی را نشان میدهد، کلید h راهنما را باز میکند و q خارج میشود. کلیدهای پیمایش ماوس، کلیدهای جهتنما، و کلیدهای home/end/page up/page down نیز ممکن است کار کنند.
برنامهٔ hledger از صفحهبند مشخصشده در متغیر محیطی PAGER استفاده خواهد کرد؛ در غیر این صورت، در صورت وجود از less، و سپس در صورت دردسترس بودن از more استفاده خواهد کرد. (با یک استثنا: دستور hledger help -p TOPIC همواره از less استفاده میکند تا بتواند به بخش مربوط به آن مبحث پیمایش کند.)
انتظار میرود که صفحهبند رنگهای ANSI و استایلبندی متن hledger را نمایش دهد. اگر نویسههای بههمریخته و نامفهوم مشاهده میکنید، ممکن است نیاز باشد صفحهبند خود را برای پردازش کدهای ANSI پیکربندی کنید. یا میتوانید رنگ را طبق توضیحات بالا غیرفعال نمایید.
اگر از صفحهبند less استفاده میکنید، hledger سعی میکند با اجرای آن به همراه گزینههای اضافی اضافهشده به متغیر محیطی LESS شما، تجربهای همواره روان و بینقص ارائه دهد:
--chop-long-lines --hilite-unread --ignore-case --no-init --quit-if-one-screen --shift=8 --squeeze-blank-lines --use-backslash
و هنگامی که خروجی رنگی فعال باشد:
--RAW-CONTROL-CHARS
میتوانید با تعریف گزینههای مورد نظر خود در متغیر HLEDGER_LESS که به جای LESS استفاده خواهد شد، از این سازوکار جلوگیری کنید..SS خروجی HTML خروجی HTML میتواند با یک فایل اختیاری hledger.css در همان دایرکتوری استایلبندی شود.
خروجی HTML یک قطعهکد HTML خواهد بود، نه یک سند کامل HTML. مانند سایر خروجیهای hledger، برای نویسههای غیر-ASCII از کدگذاری متن locale سیستم استفاده خواهد کرد (بخش Text encoding را ببینید).
خروجی CSV / TSV
در خروجی CSV یا TSV، نشانههای گروهبندی ارقام (مانند جداکنندههای هزارگان) بهطور خودکار غیرفعال میشوند.
خروجی FODS
فرمت FODS همان قالب OpenDocument Spreadsheet بهصورت XML ساده است، آنگونه که توسط LibreOffice و OpenOffice پذیرفته میشود. اگر از برنامههای صفحهگسترده آنها استفاده میکنید، این قالب بهتر از CSV است زیرا در localeهای گوناگون کار میکند (نقطه اعشار در برابر کامای اعشار، ذخیره کدگذاری نویسهها در سرآیند XML و در نتیجه عدم بروز مشکل با اوملاوتها)، از ردیفها و ستونهای ثابت سرآیند، نوع سلولها (رشته در برابر عدد در برابر تاریخ)، تفکیک عدد و واحد پول (واحد پول نمایش داده میشود اما نوع سلول همچنان عددی و برای محاسبات در دسترس است)، سبکها (حالت برجسته/bold) و حاشیهها پشتیبانی میکند. ضمناً همچنان میتوانید با استفاده از ابزارهای مختلفی مانند libreoffice --headless یا ods2csv از FODS/ODS دادههای CSV را استخراج کنید.
خروجی Beancount
این قالب دفتر روزنامه Beancount است. میتوانید از این برای برونبری دادههای hledger خود به Beancount، مثلاً برای استفاده از برنامه تحت وب Fava بهره ببرید.
ابزار hledger تلاش خواهد کرد تا دادههای شما را بهطور خودکار متناسب با Beancount تنظیم کند. محتاط باشید و تبدیل را بررسی کنید تا زمانی که از درستی آن مطمئن شوید. اگر قصد دارید بهطور مکرر به Beancount خروجی بگیرید، ممکن است برای تبدیلی تمیزتر بخواهید از قواعد آن پیروی کنید:
- استفاده از نامهای حساب سازگار با Beancount
- استفاده از کدهای ارز بهجای نمادهای ارز
- استفاده از نشانهگذاری بهای تمامشده (cost notation) بهجای ثبتهای تبدیل حقوق صاحبان سهام (equity conversion postings)
- اجتناب از ثبتهای مجازی، تخصیصهای تراز (balance assignments) و تاریخهای ثانویه.
یک تنظیم اساسی وجود دارد که باید خودتان آن را مدیریت کنید: برای Beancount، نام حسابهای سطح بالا باید Assets، Liabilities، Equity، Income و/یا Expenses باشند. در صورت نیاز میتوانید از نامهای مستعار حساب برای بازنویسی موقت نامهای حساب خود استفاده کنید، مانند آنچه در فایل پیکربندی hledger2beancount.conf آمده است.
2024-12-20: چند مورد دیگر که هنوز برای شما بهطور خودکار انجام نمیشوند:
- دستورالعملهای P بهطور خودکار تبدیل نمیشوند - آنها را خودتان تبدیل کنید.
- تخصیصهای تراز (Balance assignments) تبدیل نمیشوند (Beancount از آنها پشتیبانی نمیکند) - آنها را با مقادیر صریح جایگزین کنید.
نامهای حساب Beancount
جدا از نامهای سطح بالا، hledger با بزرگ نوشتن حرف اول هر بخش، جایگزینی فاصلهها با -، جایگزینی سایر نویسههای پشتیبانینشده با C<HEXBYTES>، افزودن A به ابتدای بخشهایی از نام حساب که با یک حرف یا رقم آغاز نمیشوند، و افزودن :A به نامهای حسابی که فقط از یک بخش تشکیل شدهاند، نامهای حساب شما را به نامهای حساب معتبر در Beancount تبدیل میکند.
نامهای کالای Beancount
ابزار hledger نامهای کالای (commodity) شما را جهت تبدیل به نامهای معتبر کالا/ارز در Beancount تنظیم خواهد کرد؛ این نامها باید بین ۲ تا ۲۴ نویسه از حروف بزرگ، ارقام، یا '، .، _، - باشند که با یک حرف شروع شده و با یک حرف یا رقم پایان مییابند. ابزار hledger نمادهای ارزی شناختهشده را به کدهای ارزی ISO 4217 تبدیل میکند، حروف را بزرگ میسازد، فاصلهها را با - جایگزین میکند، سایر نویسههای پشتیبانینشده را با C<HEXBYTES> جایگزین مینماید، و در صورت نیاز C را به ابتدا یا انتهای آن میافزاید.
ثبتهای مجازی Beancount
ابزار Beancount اجازه استفاده از ثبتهای مجازی را نمیدهد؛ اگر مواردی از آنها را داشته باشید، از خروجی Beancount حذف خواهند شد.
متاداده Beancount
برچسبهای hledger به متادادههای Beancount تبدیل خواهند شد (بهجز برچسبهایی که نام آنها با _ آغاز میشود). نامهای متاداده طوری تنظیم میشوند که با Beancount سازگار باشند: با یک حرف کوچک آغاز شوند، حداقل دو نویسه طول داشته باشند، و نویسههای پشتیبانینشده کدگذاری شوند. مقادیر متاداده از نوع رشتهای (string) Beancount استفاده خواهند کرد.
در hledger، اشیاء میتوانند یک برچسب یکسان را با مقادیر متعدد تکرار کنند. برای نمونه یک حساب assets:cash ممکن است هر دو برچسب type:Asset و type:Cash را داشته باشد. برای Beancount این برچسبها با یکدیگر ترکیب شده و مقادیر آنها با کاما از هم جدا میشوند. مانند: type: "Asset, Cash"..SS "هزینههای Beancount (Beancount costs)" Beancount برخلاف hledger، هزینهها و ثبتهای تبدیل (conversion postings) اضافی را مجاز نمیداند. اگر هر یک از این موارد را داشته باشید، ثبتهای تبدیل حذف خواهند شد. در حال حاضر حداکثر از یک گروه «هزینه + ثبتهای تبدیل» در هر تراکنش پشتیبانی میکنیم.
ارز عملیاتی Beancount (Beancount operating currency)
اعلان یک (یا چند) ارز عملیاتی، گزارشهای Beancount و Fava را بهبود میبخشد. در حال حاضر hledger هر ارزی را که در مقادیر هزینه استفاده شده باشد به عنوان یک ارز عملیاتی اعلام میکند. در صورت نیاز، این موارد را با اعلان خود جایگزین کنید، مانند:
-
option "operating_currency" "USD"
خروجی SQL (SQL output)
انتظار میرود خروجی SQL دستکم با SQLite، MySQL و Postgres کار کند.
انتظار میرود دستورات SQL در یک پایگاه داده خالی اجرا شوند. اگر از قبل جدولهایی دارید که از طریق خروجی SQL در hledger ایجاد شدهاند، احتمالاً بهتر است پیش از درونریزی، یا دادههای آنها را پاک کنید (از طریق دستورات SQL مانند delete یا truncate) یا جدولها را بهطور کامل drop کنید؛ در غیر این صورت ثبتهای شما تکراری خواهند شد.
برای SQLite، مفیدتر است که فیلد id تولیدشده را به یک PRIMARY KEY تغییر دهید. به عنوان مثال:
-
$ hledger print -O sql | sed 's/id serial/id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL/g' | ...
این قابلیت هنوز چندان مورد استفاده قرار نگرفته است؛ از بازخوردها استقبال میشود.
خروجی JSON (JSON output)
خروجی JSON ما نسبتاً بزرگ و پرحجم (verbose) است، چرا که بازنمایی دقیقی از انواع دادههای داخلی hledger است. برای درک ساختار آن، تعاریف نوع Haskell را که بیشتر در نشانی زیر قرار دارند مطالعه کنید: https://github.com/simonmichael/hledger/blob/master/hledger-lib/Hledger/Data/Types.hs مشخصات OpenAPI مربوط به hledger-web نیز ممکن است مرتبط باشد.
hledger اعداد را گاهی تا ۲۵۵ رقم بااهمیت ذخیره میکند. این تعداد رقم برای بیشتر مصرفکنندگان JSON بیش از حد زیاد است، بنابراین در خروجی JSON اعداد را حداکثر تا ۱۰ رقم اعشار گرد میکنیم. (ما تعداد ارقام صحیح را محدود نمیکنیم.) اگر متوجه شدید که این مسئله مشکلی ایجاد میکند، لطفاً به ما اطلاع دهید. مرتبط: #1195
این قابلیت هنوز چندان مورد استفاده قرار نگرفته است؛ از بازخوردها استقبال میشود.
شیوههای کالا (Commodity styles)
هنگام نمایش مقادیر، hledger یک شیوه نمایش استاندارد را برای هر کالا/ارز استنتاج میکند، همانطور که در ادامه در «شیوه نمایش کالا» توضیح داده شده است.
در صورت نیاز، میتوان این شیوه را با گزینه -c/--commodity-style بازنویسی کرد (بهجز برای مقادیر هزینه و مقادیر نمایشدادهشده توسط دستور print، که همیشه با تمام ارقام اعشار نمایش داده میشوند). برای مثال، دستور زیر مقادیر دلاری را مجبور میکند تا به صورت نشاندادهشده نمایش داده شوند:
-
$ hledger print -c '$1.000,0'
این گزینه میتواند برای تعیین شیوه نمایش برای چندین کالا/ارز تکرار شود. آرگومان آن همانطور است که در دستورالعمل commodity شرح داده شده است. توجه داشته باشید که حذف نماد کالا، شیوه نمایش را تنها برای کالای بدون نماد تعیین میکند، نه تمام کالاها.
در برخی موارد hledger قالببندی اعداد را برای بهبود قابلیت تجزیه (parseability) آنها تنظیم میکند (مانند افزودن ممیزهای اعشاری انتهایی در صورت نیاز).
خروجی اشکالزدایی (Debug output)
هدف ما این است که عیبیابی، بررسی درونی و توسعه hledger نسبتاً آسان باشد. میتوانید --debug[=N] را به هر خط فرمان hledger اضافه کنید تا خروجی اشکالزدایی اضافی را مشاهده کنید. مقدار N از ۱ (کمترین خروجی، پیشفرض) تا ۹ (بیشترین خروجی) متغیر است. معمولاً از ۱ شروع میکنید و تا زمانی که خروجی کافی ببینید، آن را افزایش میدهید. خروجی اشکالزدایی به stderr ارسال میشود و تحت تأثیر -o/--output-file قرار نمیگیرد (مگر اینکه stderr را به stdout تغییر مسیر دهید، مانند: 2>&1). این خروجی با خروجی عادی درهمآمیخته میشود، که میتواند به آشکار شدن زمان ارزیابی بخشهایی از کد کمک کند. برای ثبت خروجی اشکالزدایی در یک فایل گزارش به جای آن، معمولاً میتوانید stderr را تغییر مسیر دهید، مانند:
-
hledger bal --debug=3 2>hledger.log
(این گزینه هنوز در فایل پیکربندی کار نمیکند.).SH "محیط (ENVIRONMENT)" این متغیرهای محیطی بر hledger تأثیر میگذارند:
HLEDGER_LESS اگر less صفحهبند (pager) شما باشد، این متغیر گزینههای less را که hledger باید استفاده کند، مشخص مینماید. (در غیر این صورت، LESS + گزینههای سفارشی استفاده میشوند.)
LEDGER_FILE فایل ژورنال پیشفرض، برای زمانی که هیچ گزینهٔ -f/--file ارائه نشده باشد. برای مثال، میتواند ~/finance/main.journal باشد. این مقدار همچنین میتواند یک الگوی glob باشد، مانند ./2???.journal. (اگر الگو با چندین فایل تطبیق یابد، تنها نخستین فایل بر اساس ترتیب الفبایی-عددی استفاده میشود.) اگر LEDGER_FILE به فایلی اشاره کند که وجود ندارد، خطایی رخ خواهد داد. اگر مقدار آن یک رشتهٔ خالی باشد، نادیده گرفته میشود.
اگر LEDGER_FILE تنظیم نشده باشد و -f نیز ارائه نشود، فایل ژورنال پیشفرض $HOME/.hledger.journal خواهد بود (یا چنانچه دایرکتوری خانگی شناسایی نشود، ./.hledger.journal).
همچنین بخش کارهای متداول > تنظیم LEDGER_FILE (Common tasks > Setting LEDGER_FILE) را ببینید.
NO_COLOR اگر این متغیر محیطی وجود داشته باشد (با هر مقداری، از جمله خالی)، hledger از کدهای رنگ ANSI در خروجی ترمینال استفاده نخواهد کرد، مگر اینکه با یک گزینهٔ صریح --color=y یا --colour=y لغو شود.
بخش ۲: قالبهای داده (PART 2: DATA FORMATS)
ژورنال (Journal)
منبع دادهٔ معمول hledger یک فایل متنی ساده (plain text) است که شامل ورودیهای ژورنال در قالب journal متعلق به hledger است. اگر بهدنبال یک مرجع سریع هستید، به برگهٔ تقلب ژورنال بروید (یا از فهرست مطالب در https://hledger.org/hledger.html استفاده کنید).
این فایل نشاندهندهٔ یک دفتر روزنامهٔ عمومی (General Journal) حسابداری است. پسوند فایل .journal بیشتر از همه استفاده میشود، گرچه کاملاً الزامی نیست. فایل ژورنال شامل تعدادی ورودی تراکنش است که هر یک انتقال پول (یا هر کالا و واحدی) را میان دو یا چند حساب نامگذاریشده، در قالبی ساده که هم برای انسان و هم برای hledger خواناست، توصیف میکند.
قالب ژورنال hledger با بیشتر بخشهای قالب ژورنال Ledger سازگار است، اما نه با همهٔ آن. تفاوتها و نکات تعاملپذیری در hledger and Ledger شرح داده شدهاند. با کمی دقت و اجتناب از ویژگیهای ناسازگار، میتوانید ژورنال hledger خود را برای Ledger نیز خوانا نگه دارید و برعکس. این امر میتواند برای مثال در مقایسهٔ رفتار یک برنامه در برابر برنامهٔ دیگر مفید باشد.
شما میتوانید بدون یادگیری بیشتر دربارهٔ این فایل از hledger استفاده کنید؛ تنها کافی است از دستورهای add یا web یا import برای ایجاد و بهروزرسانی آن بهره ببرید.
با این حال، بسیاری از کاربران فایل ژورنال را با یک ویرایشگر متن ویرایش میکنند و تغییرات را با یک سیستم کنترل نسخه مانند git پیگیری مینمایند. افزونههای ویرایشگر مانند ledger-mode یا hledger-mode برای Emacs، vim-ledger برای Vim، و hledger-vscode برای Visual Studio Code این کار را با افزودن رنگ، قالببندی، تکمیل با Tab، و دستورهای مفید آسانتر میکنند. برای فهرست کامل، Editors را در hledger.org ببینید.
یک فایل ژورنال hledger میتواند شامل سه نوع مورد باشد: خطوط توضیح، تراکنشها، و/یا دستورالعملها (شامل قواعد تراکنشهای دورهای و قواعد ارسال خودکار). درک قالب فایل ژورنال همچنین فهم خوبی از مدل دادهٔ hledger به شما خواهد داد. در ادامه یک برگهٔ تقلب/نمای کلی سریع، و بهدنبال آن توضیحات دقیق هر بخش آمده است.
برگهٔ تقلب ژورنال (Journal cheatsheet)
-
# ساختار دستوری اصلی قالب ژورنال hledger در اینجا آمده است # (بدون در نظر گرفتن دستور زبان اضافی برای سازگاری با Ledger). ############################################################################### # ۱. اینها خطوط توضیح هستند، برای یادداشتها یا غیرفعالسازی موقت موارد. ; آنها با # یا ; آغاز میشوند comment یا اینکه خطوط میتوانند درون "comment" / "end comment" قرار گیرند. این یک بلوک از خطوط توضیح است. end comment # برخی ورودیهای ژورنال میتوانند در انتهای خط توضیح با نقطهویرگول داشته باشند ; مانند این # برخی از آنها به ۲ یا چند فاصله قبل از نقطهویرگول نیاز دارند. ############################################################################### # ۲. دستورالعملها پردازش یا خروجی را به نوعی سفارشی میکنند. # برای شروع به هیچ دستورالعملی نیاز ندارید. # اما آنها میتوانند بررسی خطای بیشتری اضافه کنند، یا نحوهٔ نمایش موارد را تغییر دهند. # آنها با یک کلمه، حرف یا نماد آغاز میشوند. # آنها اغلب در بالا، پیش از تراکنشها قرار میگیرند. account assets ; اعلان نامهای حساب معتبر و ترتیب نمایش. account assets:savings ; یک زیرحساب. این یکی نشاندهندهٔ یک حساب بانکی است. account assets:checking ; دیگری. توجه: ۲+ فاصله پس از نام حساب. account assets:receivable ; نوع حسابداری از نامهای انگلیسی استنباط میشود، account passifs ; یا با یک برچسب "type" اعلام میگردد، type:L account expenses ; type:X ; یک خط توضیح ادامهدار، با تورفتگی. account expenses:rent ; دستههای هزینه و درآمد نیز حساب هستند. ; زیرحسابها نوع والد خود را به ارث میبرند. commodity $0.00 ; اعلان کالاهای معتبر و سبکهای نمایش آنها. commodity 1.000,00 EUR decimal-mark . ; نشانگر اعشار استفادهشده در این فایل (در صورت مبهم بودن). payee Whole Foods ; اعلان یک نام دریافتکننده وجه معتبر. tag trip ; اعلان یک نام برچسب معتبر. P 2024-03-01 AAPL $179 ; اعلان قیمت بازار برای AAPL به $ در این تاریخ. include other.journal ; درج یک فایل ژورنال دیگر در اینجا. # اعلان یک «تراکنش دورهای» ("periodic transaction")، برای گزارشهای بودجه/پیشبینی ~ monthly set budget goals ; <- توجه: ۲+ فاصله پیش از شرح. (expenses:rent) $1000 (expenses:food) $500 # اعلان یک قاعدهٔ ارسال خودکار، برای تغییر تراکنشهای موجود در گزارشها = revenues:consulting liabilities:tax:2024:us *0.25 ; افزودن بدهی مالیاتی و هزینه expenses:tax:2024:us *-0.25 ; به میزان ۲۵٪ از درآمد. ############################################################################### # ۳. تراکنشها اصل ماجرا هستند. # آنها رویدادهای تاریخداری هستند، معمولاً انتقال پول میان ۲ یا چند حساب. # آنها با یک تاریخ عددی آغاز میشوند. # شکل کلی آنها بدین صورت است: # # DATE DESCRIPTION ; تاریخ و شرح اختیاری تراکنش. # ACCOUNT1 AMOUNT ; ثبت یک مبلغ به/از این حساب، با تورفتگی. # ACCOUNT2 AMOUNT ; ثبت دوم، که ثبت اول را تراز میکند. # ... ; موارد بیشتر در صورت نیاز. مجموع مبالغ باید صفر شود. # ; توجه: ۲+ فاصله بین نامهای حساب و مبالغ. 2024-01-01 opening balances ; در ابتدا، موجودیهای از پیش موجود را بدین صورت اعلام کنید. assets:savings $10000 ; نام حساب میتواند هر چیزی باشد. حروف کوچک تایپ آسانتری دارند. assets:checking $1000 ; assets، liabilities، equity، revenues، expenses رایج هستند. liabilities:credit card $-500 ; موجودیهای liabilities، equity، revenues معمولاً منفی هستند. equity:start ; یک مبلغ میتواند خالی بماند. $-10500 در اینجا استنباط میشود. ; برخی از این حسابها را در بالا اعلان نکردیم، ; بنابراین -s/--strict ایراد خواهد گرفت. 2024-01-03 ! (12345) pay rent ; خطوط توضیح اضافی تراکنش، با تورفتگی. ; میتواند یک ! یا * پس از تاریخ باشد به معنای «در انتظار» ("pending") یا «تسویهشده» ("cleared"). ; میتواند یک (code) داخل پرانتز پس از تاریخ/وضعیت وجود داشته باشد. ; علامت مبالغ جهت گردش را نشان میدهد. assets:checking $-500 ; منفی یعنی برداشت از این حساب (بستانکار/credit). expenses:rent $500 ; مثبت یعنی واریز به این حساب (بدهکار/debit). ; نگهداشتن تراکنشها به ترتیب تاریخ اختیاری است (اما به بررسی خطا کمک میکند). 2024-01-02 Gringott's Bank | withdrawal ; شرح میتواند بهصورت PAYEE | NOTE باشد assets:bank:gold -10 gold assets:pouch 10 gold 2024-01-02 shopping expenses:clothing 1 gold expenses:wands 5 gold assets:pouch -6 gold 2024-01-02 receive gift revenues:gifts -3 "Chocolate Frogs" ; نمادهای پیچیدهٔ کالا assets:pouch 3 "Chocolate Frogs" ; باید داخل علامت نقلقول باشند. 2024-01-15 buy some shares, in two lots ; هزینه میتواند قید شود. assets:investments:2024-01-15 2.0 AAAA @ $1.50 ; @ به معنای هزینهٔ هر واحد است assets:investments:2024-01-15-02 3.0 AAAA @@ $4 ; @@ به معنای هزینهٔ کل است ; ^ زیرحسابهای به ازای هر بهر (lot) گاهی مفید هستند. assets:checking $-7 2024-01-15 assert some account balances on this date ; موجودیها را میتوان در هر تراکنش با = تصدیق کرد، برای بررسی خطای بیشتر. ; تراکنشهای تصدیقی مانند این را میتوان با hledger close --assert --show-costs ایجاد کرد ; assets:savings $0 = $10000 assets:checking $0 = $493 assets:bank:gold 0 gold = -10 gold assets:pouch 0 gold = 4 gold assets:pouch 0 "Chocolate Frogs" = 3 "Chocolate Frogs" assets:investments:2024-01-15 0.0 AAAA = 2.0 AAAA @ $1.50 assets:investments:2024-01-15-02 0.0 AAAA = 3.0 AAAA @@ $4 liabilities:credit card $0 = $-500 2024-02-01 note some event, or a transaction not yet fully entered, on this date ; ثبتها (postings) الزامی نیستند. # قالب تاریخ یکدست YYYY-MM-DD توصیه میشود، # اما در صورت تمایل میتوانید از . یا / استفاده کرده و صفرهای ابتدایی را حذف کنید. 2024.01.01 2024/1/1 خطوط دفتر روزنامه (journal) در صورتی که با یک علامت هش (#) یا یک نقطه-ویرگول (;) آغاز شوند نادیده گرفته خواهند شد. (همچنین بخش «سایر ساختارها» را ببینید.) برنامه hledger همچنین بخشهایی را که با یک خط comment آغاز شده و با یک خط end comment (یا انتهای فایل) پایان مییابند، نادیده میگیرد. در اینجا پیشنهادی برای انتخاب میان آنها آورده شده است:
-
# برای یادداشتهای سطح بالا -
; برای کامنت کردن موقت موارد -
comment برای کامنت کردن سریع بخشهای بزرگ (به خاطر داشته باشید که آنجاست، وگرنه ممکن است گیج شوید)
برای مثال:
-
# a comment line ; another commentline comment A multi-line comment block, continuing until "end comment" directive or the end of the current file. end comment
برخی مدخلهای hledger میتوانند کامنتهای درونخطی داشته باشند، از ; (نقطه-ویرگول) تا پایان خط. بخشهای «کامنتهای تراکنش» (Transaction comments)، «کامنتهای ثبت» (Posting comments) و «کامنتهای حساب» (Account comments) را در ادامه ببینید.
تراکنشها (Transactions)
تراکنشها واحد اصلی اطلاعات در یک فایل دفتر روزنامه هستند. آنها نشاندهنده رویدادها هستند، معمولاً جابهجایی مقداری از داراییها بین دو یا چند حساب مشخص.
هر تراکنش به عنوان یک مدخل در دفتر روزنامه ثبت میشود که با یک تاریخ ساده در ستون 0 آغاز میگردد. پس از آن میتواند هر یک از فیلدهای اختیاری زیر قرار گیرد که با فاصله از هم جدا میشوند:
- یک نویسه وضعیت (خالی، !، یا *)
- یک کد (هر عدد یا متن کوتاه، محصور در پرانتز)
- یک شرح (هر متن باقیمانده تا انتهای خط یا نقطه-ویرگول)
- یک کامنت (هر متن باقیمانده پس از یک نقطه-ویرگول تا انتهای خط، و هر خط تورفته پس از آن که با نقطه-ویرگول آغاز شود)
- 0 یا چند خط تورفته ثبت (posting)، که توصیفکننده موارد منتقلشده و حسابهای درگیر است (خطوط کامنت تورفته نیز مجاز هستند، اما خطوط خالی یا خطوط بدون تورفتگی مجاز نیستند).
در اینجا یک فایل دفتر روزنامه ساده شامل یک تراکنش آورده شده است:
-
2008/01/01 income assets:bank:checking $1 income:salary $-1
تاریخها (Dates)
تاریخهای ساده (Simple dates)
تاریخها در فایل دفتر روزنامه از قالب تاریخهای ساده استفاده میکنند: YYYY-MM-DD یا YYYY/MM/DD یا YYYY.MM.DD، که صفرهای ابتدایی در آنها اختیاری است. ممکن است سال حذف شود، که در این حالت از زمینه استنباط خواهد شد: تراکنش فعلی، سال پیشفرضی که با دستورالعمل Y تنظیم شده، یا تاریخ جاری هنگام اجرای دستور. چند مثال: 2010-01-31، 2010/01/31، 2010.1.31، 1/31.
(رابط کاربری علاوه بر تاریخهای ساده، تاریخهای هوشمندِ انعطافپذیرتر را که در دفترچه راهنمای hledger مستند شدهاند نیز میپذیرد.)
تاریخهای ثبت (Posting dates)
میتوانید با افزودن یک کامنت ثبت شامل یک برچسب (در ادامه ببینید) مانند ; date:DATE، به هر یک از ثبتها تاریخی متفاوت از تراکنش والد اختصاص دهید. (همچنین یک ساختار سازگار با Ledger وجود دارد: ; [DATE]، که میتواند کارآمد باشد.)
این روش احتمالاً بهترین راه برای کنترل دقیق تاریخهای ثبت است. برای مثال در این نمونه، هزینه باید در گزارشهای May نمایش داده شود و کسر از حساب checking باید در 6/1 گزارش شود تا تطبیق بانکی به سادگی انجام گیرد:
-
2015/5/30 expenses:food $10 ; food purchased on saturday 5/30 assets:checking ; bank cleared it on monday, date:6/1 -
$ hledger -f t.j register food 2015-05-30 expenses:food $10 $10
-
$ hledger -f t.j register checking 2015-06-01 assets:checking $-10 $-10
مقدار DATE باید یک تاریخ ساده باشد؛ اگر سال مشخص نشده باشد، از سالِ تاریخ تراکنش استفاده خواهد شد.
برچسب date: در صورت وجود باید یک مقدار معتبر از تاریخ ساده داشته باشد؛ برای مثال، برچسب date: بدون مقدار مجاز نیست..SS "وضعیت (Status)" تراکنشها (یا ثبتهای مجزا درون یک تراکنش) میتوانند یک نشان وضعیت داشته باشند، که نویسهای منفرد پیش از شرح تراکنش (یا نام حسابِ ثبت) است، با یک فاصله از آن جدا میشود، و نشاندهنده یکی از سه وضعیت زیر است:
| نشان | وضعیت |
| unmarked (بدون نشان) | |
| ! | pending (در انتظار) |
| * | cleared (تسویهشده) |
هنگام گزارشگیری، میتوانید با پرچمهای -U/--unmarked، -P/--pending و -C/--cleared بر اساس وضعیت فیلتر کنید (و میتوانید این پرچمها را ترکیب کنید، برای مثال -UP برای تطبیق همه موارد به جز موارد تسویهشده). یا میتوانید از پرسوجوهای status:، status:! و status:*، یا کلیدهای U، P و C در hledger-ui استفاده کنید.
(یادداشت: در Ledger وضعیت "unmarked" به نام "uncleared" خوانده میشود؛ در hledger ما آن را برای شفافیت معنایی به "unmarked" تغییر نام دادیم.)
نشانهای وضعیت اختیاری هستند، اما میتوانند به عنوان مثال برای مغایرتگیری با حسابهای دنیای واقعی (real-world) مفید باشند. برخی حالتهای ویرایشگر قابلیت برجستهسازی و میانبرهایی را برای کار با وضعیت ارائه میدهند. برای مثال در ledger-mode ایمکس (Emacs)، میتوانید وضعیت تراکنش را با C-c C-e، یا وضعیت ثبت را با C-c C-c تغییر وضعیت (toggle) دهید.
اینکه "uncleared"، "pending" و "cleared" در عمل واقعاً چه معنایی دارند، به شما بستگی دارد. در اینجا یک پیشنهاد آمده است:
| وضعیت | معنا |
| uncleared | ثبتشده اما هنوز مغایرتگیری نشده است؛ نیازمند بازبینی |
| pending | بهطور موقت مغایرتگیریشده (در صورت نیاز، مثلاً حین یک مغایرتگیری بزرگ) |
| cleared | کامل، تا حد امکان مغایرتگیریشده، و درست در نظر گرفتهشده |
با این شیوه، میتوانید از -PC برای دیدن موجودی فعلی در بانک خود، از -U برای مشاهده مواردی که احتمالاً بهزودی در بانک شما اعمال میشوند (مانند چکهای وصولنشده)، و بدون هیچ پرچمی برای دیدن بهروزترین وضعیت مالی خود استفاده کنید..SS "کد (Code)" پس از نشانگر وضعیت، اما پیش از شرح، میتوانید بهصورت اختیاری یک "کد" (code) برای تراکنش، مانند شماره چک یا شناسهٔ تراکنش را محصور در پرانتز بنویسید.
این کار چند محدودیت دارد: کد نباید حاوی پرانتز بسته باشد (وگرنه کوتاه و بریده خواهد شد). کدها معمولاً تراز گزارش دفاتر (register report) را به هم میزنند و بازبینی چشمی آن را سختتر میکنند. همچنین نمیتوانید در هر تراکنش بیش از یک مقدار در آن ذخیره کنید. به این دلایل ممکن است ترجیح دهید از فیلد کد اجتناب کرده و در عوض از tags(#tags] استفاده کنید.
شرح (Description)
پس از فیلدهای تاریخ، نشانگر وضعیت و/یا کد، باقیماندهٔ سطر (یا تا جایی که کامنت با ; آغاز شود) شرح تراکنش است. در اینجا میتوانید تراکنش را توصیف کنید (که در حسابداری سنتی "شرح سند" نامیده میشود)، یا میتوانید نام دریافتکننده/پرداختکننده (payee/payer) را ثبت کنید، یا آن را خالی بگذارید.
شرحهای تراکنش در خروجی دستور print و در گزارشهای register نمایش داده میشوند و میتوان آنها را با دستور descriptions فهرست کرد.
میتوانید با استفاده از desc:DESCREGEX بر اساس شرح پرسوجو کنید، یا با --pivot desc گزارش را بر اساس شرح محوری (pivot) کنید.
دریافتکننده و یادداشت (Payee and note)
گاهی افراد یک فیلد اختصاصی دریافتکننده/پرداختکننده میخواهند که بتوان آن را با دقت بیشتری پرسوجو و بررسی کرد. اگر چنین چیزی میخواهید، میتوانید یک نویسهٔ | (خط عمودی/pipe) در شرح بنویسید. این کار آن را به یک فیلد "payee" در سمت چپ و یک فیلد "note" در سمت راست تقسیم میکند. (هر یک از آنها میتوانند خالی باشند.)
میتوانید این موارد را با payee:PAYEEREGEX و note:NOTEREGEX پرسوجو کنید، مقادیر آنها را با دستورهای payees و notes فهرست نمایید، یا روی payee یا note عملیات محوربندی (pivot) انجام دهید.
نکته: در تراکنشهای فاقد نویسهٔ |، مقادیر description، payee و note همگی یکسان هستند. بهمحض اضافه شدن یک |، آنها از یکدیگر مجزا میشوند. (اگر مایلید این رفتار تغییر کند، لطفاً آن را در لیست پستی مطرح کنید.)
اگر خواستار بررسی دقیقتر خطاها هستید، میتوانید نامهای معتبر دریافتکننده را با دستورالعملهای payee تعریف کنید، و سپس این موارد را با hledger check payees اعمال و اعتبارسنجی نمایید. (توجه: به دلیل نکتهٔ ذکر شده در بالا، برای این کار باید مطمئن شوید شرح هر تراکنش شامل یک | و در نتیجه یک نام payee قابلبررسی باشد، حتی اگر خالی بماند.)
کامنتهای تراکنش (Transaction comments)
متنی که پس از ;، بعد از شرح تراکنش، و/یا در سطرهای تورفته بلافاصله زیر آن قرار میگیرد، کامنتهای آن تراکنش را تشکیل میدهد. این کامنتها توسط print بازتولید میشوند اما در غیر این صورت نادیده گرفته خواهند شد، مگر اینکه حاوی برچسبها (tags) باشند که در آن صورت نادیده گرفته نمیشوند.
-
2012-01-01 something ; a transaction comment ; a second line of transaction comment expenses 1 assets
ثبتها (Postings)
یک ثبت عبارت است از افزودن مقداری به، یا کسر مقداری از یک حساب. هر سطر ثبت با حداقل یک فاصله یا تب آغاز میشود (معمولاً ۲ یا ۴ فاصله)، و در ادامه:
- (اختیاری) یک نویسهٔ وضعیت (خالی، ! یا *)، به همراه یک فاصله در ادامه
- (الزامی) یک نام حساب (هر متنی، اختیاری شامل فاصلههای تکی. اگر هر چیزی بعد از نام حساب در همان سطر بیاید، نام حساب باید به دو یا چند فاصله ختم شود.)
- (اختیاری) یک مبلغ
- (اختیاری) یک کامنت ثبت در همان سطر، که با یک نقطهویرگول (;) آغاز میشود.
اگر مبلغ مثبت باشد، به حساب افزوده میشود؛ اگر منفی باشد، از حساب کسر میگردد.
مبالغ ثبت در یک تراکنش باید مجموعاً برابر با صفر شوند، که نشان میدهد ورودیها و خروجیها برابر هستند. ما این را یک تراکنش تراز شده (balanced transaction) مینامیم. (میتوانید دربارهٔ جزئیات تراز کردن تراکنش در ادامه اطلاعات بیشتری کسب کنید.)
اگر مبلغی نوشته نشود، بهطور خودکار از سایر ثبتهای درون تراکنش محاسبه خواهد شد تا تراکنش تراز شود. به عبارت دیگر، در هر تراکنش میتوانید برای صرفهجویی در تایپ، یک ثبت را بدون مبلغ رها کنید..SS بدهکار و بستانکار (Debits and credits) مفاهیم سنتی حسابداری بدهکار و بستانکار مسلماً در hledger وجود دارند، اما ما آنها را با علامت عددی نمایش میدهیم. مبالغ مثبت و منفی ثبتی (posting) به ترتیب نمایانگر بدهکار و بستانکار هستند.
نیازی نیست این موضوع را حفظ کنید، اما اگر تمایل دارید - مثلاً برای راهنمایی تازهواردها یا گفتگو با حسابدارتان - این یک عبارت یادیار مفید است:
debit / plus / left / short words
credit / minus / right / longer words
نامهای حساب (Account names)
حسابها شیوه اصلی دستهبندی موارد در hledger هستند. همانند دفترداری دوطرفه، آنها میتوانند نمایانگر حسابهای دنیای واقعی (مانند یک حساب بانکی)، یا دستهبندیهای انتزاعیتر مانند «پول خرجشده برای غذا» یا «پول قرضگرفتهشده از فرانک» باشند.
نامهای حساب منعطف هستند. میتوانند با حروف بزرگ یا کوچک نوشته شوند؛ میتوانند شامل حروف، اعداد، علائم نگارشی، نمادها، یا فاصلههای تکی باشند؛ و میتوانند به هر زبانی باشند.
بهطور معمول از پنج دستهبندی سنتی حسابداری بهعنوان نقطه شروع نامگذاری حسابها استفاده میکنیم. در انگلیسی این دستهها عبارتند از:
assets, liabilities, equity, revenues, expenses
این موارد در ادامه در بخش انواع حساب (Account types) بیشتر مورد بحث قرار خواهند گرفت. در مستندات hledger ممکن است این موارد را بهصورت اختصاری با A، L، E، R و X ببینید.
جداکننده دو فاصله (Two space delimiter)
به جداکننده دو یا چند فاصله که گاهی پس از نامهای حساب لازم است، توجه داشته باشید. نامهای حساب در hledger که از Ledger به ارث رسیدهاند، بسیار منعطف هستند؛ آنها میتوانند تقریباً شامل هر نوع متنی، از جمله فاصلههای تکی و نقطهویرگول باشند. به همین دلیل، اگر چیزی در همان خط به دنبال آنها بیاید، باید با دو یا چند فاصله خاتمه یابند. برای مثال، اگر یک مبلغ، انتساب موجودی (balance assignment)، یا توضیحی در همان خط پس از نام حساب بیاید، باید پیش از آنها دو یا چند فاصله قرار گیرد، در غیر این صورت بخشی از نام حساب در نظر گرفته خواهند شد:
-
bad: assets:accounts receivable $10 ; <- too close! good: assets:accounts receivable $10
-
bad: assets:accounts receivable =$1000 ; <- too close! good: assets:accounts receivable =$1000
-
bad: assets:accounts receivable ; comment. <- too close! good: assets:accounts receivable ; comment
این جداکننده دو فاصلهای در چند بخش از hledger دیده میشود؛ مانند پس از نامهای حساب در ثبتها (postings) یا دستورالعملهای حساب (account directives)؛ و همچنین پس از عبارت دوره زمانی در قواعد تراکنشهای دورهای. در ابتدای کار، انتظار داشته باشید که حداقل یک بار این موضوع شما را به اشتباه بیندازد. این مسئله گاهی آزاردهنده است، اما به ما اجازه میدهد ضمن حفظ سادگی نحو (syntax)، از نامهای حساب رسا و واضح استفاده کنیم.
سلسلهمراتب حساب (Account hierarchy)
برای گزارشگیری دقیقتر، معمولاً با قرار دادن دونقطه (:) بین بخشهای نام حساب، آنها را به زیرحسابها، زیرزیرحسابها و موارد جزئیتر تقسیم میکنیم. بهعنوان مثال، بهجای نوشتن assets و expenses، ممکن است بنویسیم assets:bank:checking و expenses:food. از این نامها، hledger این سلسلهمراتب شامل پنج حساب را استنباط خواهد کرد:
-
assets assets:bank assets:bank:checking expenses expenses:food
یا بهصورت یک ساختار درختی:
-
assets bank checking expenses food
گزارشهای hledger میتوانند درخت حسابها را در هر عمقی خلاصه کنند، بنابراین میتوانید زیردستههای خود را تا هر اندازه که مایلید با جزئیات تعریف کنید. اما بهویژه در شروع کار زیادهروی نکنید؛ دستهبندیهای سادهتر زحمت کمتری دارند..SS سایر ویژگیهای نام حساب قراردادن نام حساب در پرانتز یا قلاب، مانند (expenses:food)، قابلیتی غیراستاندارد در حسابداری را فعال میکند: ثبتهای مجازی (virtual postings).
نامهای حساب را میتوان با استفاده از نامهای مستعار حساب (account aliases)، بهطور موقت یا دائمی بازنویسی کرد و ساختارشان را تغییر داد.
مقادیر (Amounts)
پس از نام حساب، معمولاً یک مقدار قرار میگیرد. (به یاد داشته باشید: بین نام حساب و مقدار، باید دو یا چند فاصله وجود داشته باشد.)
قالب مقدار در hledger انعطافپذیر است و از چندین قالب بینالمللی پشتیبانی میکند. در اینجا چند مثال آورده شده است. مقادیر دارای یک عدد (همان «تعداد» یا «quantity») هستند:
-
1
..و معمولاً یک نماد ارز یا نام کالا (commodity) (توضیحات بیشتر در ادامه)، در سمت چپ یا راست مقدار عددی، با یا بدون فاصله جداکننده:
-
$1 4000 AAPL 3 "green apples"
پیش از مقادیر میتواند علامت منفی (یا علامت مثبت، هرچند مثبت پیشفرض است) بیاید. این علامت میتواند قبل یا بعد از نماد کالای واقع در سمت چپ نوشته شود:
-
-$1 $-1
یک یا چند فاصله بین علامت و عدد هنگام تجزیه (parsing) پذیرفته میشود (اما در خروجی نمایش داده نخواهند شد):
-
+ $1 $- 1
نماد علمی E مجاز است:
-
1E-6 EUR 1E3
نشانههای اعشار (Decimal marks)
یک نشانه اعشار میتواند بهصورت نقطه یا کاما نوشته شود:
-
1.23 1,23
هر دوی اینها در قالبهای بینالمللی اعداد رایج هستند، بنابراین hledger نسبت به یکی بر دیگری تعصبی ندارد. از آنجا که hledger از نشانههای گروهبندی ارقام (مانند جداکنندههای هزارگان) نیز پشتیبانی میکند، این بدان معناست که عددی مانند 1,000 یا 1.000 که تنها شامل یک نقطه یا کاما باشد، مبهم است. در چنین مواردی، hledger بهطور پیشفرض آن را نشانه اعشار در نظر میگیرد و هر دوی آنها را به عنوان 1 تجزیه خواهد کرد.
برای کمک به hledger جهت تجزیه دقیقتر چنین اعداد مبهمی، اگر از نشانههای گروهبندی ارقام استفاده میکنید، توصیه میکنیم نشانه اعشار را صریحاً تعریف کنید. بهترین روش افزودن یک دستورالعمل decimal-mark در ابتدای هر فایل داده است، مانند این:
-
decimal-mark .
یا میتوانید آن را به ازای هر کالا با دستورالعملهای commodity که در ادامه شرح داده شده است، تعریف کنید.
hledger همچنین اعدادی مانند 10. را بدون هیچ رقمی پس از نشانه اعشار میپذیرد (و گاهی اوقات اعداد را برای رفع ابهام به همین شکل نمایش میدهد - بخش نشانههای اعشار پایانی یا Trailing decimal marks را ببینید)..SS "نشانههای تفکیک ارقام (Digit group marks)" در بخش صحیح مقدارِ مبلغ (سمت چپ نشانهٔ اعشار)، گروههای ارقام میتوانند به صورت اختیاری با یک نشانهٔ تفکیک ارقام - یک کاما یا نقطه (هر کدام که به عنوان نشانهٔ اعشار استفاده نشده باشد)، یا فاصله (چندین نوع فاصله در یونیکد، مانند فاصلهٔ نشکستنی [no-break space] نیز پذیرفته میشوند) جدا شوند. بنابراین اینها همگی مقادیر معتبری در یک فایل دفتر روزنامه هستند:
-
$1,000,000.00 EUR 2.000.000,00 INR 9,99,99,999.00 1 000 000.00 ; <- ordinary space 1 000 000.00 ; <- no-break space
کالا (Commodity)
مبالغ در hledger هم دارای یک "مقدار" (quantity) هستند که یک عدد اعشاری علامتدار است، و هم دارای یک "کالا" (commodity) که یک نماد ارز، نماد معاملاتی سهام، یا هر کلمه یا عبارتی است که چیزی را که ردیابی میکنید توصیف میکند.
اگر نام کالا شامل نویسههای غیرحرفی (فاصلهها، اعداد، یا علائم نگارشی) باشد، باید همیشه آن را درون نقلقول دوتایی بنویسید ("green apples"، "ABC123").
اگر تنها یک عدد خالی بنویسید، آن نیز کالایی با نام "" خواهد داشت؛ ما آن را "کالای بدون نماد" (no-symbol commodity) مینامیم.
در واقع، hledger این مبالغ تککالایی را در قالب مبالغ چندکالایی قدرتمندتری ترکیب میکند، که در اکثر مواقع با آنها کار میکند. یک مبلغ چندکالایی میتواند برای مثال به این صورت باشد: 1 USD, 2 EUR, 3.456 TSLA. در عمل، شما مبالغ چندکالایی را تنها در خروجی hledger خواهید دید؛ نمیتوانید آنها را مستقیماً در فایل دفتر روزنامه بنویسید.
بهطور پیشفرض، قالب مبالغ در دفتر روزنامه بر نحوهٔ نمایش آنها توسط hledger در خروجی تأثیر میگذارد. این موضوع در بخش «شیوهٔ نمایش کالا» (Commodity display style) در ادامه توضیح داده شده است.
بها (Costs)
در دفترداری دوطرفهٔ سنتی، برای ثبت تراکنشی که در آن یک کالا با کالایی دیگر مبادله میشود، ثبتهای حقوق مالکانهی (equity postings) اضافی برای تراز کردن دو کالا اضافه میکنید. برای مثال:
-
2026-01-01 buy euros assets:dollars $-123 equity:conversion $123 equity:conversion €-100 assets:euros €100
نرمافزار hledger شیوهٔ نشانهگذاری کارآمدتر @/@@ موسوم به "نشانهگذاری بها" (cost notation) را به عنوان یک جایگزین ارائه میدهد: به جای ثبتهای حقوق مالکانه، میتوانید "نرخ تبدیل" یا "قیمت معاملهشده" را پس از مبلغِ یک ثبت بنویسید. مستندات hledger، چه در حالت خرید و چه در فروش، این را بهطور کلی "بها" (cost) مینامند. این مقدار میتواند به صورت @ UNITPRICE یا @@ TOTALPRICE نوشته شود. برای مثال میتوانید مورد بالا را اینگونه بنویسید:
-
2026-01-01 buy euros assets:dollars $-123 assets:euros €100 @ $1.23 ; unit cost (exchange rate)
یا:
-
2026-01-01 buy euros assets:dollars $-123 assets:euros €100 @@ $123 ; total cost
بها معمولاً باید یک مقدار مثبت باشد. بهای منفی نیز پشتیبانی میشود، اما میتواند گیجکننده باشد، همانطور که در بخش --infer-market-prices: market prices from transactions مورد بحث قرار گرفته است.
بها در تراز کردن تراکنش مشارکت دارد. مبالغ پیش از بررسی اینکه آیا تراکنش تراز است یا خیر، به بهای خود تبدیل میشوند. همچنین میتوانید مورد بالا را با افزونگی کمتر و به این صورت بنویسید:
-
2026-01-01 buy euros assets:dollars ; $-123 is inferred assets:euros €100 @ $1.23
یا:
-
2026-01-01 buy euros assets:dollars ; $-123 is inferred assets:euros €100 @@ $123
یا حتی:
-
2026-01-01 buy euros assets:euros €100 ; @@ $123 is inferred assets:dollars $-123
این حالتِ آخر برای تراکنشهایی که دقیقاً شامل دو کالا هستند، بدون نیاز به نشانهگذاری بها یا ثبتهای حقوق مالکانه کار میکند. توجه داشته باشید که ترتیب ثبتها اهمیت دارد: بها به نخستین ثبت (بالایی) نسبت داده خواهد شد. بنابراین ما مجبور شدیم ترتیب ثبتها را جابهجا کنیم تا همان معنای بالا حاصل شود. همچنین، در این شیوه ارتکاب خطاهای کشفنشده از همه آسانتر است؛ از این رو توسط hledger check balanced و همچنین توسط حالت سختگیرانه (strict mode) رد میشود.
مزایای نشانهگذاری بها:
- 1.
- فشردهتر است و خواندن و نوشتن آن آسانتر است.
- 2.
- هنگامی که پرچم -B/--cost را اضافه کنید، گزارشهای hledger میتوانند چنین مبالغی را تبدیلشده به بهای آنها نشان دهند (بخش Cost reporting را ببینید).
مزایای ثبتهای حقوق مالکانه (equity postings):
- 1.
- به برقرار ماندن تراز معادلهٔ حسابداری کمک میکنند (اگر این موضوع برایتان اهمیت دارد).
- 2.
- بهآسانی به هر سامانهٔ حسابداری دوطرفهٔ دیگری قابل انتقال هستند.
بیشتر کاربران hledger از نشانهگذاری بها استفاده میکنند و ثبتهای حقوق مالکانه را به کار نمیبرند.
اما شما همواره میتوانید با افزودن --infer-equity، نشانهگذاری بها را به ثبتهای حقوق مالکانه تبدیل کنید. برای نمونه دستور hledger print -x --infer-equity را امتحان کنید.
و معمولاً میتوانید با افزودن --infer-costs، ثبتهای حقوق مالکانه را به نشانهگذاری بها تبدیل کنید (بخش Requirements for detecting equity conversion postings را ببینید). برای نمونه دستور hledger print -x --infer-costs را امتحان کنید.
در نهایت: استفادهٔ همزمان از ثبتهای حقوق مالکانه و نشانهگذاری بها تا زمانی که ساختار مدخل دفتر روزنامه مناسب باشد به طوری که معادلهای ثبتهای حقوق مالکانه / بها قابل تشخیص باشند، مجاز است. (در غیر این صورت، پیام خطایی دریافت خواهید کرد مبنی بر اینکه تراکنش ناتراز است.):
-
2026-01-01 buy euros assets:dollars $-123 equity:conversion $123 equity:conversion €-100 assets:euros €100 @ $1.23
بنابراین در اصل میتوانید هر دو گزینهٔ --infer-equity و --infer-costs را در فایل پیکربندی خود فعال کنید، و گزارشهای شما از مزایای هر دو بهرهمند خواهند شد..SS مبنای هزینه / نحو بهر (Cost basis / lot syntax) اگر کالایی را برای نگهداری بهعنوان سرمایهگذاری خریداری میکنید، ممکن است رهگیری موارد زیر حائز اهمیت باشد:
- 1.
- هزینهٔ اولیهٔ تملک آن
- 2.
- تاریخ اولیهٔ تملک آن
- 3.
- و یک شمارهٔ ترتیبی یا برچسب در صورت نیاز، برای ابهامزدایی از خریدهای متعدد در یک روز، یا استفاده بهمنزلهٔ یادآور جهت ارجاع آسان.
در hledger به این سه مورد "مبنای هزینه" (cost basis) میگوییم؛ و اگر مقداری که تملک میشود دارای مبنای هزینه باشد، آن را یک "بهر" (lot) مینامیم. مقامات مالیاتی معمولاً الزام میکنند که بهرها بهدقت رهگیری شده و به ترتیب مشخصی واگذار (فروخته) شوند.
توجه داشته باشید هرچند "مبنای هزینه" مشابه "هزینه" (قیمت معامله) که در بالا بحث شد به نظر میرسد، اما این دو مفاهیمی متمایز هستند. در برخی تراکنشها قیمت معامله و مبنای هزینه یکسان هستند، اما در برخی دیگر تفاوت دارند.
بنابراین مبنای هزینه نحو مختص به خود را دارد که "نحو بهر" (lot syntax) نیز نامیده میشود. نحو lot در hledger مشابه نحو Ledger است: یک یا چند مورد از یادداشتهای زیر که پس از مقدار اصلی میآیند:
- {LOTUNITCOST} یا {{LOTTOTALCOST}} (مبحث lot price را ببینید)
- [LOTDATE] (مبحث lot date را ببینید)
- (LOTLABEL) (مبحث lot note را ببینید)
برنامهٔ hledger هنوز عملیاتی با این نحو lot انجام نمیدهد، بهجز حفظ آن و نمایش در خروجیهای txt، beancount و json دستور print. این بدان معناست که میتوانید از این نحو در دفترهای روزنامهٔ hledger خود استفاده کنید (بههمراه یک ثبت اضافیِ بدون مقدار در صورت نیاز برای کمک به تراز شدن تراکنشها)، سپس از دستور print برای برونبری به Ledger ،Beancount یا rustledger استفاده نمایید تا گزارشهای بهرها/سودها (lots/gains) آنها را بهکار بگیرید (گردشکار Export Lots را ببینید).
تصدیقهای تراز (Balance assertions)
نرمافزار hledger از تصدیقهای تراز به سبک Ledger در فایلهای دفتر روزنامه پشتیبانی میکند. این تصدیقها برای نمونه مانند = EXPECTEDBALANCE هستند که پس از مقدار یک ثبت (posting) قرار میگیرند. برای مثال در اینجا تراز دلاری مورد انتظار در حسابهای a و b را پس از هر ثبت تصدیق میکنیم:
-
2013/1/1 a $1 = $1 b = $-1 2013/1/2 a $1 = $2 b $-1 = $-2
پس از خواندن یک فایل دفتر روزنامه، hledger تمام تصدیقهای تراز را بررسی کرده و در صورت نادرست بودن هر یک از آنها، خطایی گزارش میکند. تصدیقهای تراز میتوانند برای مثال از بههمریختن سهوی ترازهای تطبیقدادهشده هنگام پاکسازی مدخلهای قدیمی جلوگیری کنند. میتوانید آنها را با پرچم -I/--ignore-assertions بهطور موقت غیرفعال کنید که میتواند برای عیبیابی یا خواندن فایلهای Ledger مفید باشد. (نکته: این پرچم در حال حاضر انتسابهای تراز را که در زیر شرح داده شده است، غیرفعال نمیکند).
تصدیقها و ترتیب (Assertions and ordering)
برنامهٔ hledger تصدیقهای تراز یک حساب را به ترتیب تاریخ (و هنگامی که چندین تصدیق در یک روز وجود داشته باشد، به ترتیب تجزیه) محاسبه و بررسی میکند. توجه داشته باشید که این رفتار با Ledger متفاوت است؛ Ledger تصدیقها را همیشه به ترتیب تجزیه و بدون در نظر گرفتن تاریخها بررسی میکند.
این بدان معناست که در hledger میتوانید آزادانه تراکنشها، ثبتها یا فایلها را بازآرایی کنید و تصدیقهای تراز معمولاً به کار خود ادامه خواهند داد. استثنا زمانی است که چندین ثبت در یک روز و برای یک حساب را که دارای تصدیق تراز هستند بازآرایی کنید؛ در این صورت احتمالاً آن تصدیقها نیازمند بهروزرسانی خواهند بود.
تصدیقها و فایلهای چندگانه (Assertions and multiple files)
اگر حسابی دارای تراکنشهایی در چند فایل مختلف باشد، تصدیقهای تراز همچنان میتوانند کار کنند - اما تنها در صورتی که آن فایلها بخشی از یک ساختار سلسلهمراتبی ایجادشده توسط دستورهای include باشند.
اگر همان فایلها با دو گزینهٔ -f در خط فرمان مشخص شوند، تصدیقهای موجود در فایل دوم ترازهای فایل اول را نخواهند دید.
برای دور زدن این مشکل، فایلهای خود را با استفاده از include در یک ساختار سلسلهمراتبی مرتب کنید. یا اینکه میتوانید فایلها را موقتاً به هم متصل (concatenate) کرده و آنها را مانند یک فایل بزرگ پردازش کنید.
چرا سیستم به این شیوه کار میکند؟ این امر احتمالاً با هدف hledger برای تولید گزارشهای پایدار و قابل پیشبینی مرتبط است. سلسلهمراتب فایلها بخشی "همیشگی" و جزئی از دادههای شما در نظر گرفته میشود، در حالی که ترتیب گزینهها/آرگومانهای خط فرمان اینگونه نیست. ما نمیخواهیم تغییرات گذرا بتوانند معنای دادهها را تغییر دهند. به عنوان مثال بسیار ناامیدکننده خواهد بود اگر فردا همهٔ تصدیقهای تراز شما نقض شوند، صرفاً به این دلیل که آرگومانهای خط فرمان را با ترتیبی متفاوت وارد کردهاید. (از بحث و تبادل نظر در این زمینه استقبال میشود.).SS ادعاها و هزینهها ادعاهای موجودی هزینهها را نادیده میگیرند، و بهطور معمول باید بدون هزینه نوشته شوند:
-
2019/1/1 (a) $1 @ €1 = $1
با این حال، ما اجازه میدهیم هزینهها در مقادیر ادعای موجودی نوشته شوند، و print آنها را نمایش میدهد، اما بر قبولی یا رد ادعا تأثیری ندارند. این امر برای سازگاری رو به عقب است (دستور close در hledger در گذشته ادعاهای موجودی را به همراه هزینه ایجاد میکرد)، و به این دلیل که انتسابهای موجودی از هزینهها استفاده میکنند (پایینتر را ببینید).
ادعاها و کالاها
ادعاهای موجودی توصیفشده تا اینجا «ادعاهای موجودی تککالایی» هستند: آنها موجودی را در یک کالا ادعا و بررسی میکنند، و هر کالای دیگری را که ممکن است وجود داشته باشد نادیده میگیرند. این همان روشی است که ادعاهای موجودی در Ledger نیز کار میکنند.
اگر یک حساب شامل چندین کالا باشد، میتوانید موجودی آنها را با نوشتن چندین ثبت (posting) به همراه ادعای موجودی، یکی برای هر کالا، ادعا و بررسی کنید:
-
2013/1/1 usd $-1 eur €-1 both 2013/1/2 both 0 = $1 both 0 = €1
در hledger میتوانید با نوشتن دو علامت مساوی (== EXPECTEDBALANCE)، یک «ادعای موجودی کالای یگانه» قویتر ایجاد کنید. این کار همچنین ادعا میکند که بهجز کالای ادعاشده هیچ کالای دیگری در حساب وجود ندارد (یا دستکم، موجودی فعلی آنها صفر است):
-
2013/1/1 usd $-1 == $-1 ; these sole commodity assertions succeed eur €-1 == €-1 both ;== $1 ; this one would fail because 'both' contains $ and €
ایجاد یک «ادعای موجودی چندکالای یگانه» (به جمع بودن کلمه دقت کنید) دشوارتر است - یعنی ادعای اینکه یک حساب شامل دو یا چند کالای مشخصشده و بدون هیچ کالای دیگری است. این کار میتواند با انجام موارد زیر انجام شود:
- 1.
- جداسازی هر کالا در یک زیرحساب، و ادعا کردن آنها
- 2.
- و همچنین ادعا کردن اینکه هیچ کالایی در خودِ حساب والد وجود ندارد:
-
2013/1/1 usd $-1 eur €-1 both 0 == 0 ; nothing up my sleeve both:usd $1 == $1 ; a dollar here both:eur €1 == €1 ; a euro there
ادعاها و زیرحسابها
تمام ادعاهای موجودی بالا (هم = و هم ==) «ادعاهای موجودی بدون احتساب زیرحساب» هستند؛ آنها هر موجودی که در زیرحسابهای عمیقتر وجود داشته باشد را نادیده میگیرند.
در hledger میتوانید با افزودن یک ستاره پس از علامت مساوی (=* یا ==*)، «ادعاهای موجودی با احتساب زیرحساب» ایجاد کنید:
-
2019/1/1 equity:start assets:checking $10 assets:savings $10 assets $0 ==* $20 ; assets + subaccounts contains $20 and nothing else ادعاهای تراز همواره ثبتهای مربوط به تمام وضعیتها (علامتنخورده، در انتظار، یا تسویهشده) را در نظر میگیرند؛ آنها تحت تأثیر پرچمهای -U/--unmarked / -P/--pending / -C/--cleared یا پرسوجوی status: قرار نمیگیرند.
ادعاها و ثبتهای مجازی
ادعاهای تراز همواره هر دو نوع ثبتهای واقعی و مجازی را در نظر میگیرند؛ آنها تحت تأثیر پرچم --real/-R یا پرسوجوی real: قرار نمیگیرند.
ادعاها و ثبتهای خودکار
ادعاهای تراز تحت تأثیر پرچم --auto قرار میگیرند که ثبتهای خودکار (auto postings) تولید میکند و میتواند تراز حسابها را تغییر دهد. از آنجا که ثبتهای خودکار در hledger اختیاری هستند، حسابهای تحت تأثیر آنها در عمل دارای دو تراز هستند. اما ادعاهای تراز تنها میتوانند یکی از این دو حالت را بیازمایند. بنابراین برای جلوگیری از ایجاد ادعاهای شکننده، یکی از موارد زیر را انجام دهید:
- ترازی را ادعا کنید که با --auto محاسبه شده است، و همواره برای آن فایل از --auto استفاده کنید
- یا ترازی را ادعا کنید که بدون --auto محاسبه شده است، و هرگز برای آن فایل از --auto استفاده نکنید
- یا از ادعاهای تراز روی حسابهای متأثر از ثبتهای خودکار اجتناب کنید (یا ثبتهای خودکار را کاملاً کنار بگذارید).
ادعاها و دقت اعشار
ادعاهای تراز مقادیر را دقیقاً بر اساس محاسبات مقایسه میکنند، مقادیری که لزوماً همیشه همان ارقام نمایشیافته در گزارشها نیستند. برای مثال یک دستورالعمل commodity ممکن است دقت نمایش را محدود کند، اما این موضوع بر ادعاهای تراز تأثیری نخواهد داشت. پیامهای خطای شکست ادعای تراز، مقادیر دقیق را نمایش میدهند.
ادعاها و add در hledger
ادعاهای تراز میتوانند در مقادیر دادهشده در add گنجانده شوند. تمام انواع ادعاها پشتیبانی میشوند، و ادعاها میتوانند مشابه یک فایل دفتر روزنامه (journal) عادی استفاده شوند.
همه تراکنشها، نه فقط مواردی که دارای ادعای صریح هستند، در برابر ادعاهای موجود در دفتر روزنامه اعتبارسنجی میشوند. این بدان معناست که ممکن است افزودن یک تراکنش شکست بخورد، حتی اگر ادعاهای آن تا تاریخ وقوع تراکنش صحیح باشند.
اگر این بررسی ادعاها مد نظر نیست، میتوان آن را با -I غیرفعال کرد.
با این حال، تخصیصهای تراز (balance assignments) در حال حاضر پشتیبانی نمیشوند.
کامنتهای ثبت
متنی که پس از ;، در انتهای یک خط ثبت (posting)، و/یا در خطوط تورفته مستقیماً در زیر آن قرار میگیرد، کامنتهای مربوط به آن ثبت را تشکیل میدهد. آنها توسط دستور print بازتولید میشوند اما در غیر این صورت نادیده گرفته میشوند، مگر اینکه حاوی برچسبها (tags) باشند که نادیده گرفته نمیشوند.
-
2012-01-01 expenses 1 ; a comment for posting 1 assets ; a comment for posting 2 ; a second comment line for posting 2
تراز کردن تراکنش
ابزار hledger دقیقاً چگونه تصمیم میگیرد که یک تراکنش تراز است؟ بهویژه زمانی که پای هزینهها (costs) در میان است، که اغلب به دلیل اعشارهای متناوب یا دادههای غیردقیق مؤسسات مالی، دقیق نیستند؟ در هر commodity، ابزار hledger مقادیر ثبت تراکنش را پس از تبدیل موارد دارای هزینه، با یکدیگر جمع میزند؛ سپس بررسی میکند که آیا این حاصلجمع پس از گرد شدن به تعداد ارقام اعشار مناسب، برابر با صفر است یا خیر - که آن را دقت تراز کردن (balancing precision) مینامیم.
از نسخه 1.50، ابزار hledger دقت تراز کردن در هر تراکنش را از روی مقادیر موجود در مدخل دفتر روزنامه همان تراکنش استنتاج میکند (مشابه Ledger). یعنی هنگام بررسی تراز commodity A، از بالاترین دقت اعشاری دیدهشده برای A در مدخل دفتر روزنامه (بهاستثنای مقادیر cost) استفاده مینماید. این کار تراز کردن تراکنش را پایدار و محکم میسازد؛ هرگونه عدم تراز باید به صورت آشکار در مدخل دفتر روزنامه لحاظ شود، دقت نمایش را میتوان آزادانه با -c افزایش داد، و سازگاری با دفاتر روزنامه Ledger و Beancount بسیار خوب است.
توجه داشته باشید که نسخههای hledger پیش از 1.50 به شیوه متفاوتی عمل میکردند: آنها اجازه میدادند دقت نمایش بر دقت تراز کردن اولویت پیدا کند (override شود). این مسئله باعث پنهان شدن عدم ترازهای جزئی و ایجاد شکنندگی میشد (به مسئله #2402 مراجعه کنید). در نتیجه، برخی مدخلهای دفتر روزنامه (یا قوانین CSV) که با hledger <1.50 کار میکردند، اکنون با خطای "unbalanced transaction" (تراکنش نامتراز) رد میشوند. اگر به این مشکل برخوردید، رفع آن آسان است:
- میتوانید رفتار پیشین را با افزودن --txn-balancing=old به دستور یا به فایل ~/.hledger.conf خود بازیابی کنید. این به شما امکان میدهد همچنان بدون تغییر از دفاتر روزنامه قدیمی استفاده کنید، هرچند مزایای فوق را نخواهید داشت.
- یا میتوانید مدخلهای دارای مشکل را برطرف کنید (توصیهشده). سه راهکار وجود دارد، از هر کدام که مناسبتر است استفاده نمایید:
- 1.
- مقادیر هزینه (cost) را دقیقتر کنید (ارقام اعشاری بیشتر/دقیقتری اضافه کنید)
- 2.
- یا مقادیر غیرهزینهای را با دقت کمتری درج کنید (ارقام اعشاری غیرضروری که دقت را بالا میبرند حذف کنید)
- 3.
- یا یک ثبت برای جذب عدم تراز اضافه نمایید (مانند "expenses:rounding". به یاد داشته باشید که در یک ثبت میتوان مقدار را خالی گذاشت؛ این ویژگی در اینجا کارآمد است.) برچسبها روشی برای افزودن برچسبها یا فیلدهای داده اضافی به تراکنشها، ثبتها، یا حسابها هستند که میتوانید با یک پرسوجوی tag: در گزارشها آنها را مطابقت دهید. (پرسوجوهای زیر را ببینید.)
برچسبها یک کلمه واحد یا کلمهای با خط تیره هستند که بلافاصله پس از آن یک دونقطه قرار میگیرد و در داخل یک توضیح نوشته میشوند. (بله، ذخیره دادهها در توضیحات کمی عجیب است.) در اینجا تراکنشی با یک برچسب آورده شده است:
-
2025-01-01 groceries ; some-tag: assets:checking expenses:food $1
یک برچسب میتواند مقداری داشته باشد؛ یک خط متنی که بعد از دونقطه نوشته میشود. مقادیر برچسب نمیتوانند شامل خط جدید باشند.:
-
2025-01-01 groceries ; tag1: this is tag1's value
چندین برچسب میتوانند با ویرگول از هم جدا شوند. مقادیر برچسب نمیتوانند شامل ویرگول باشند.:
-
2025-01-01 groceries ; tag1:value 1, tag2:value 2, comment text
یک برچسب میتواند چندین مقدار داشته باشد:
-
2025-01-01 groceries ; tag1:value 1, tag1:value 2
در صورت تمایل میتوانید هر برچسب را در خط جداگانه خود بنویسید (اما همچنان نمیتوانند شامل ویرگول باشند):
-
2025-01-01 groceries ; tag1: value 1 ; tag2: value 2
برچسبها را میتوان به جای کل تراکنش، به ثبتهای جداگانه متصل کرد:
-
2025-01-01 rent assets:checking expenses:rent $1000 ; postingtag:
برچسبها را میتوان در دستورالعمل حساب آنها، به حسابها متصل کرد:
-
account assets:checking ; acct-number: 123-45-6789
انتشار برچسب (Tag propagation)
برچسبها علاوه بر آنچه به آن متصل شدهاند، به چند روش بر دادههای مرتبط نیز تأثیر میگذارند و امکان پرسوجوهای قدرتمندتری را فراهم میسازند:
- 1.
- حسابها -> ثبتها. ثبتها برچسبها را از حساب خود به ارث میبرند.
- 2.
- تراکنشها -> ثبتها. ثبتها برچسبها را از تراکنش خود به ارث میبرند.
- 3.
- ثبتها -> تراکنشها. تراکنشها نیز برچسبهای ثبتهای خود را دریافت میکنند.
بنابراین وقتی از پرسوجوی tag: برای مطابقت کل تراکنشها، ثبتهای جداگانه یا حسابها استفاده میکنید، بهتر است نحوه رفتار برچسبها را بدانید. در اینجا مثالی آمده است که هر سه نوع انتشار را نشان میدهد:
-
account assets:checking account expenses:food ; atag: 2025-01-01 groceries ; ttag: assets:checking ; p1tag: expenses:food $1 ; p2tag:
| بخش داده | دارای برچسبهای | توضیحات |
| حساب assets:checking | هیچ برچسبی متصل نشده است | |
| حساب expenses:food | atag | atag: در توضیح |
| ثبت assets:checking | p1tag, ttag | p1tag: در توضیح، ttag از تراکنش دریافت شده |
| ثبت expenses:food | p2tag, atag, ttag | p2tag: در توضیح، atag از حساب، ttag از تراکنش |
| تراکنش groceries | ttag, p1tag, p2tag, atag | ttag: در توضیح، p1tag از ثبت اول، p2tag و atag از ثبت دوم |
| نمایش برچسبها (Displaying tags) | ||
| میتوانید از دستور tags برای فهرست کردن نامها یا مقادیر برچسبها استفاده کنید. | ||
| دستور print نیز برچسبها را نمایش میدهد. | ||
| میتوانید از --pivot برای نمایش مقادیر برچسب در سایر گزارشها، به روشهای گوناگون (مانند الحاق به نام حسابها، شبیه به شبهحسابهای فرعی) استفاده کنید. | ||
| چه زمانی از برچسبها استفاده کنیم؟ (When to use tags ?) | ||
| برچسبها ابعاد بیشتری از دستهبندی را فراهم کرده و مکمل حسابها و شرح تراکنشها هستند. | ||
| اینکه چه زمانی از هر یک از اینها استفاده کنید تا حدی سلیقهای است. | ||
| حسابها بیشترین پشتیبانی توکار را دارند و پرسوجوهای regex روی شرحها نیز بسیار قدرتمند هستند. | ||
| بنابراین ممکن است اصلاً به برچسبها نیازی نداشته باشید. | ||
| اما اگر میخواهید چندین دستهبندی متقاطع را پیگیری کنید، میتوانند گزینه مناسبی باشند. | ||
| برای نمونه، میتوانید تراکنشهای مربوط به سفر را با trip: YEAR:PLACE برچسبگذاری کنید، بدون اینکه دستهبندیهای معمول حسابهای خود را برهم بزنید. | ||
| نامهای برچسب (Tag names) | ||
| چه نویسههایی در نام برچسب مجاز است؟ | ||
| بیشتر نویسههای غیرفاصلهای. | ||
| برای نمونه 😀: یک برچسب معتبر است. | ||
| برای بررسی بیشتر خطاها، میتوانید نامهای معتبر برچسب را با دستورالعمل tag تعریف کرده و سپس آنها را با دستور check اعمال کنید. | ||
| اما توجه داشته باشید که در حال حاضر برچسبها بهصورت نهچندان سختگیرانه شناسایی میشوند، گاهی در جاهایی که قصد آن را نداشتهاید. | ||
| برای نمونه یادداشتی مانند ; see https://foo.com یک برچسب https اضافه میکند. | ||
| چندین نام برچسب وجود دارند که برای hledger اهمیت ویژهای دارند. | ||
| آنها در بخشهای دیگر توضیح داده شدهاند، اما در اینجا یک راهنمای سریع آورده شده است: | ||
| type -- نوع یک حساب را اعلان میکند | ||
| date -- تاریخ یک ثبت را بازنویسی میکند | ||
| date2 -- تاریخ ثانویه یک ثبت را بازنویسی میکند | ||
| assert -- روی تراکنشهای تولیدشده توسط close --assert ظاهر میشود | ||
| retain -- روی تراکنشهای تولیدشده توسط close --retain ظاهر میشود | ||
| start -- روی تراکنشهای تولیدشده توسط close --migrate/--close/--open/--assign ظاهر میشود | ||
| t -- روی ثبتهای تولیدشده از نویسههای timedot ظاهر میشود | ||
| generated-transaction -- روی تراکنشهای تولیدشده توسط یک قانون دورهای ظاهر میشود | ||
| modified-transaction -- روی تراکنشهایی که ثبتهای خودکار به آنها افزوده شده ظاهر میشود | ||
| generated-posting -- روی ثبتهای تولیدشده ظاهر میشود | ||
| cost-posting -- روی ثبتهایی که دارای (یا میتوانند دارای) بها باشند ظاهر میشود، | ||
| و دارای ثبتهای تبدیل معادل در تراکنش هستند | ||
| conversion-posting -- روی ثبتهایی ظاهر میشود که به یک حساب V/Conversion هستند | ||
| و یک ثبت بهای معادل در تراکنش دارند | ||
| گروه دوم در بالا (generated-transaction و غیره) معمولاً پنهان هستند و پیشوند _ به آنها افزوده شده است. | ||
| این بدان معناست که print بهطور پیشفرض آنها را نمایش نمیدهد؛ اما همچنان میتوانید از آنها در پرسوجوها استفاده کنید. | ||
| میتوانید پرچم --verbose-tags را اضافه کنید تا در خروجی print قابل مشاهده شوند، که میتواند برای عیبیابی مفید باشد. | ||
| دستورالعملها (Directives) | ||
| علاوه بر تراکنشها، مورد دیگری نیز وجود دارد که میتوانید در یک فایل journal قرار دهید: دستورالعملها (directives). | ||
| اینها اعلانهایی هستند که با یک کلیدواژه آغاز میشوند و رفتار hledger را تغییر میدهند. | ||
| برخی دستورالعملها میتوانند زیردستورالعملهای مشخصتری داشته باشند که با تورفتگی در زیر آنها قرار میگیرند. | ||
| دستورالعملهای hledger در بسیاری از موارد مشابه Ledger هستند، اما تفاوتهای زیادی نیز وجود دارد. | ||
| دستورالعملها اجباری نیستند، اما میتوانند سودمند باشند. | ||
| در اینجا دستورالعملهای اصلی آورده شدهاند: | ||
| tab( | ); | |
| lw(39.7n) lw(30.3n). | ||
| هدف | دستورالعمل | |
| خواندن دادهها (READING DATA): | ||
| بازنویسی نام حسابها | alias | |
| کامنت کردن بخشهایی از فایل | comment | |
| اعلان نشانگر اعشار فایل، برای کمک به تجزیه دقیق مقادیر | decimal-mark | |
| قراردادن سایر فایلهای داده | include | |
| تولید دادهها (GENERATING DATA): | ||
| تولید تراکنشهای تکرارشونده یا اهداف بودجه | ~ | |
| تولید ثبتهای اضافی روی تراکنشهای موجود | = | |
| بررسی خطاها (CHECKING FOR ERRORS): | ||
| تعریف موجودیتهای معتبر برای بررسی بیشتر خطاها | account، commodity، payee، tag | |
| گزارشگیری (REPORTING): | ||
| اعلان نوع و ترتیب نمایش حسابها | account | |
| اعلان شیوههای نمایش ارز و کالا | commodity | |
| اعلان قیمتهای بازار | P | |
| دستورالعملها از نظر دامنه اثر خود، یعنی اینکه بر کدام مدخلهای دفتر روزنامه و | ||
| کدام فایلهای ورودی تأثیر میگذارند، تفاوت دارند. | ||
| اغلب اوقات، یک دستورالعمل بر مدخلهای بعدی و فایلهای گنجاندهشده (در صورت وجود)، | ||
| تا پایان فایل جاری تأثیر میگذارد - و نه فراتر از آن. | ||
| شاید این موضوع به نظرتان ناخوشایند بیاید! | ||
| برای مثال، دستورالعملهای alias بر فایلهای والد یا همسطح | ||
| تأثیری ندارند. | ||
| اما معمولاً راهحلهایی وجود دارد؛ برای نمونه، قرار دادن دستورالعملهای alias | ||
| در بالاترین فایل خود، پیش از گنجاندن فایلهای دیگر. | ||
| این محدودیت، اگرچه ممکن است در ابتدا آزاردهنده باشد، اما هدف خوبی دارد؛ | ||
| این امر باعث میشود گزارشها مستقل از ترتیب ورودی، پایدار و قطعی باشند. | ||
| بدون آن، گزارشها ممکن بود بسته به ترتیب گزینههای -f، یا جایگاه | ||
| دستورالعملهای include در فایلهایتان، اعداد متفاوتی را نشان دهند. | ||
| "تأثیرات دستورالعملها" | ||
| در اینجا تمام دستورالعملهای hledger به همراه خلاصهای از اثرات و دامنه | ||
| آنها آورده شده است - نُه دستورالعمل اصلی، بهعلاوه چهار مورد دیگر که آنها را | ||
| غیرضروری میدانیم: | ||
| tab( | ); | |
| lw(3.5n) lw(64.1n) lw(2.4n). | ||
| دستورالعمل | عملکرد | خاتمه در انتهای فایل؟ |
| account | یک حساب را برای بررسی تمام مدخلها در همه فایلها، و همچنین ترتیب نمایش و نوع آن اعلام میکند. دستورالعملهای فرعی: هر متنی، نادیده گرفته میشود. | خیر |
| alias | نامهای حساب را در مدخلهای بعدی تا انتهای فایل جاری یا end aliases بازنویسی میکند. معادل در خط فرمان: --alias | بله |
| comment | بخشی از فایل دفتر روزنامه را تا پایان فایل جاری یا end comment نادیده میگیرد. | بله |
| commodity | تا چهار مورد را تعیین میکند: 1. یک نماد کالا، برای بررسی تمام مقادیر در همه فایلها 2. سبک نمایش برای تمام مقادیر این کالا 3. علامت اعشار برای تجزیه مقادیر این کالا، در ادامه این فایل و فرزندان آن، در صورتی که هیچ دستورالعمل decimal-mark وجود نداشته باشد 4. دقت مورد استفاده برای بررسی تراکنشهای تراز در این کالا، در این فایل و فرزندان آن. بر D اولویت دارد. دستورالعملهای فرعی: format (نادیده گرفته میشود). معادل در خط فرمان: -c/--commodity-style | خیر، خیر، بله، بله |
| decimal-mark | علامت اعشار را برای تجزیه مقادیر تمام کالاها در مدخلهای بعدی تا decimal-mark بعدی یا پایان فایل جاری تعیین میکند. فایلهای گنجاندهشده میتوانند آن را بازنویسی کنند. بر commodity و D اولویت دارد. | بله |
| include | مدخلها و دستورالعملها را از فایلی دیگر میگنجاند، بهگونهای که گویی بهصورت درونخطی نوشته شدهاند. جایگزین در خط فرمان: چند گزینه -f/--file | خیر |
| payee | نام دریافتکننده وجه را برای بررسی تمام مدخلها در همه فایلها تعیین میکند. | خیر |
| P | قیمت بازار یک کالا را در تاریخی مشخص، برای گزارشهای ارزشگذاری اعلام میکند. | خیر |
| ~ (تیلدا / tilde) | یک قاعده تراکنش دورهای را تعیین میکند که تراکنشهای آینده را با --forecast و اهداف بودجه را با balance --budget تولید میکند. | خیر |
| سایر نحوها: | ||
| apply account | یک حساب والد مشترک را به ابتدای تمام نامهای حساب در مدخلهای بعدی تا پایان فایل جاری یا end apply account میافزاید. | بله |
| D | یک کالای پیشفرض را برای استفاده در مقادیر بدون نماد تنظیم میکند؛ و اگر هیچ دستورالعمل commodity برای این کالا وجود نداشته باشد: علامت اعشار، دقت ترازسازی، و سبک نمایش آن را مطابق موارد بالا تنظیم میکند. | بله، بله، خیر، خیر |
| Y | یک سال پیشفرض را برای استفاده در تاریخهای بدون سال در مدخلهای بعدی تا پایان فایل جاری تنظیم میکند. | بله |
| = (مساوی / equals) | یک قاعده ثبت خودکار را تعیین میکند که ثبتهای اضافی را در تراکنشهای منطبق با --auto، در فایلهای جاری، والد و فرزند تولید میکند (اما نه در فایلهای همسطح، گزارش #1212 را ببینید). | تا حدی |
| سایر دستورالعملهای Ledger | سایر دستورالعملهای برگرفته از قالب فایل Ledger پذیرفته میشوند اما نادیده گرفته خواهند شد. | |
| دستورالعملهای account میتوانند برای اعلان حسابها (یعنی | ||
| مکانهایی که مبالغ از آنها و به آنها منتقل میشوند) استفاده شوند. | ||
| گرچه الزامی نیست، اما این اعلانها میتوانند مزایای متعددی را فراهم کنند: | ||
| • 2 | ||
| میتوانند ساختار و نمودار حسابهای (chart of accounts) مدنظر شما را مستند کرده و یک مرجع | ||
| ارائه دهند. | ||
| • 2 | ||
| میتوانند اطلاعات تکمیلی حساب را بهصورت کامنت، یا برچسبهایی | ||
| که میتوان برای فیلتر کردن یا تغییر جهت (pivot) گزارشها استفاده کرد، ذخیره کنند. | ||
| • 2 | ||
| میتوانند حسابهایی را که تراکنشها مجاز به ثبت در آنها هستند محدود کنند؛ مثلاً در | ||
| حالت strict mode، که به جلوگیری از خطاها کمک میکند. | ||
| • 2 | ||
| آنها بر ترتیب نمایش حسابها در گزارشها اثر میگذارند و امکان مرتبسازی | ||
| غیرالفبایی را فراهم میسازند (مثلاً درآمدها بالاتر از هزینهها نمایش یابند). | ||
| • 2 | ||
| میتوانند به hledger در شناسایی نوع حسابهای شما (asset، liability، | ||
| equity، revenue، expense) کمک کنند و گزارشهایی مانند balancesheet و | ||
| incomestatement را امکانپذیر سازند. | ||
| • 2 | ||
| به تکمیل خودکار نام حساب کمک میکنند (در hledger add، hledger-web، | ||
| hledger-iadd، ledger-mode و غیره). | ||
| آنها بهصورت کلمهٔ account به همراه یک نام حساب به سبک | ||
| hledger نوشته میشوند. | ||
| برای مثال: | ||
| account assets:bank:checking | ||
| زیردستورالعملهای دارای تورفتگی به سبک Ledger نیز پذیرفته میشوند، اما نادیده گرفته میشوند: | ||
| account assets:bank:checking | ||
| format subdirective ; currently ignored | ||
| کامنتهای حساب | ||
| متنی که پس از دو یا چند فاصله و ; در انتهای | ||
| خط یک دستورالعمل account، و/یا پس از ; در خطوط دارای تورفتگی | ||
| بلافاصله زیر آن بیاید، کامنتهای آن حساب را تشکیل میدهد. | ||
| کامنتهای حساب در همان خط به بیش از ۲ فاصله پیش از ; نیاز دارند | ||
| زیرا این نویسه میتواند در نام حسابها نیز ظاهر شود. | ||
| account assets:bank:checking ; same-line comment, at least 2 spaces before the semicolon | ||
| ; next-line comment | ||
| ; some tags - type:A, acctnum:12345 | ||
| برچسبهای حساب | ||
| کامنتِ یک دستورالعمل account میتواند شامل برچسبها باشد. | ||
| این برچسبها به تمام ثبتهای تراکنش (postings) که از آن حساب استفاده میکنند، بهعنوان | ||
| برچسبهای ثبت پنهان اما قابل جستوجو، منتقل میشوند، مگر در مواردی که آن ثبت از قبل برچسبی | ||
| با همان نام داشته باشد. | ||
| (برچسبهای ثبت بر برچسبهای حساب اولویت دارند.) | ||
| بررسی خطای حساب | ||
| بهطور پیشفرض، نیازی به اعلان حسابها نیست؛ آنها زمانی به وجود میآیند | ||
| که یک ثبت تراکنش به آنها ارجاع دهد. | ||
| این ویژگی راحت است، اما به این معنی است که hledger نمیتواند هنگام | ||
| اشتباه املایی در نام حساب در journal به شما هشدار دهد. | ||
| معمولاً چنین خطایی را بعداً خواهید یافت، بهعنوان یک حساب اضافی در گزارشهای | ||
| تراز، یا یک تراز نادرست هنگام تطبیق حسابها (reconciling). | ||
| در حالت سختگیرانه (strict mode)، که با پرچم -s/--strict | ||
| فعال میشود، یا زمانی که دستور hledger check accounts را اجرا میکنید، | ||
| اگر هر تراکنشی از نام حسابی استفاده کند که توسط دستورالعمل account اعلان نشده | ||
| باشد، hledger یک خطا گزارش میدهد. | ||
| چند نکته: | ||
| • 2 | ||
| اعلان حساب حساس به بزرگی و کوچکی حروف (case-sensitive) است؛ تراکنشها باید از بزرگی | ||
| و کوچکی صحیح حروف نام حساب استفاده کنند. | ||
| • 2 | ||
| دامنهٔ دستورالعمل account بهصورت "تمام فایل و زیرمجموعهها" (بخش | ||
| directives را ببینید) است. | ||
| این یعنی بر تمام فایل جاری و هر فایلی که شامل (include) کرده است اثر میگذارد، | ||
| اما بر فایلهای والد یا همسطح تأثیری ندارد. | ||
| موقعیت قرارگیری دستورالعملهای account درون فایل اهمیتی ندارد، | ||
| اگرچه معمول است که در بالای فایل قرار داده شوند. | ||
| • 2 | ||
| حسابها فقط در فایلهای journal قابل اعلان هستند، اما | ||
| بر فایلهای گنجاندهشده از تمام انواع تأثیر میگذارند. | ||
| • 2 | ||
| در حال حاضر اعلان "تمام زیرحسابهای ممکن" با یک نویسهٔ عامهنما (wildcard) | ||
| امکانپذیر نیست؛ هر حسابی که به آن ثبتی تخصیص داده میشود باید اعلان شده باشد. | ||
| • 2 | ||
| اگر از پرچم --infer-equity استفاده میکنید، به اعلانهایی برای نامهای حسابی که | ||
| این پرچم ایجاد میکند نیز نیاز خواهید داشت..SS "ترتیب نمایش حسابها (Account display order)" | ||
| دستورهای account همچنین باعث میشوند که hledger حسابها را نه فقط به ترتیب الفبایی، بلکه به ترتیبی مشخص نمایش دهد. | ||
| برای نمونه، این یک ترتیب متداول برای حسابهای سطح بالا (top-level) است: | ||
| account assets | ||
| account liabilities | ||
| account equity | ||
| account revenues | ||
| account expenses | ||
| اکنون hledger آنها را با همین ترتیب نمایش میدهد: | ||
| $ hledger accounts | ||
| assets | ||
| liabilities | ||
| equity | ||
| revenues | ||
| expenses | ||
| اگر حسابهای اعلاننشدهای وجود داشته باشند، در انتها و به ترتیب الفبایی نمایش داده خواهند شد. | ||
| مرتبسازی در هر گروه از حسابهای همسطح (همنیا)، در هر سطح از درخت حسابها انجام میشود. | ||
| برای نمونه، اعلانی مانند account parent:child بر جایگاه child در میان حسابهای همسطحش اثر میگذارد. | ||
| توجه داشته باشید که این اعلان تأثیری بر جایگاه parent ندارد؛ برای این کار، به اعلان account parent نیاز دارید. | ||
| حسابهای همسطح همواره کنار یکدیگر نمایش داده میشوند؛ hledger هیچگاه x:y را میان a:b و a:c نمایش نخواهد داد. | ||
| یک دستور account هم یک حساب را به عنوان مقصدی معتبر برای ثبت سند (posting target) اعلان میکند و هم ترتیب نمایش آن را مشخص میسازد؛ نمیتوانید به آسانی یکی را بدون دیگری انجام دهید. | ||
| "انواع حسابها (Account types)" | ||
| نرمافزار hledger میداند که در حسابداری سه نوع حساب اصلی وجود دارد: | ||
| tab( | ); | |
| l l l. | ||
| Asset | A | داراییهای شما |
| Liability | L | بدهیهای شما |
| Equity | E | سرمایهٔ مالک، برقرارکنندهٔ توازن میان دو مورد بالا |
و دو نوع دیگر که تغییرات در اینها را نشان میدهند:
| Revenue | R | جریانهای ورودی (شناختهشده با عنوان Income) |
| Expense | X | جریانهای خروجی |
همچنین hledger از چند زیرنوع (subtype) استفاده میکند:
| Cash | C | داراییهای نقد (زیرنوعی از Asset) |
| Conversion | V | حقوق صاحبان سهام تبدیل کالا (زیرنوعی از Equity) |
| Gain | G | سودها/زیانهای سرمایهای (زیرنوعی از Revenue) |
برای آسودگی، hledger بیشتر این نوعها را به طور خودکار از روی نامهای انگلیسی حسابها تشخیص میدهد. اما بهتر است با افزودن برچسب type: در دستورهای account، آنها را به طور صریح اعلان کنید. مقدار برچسب میتواند هر یک از انواع یا اختصارات تکحرفی بالا باشد.
در اینجا مجموعهای نمونه از اعلانهای نوع حساب آورده شده است. زیرحسابها نوع والد خود را به ارث میبرند، یا میتوانند آن را بازنویسی کنند:
-
account assets ; type: A account liabilities ; type: L account equity ; type: E account revenues ; type: R account expenses ; type: X account assets:bank ; type: C account assets:cash ; type: C account equity:conversion ; type: V account revenues:capital ; type: G
این کار تولید آسان گزارشهای balancesheet ،balancesheetequity ،cashflow و incomestatement، و همچنین پرسوجو بر اساس نوع را امکانپذیر میسازد:.
نکات:
- •
- میتوانید برای عیبیابی، حسابها و انواع آنها را فهرست کنید:
-
$ hledger accounts --types [ACCTPAT] [type:TYPECODES] [-DEPTH] [--locations]
- ایدهٔ خوبی است که دستکم یک حساب را برای هر نوع حساب اعلان کنید. اعلان برخی نوعها و استنتاج برخی دیگر میتواند باعث اختلال در برخی گزارشها شود.
- قواعد استنتاج نوعها از نام حسابها به شرح زیر است (با استفاده از عبارات باقاعده - Regular expressions).
اگر این قواعد برای شما کارآمد نیستند، کافی است آنها را نادیده بگیرید و انواع خود را با برچسبهای type: اعلان کنید.
-
If account's name contains this case insensitive regular expression | its type is --------------------------------------------------------------------|------------- ^assets?(:.+)?:(cash|bank|che(ck|que?)(ing)?|savings?|current)(:|$) | Cash ^assets?(:|$) | Asset ^(debts?|liabilit(y|ies))(:|$) | Liability ^equity:(trad(e|ing)|conversion)s?(:|$) | Conversion ^equity(:|$) | Equity ^(income|revenue)s?(:|$) | Revenue ^expenses?(:|$) | Expense
همانطور که در بالا اشاره شد، زیرحسابها نوع را از حساب والد خود به ارث خواهند برد. بهطور دقیق، نوع یک حساب با نخستین مورد از موارد زیر که وجود داشته باشد تعیین میشود:
- 1.
- یک اعلان type: برای این حساب.
- 2.
- یک اعلان type: در حسابهای والد بالاتر از آن، با اولویت نزدیکترین حساب.
- 3.
- یک نوع حساب استنباطشده از نام این حساب.
- 4.
- یک نوع حساب استنباطشده از نام حساب والد، با اولویت نزدیکترین حساب والد.
- 5.
- در غیر این صورت، حسابی بدون نوع خواهد بود.
- •
- نامهای مستعار حساب میتوانند انواع حسابها را مختل کنند.
دستورالعمل alias
میتوانید قواعد نام مستعار حساب (alias) را تعریف کنید که نام حسابهای شما، یا بخشهایی از آنها را پیش از تولید گزارشها بازنویسی میکنند. این قابلیت میتواند برای موارد زیر مفید باشد:
- بسط دادن نامهای اختصاری حسابها به شکل کاملشان، جهت ورود آسانتر دادهها و داشتن یک دفتر روزنامه مختصرتر
- تطبیق دادن دفترهای روزنامه قدیمی با نمودار حسابهای فعلی شما
- آزمودن سازماندهیها و ساختارهای جدید حساب، مانند یک سلسلهمراتب تازه
- ترکیب دو حساب در یکی، برای مثال جهت مشاهده مجموع یا تفاضل آنها در یک خط
- سفارشیسازی گزارشها
نامهای مستعار حساب همچنین نامهای حساب را در دستورالعملهای account بازنویسی میکنند. آنها بر نامهای حسابی که از طریق hledger add یا hledger-web وارد میشوند تأثیری ندارند.
نامهای مستعار حساب بسیار قدرتمند هستند. استفاده صحیح از آنها بهطور کلی آسان است، اما میتوانید با آنها نامهای حساب نامعتبر نیز ایجاد کنید؛ در ادامه به این موضوع بیشتر پرداخته خواهد شد.
همچنین بخش «بازنویسی نامهای حساب» (Rewrite account names) را ببینید.
نامهای مستعار پایه
برای تنظیم یک نام مستعار حساب، از دستورالعمل alias در فایل دفتر روزنامه خود استفاده کنید. این کار بر تمام ورودیهای بعدی دفتر روزنامه در فایل جاری یا فایلهای ضمیمهشده به آن تأثیر میگذارد (اما توجه داشته باشید: بر فایلهای همسطح یا والد تأثیری ندارد). فاصلههای اطراف = اختیاری هستند:
-
alias OLD = NEW
یا میتوانید از گزینه --alias 'OLD=NEW' در خط فرمان استفاده کنید. این کار بر تمام ورودیها تأثیر میگذارد. این روش برای آزمایش تعاملی نامهای مستعار مفید است.
عبارات OLD و NEW نامهای حساب کامل و حساس به بزرگی و کوچکی حروف هستند. hledger هر رخدادی از نام حساب قدیمی را با نام جدید جایگزین خواهد کرد. زیرحسابها نیز متأثر میشوند. برای مثال:
-
alias checking = assets:bank:wells fargo:checking ; rewrites "checking" to "assets:bank:wells fargo:checking", or "checking:a" to "assets:bank:wells fargo:checking:a"
نامهای مستعار مبتنی بر عبارت باقاعده (Regex)
گونهای قدرتمندتر نیز وجود دارد که از یک عبارت باقاعده استفاده میکند و با قرار گرفتن الگو در میان اسلشهای رو به جلو مشخص میشود. (این تنها جایی است که hledger به اسلشهای رو به جلو در اطراف یک عبارت باقاعده نیاز دارد.)
برای مثال:
-
alias /REGEX/ = REPLACEMENT
یا:
-
$ hledger --alias '/REGEX/=REPLACEMENT' ...
هر بخشی از نام حساب که با REGEX تطبیق داده شود، با REPLACEMENT جایگزین خواهد شد. REGEX طبق معمول به بزرگی و کوچکی حروف حساس نیست (case-insensitive).
اگر نیاز دارید با یک اسلش رو به جلو تطبیق دهید، آن را با یک بکاسلش گریز دهید، مانند /\/=:.
اگر REGEX شامل گروههای تطبیق پرانتزبندیشده باشد، میتوان در REPLACEMENT با استفاده از بکاسلش و شماره به آنها ارجاع داد:
-
alias /^(.+):bank:([^:]+):(.*)/ = \1:\2 \3 ; rewrites "assets:bank:wells fargo:checking" to "assets:wells fargo checking"
REPLACEMENT تا انتهای خط (یا در خط فرمان، تا انتهای آرگومان گزینه) ادامه مییابد، بنابراین میتواند شامل نویسههای فاصله خالی انتهایی باشد..SS ترکیب نامهای مستعار میتوانید با استفاده از دستورالعملهای ژورنال و/یا گزینههای خط فرمان، به هر تعداد که مایلید نام مستعار (alias) تعریف کنید.
نامهای مستعار بازگشتی - که در آن نام یک حساب ابتدا توسط یک نام مستعار، سپس توسط نام مستعاری دیگر و به همین ترتیب بازنویسی میشود - مجاز هستند. هر نام مستعار، تأثیر نامهای مستعار اعمالشده پیشین را مشاهده میکند.
در چنین مواردی درک اینکه کدام نامهای مستعار و با چه ترتیبی اعمال خواهند شد میتواند حائز اهمیت باشد. برای (هر نام حساب در) هر ورودی ژورنال، موارد زیر اعمال میشوند:
- 1.
- دستورالعملهای alias پیش از ورودی ژورنال، به ترتیب آخرین مورد تجزیهشده (یعنی با خواندن رو به بالا از ورودی ژورنال، از پایین به بالا)
- 2.
- گزینههای --alias، به همان ترتیبی که در خط فرمان ظاهر شدهاند (از چپ به راست).
به عبارت دیگر، برای (یک نام حساب در) یک ورودی مشخص ژورنال:
- نزدیکترین تعریف نام مستعار قبل/بالای ورودی ابتدا اعمال میشود
- نام مستعار بعدی قبل/بالای آن در مرحله بعد اعمال خواهد شد، و به همین ترتیب
- نامهای مستعار تعریفشده بعد/پایینتر از ورودی روی آن تأثیری ندارند.
این کار به نامهای مستعار نزدیکتر نسبت به موارد دورتر اولویت میدهد و به ارائه پایداری معنایی کمک میکند - نامهای مستعار مستقل از اینکه چه فایلهایی و با چه ترتیبی خوانده میشوند، عملکرد یکسانی خواهند داشت.
در صورت بروز مشکل، افزودن --debug=6 به خط فرمان نشان خواهد داد که کدام نامهای مستعار در چه زمانی اعمال میشوند.
نامهای مستعار و چندین فایل
همانطور که در بخش «دستورالعملها و چندین فایل» توضیح داده شد، دستورالعملهای alias بر فایلهای والد یا همسطح تأثیری نمیگذارند. به عنوان مثال در این دستور،
-
hledger -f a.aliases -f b.journal
نامهای مستعار حساب تعریفشده در a.aliases روی b.journal تأثیری نخواهند داشت. شامل کردن (include) نامهای مستعار نیز کارساز نیست:
-
include a.aliases 2023-01-01 ; not affected by a.aliases foo 1 bar
این بدان معناست که نامهای مستعار حساب معمولاً باید در ابتدای بالاترین فایل شما اعلان شوند، مانند این:
-
alias foo=Foo alias bar=Bar 2023-01-01 ; affected by aliases above foo 1 bar include c.journal ; also affected
دستورالعمل end aliases
میتوانید با این دستورالعمل، تمام نامهای مستعار تعریفشده کنونی (دیده شده در ژورنال تا این لحظه، یا تعریف شده در خط فرمان) را پاک (فراموش) کنید:
-
end aliases
نامهای مستعار میتوانند نامهای حساب نامعتبر ایجاد کنند
توجه داشته باشید که نامهای مستعار حساب میتوانند نامهای حساب بدریخت و ناهنجاری تولید کنند که ممکن است به گزارشهای گیجکننده یا خروجی نامعتبر print منجر شود. به عنوان مثال، میتوانید تمام نامهای حساب را پاک کنید:
-
2021-01-01 a:aa 1 b
-
$ hledger print --alias '/.*/=' 2021-01-01 1
خروجی print بالا یک ژورنال معتبر نیست. یا میتوانید یک فاصله دوتایی غیرمجاز درج کنید، که باعث ایجاد خروجی print میشود که در صورت تجزیه مجدد، ژورنال متفاوتی به دست میدهد:
-
2021-01-01 old 1 other
-
$ hledger print --alias old="new USD" | hledger -f- print 2021-01-01 new USD 1 other اگر حسابی با اعلان نوع (بخش اعلان حسابها > انواع حساب را ببینید) از طریق یک نام مستعار تغییر نام یابد، نوع حساب معمولاً به قوت خود باقی میماند.
با این حال، تغییر نام به گونهای که ساختار درخت حساب را دگرگون کند (برای نمونه تغییر نام حسابهای والد بدون تغییر نام فرزندانشان، یا برعکس) میتواند مانع از به ارث بردن نوع حسابِ والدین توسط حسابهای فرزند شود.
دوم اینکه، اگر نوع یک حساب از نام آن استنتاج میشود، تغییر نام آن توسط یک نام مستعار میتواند مانع از این کار شده یا آن را تغییر دهد.
اگر از نامهای مستعار حساب استفاده میکنید و پرسوجوی type: حسابها را آنطور که انتظار دارید تطبیق نمیدهد، عیبیابی را با دستور accounts امتحان کنید؛ برای مثال چیزی مانند:
-
$ hledger accounts --types -1 --alias assets=bassetts
دستورالعمل commodity
دستورالعمل commodity چندین عملکرد را انجام میدهد:
- 1.
- اعلان میکند که چه نمادهای کالایی مجاز به استفاده در دفتر روزنامه هستند، و بررسی خطای مفیدی را با حالت سختگیرانه (strict mode) یا دستور check ممکن میسازد. بخش «بررسی خطای کالا» را در زیر ببینید.
- 2.
- اعلان میکند که تمام مقادیر این کالا چگونه باید نمایش داده شوند؛ برای نمونه چه تعداد رقم اعشار نمایش یابد. بخش «سبک نمایش کالا» را در بالا ببینید.
- 3.
- (اگر هیچ دستورالعمل decimal-mark فعالی در کار نباشد:) نشانه اعشاری مورد انتظار (نقطه یا کاما) را هنگام تجزیه مقادیر این کالا، در این فایل و فایلهای شاملشده در آن، از مکان این دستورالعمل تا انتهای فایل جاری تعیین میکند. بخش «نشانههای اعشار» را در بالا ببینید.
- 4.
- دقتی را اعلان میکند که مقادیر این کالا باید هنگام بررسی تراز بودن تراکنشها با آن مقایسه شوند، در هر کجای این فایل و فایلهای شاملشده در آن، تا انتهای فایل جاری.
اعلان کالاها چندین مشکل رایج تجزیه/نمایش را برطرف میکند، بنابراین استفاده از آن را توصیه میکنیم.
توجه داشته باشید که تأثیرات ۳ و ۴ در بالا، در انتهای فایلِ دستورالعمل خاتمه مییابند و روی فایلهای همتا یا والد تأثیری نخواهند گذاشت. بنابراین اگر به آنها متکی هستید (بهویژه مورد ۴) و از چندین فایل استفاده میکنید، قرار دادن دستورالعملهای commodity در یک فایل والد بالاترین سطح ممکن است حائز اهمیت باشد. یا اینکه، نشانههای اعشار خود را بدون ابهام نگه دارید و ورودیهایتان را دقیق و بهخوبی تراز کنید.
حذف نماد کالا، سبک نمایش را تنها برای کالای بدوننماد تعیین میکند، نه همه کالاها.
سبکهای کالا را میتوان با گزینه خط فرمان -c/--commodity-style بازنویسی کرد.
(مرتبط: #793)
ساختار دستورالعمل commodity
یک دستورالعمل کالا معمولاً کلمه commodity است که در ادامه آن یک مقدار نمونه، و به صورت اختیاری یک توضیح میآید. تنها نماد مقدار و قالب عدد حائز اهمیت است. برای مثال:
-
commodity $1000.00 commodity 1.000,00 EUR commodity 1 000 000.0000 ; the no-symbol commodity
مقدار نمونه در دستورالعمل کالا همواره باید شامل یک نشانه اعشار نقطه یا کاما باشد (این قاعده به رفع ابهام بین نشانههای اعشار و نشانههای گروهبندی ارقام کمک میکند). اگر نمیخواهید هیچ رقم اعشاری نشان داده شود، نشانه اعشار را در انتها بنویسید:
-
commodity 1000. AAAA ; show AAAA with no decimals
نمادهای کالایی حاوی فاصله، اعداد، یا نشانههای نگارشی باید طبق معمول داخل علامتهای نقلقول دوتایی قرار گیرند:
-
commodity 1.0000 "AAAA 2023"
دستورالعملهای کالا معمولاً شامل یک مقدار نمونه هستند، اما میتوانند تنها یک نماد را اعلان کنند (یعنی فقط عملکرد ۱ در بالا):
-
commodity $ commodity INR commodity "AAAA 2023" commodity "" ; the no-symbol commodity
دستورالعملهای کالا ممکن است با یک زیردستورالعمل دندانهدار format نیز نوشته شوند، همانند Ledger. نماد تکرار میشود و باید در هر دو مکان یکسان باشد. سایر زیردستورالعملها در حال حاضر نادیده گرفته میشوند:
-
; display indian rupees with currency name on the left, ; thousands, lakhs and crores comma-separated, ; period as decimal point, and two decimal places. commodity INR format INR 1,00,00,000.00 an unsupported subdirective ; ignored by hledger یادداشت یک دستور commodity میتواند حاوی برچسبها باشد. این برچسبها به تمام ثبتهایی (postings) که از آن کالا در مقدار اصلی خود استفاده میکنند، بهعنوان برچسبهای ثبت پنهان اما قابل پرسوجو، منتقل میشوند؛ مگر در مواردی که ثبت مذکور از قبل برچسبی با همان نام داشته باشد. (برچسبهای ثبت بر برچسبهای حساب، و برچسبهای حساب بر برچسبهای کالا اولویت دارند.)
بررسی خطای کالا (Commodity error checking)
در حالت سختگیرانه (-s/--strict) (یا هنگام اجرای hledger check commodities)، اگر نماد کالای تعریفنشدهای استفاده شود، hledger خطایی را گزارش خواهد کرد. (با یک استثنا: مقادیر صفر همیشه مجازند که نماد کالا نداشته باشند.) عملکرد آن مشابه بررسی خطای حساب (که در بالا توضیح داده شد) است.
دستور decimal-mark
میتوانید از دستور decimal-mark - معمولاً یکی به ازای هر فایل، در بالای فایل - استفاده کنید تا مشخص نمایید هنگام تجزیه مقادیر در این فایل، چه نویسهای نشاندهنده ممیز اعشاری است. میتواند به شکل زیر باشد:
-
decimal-mark .
یا
-
decimal-mark ,
این کار از هرگونه ابهام هنگام تجزیه اعداد در فایل جلوگیری میکند، بنابراین استفاده از آن توصیه میشود؛ بهویژه اگر فایل حاوی نشانههای گروهبندی ارقام (مانند جداکنندههای هزارگان) باشد.
دستور include
میتوانید با نوشتن یک دستور include، محتوای فایلهای دیگر را به پرونده اضافه کنید، مانند زیر:
-
include SOMEFILE
این کار همان اثری را دارد که گویی محتوای SOMEFILE در همین نقطه درج شده است. (همچنین هر دستور include درون SOMEFILE نیز به همین ترتیب و بهصورت بازگشتی پردازش میشود.)
فقط فایلهای journal میتوانند فایلهای دیگر را ضمیمه (include) کنند. آنها میتوانند فایلهای journal، timeclock یا timedot را دربرگیرند، اما فایلهای CSV مجاز نیستند.
اگر مسیر فایل با علامت مدک (tilde) شروع شود، به معنی دایرکتوری خانگی شماست: include ~/main.journal.
اگر با یک اسلش شروع شود، یک مسیر مطلق است: include /home/user/main.journal. در غیر این صورت، مسیر نسبت به پوشه فایلی که آن را ضمیمه کرده، سنجیده میشود: include ../finances/main.journal.
همچنین، مسیر ممکن است دارای یک پیشوند نوع فایل باشد تا قالب فایلی مشخصی را تحمیل کرده و پسوند(های) فایل را نادیده بگیرد (همانطور که در Data formats شرح داده شده است): include timedot:notes/2023.md.
مسیر ممکن است شامل الگوهای glob برای تطبیق با چندین فایل باشد. الگوهای glob در hledger شبیه به zsh هستند: ? برای تطبیق با هر نویسه؛ [a-z] برای تطبیق با هر نویسه در یک محدوده؛ * برای تطبیق با صفر یا چند نویسه که جداکننده مسیر نیستند (مانند /)؛ ** برای تطبیق با صفر یا چند زیردایرکتوری و/یا صفر یا چند نویسه در ابتدای نام فایل؛ و غیره. برای سهولت کار، include همواره فایل فعلی را مستثنی میکند. بنابراین، میتوانید از چنین مواردی استفاده کنید:
- include *.journal برای ضمیمهکردن تمام فایلهای journal دیگر در دایرکتوری فعلی (بهاستثنای فایلهای نقطهدار)
- include **.journal برای ضمیمهکردن تمام فایلهای journal دیگر در این دایرکتوری و زیرشاخههای آن (بهاستثنای فایلهای نقطهدار و دایرکتوریهای نقطهدار سطح اول)
- include timelogs/2???.timedot برای ضمیمهکردن تمام فایلهای timedot که نامی شبیه به شماره سال دارند.
توجه داشته باشید که * و ** معمولاً با فایلها یا دایرکتوریهای نقطهدار تطبیق داده نمیشوند، با یک استثنا: ** دایرکتوریهای نقطهداری که در سطح اول نیستند را جستجو میکند. اگر این مسئله مشکلی ایجاد میکند، الگوی glob خود را دقیقتر تعیین کنید (مثلاً **.journal بهجای **).
اگر از فایلهای ضمیمهشده فراوان، یا با تودرتویی عمیق استفاده میکنید و به خطایی برخورد کردهاید که یافتن دقیق آن دشوار است، یک دستور عیبیابی خوب hledger files --debug=6 (یا 7) است..SS دستورالعمل P دستورالعمل P یک قیمت بازار را اعلان میکند، که در واقع نرخ تبدیل بین دو کالا در یک تاریخ مشخص است. این قابلیت به گزارشهای ارزش اجازه میدهد مقادیر یک کالا را به ارزش آن در کالایی دیگر، در آن تاریخ یا پس از آن تبدیل کنند. این قیمتها معمولاً از بورس اوراق بهادار، صرافی رمزارز، یا بازار تبادل ارزهای خارجی (فارکس) به دست میآیند.
قالب آن بدین صورت است:
-
P DATE COMMODITY1SYMBOL COMMODITY2AMOUNT
DATE یک تاریخ ساده است، COMMODITY1SYMBOL نماد کالایی است که قیمتگذاری میشود، و COMMODITY2AMOUNT مقدار (نماد و کمیت) کالای ۲ است که یک واحد از کالای ۱ در این تاریخ ارزش دارد. مثالها:
-
# one euro was worth $1.35 from 2009-01-01 onward: P 2009-01-01 € $1.35 # and $1.40 from 2010-01-01 onward: P 2010-01-01 € $1.40
پرچمهای -V، -X و --value از این قیمتهای بازار برای نمایش مقادیر بر حسب کالایی دیگر استفاده میکنند. بخش گزارشدهی ارزش (Value reporting) را ببینید.
دستورالعمل payee
payee PAYEE NAME
از این دستورالعمل میتوان برای اعلان مجموعهای محدود از دریافتکنندگان وجه که ممکن است در توضیحات تراکنش ظاهر شوند استفاده کرد. در صورتی که هر تراکنشی به دریافتکنندهای اشاره کند که اعلان نشده باشد، بررسی "payees" خطا گزارش خواهد کرد. برای مثال:
-
payee Whole Foods ; a comment
دریافتکنندگان وجه برچسب (tag) ندارند (برچسبها در یادداشت نادیده گرفته میشوند).
برای اعلان نام دریافتکننده خالی، از "" استفاده کنید.
-
payee ""
زیردستورالعملهای دارای تورفتگی به سبک Ledger، در صورت وجود، در حال حاضر نادیده گرفته میشوند.
دستورالعمل tag
tag TAGNAME
از این دستورالعمل میتوان برای اعلان مجموعهای محدود از نامهای مجاز در برچسبها استفاده کرد. TAGNAME باید یک نام برچسب معتبر باشد (بدون فاصله). برای مثال:
-
tag item-id
هرگونه زیردستورالعمل دارای تورفتگی در حال حاضر نادیده گرفته میشود.
در صورتی که از هر نام برچسبِ اعلاننشدهای استفاده شود، بررسی "tags" خطا گزارش خواهد کرد. ایجاد تصادفی یک برچسب با استفاده معمول از دونقطه در یادداشتها بسیار آسان است؛ اگر میخواهید از این کار جلوگیری کنید، میتوانید برچسبهای خود را اعلان و بررسی نمایید.
تراکنشهای دورهای (Periodic transactions)
دستورالعمل ~ یک «قاعده دورهای» ("periodic rule") را اعلان میکند که هنگام اجرای hledger با پرچم --forecast، تراکنشهای اضافی موقتی ایجاد میکند که معمولاً در بازههای زمانی مشخص تکرار میشوند. این «تراکنشهای پیشبینی» ("forecast transactions") برای پیشبینی فعالیتهای آینده مفید هستند. آنها تنها در طول مدت تولید گزارش و تنها زمانی که --forecast استفاده شده باشد وجود دارند؛ آنها توسط hledger در فایل دفتر روزنامه ذخیره نمیشوند.
قواعد دورهای کاربرد دومی نیز دارند: با پرچم --budget، آنها اهداف بودجه را برای بودجهبندی تعیین میکنند.
قواعد دورهای میتوانند کمی قلقدار باشند، بنابراین پیش از استفاده از آنها، تمام این بخش یا دستکم نکات زیر را مطالعه کنید:
- 1.
- افزودن یا حذف تصادفی دو فاصله برایتان دردسر ایجاد خواهد کرد - در این باره در ادامه بخوانید.
- 2.
- برای عیبیابی، تراکنشهای تولیدشده را با hledger print --forecast tag:generated یا hledger register --forecast tag:generated نمایش دهید.
- 3.
- تراکنشهای پیشبینیشده تنها پس از تاریخ آخرین تراکنش غیرپیشبینیشده آغاز خواهند شد.
- 4.
- تراکنشهای پیشبینیشده بهطور پیشفرض ۶ ماه پس از امروز پایان مییابند. برای قواعد دقیق شروع/پایان به ادامه مراجعه کنید.
- 5.
- عبارتهای دوره زمانی (period expressions) میتوانند قلقدار باشند. مستندات آنها نیازمند بهبود است، اما ارزش مطالعه را دارد.
- 6.
- برخی از عبارتهای دوره زمانی با بازه تکرارشونده باید در مرز طبیعی آن بازه آغاز شوند. برای مثال در weekly from DATE، مقدار DATE باید یک دوشنبه باشد. عبارت ~ weekly from 2019/10/1 (که یک سهشنبه است) خطا خواهد داد.
- 7.
- سایر عبارتهای دوره زمانی با یک بازه بهطور خودکار گسترش مییابند تا تعداد کاملی از آن بازه را پوشش دهند. (این کار برای بهبود گزارشها انجام میشود، اما بر تراکنشهای دورهای نیز تأثیر میگذارد. بله، کمی با مورد بالا ناهماهنگ است.) برای مثال: ~ every 10th day of month from 2023/01 که معادل ~ every 10th day of month from 2023/01/01 است، بهگونهای تنظیم خواهد شد که از 2019/12/10 آغاز شود..SS ساختار قواعد دورهای یک قاعده تراکنش دورهای شبیه به یک مدخل عادی دفتر روزنامه است، که در آن تاریخ با یک مدک (~) جایگزین شده و پس از آن یک عبارت دورهای میآید (یادآور: ~ شبیه یک موج سینوسی تکرارشونده است.):
-
# every first of month ~ monthly expenses:rent $2000 assets:bank:checking # every 15th of month in 2023's first quarter: ~ monthly from 2023-04-15 to 2023-06-16 expenses:utilities $400 assets:bank:checking
عبارت دوره دارای همان نحوی است که برای مشخص کردن گزارشهای چنددورهای استفاده میشود، فقط تفسیر متفاوتی دارد؛ در آنجا دورههای گزارش را تعیین میکند؛ در اینجا تاریخهای تکرار (تاریخهای شروع دورهها) را مشخص میسازد.
قواعد دورهای و تاریخهای نسبی
تاریخهای ناقص یا نسبی (مانند 12/31، 25، tomorrow، last week، next quarter) معمولاً در قواعد دورهای توصیه نمیشوند، زیرا با گذشت زمان نتایج تغییر خواهند کرد. در صورت استفاده، بر اساس اولویت نسبت به موارد زیر تفسیر میشوند:
- 1.
- روز اول سال پیشفرض مشخصشده توسط یک دستور Y اخیر
- 2.
- یا تاریخ مشخصشده با --today
- 3.
- یا تاریخی که در آن گزارش را اجرا میکنید.
آنها به هیچ وجه تحت تأثیر تاریخهای دوره گزارش یا دوره پیشبینی قرار نخواهند گرفت.
دو فاصله میان عبارت دوره و شرح تراکنش!
اگر به دنبال عبارت دوره یک شرح تراکنش بیاید، این دو باید با دو یا چند فاصله از هم جدا شوند. این کار به hledger کمک میکند تا پایان عبارت دوره را تشخیص دهد، به طوری که شرحها نتوانند تصادفاً معنای آن را تغییر دهند، مانند این مثال:
-
; 2 or more spaces needed here, so the period is not understood as "every 2 months in 2023" ; || ; vv ~ every 2 months in 2023, we will review assets:bank:checking $1500 income:acme inc
بنابراین،
- حتماً بین عبارت دوره و شرح تراکنش خود (در صورت وجود) دو فاصله قرار دهید.
- در میان عبارت دوره، به طور تصادفی دو فاصله نگذارید.
ثبتهای خودکار (Auto postings)
دستور = یک «قاعده ثبت خودکار» ("auto posting rule") را اعلان میکند که ثبتهای اضافی به تراکنشهای موجود میافزاید. (به یاد داشته باشید، ثبتها (postings) خطوط نام حساب و مبلغ در زیر تاریخ و شرح یک تراکنش هستند.)
در دفتر روزنامه، یک قاعده ثبت خودکار کاملاً شبیه یک تراکنش است، اما به جای تاریخ و شرح، دارای = (یادآور: تطابق یا "match") و یک پرسوجو (query) است، مانند این:
-
= QUERY ACCOUNT AMOUNT ...
پرسوجوها دقیقاً مانند پرسوجوهای خط فرمان هستند؛ زیررشته نام حساب رایجترین آنهاست. عبارتهای پرسوجو که دارای فاصله هستند باید داخل گیومه تکی یا دوتایی قرار گیرند.
هر قاعده = به این صورت کار میکند: هنگامی که hledger با پرچم --auto اجرا میشود، هر جا که QUERY با ثبتی در دفتر روزنامه مطابقت داشته باشد، ثبتهای آن قاعده دقیقاً زیر ثبت منطبقشده به آن تراکنش اضافه میشوند. توجه داشته باشید که این ثبتهای تولیدشده موقتی هستند، و تنها در طول مدت گزارش و فقط زمانی که --auto استفاده میشود وجود دارند؛ آنها توسط hledger در فایل دفتر روزنامه ذخیره نمیشوند.
ثبتها میتوانند حاوی رشته ویژه %account باشند که به نام حسابی که تطبیق یافته است بسط داده میشود.
مبالغ ثبتهای تولیدشده میتواند به مبلغ ثبت منطبقشده وابسته باشد. بنابراین ثبتهای خودکار میتوانند مثلاً برای افزودن ثبتهای مالیاتی با درصدی استاندارد مفید باشند. AMOUNT میتواند به شکلهای زیر باشد:
- یک عدد بدون نماد ارز/کالا، مانند 2. نماد کالای ثبت منطبقشده به این اضافه خواهد شد.
- یک مبلغ معمولی با نماد ارز/کالا، مانند $2. این مقدار بدون تغییر استفاده خواهد شد.
- یک ستاره به همراه یک عدد، مانند *2. این کار مبلغ ثبت منطبقشده (و قیمت کل، در صورت وجود) را در آن عدد ضرب میکند.
- یک ستاره به همراه مبلغی دارای نماد ارز/کالا، مانند *$2. این کار مقدار را ضرب کرده و همچنین نماد ارز/کالا را با نماد جدید جایگزین میکند.
چند مثال:
-
; every time I buy food, schedule a dollar donation = expenses:food (liabilities:charity) $-1 ; when I buy a gift, also deduct that amount from a budget envelope subaccount = expenses:gifts assets:checking:gifts *-1 assets:checking *1 2017/12/1 expenses:food $10 assets:checking 2017/12/14 expenses:gifts $20 assets:checking -
$ hledger print --auto 2017-12-01 expenses:food $10 assets:checking (liabilities:charity) $-1 2017-12-14 expenses:gifts $20 assets:checking assets:checking:gifts -$20 assets:checking $20
توجه داشته باشید که اتکای کامل به دادههای تولیدشدهای مانند این معایبی دارد - قابلیت حمل کمتر، پایداری کمتر در آینده، دشواری بیشتر در حسابرسی توسط دیگران، و استحکام کمتر (به عنوان مثال، balance assertions شما به این وابسته خواهد بود که از --auto استفاده کنید یا خیر). یک راهکار جایگزین استفاده از ثبتهای خودکار به صورت «یکباره» است - استفاده از آنها برای کمک به ساخت یک مدخل پیچیده در دفتر روزنامه، مشاهده آن با hledger print --auto، و سپس کپی کردن آن خروجی در فایل دفتر روزنامه برای دائمی کردن آن..SS ثبتهای خودکار و چندین فایل یک قاعدهٔ ثبت خودکار میتواند بر هر تراکنشی در فایل جاری، یا در هر فایل والد یا فایل فرزند تأثیر بگذارد. توجه داشته باشید که در حال حاضر این قواعد بر فایلهای همسطح تأثیری نخواهند داشت (زمانی که از چند -f/--file استفاده شده باشد - به #1212 مراجعه کنید).
ثبتهای خودکار و تاریخها
تاریخ ثبت (یا تاریخ ثانویه) در ثبت منطبقشده، یا (با اولویت بالاتر) تاریخ ثبت در خودِ قاعدهٔ ثبت خودکار، در ثبت ایجادشده نیز استفاده خواهد شد.
ثبتهای خودکار و تراز تراکنش / مبالغ استنتاجشده / ادعاهای موجودی
در حال حاضر، ثبتهای خودکار اضافه میشوند:
- پس از اینکه مبالغ درجنشده استنتاج شدند، و تراکنشها از نظر تراز بودن بررسی گردیدند،
- اما پیش از اینکه ادعاهای موجودی بررسی شوند.
توجه داشته باشید که این بدان معناست که مدخلهای دفتر روزنامه باید هم پیش از اضافه شدن ثبتهای خودکار و هم پس از آن تراز باشند. این سازوکار در hledger نسخهٔ 1.12+ تغییر کرد؛ برای پیشزمینه به #893 مراجعه کنید.
این همچنین بدین معنی است که نمیتوانید بیش از یک ثبت خودکار با مبلغ درجنشده را برای یک تراکنش معین اعمال کنید، زیرا در استنتاج مبالغ ناتوان خواهد بود.
برچسبهای ثبت خودکار
ثبتهای خودکار دارای چند برچسب اضافی خواهند بود:
- generated-posting:= QUERY - نشان میدهد که این مورد توسط یک قاعدهٔ ثبت خودکار ایجاد شده است، و عبارت جستجو (query) را نمایش میدهد
- _generated-posting:= QUERY - یک برچسب پنهان که در خروجی hledger نمایش داده نمیشود. این برچسب میتواند برای تطبیق ثبتهایی به کار رود که "همین حالا" ایجاد شدهاند، نه ثبتهایی که در گذشته ایجاد و در دفتر روزنامه ذخیره شدهاند.
همچنین، به هر تراکنشی که توسط قواعد ثبت خودکار تغییر یافته باشد، این برچسبها اضافه خواهند شد:
- modified: - این تراکنش تغییر یافته است
- _modified: - یک برچسب پنهان که در یادداشتها ظاهر نمیشود؛ این تراکنش "همین حالا" تغییر یافته است.
ثبتهای خودکار تنها روی تراکنشهای پیشبینی
نکته: میتوانید با افزودن tag:_generated-transaction به QUERY آنها، ثبتهای خودکاری ایجاد کنید که تنها بر تراکنشهای پیشبینی اعمال شوند و نه تراکنشهای ثبتشده. این ویژگی هنگام تولید مدخلهای جدید دفتر روزنامه برای ذخیره شدن در دفتر روزنامه میتواند مفید باشد.
ساختارهای نحوی دیگر
قالب دفتر روزنامهٔ hledger از چندین قابلیت دیگر پشتیبانی میکند، که عمدتاً برای آسانتر ساختن تعاملپذیری با Ledger یا تبدیل از آن هستند. توجه داشته باشید که برخی از قابلیتهای زیر قدرتمند هستند و میتوانند در موارد خاص سودمند باشند، اما بهطور کلی، ویژگیهای این بخش کماهمیتتر تلقی میشوند یا حتی استفاده از آنها به بیشتر کاربران توصیه نمیشود. معایب آنها ذکر شده است تا به شما در تصمیمگیری برای استفاده از آنها کمک کند.
تخصیصهای موجودی
تخصیصهای موجودی به سبک Ledger نیز پشتیبانی میشوند. اینها شبیه به ادعاهای موجودی هستند، اما در سمت چپ علامت مساوی هیچ مبلغ ثبتی وجود ندارد؛ در عوض این مبلغ بهطور خودکار محاسبه میشود تا شرط ادعا برآورده شود. این ویژگی میتواند هنگام ورود دادهها، مثلاً هنگام تنظیم موجودیهای اولیه، کار را راحتتر کند:
-
; starting a new journal, set asset account balances 2016/1/1 opening balances assets:checking = $409.32 assets:savings = $735.24 assets:cash = $42 equity:opening balances
یا هنگام تطبیق موجودی با واقعیت:
-
; no cash left; update balance, record any untracked spending as a generic expense 2016/1/15 assets:cash = $0 expenses:misc
مبلغ محاسبهشده به موجودی حساب در آن کالا (commodity) در آن نقطه بستگی دارد (که خود به ثبتهای دارای تاریخ قبلیِ آن کالا در آن حساب از زمان آخرین ادعا یا تخصیص موجودی وابسته است).
معایب: استفاده از تخصیصهای موجودی باعث میشود دفتر روزنامهٔ شما از صراحت کمتری برخوردار باشد؛ برای آگاهی از مبلغ دقیق ثبتشده، به جای خواندن مستقیم آن، باید hledger را اجرا کنید یا خودتان محاسبات را انجام دهید. همچنین، تحمیل موجودیها توسط تخصیص موجودی میتواند خطاها را پنهان کند. این موارد سبب میشوند دادههای مالی شما کمتر قابلحمل، کمتر مقاوم در برابر تغییرات آتی، و در حسابرسی کمتر قابلاعتماد باشند..SS انتسابهای تراز و هزینهها یک هزینه (cost) در انتساب تراز باعث میشود که مقدار محاسبهشده، آن هزینه را به همراه داشته باشد:
-
2019/1/1 (a) = $1 @ €2
-
$ hledger print --explicit 2019-01-01 (a) $1 @ €2 = $1 @ €2
انتسابهای تراز و چندین فایل
انتسابهای تراز مانند تصدیقهای تراز (balance assertions) با چندین فایل برخورد میکنند. آنها موجودی را از فایلهای دیگری که پیشتر از فایل جاری وارد (include) شدهاند مشاهده میکنند، اما از فایلهای همسطح یا والد قبلی خیر.
تاریخهای ثبت درون قلاب
برای تنظیم تاریخهای ثبت و تاریخهای ثبت ثانویه، نحوِ تاریخ درون قلاب در Ledger نیز پشتیبانی میشود: [DATE]، [DATE=DATE2] یا [=DATE2] در یادداشتهای ثبت (posting comments). دستور hledger تلاش خواهد کرد هر دنبالهای درون قلاب از نویسههای 0123456789/-.= را به این روش تجزیه کند. با این نحو، DATE سال خود را از تراکنش استنتاج میکند و DATE2 سال خود را از DATE برمیدارد.
معایب: نحوی مضاعف برای یادگیری، افزونگی با برچسبهای date:/date2: در hledger، و شباهت گیجکننده به نحو تاریخ دسته (lot date) در Ledger.
دستورالعمل D
D AMOUNT
این دستورالعمل، یک کالای پیشفرض را تعیین میکند تا برای هر مقدار فاقد کالای پس از آن (یعنی اعداد ساده) که هنگام تجزیه دفتر روزنامه مشاهده میشود، به کار رود. این اثر تا دستورالعمل بعدی D یا پایان فایل جاری ادامه دارد.
به دلایل تاریخی یا سازگاری، D همچنین مانند یک دستورالعمل commodity عمل میکند (تنظیم نشانهگذار اعشاری کالا برای تجزیه، و سبک نمایش برای خروجی). بنابراین آرگومان آن تنها یک نماد کالا نیست، بلکه مقداری کامل است که سبک نمایش را نشان میدهد. مقدار حتماً باید شامل یک نشانهگذار اعشاری (نقطه یا ویرگول) باشد. به عنوان مثال:
-
; commodity-less amounts should be treated as dollars ; (and displayed with the dollar sign on the left, thousands separators and two decimal places) D $1,000.00 1/1 a 5 ; <- commodity-less amount, parsed as $5 and displayed as $5.00 b
برهمکنش با سایر دستورالعملها:
برای تنظیم سبک نمایش کالا، دستورالعمل commodity بالاترین اولویت را دارد و پس از آن دستورالعمل D قرار میگیرد.
برای تشخیص نشانهگذار اعشاری کالا هنگام تجزیه، decimal-mark بالاترین اولویت را دارد، سپس commodity، و در نهایت D.
برای بررسی نمادهای کالا با دستور check، وجود یک دستورالعمل commodity الزامی است (hledger check commodities دستورالعملهای D را نادیده میگیرد).
معایب: حذف نمادهای کالا دادههای مالی شما را کمتر صریح، کمتر قابل حمل و در حسابرسی کمتر قابل اعتماد میکند. این کار معمولاً یک میانبُر ناپایدار است؛ دیر یا زود تمایل خواهید داشت چندین کالا را ردیابی کنید. دستور D با قابلیتهایی که نسبت به commodity و decimal-mark مازاد هستند، سربارگذاری شده است. همچنین سازوکار آن با D در Ledger متفاوت است.
دستورالعمل apply account
این دستورالعمل، یک حساب والد پیشفرض تعیین میکند که تا زمان رسیدن به دستورالعمل end apply account یا پایان فایل جاری، به ابتدای تمام حسابها در ورودیهای پس از آن اضافه خواهد شد. به عنوان مثال:
-
apply account home 2010/1/1 food $10 cash end apply account
معادل است با:
-
2010/01/01 home:food $10 home:cash $-10
دستورالعملهای account و همچنین هر محتوای واردشده (include) نیز تحت تأثیر قرار میگیرند.
نامهای حسابی که از طریق hledger add یا hledger-web وارد شوند تحت تأثیر قرار نمیگیرند.
نامهای مستعار حساب (در صورت وجود)، پس از اضافه شدن حساب والد به ابتدای نام اعمال میشوند.
معایب: این کار میتواند دادههای مالی شما را در حسابرسی کمتر صریح، کمتر قابل حمل و کمتر قابل اعتماد سازد..SS رهنمود Y Y YEAR
یا (شکلهای منسوخشده برای سازگاری رو به عقب):
year YEAR apply year YEAR
فاصله اختیاری است. این دستور یک سال پیشفرض را تعیین میکند تا برای تاریخهای پس از آن که سالی را مشخص نکردهاند استفاده شود. برای مثال:
-
Y2009 ; set default year to 2009 12/15 ; equivalent to 2009/12/15 expenses 1 assets year 2010 ; change default year to 2010 2009/1/30 ; specifies the year, not affected expenses 1 assets 1/31 ; equivalent to 2010/1/31 expenses 1 assets
معایب: حذف سال (دستکم از تاریخهای اصلی تراکنشها) باعث میشود دادههای مالی شما کمتر صریح، با قابلیت حمل کمتر و در حسابرسی کمتر قابل اعتماد باشند. چنین تاریخهایی ممکن است از رهنمود Y متناظر خود جدا شوند؛ برای مثال هنگام ارزیابی بخشی از دفتر روزنامه در ویرایشگر متن. نبود رهنمود Y باعث میشود گزارشها وابسته به تاریخ امروز شوند.
تاریخهای ثانویه
تاریخ ثانویه پس از تاریخ اصلی و به دنبال علامت مساوی نوشته میشود: DATE1=DATE2. اگر سال حذف شود، سالِ تاریخ اصلی در نظر گرفته میشود. هنگام اجرای گزارشها، تاریخ اصلی (سمت چپ) بهطور پیشفرض استفاده میشود، اما با پرچم --date2 (گزینههای --aux-date یا --effective نیز برای کاربران Ledger کار میکنند)، تاریخ ثانویه (سمت راست) به جای آن به کار خواهد رفت.
معنای تاریخهای ثانویه به شما بستگی دارد. برای مثال میتواند به این صورت باشد: "تاریخ اصلی، تاریخ تسویه بانک است و تاریخ ثانویه، در صورت تفاوت، تاریخ آغاز تراکنش است".
در عمل، این قابلیت معمولاً موجب سردرگمی میشود:
- باید معنای تاریخهای اصلی و ثانویه را به یاد داشته باشید و همواره آن را رعایت کنید.
- دفترداری شما را به دو حالت تقسیم میکند و باید به خاطر بسپارید که کدام حالت برای یک گزارش مشخص مناسب است.
- معمولاً اعتبارسنجیهای تراز (balance assertions) تنها با یکی از این حالتها کار خواهند کرد.
- دادههای مالی شما را پیچیدهتر، با قابلیت حمل کمتر و در یک حسابرسی با وضوح کمتر همراه میسازد.
- با تمامی امکانات دیگر تداخل پیدا میکند و هزینهای پیوسته برای توسعهدهندگان پدید میآورد.
- موجب حواسپرتی کاربران تازهکار و حامیان پروژه میشود.
- تاریخهای ثبت (posting dates) سادهتر هستند و کارایی بهتری دارند.
بنابراین تاریخهای ثانویه رسماً در hledger منسوخ شدهاند و تنها برای سازگاری با Ledger باقی ماندهاند؛ توصیه میکنیم به جای آنها از posting dates استفاده کنید.
یادداشتهای ستارهدار
خطوطی که با * (ستاره) آغاز میشوند نیز خطوط یادداشت (کامنت) هستند. این قابلیت به کاربران Emacs اجازه میدهد سرتیترهای org را در دفتر روزنامه خود درج کنند تا بتوانند هنگام مشاهده در org mode، آن را مانند یک ساختار سلسلهمراتبی جمع، باز و پیمایش کنند.
معایب: یک نحو نامتعارف دیگر برای نوشتن کامنت که باید آموخته شود. قابلیت حمل دفتر روزنامه شما را کاهش میدهد. همچنین جابهجایی به حالت Emacs org صرفاً برای جمع/باز کردن، به معنای از دست دادن مزایای ledger mode بود؛ امروزه میتوانید حالت outshine را به ledger mode بیفزایید تا بدون از دست دادن امکانات ledger mode از جمعوباز کردن متن نیز بهرهمند شوید..SS "عبارتهای ارزشگذاری (Valuation expressions)" نرمافزار Ledger اجازه میدهد یک تابع ارزشگذاری یا مقدار در پرانتزهای مضاعف پس از یک مبلغ نوشته شود. hledger این موارد را نادیده میگیرد.
ثبتهای مجازی (Virtual postings)
ثبتی که پرانتزهایی در اطراف نام حساب دارد، مانند (some:account) 10، یک ثبت مجازی نامتوازن نامیده میشود. این ثبتها در تراز کردن تراکنش شرکت نمیکنند. (و اگر آنها را بدون مبلغ بنویسید، همواره مقدار صفر استنباط میشود.) این موارد گاهی اوقات میتوانند برای شرایط خاص مناسب باشند، اما دفترداری دوطرفه را نقض میکنند و قابلیت انتقال دادههای شما را میان برنامههای مختلف کاهش میدهند، بنابراین بسیاری از افراد اصلاً از آنها استفاده نمیکنند.
ثبتی که دارای قلاب (کروشه) در اطراف نام حساب باشد ([some:account])، یک ثبت مجازی متوازن نامیده میشود. مجموع ثبتهای مجازی متوازن در یک تراکنش، درست مانند ثبتهای عادی اما بهصورت جداگانه از آنها، باید به صفر برسد. این موارد نیز بخشی از دفترداری دوطرفه نیستند، اما دستکم متوازن هستند. یک مثال:
-
2022-01-01 buy food with cash, update budget envelope subaccounts, & something else assets:cash $-10 ; <- these balance each other expenses:food $7 ; <- expenses:food $3 ; <- [assets:checking:budget:food] $-10 ; <- and these balance each other [assets:checking:available] $10 ; <- (something:else) $5 ; <- this is not required to balance
ثبتهای عادی، که نام حساب آنها نه درون پرانتز است و نه درون قلاب، ثبتهای واقعی نامیده میشوند. میتوانید با استفاده از پرچم -R/--real یا پرسوجوی real:1، ثبتهای مجازی را از گزارشها مستثنی کنید.
سایر دستورالعملهای Ledger (Other Ledger directives)
سایر دستورالعملهای Ledger زیر در حال حاضر پذیرفته میشوند اما نادیده گرفته میشوند. این ویژگی به hledger امکان میدهد فایلهای بیشتری از Ledger را بخواند، اما توجه داشته باشید که در صورت استفاده از این موارد، ممکن است گزارشهای hledger با گزارشهای Ledger تفاوت داشته باشند.
-
apply fixed COMM AMT apply tag TAG assert EXPR bucket / A ACCT capture ACCT REGEX check EXPR define VAR=EXPR end apply fixed end apply tag end apply year end tag eval / expr EXPR python PYTHONCODE tag NAME value EXPR --command-line-flags
همچنین برای مقایسه تفصیلی نحو hledger و Ledger به https://hledger.org/ledger.html مراجعه کنید.
هزینههای مجازی Ledger (Ledger virtual costs)
در Ledger، عبارتهای (@) UNITCOST و (@@) TOTALCOST هزینههای مجازی هستند که قیمتهای بازار ایجاد نمیکنند. در hledger، این موارد معادل @ و @@ هستند.
نحو لاتهای Ledger (Ledger lot syntax)
در Ledger، این یادداشتهای اختیاریِ پس از یک مبلغ، به تعیین مبنای هزینه (بهای تمامشده) یک لات تازه خریداریشده، یا انتخاب لات(های) موجود برای واگذاری کمک میکنند:
- {LOTUNITCOST} و {{LOTTOTALCOST}} (قیمت لات)
- [LOTDATE] (تاریخ لات)
- (LOTNOTE) (یادداشت لات)
نرمافزار hledger هنوز خود لاتها را محاسبه نمیکند، اما این یادداشتها را میپذیرد و آنها را در قالبهای خروجی txt، beancount و json دستور print نمایش میدهد. این بدان معناست که میتوانید از این نحو در دفترهای روزنامه hledger خود استفاده کنید (در صورت نیاز، همراه با یک ثبت اضافی بدون مبلغ برای کمک به تراز شدن تراکنشها)، و هر زمان که خواستید لاتها و سود سرمایهای را محاسبه کنید، از دستور print برای برونبری به Ledger یا Beancount بهره ببرید..SS "هزینههای لات ثابت در Ledger (Ledger fixed lot costs)"
- •
- {=UNITCOST} و {{=TOTALCOST}} (قیمت ثابت)
- •
- هنگام خرید، به معنای "این هزینه همان ارزش ثابت نیز هست، اجازه ندهید در گزارشهای ارزش نوسان کند" است
احتمالاً معادل با @/@@ است، اما مطمئن نیستم.
Beancount نشانهگذاری سادهتر و رفتار متفاوتی دارد:
- •
- @ UNITCOST و @@ TOTALCOST
- هزینهای را بدون ایجاد لات، همانند hledger، بیان میکند
- هنگام خرید (بهدست آوردن) یا فروش (واگذاری) یک لات، و در ترکیب با {...}: جز برای ثبت بهای تمامشده/قیمت فروش استفاده نمیشود
- •
- {UNITCOST} و {{TOTALCOST}}
- هنگام خرید، هزینه را برای تراز تراکنش بیان کرده، و همچنین یک لات به همراه این مبنای هزینه ضمیمهشده ایجاد میکند
- هنگام فروش،
- لاتی را بر اساس مبنای هزینه آن انتخاب میکند
- در صورتی که آن لات موجود نباشد یا نتوان آن را بدون ابهام انتخاب کرد (بسته به روش ثبت پیکربندیشده)، خطایی ایجاد میکند
- قیمت فروش را برای تراز تراکنش بیان میکند
- •
- {}، {YYYY-MM-DD}، {"LABEL"}، {UNITCOST, "LABEL"}، {UNITCOST, YYYY-MM-DD, "LABEL"}
- •
- هنگام فروش، ترکیبهای دیگری از تاریخ/هزینه/برچسب، مانند موارد بالا، برای انتخاب لات پذیرفته میشوند.
در حال حاضر، hledger
- از @ و @@ پشتیبانی میکند
- نشانهگذاری {UNITCOST}/{{TOTALCOST}} را میپذیرد، اما آن را نادیده میگیرد
- و سایر موارد را رد میکند.
سیاسوی (CSV)
ابزار hledger میتواند تراکنشها را از فایلهای CSV (مقادیر جداشده با کاما) بخواند. دقیقتر آنکه میتواند دادههای DSV (مقادیر جداشده با جداکننده) را از یک فایل یا ورودی استاندارد بخواند. فرمتهای جداشده با کاما، جداشده با نقطهویرگول و جداشده با تب، رایجترین انواع هستند و hledger این سه نوع را بهطور خودکار بر پایه پسوند نام فایل .csv، .ssv یا .tsv یا پیشوند مسیر فایل csv:، ssv: یا tsv: شناسایی میکند.
(برای کسب اطلاعات درباره نحوه تولید خروجی با فرمت CSV یا TSV، بخش Output format را ببینید.)
هر فایل CSV باید توسط یک فایل قوانین (rules file) متناظر توصیف شود. این فایل شامل قوانینی است که دادههای CSV (خط سربرگ، چینش فیلدها، قالب تاریخ و غیره)، چگونگی ساخت تراکنشهای hledger از آن، و نحوه دستهبندی تراکنشها بر اساس شرح یا سایر ویژگیها را توصیف میکند.
بهطور پیشفرض، hledger انتظار دارد نام این فایل قوانین مشابه فایل CSV همراه با یک پسوند الحاقی .rules در همان دایرکتوری باشد. بهعنوان مثال، هنگام درخواست خواندن foo/FILE.csv، ابزار hledger به دنبال foo/FILE.csv.rules میگردد. میتوانید با استفاده از گزینه --rules، فایل قوانین متفاوتی را مشخص کنید.
در کمترین حالت، فایل قوانین باید فیلدهای تاریخ (date) و مبلغ (amount) را مشخص کند، و اغلب همچنین قالب تاریخ و تعداد خطوط سربرگ را تعیین مینماید. در اینجا یک فایل ساده CSV و فایل قوانین متناظر با آن آورده شده است:
-
Date, Description, Id, Amount 12/11/2019, Foo, 123, 10.23
-
# basic.csv.rules skip 1 fields date, description, , amount date-format %d/%m/%Y
-
$ hledger print -f basic.csv 2019-11-12 Foo expenses:unknown 10.23 income:unknown -10.23
یک آموزش مقدماتی با عنوان Tutorial: Import CSV data در hledger.org، و نمونههای بیشتری از قوانین CSV در ادامه، و مجموعهای بزرگتر در آدرس https://github.com/simonmichael/hledger/tree/master/examples/csv در دسترس است..SS برگه تقلب قواعد CSV (CSV rules cheatsheet) انواع قواعد زیر میتوانند به هر ترتیبی در فایل قواعد ظاهر شوند. (خطوط خالی و خطوطی که با # یا ; یا * آغاز میشوند نادیده گرفته میشوند.)
| source | بهطور اختیاری مشخص میکند دادهها از کدام فایل خوانده شوند |
| archive | بهطور اختیاری ایجاد بایگانی از فایلهای واردشده را فعال میکند |
| encoding | بهطور اختیاری کدگذاری متنی (text encoding) دادهها را مشخص میکند |
| separator | جداکننده فیلدها را بهجای تکیه بر پسوند فایل مشخص میکند |
| decimal-mark | در صورت مبهم بودن، ممیز اعشاری مورد استفاده در مقادیر CSV را مشخص میکند |
| date-format | نحوه تجزیه تاریخها/تاریخ-زمانهای CSV را مشخص میکند |
| timezone | منطقه زمانی تاریخ-زمانهای مبهم CSV را مشخص میکند |
| newest-first | ترتیب تراکنشها (txn) را بهبود میبخشد هنگامی که: چندین رکورد وجود دارد، جدیدترینها در ابتدا هستند و همگی تاریخی یکسان دارند |
| intra-day-reversed | ترتیب تراکنشها (txn) را بهبود میبخشد هنگامی که: تراکنشهای همروز در ترتیبی معکوس نسبت به کل فایل قرار دارند |
| skip | (در سطح بالا) خط(های) سرایند (header) را در ابتدای فایل نادیده میگیرد |
| فهرست fields | فیلدهای CSV را برای ارجاع آسان نامگذاری میکند، و بهطور اختیاری مقادیر آنها را به فیلدهای hledger اختصاص میدهد |
| تخصیص فیلد | یک مقدار CSV یا مقدار متنی درونیابیشده را به یک فیلد hledger اختصاص میدهد |
| بلوک if | بهصورت شرطی مقادیری را به فیلدهای hledger اختصاص میدهد، یا یک رکورد را نادیده میگیرد (skip)، یا به پردازش پایان میدهد (end، نادیده گرفتن بقیه فایل) |
| جدول if | بهصورت شرطی و با استفاده از ساختار نگارشی فشرده مقادیری را به فیلدهای hledger اختصاص میدهد |
| skip | (درون یک قاعده if) رکورد(های) فعلی را نادیده میگیرد |
| end | (درون یک قاعده if) تمام رکوردهای باقیمانده را نادیده میگیرد |
| balance-type | نوع گزارهها/تخصیصهای موجودی (balance assertions/assignments) تولیدی را انتخاب میکند |
| include | یک فایل قواعد CSV دیگر را بهصورت درونخطی وارد میکند |
نکات کار با CSV را میتوان در ادامه یافت، از جمله نحوه ارزیابی قواعد CSV..SS source اگر به hledger بگویید که یک فایل csv را با -f foo.csv بخواند، در foo.csv.rules به دنبال قوانین خواهد گشت. یا میتوانید به آن بگویید فایل قوانین را با -f foo.csv.rules بخواند، و آن در foo.csv به دنبال دادهها خواهد گشت (از نسخهٔ 1.30). این دو روش عمدتاً معادل هستند، اما روش دوم قابلیتهای اضافهای را ارائه میدهد. از جمله اینکه فایل داده میتواند وجود نداشته باشد، بدون اینکه خطایی رخ دهد؛ در این حالت صرفاً خالی در نظر گرفته میشود.
برای انعطافپذیری بیشتر، یک قاعدهٔ source اضافه کنید که به شما امکان میدهد فایل دادهٔ متفاوتی را مشخص کنید:
-
source ./Checking1.csv
اگر فایل وجود نداشته باشد، بدون ایجاد خطا، صرفاً خالی در نظر گرفته میشود.
اگر تنها نام یک فایل را بدون مسیر مشخص کنید، hledger در پوشهٔ ~/Downloads به دنبال آن خواهد گشت:
-
source Checking1.csv
میتوانید از یک الگوی glob استفاده کنید تا از مشخص کردن دقیق نام فایل اجتناب شود:
-
source Checking1*.csv
این کار مزیت دیگری نیز دارد: اگر الگو با چندین فایل مطابقت داشته باشد، hledger جدیدترین آنها (که اخیراً تغییر یافته است) را خواهد خواند. این امر در صورتی که فایلی را چندین بار بدون پاکسازی بارگیری کرده باشید، از بروز مشکلات جلوگیری میکند.
همهٔ اینها یک گردش کاری آسان را فراهم میکنند که در آن میتوانید صرفاً فایلهای CSV را بارگیری کرده و سپس دستور hledger import rules/* را اجرا نمایید.
همچنین بخش "Working with CSV > Reading files specified by rule" را ببینید.
دستورهای پاکسازی داده / تولید داده
پس از الگوی فایلِ source، میتوانید | (پایپ) و یک دستور پاکسازی داده (یا زنجیرهای از دستورها) بنویسید. اگر قوانین CSV در hledger کافی نیستند، میتوانید دادههای بارگیریشده را در اینجا با یک دستور یا اسکریپت شل پیشپردازش کنید تا برای تبدیل مناسبتر شوند. این دستور توسط شل پیشفرض شما، در دایرکتوریِ فایل قوانین اجرا خواهد شد، محتوای فایل داده را به عنوان ورودی استاندارد دریافت خواهد کرد و باید صفر یا چند خط از مقادیر جدا شده با نویسه (CSV) را که برای تبدیل توسط قوانین CSV مناسب هستند، در خروجی ارائه دهد.
مثالها:
-
source ./paypal.json | paypalcsv source data/simplefin.json | simplefincsv - 'chase.*card' source OfxDownload*.csv | grep -vE '^(([^,]*,){6}[^,]*|)$' | sort -t, -n +2 source History_for_Account_Z20144832*.csv # | grep -E '^([^,]*,){12}[^,]*$' | sed -E -e 's/^ //' -e 's/\.([0-9]),/.\10,/g' -e 's/,([0-9]+),/,\1.00,/g'
یا اینکه، پس از source میتوانید | و یک دستور تولید داده را (بدون الگوی فایل پیش از |) بنویسید. این دستور هیچ ورودیای دریافت نمیکند و باید صفر یا چند خط از مقادیر جدا شده با نویسه را که برای تبدیل توسط قوانین CSV مناسب هستند، در خروجی تولید کند.
مثالها:
-
source | paypaljson | paypalcsv source | paypalcsv data/paypal.json source | simplefinjson >data/simplefin.json && simplefincsv data/simplefin.json 'chase.*card' source | simplefincsv data/simplefin.json 'unify.*checking'
(اسکریپتهای paypal* و simplefin* در bin/ قرار دارند)
هر زمان که hledger یکی از این دستورها را اجرا کند، آن دستور را در stderr بازتاب (echo) خواهد داد. اگر دستور خروجی خطا تولید کند اما با موفقیت خاتمه یابد، hledger خروجی خطا را به عنوان یک هشدار نمایش میدهد. اگر دستور با شکست مواجه شود، hledger نیز ناموفق خواهد بود و خروجی خطا را در پیام خطا نمایش میدهد.
اضافهشده در نسخهٔ 1.50؛ آزمایشی..SS archive با افزودن archive به یک فایل قوانین، دستور import هر فایل داده یا خروجی دستور دادهٔ پردازششده با موفقیت را در یک دایرکتوری data/ مجاور بایگانی خواهد کرد. نام فایل بایگانی بر اساس فایل قوانین و تاریخ ویرایش و پسوند فایل داده (یا برای دستوری که داده تولید میکند، تاریخ جاری و پسوند ".csv") تعیین خواهد شد. فایل دادهٔ اصلی، در صورت وجود، حذف خواهد شد.
همچنین، در این حالت import قدیمیترین فایل منطبق با الگوی glob در قانون source را ترجیح میدهد، نه جدیدترین را. (بنابراین اگر چندین بارگیری وجود داشته باشد، ابتدا قدیمیترینها وارد و بایگانی میشوند.)
بایگانی کردن اختیاری است، اما میتواند برای عیبیابی قوانین CSV، بازتولید مدخلها با قوانین بهبودیافته، بررسی تغییرات در CSV بانک شما و غیره مفید باشد.
در نسخهٔ 1.50 افزوده شد؛ آزمایشی.
encoding
-
encoding ENCODING
hledger بهطور معمول انتظار دارد متنهای غیر ascii با کدگذاری متن locale سیستم باشند. اگر نیاز به خواندن فایلهای CSV با کدگذاری دیگری دارید، میتوانید با افزودن encoding ENCODING به قوانین CSV خود این کار را انجام دهید. برای مثال: encoding iso-8859-1.
کدگذاریهای زیر پشتیبانی میشوند:
ascii, utf-8, utf-16, utf-32, iso-8859-1, iso-8859-2, iso-8859-3, iso-8859-4, iso-8859-5, iso-8859-6, iso-8859-7, iso-8859-8, iso-8859-9, iso-8859-10, iso-8859-11, iso-8859-13, iso-8859-14, iso-8859-15, iso-8859-16, cp1250, cp1251, cp1252, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258, koi8-r, koi8-u, gb18030, macintosh, jis-x-0201, jis-x-0208, iso-2022-jp, shift-jis, cp437, cp737, cp775, cp850, cp852, cp855, cp857, cp860, cp861, cp862, cp863, cp864, cp865, cp866, cp869, cp874, cp932.
در نسخهٔ 1.42 افزوده شد.
separator
میتوانید از قانون separator برای خواندن انواع دیگر دادههای جداشده با نویسه (character-separated) استفاده کنید. آرگومان میتواند هر تکنویسهٔ جداکننده یا کلمات tab یا space (بدون حساسیت به بزرگی و کوچکی حروف) باشد. برای مثال، برای مقادیر جداشده با کاما (CSV):
-
separator ,
یا برای مقادیر جداشده با نقطهویرگول (SSV):
-
separator ;
یا برای مقادیر جداشده با تب (TSV):
-
separator TAB
اگر فایل ورودی دارای پسوند فایل .csv، .ssv یا .tsv (یا پیشوند csv:، ssv: یا tsv:) باشد، جداکنندهٔ مناسب بهطور خودکار استنتاج میشود و نیازی به این قانون نخواهید داشت..SS skip
-
skip N
واژه skip به همراه یک عدد (یا بدون عدد، به معنای ۱) به hledger میگوید که این تعداد خط غیرخالی را در ابتدای دادههای ورودی نادیده بگیرد. هر زمان که دادههای CSV شما حاوی خطوط سرآیند باشد، به این مورد نیاز خواهید داشت. توجه داشته باشید که خطوط خالی بهطور خودکار نادیده گرفته میشوند، بنابراین نیازی به شمارش آنها نیست.
دستور skip کاربرد دومی نیز دارد: میتوان از آن درون بلوکهای if (که در ادامه توضیح داده شده) استفاده کرد تا در صورت برقرار بودن شرط، یک یا چند رکورد نادیده گرفته شوند. رکوردهایی که به این صورت رد میشوند نادیده گرفته خواهند شد، با این استثنا که همچنان باید CSV معتبر باشند.
date-format
-
date-format DATEFMT
این یک قاعده کمکی برای فیلدهای date (و date2) است. اگر تاریخهای CSV شما به قالب YYYY-MM-DD، YYYY/MM/DD یا YYYY.MM.DD نیستند، باید یک قاعده date-format اضافه کنید که آنها را با یک الگوی تجزیه تاریخ به سبک strptime توصیف کند - پیوند زیر را ببینید: https://hackage.haskell.org/package/time/docs/Data-Time-Format.html#v:formatTime الگو باید مقدار تاریخ CSV را بهطور کامل تجزیه کند. چند مثال:
-
# MM/DD/YY date-format %m/%d/%y
-
# D/M/YYYY # The - makes leading zeros optional. date-format %-d/%-m/%Y
-
# YYYY-Mmm-DD date-format %Y-%h-%d
-
# M/D/YYYY HH:MM AM some other junk # Note the time and junk must be fully parsed, though only the date is used. date-format %-m/%-d/%Y %l:%M %p some other junk
توجه داشته باشید که در حال حاضر هیچگونه پشتیبانی از محلیسازی (locale) برای مواردی مانند %b وجود ندارد و مقداردهی LC_TIME کمکی نخواهد کرد.
timezone
-
timezone TIMEZONE
هنگامی که CSV حاوی تاریخ-زمانهایی است که بهطور ضمنی در منطقهای زمانی غیر از منطقه شما قرار دارند اما حاوی اطلاعات صریح منطقه زمانی نیستند، میتوانید از این قاعده برای اعلام منطقه زمانی بومی CSV استفاده کنید؛ این کار به جلوگیری از خطای جابهجایی یکروزه تاریخها (off-by-one) کمک میکند.
هنگامی که تاریخ-زمانهای CSV حاوی اطلاعات منطقه زمانی هستند، به این قاعده نیازی نخواهید داشت؛ در عوض، از %Z در date-format استفاده کنید (یا %z، %EZ، %Ez؛ پیوند formatTime در بالا را ببینید).
در هر یک از این حالات، hledger تبدیلی آگاه از منطقه زمانی انجام داده و تاریخ-زمانهای CSV را به منطقه زمانی جاری سیستم شما محلیسازی میکند. اگر ترجیح میدهید محلیسازی به منطقه زمانی دیگری انجام شود، برای نمونه جهت بازتولیدپذیری، میتوانید (دستکم در یونیکس) منطقه زمانی خروجی را با متغیر محیطی TZ تنظیم کنید؛ برای مثال:
-
$ TZ=-1000 hledger print -f foo.csv # or TZ=-1000 hledger import foo.csv
قاعده timezone در حال حاضر نامهای مناطق زمانی را تشخیص نمیدهد، به جز "UTC"، "GMT"، "EST"، "EDT"، "CST"، "CDT"، "MST"، "MDT"، "PST" یا "PDT". برای سایر موارد، از قالب عددی استفاده کنید: +HHMM یا -HHMM..SS newest-first ابزار hledger تلاش میکند تا اطمینان حاصل کند که تراکنشهای تولیدشده دارای ترتیب زمانی خواهند بود، از جمله تراکنشهای مربوط به یک روز یکسان. معمولاً این ابزار میتواند ترتیب رکوردهای CSV را بهطور خودکار تشخیص دهد. اما اگر با یک فایل CSV مواجه شود که تمام رکوردهای آن دارای تاریخی یکسان باشند، فرض را بر این میگذارد که رکوردها از قدیمیترین به جدیدترین مرتب شدهاند. اگر در واقعیت رکوردهای CSV معمولاً از جدیدترین به قدیمیترین باشند، مانند:
-
2022-10-01, txn 3... 2022-10-01, txn 2... 2022-10-01, txn 1...
میتوانید قاعده newest-first را اضافه کنید تا به hledger در تولید تراکنشها با ترتیب درست کمک نمایید.
-
# same-day CSV records are newest first newest-first
intra-day-reversed
اگر رکوردهای CSV در یک روز معین برعکس ترتیب کلی رکوردها مرتب شده باشند، میتوانید قاعده intra-day-reversed را برای بهبود ترتیب مدخلهای دفتر کل اضافه کنید. بهعنوان مثال، در اینجا ترتیب کلی رکوردها از جدیدترین به قدیمیترین است، اما رکوردهای همان روز از قدیمیترین به جدیدترین مرتب شدهاند:
-
2022-10-02, txn 3... 2022-10-02, txn 4... 2022-10-01, txn 1... 2022-10-01, txn 2...
-
# transactions within each day are reversed with respect to the overall date order intra-day-reversed
decimal-mark
-
decimal-mark .
یا:
-
decimal-mark ,
ابزار hledger هنگام تجزیه اعداد، بهطور خودکار نقطه یا ویرگول را بهعنوان نشانگر اعشار میپذیرد (رجوع کنید به Amounts). با این حال، اگر هر یک از اعداد در فایل CSV شامل نشانگرهای گروهبندی ارقام مانند ویرگولهای جداکننده هزارگان باشند، باید با استفاده از این قاعده نشانگر اعشار را بهطور صریح مشخص کنید تا از خطای تجزیه اعداد جلوگیری شود.
فیلدهای CSV و فیلدهای hledger
این موضوع میتواند گیجکننده باشد، بنابراین اجازه دهید با یک مرور کلی شروع کنیم:
- فیلدهای CSV توسط فایل داده شما ارائه میشوند. نامگذاری آنها بر اساس موقعیت مکانیشان در رکورد CSV و با شروع از ۱ انجام میشود. همچنین میتوانید یک نام خوانا به آنها اختصاص دهید.
- فیلدهای hledger از پیش تعریفشده هستند؛ date، description، account1، amount1 و account2 برخی از آنها هستند. آنها بیشتر با بخشهایی از یک مدخل دفتر کل تراکنش مطابقت دارند.
- فیلدهای CSV و فیلدهای hledger تنها فیلدهایی هستند که با آنها کار خواهید کرد؛ شما نمیتوانید فیلدهای جدید یا متغیرهایی مانند یک زبان برنامهنویسی تعریف کنید. (اما میتوانید در مرحله پیشپردازش، پیش از اجرای قواعد، فیلدهای CSV اضافی را به دادهها اضافه نمایید.)
- برای هر رکورد CSV، مقادیری را به یک یا چند مورد از فیلدهای hledger اختصاص میدهید تا یک تراکنش (مدخل دفتر کل) ایجاد شود. مقادیر میتوانند متنی ایستا، مقادیر فیلد CSV از رکورد جاری، یا ترکیبی از اینها باشند.
- برای موارد ساده، میتوانید نام یک فیلد CSV را همنام با یکی از فیلدهای hledger تعیین کنید؛ در این صورت مقدار آن بهطور خودکار به آن فیلد hledger اختصاص خواهد یافت.
- فیلدهای CSV فقط قابل خواندن هستند و امکان نوشتن در آنها وجود ندارد. آنها در سمت راست و با یک پیشوند % قرار میگیرند. بهعنوان مثال:
- بررسی مقدار یک فیلد CSV: if %CSVFIELD ...
- درج و جایگزینی مقدار آن: HLEDGERFIELD %CSVFIELD
- •
- فیلدهای hledger فقط قابل نوشتن هستند و خوانده نمیشوند. آنها در سمت چپ (یا در فهرست فیلدها) و بدون هیچ پیشوندی قرار میگیرند. بهعنوان مثال:
- تنظیم شرح تراکنش روی یک مقدار: description VALUE
- تنظیم شرح تراکنش با مقدار دومین فیلد CSV:
fields date, description, amount
-
fields FIELDNAME1, FIELDNAME2, ...
یک فهرست فیلدها (کلمهٔ fields که در ادامهٔ آن نامهای فیلد با کاما از هم جدا شدهاند) اختیاری، اما کارآمد است. این فهرست دو کار انجام میدهد:
- 1.
- به فیلد CSV در هر ستون نام اختصاص میدهد. این کار در صورتی که در سایر قوانین به آنها ارجاع دهید سودمند است، تا بتوانید بهجای بهخاطر سپردن %13، از %SomeField استفاده کنید.
- 2.
- هر زمان که از یکی از نامهای فیلد خاص hledger (که در ادامه شرح داده شده) استفاده کنید، مقدار CSV در این موقعیت را به آن فیلد hledger اختصاص میدهد. این سریعترین راه برای مقداردهی فیلدهای hledger و ساخت یک تراکنش است.
در اینجا مثالی آمده است که میگوید "از فیلدهای اول، دوم و چهارم بهعنوان تاریخ، شرح و مقدار تراکنش استفاده کن؛ دو فیلد آخر را برای ارجاعهای بعدی نامگذاری کن؛ و بقیه را نادیده بگیر":
-
fields date, description, , amount, , , somefield, anotherfield
در فهرست فیلدها، جداکننده همیشه کاما است؛ این مورد ارتباطی با جداکنندهٔ فایل CSV ندارد. همچنین:
- باید دستکم دو مورد در فهرست وجود داشته باشد (حداقل یک کاما).
- نامهای فیلد نباید شامل فاصله باشند. فاصلههای قبل یا بعد از نام فیلد اختیاری هستند.
- نامهای فیلد میتوانند شامل _ (خط زیرین) یا - (خط پیوند) باشند.
- به فیلدهایی که برایتان اهمیتی ندارند میتوان یک نام ساختگی یا یک نام خالی اختصاص داد.
اگر فایل CSV شامل سرستون باشد، مناسب است که از آنها برای نامهای فیلد خود، پس از اعمال تغییرات لازم (مثلاً تبدیل به حروف کوچک و جایگزینی فاصلهها با خط زیرین) استفاده کنید.
گاهی اوقات ممکن است بخواهید نام یک فیلد CSV را تغییر دهید تا از انتساب به یک فیلد همنام در hledger جلوگیری کنید. بهعنوان مثال، میتوانید فیلد "balance" در CSV را balance_ بنامید تا از تنظیم مستقیم فیلد balance در hledger (و ایجاد یک اعتبارسنجی تراز) جلوگیری شود.
تخصیص فیلد
-
HLEDGERFIELD FIELDVALUE
تخصیص فیلد روش انعطافپذیرتری برای انتساب مقادیر CSV به فیلدهای hledger است. از آنها میتوان بهجای فهرست فیلدها یا علاوه بر آن (به بالا مراجعه کنید) استفاده کرد.
برای انتساب یک مقدار به فیلد hledger، نام فیلد (هر یک از نامهای فیلدها/شبهفیلدهای استاندارد hledger که در ادامه تعریف شدهاند)، یک فاصله، و سپس یک مقدار متنی در همان خط بنویسید. این مقدار متنی میتواند فیلدهای CSV را درونیابی کند، که یا با موقعیت مبتنی بر ۱ آنها در رکورد CSV (%N) یا با نامی که در فهرست فیلدها به آنها داده شده است (%CSVFIELD) و گروههای تطابق عبارت باقاعده (\N) به آنها ارجاع داده میشود.
چند مثال:
-
# تنظیم مقدار بر روی چهارمین فیلد CSV، همراه با افزودن " USD" در انتها amount %4 USD # ترکیب سه فیلد برای ساخت کامنت، شامل برچسبهای note: و date: comment note: %somefield - %anotherfield, date: %1
نکات:
- درونیابی فاصلههای خالی ابتدا و انتها را حذف میکند (بنابراین یک مقدار CSV مانند " 1 " هنگام درونیابی به 1 تبدیل میشود) (#1051).
- درونیابیها همیشه به یک فیلد CSV ارجاع میدهند - نمیتوانید یک فیلد hledger را درونیابی کنید. (به «ارجاع به سایر فیلدها» در ادامه مراجعه کنید)..SS "نامهای فیلد (Field names)" به دو نوع نام فیلد که در اینجا ذکر شده و فقط در فایلهای قواعد CSV برنامهٔ hledger به کار میروند، توجه کنید:
- 1.
- نامهای فیلد CSV (در این مستندات CSVFIELD): میتوانید ستونهای CSV را بهطور اختیاری برای ارجاع آسان نامگذاری کنید (چرا که hledger هنوز عناوین ستونها را در یک فایل CSV بهطور خودکار تشخیص نمیدهد)، از طریق نوشتن نامهای دلخواه در یک فهرست fields، به عنوان مثال:
-
fields When, What, Some_Id, Net, Total, Foo, Bar
- 2.
- نامهای فیلد ویژهٔ hledger (در این مستندات HLEDGERFIELD): برای تولید تراکنش hledger از یک رکورد CSV، باید حداقل برخی از اینها را با نوشتن آنها در سمت چپ یک انتساب فیلد مقداردهی کنید، به عنوان مثال:
-
date %When code %Some_Id description %What comment %Foo %Bar amount1 $ %Total
یا مستقیماً در یک فهرست fields:
-
fields date, description, code, , amount1, Foo, Bar currency $ comment %Foo %Bar
در اینجا تمام نامهای فیلد ویژهٔ موجود در hledger و آنچه هنگام مقداردهی به آنها رخ میدهد آمده است:
فیلد date (date field)
مقداردهی به date تاریخ تراکنش را تعیین میکند.
فیلد date2 (date2 field)
فیلد date2 تاریخ ثانویهٔ تراکنش را، در صورت وجود، تعیین میکند.
فیلد status (status field)
فیلد status وضعیت تراکنش را، در صورت وجود، تعیین میکند.
فیلد code (code field)
فیلد code کد تراکنش را، در صورت وجود، تعیین میکند.
فیلد description (description field)
فیلد description شرح تراکنش را، در صورت وجود، تعیین میکند.
فیلد comment (comment field)
فیلد comment یادداشت تراکنش را، در صورت وجود، تعیین میکند.
فیلد commentN، که در آن N یک عدد است، یادداشت Nاُمین ثبت (posting) را تعیین میکند.
میتوانید یادداشتهای چندخطی را با نوشتن صریح \n در کد تعیین کنید. یادداشتی که با \n شروع شود، از یک خط جدید آغاز خواهد شد.
یادداشتها طبق معمول میتوانند شامل برچسبها (tags) باشند.
یادداشتهای ثبت همچنین میتوانند حاوی تاریخ ثبت باشند. تاریخ ثانویه، یا تاریخی بدون سال، نادیده گرفته خواهد شد.
فیلد account (account field)
مقداردهی به accountN، که در آن N عددی از ۱ تا ۹۹ است، نام حسابِ Nاُمین ثبت را تعیین کرده و باعث تولید آن ثبت میشود.
در بیشتر مواقع دو ثبت وجود دارد، بنابراین مایلید account1 و account2 را تعیین کنید. معمولاً account1 با فایل CSV مرتبط است و یکبار با یک انتساب در سطح بالا مقداردهی میشود، در حالی که account2 بر اساس شرح هر تراکنش در قواعد شرطی مقداردهی میشود.
اگر نام حسابِ یک ثبت تعیین نشود اما مبلغ آن مشخص شده باشد (پایین را ببینید)، یک نام حساب پیشفرض انتخاب خواهد شد (مانند "expenses:unknown" یا "income:unknown").
فیلد amount (amount field)
روشهای مختلفی برای تعیین مبالغ ثبت از روی CSV وجود دارد که در موقعیتهای گوناگون مفید هستند.
- 1.
- فیلد amount قدیمیترین و سادهترین حالت است. مقداردهی به این فیلد، مبلغ اولین و دومین ثبت را تعیین میکند. در ثبت دوم، علامت مبلغ منفی میشود؛ همچنین، اگر بهایی به آن پیوست شده باشد، به بهای تمامشده تبدیل خواهد شد.
- 2.
- فیلدهای amount-in و amount-out دقیقاً مانند مورد بالا عمل میکنند، اما زمانی باید استفاده شوند که CSV دو فیلد مبلغ دارد (مانند "Debit" و "Credit"، یا "Inflow" و "Outflow"). هر فیلدی که مقدار غیرصفر داشته باشد، به عنوان مبلغ ثبت اول و دوم استفاده خواهد شد. در اینجا نکاتی برای جلوگیری از سردرگمی آمده است:
- به این صورت نیست که "amount-in برای ثبت ۱ و amount-out برای ثبت ۲ باشد"، بلکه به این صورت است که "یک مبلغ واحد را از فیلد amount-in یا amount-out استخراج کن، و از آن برای ثبت ۱ و (بهصورت منفیشده) برای ثبت ۲ استفاده کن".
- از هر دوی amount و amount-in/amount-out در یک فایل قواعد مشترک استفاده نکنید؛ بر اساس اینکه آیا مبلغ در یک فیلد منفرد CSV قرار دارد یا بین دو فیلد پخش شده است، انتخاب کنید.
- در هر رکورد، حداکثر یکی از دو فیلد CSV باید حاوی مبلغ غیرصفر باشد؛ فیلد دیگر باید شامل صفر یا خالی باشد.
- برنامهٔ hledger فرض میکند که هر دو فیلد CSV شامل اعداد بدون علامت هستند و بهطور خودکار مقادیر amount-out را منفی میکند.
- اگر دادهها با این نیازمندیها مطابقت ندارند، احتمالاً به یک قاعدهٔ if نیاز خواهید داشت (پایین را ببینید).
- 3.
- فیلد amountN (که در آن N عددی از ۱ تا ۹۹ است) مبلغِ تنها یک ثبت را تعیین میکند: Nاُمین ثبت در تراکنش. معمولاً برای ایجاد یک تراکنش تراز (متوازن) به حداقل دو مورد از این انتسابها نیاز خواهید داشت. همچنین میتوانید برای نمایش تراکنشهای پیچیدهتر، بیش از دو ثبت تولید کنید. شمارههای ثبت نیازی نیست متوالی باشند؛ همراه با قواعد if، شمارههای ثبت بالاتر میتوانند برای اطمینان از یک ترتیب مشخص برای ثبتها مفید باشند.
- 4.
- فیلدهای amountN-in و amountN-out دقیقاً مانند مورد بالا عمل میکنند، اما زمانی باید استفاده شوند که فایل CSV دو فیلد مبلغ دارد. این فیلدها معادل amount-in و amount-out هستند و نکات یادشده در مورد آنها در اینجا نیز صدق میکند.
- 5.
- به یاد داشته باشید که یک فهرست fields نیز میتواند انتسابها را انجام دهد. بنابراین اگر در یک فهرست fields یک فیلد CSV را "amount" بنامید، این عمل معادل انتساب به amount به حساب میآید. (اگر این را نمیخواهید، در فهرست fields نام دیگری به آن بدهید، مانند "amount_".)
- 6.
- موارد بالا پاسخگوی هر وضعیتی نیستند؛ اگر به انعطافپذیری بیشتری نیاز دارید، از یک قاعدهٔ if برای تعیین شرطی مبالغ استفاده کنید. برای اطلاعات بیشتر در این مورد و بهطور کلی دربارهٔ نحوهٔ تعیین مبالغ، به بخش "کار با CSV > تعیین مبالغ (Working with CSV > Setting amounts)" در زیر مراجعه کنید..SS فیلد currency currency یک نماد واحد پولی تعیین میکند تا به ابتدای مبالغ تمام ثبتها افزوده شود. اگر مبالغ CSV نماد ارز ندارند، برای نمونه زمانی که در یک ستون جداگانه قرار دارند، میتوانید از این مورد استفاده کنید.
currencyN نماد واحد پولی را تنها به ابتدای مبلغ ثبت Nام میافزاید.
فیلد balance
balanceN یک مبلغ راستیآزمایی تراز (یا اگر مبلغ ثبت خالی رها شود، یک انتساب تراز) را روی ثبت Nام تنظیم میکند.
balance نگارشی برای سازگاری با نسخههای پیش از 1.17 برنامهٔ hledger است؛ این مورد معادل balance1 میباشد.
میتوانید نوع راستیآزمایی/انتساب را با قاعدهٔ balance-type تنظیم کنید (به بخش زیر مراجعه کنید).
برای اطلاعات بیشتر پیرامون تنظیم مبالغ و ارز، به نکات بخش Working with CSV در ادامه مراجعه کنید.
بلوک if
قواعد میتوانند بسته به الگوهای موجود در دادههای CSV، بهصورت شرطی اعمال شوند. این ویژگی انعطافپذیری بالایی فراهم میکند؛ بهویژه روشی است که از طریق آن میتوانید تراکنشها را دستهبندی کرده و (برای مثال) بر اساس شرح آنها، نام حساب مناسب را انتخاب کنید. دو روش برای نوشتن قواعد شرطی وجود دارد: «بلوکهای if» که در اینجا توضیح داده شدهاند، و «جدولهای if» که در ادامه شرح داده میشوند.
یک بلوک if شامل کلمهٔ if و یک یا چند عبارت «تطبیقدهنده» (میتواند یک کلمه یا عبارت باشد) در هر سطر است، که از همان سطر یا سطر بعدی آغاز میشوند؛ و به دنبال آن یک یا چند قاعدهٔ دندانهدار میآید. برای نمونه،
-
if MATCHER RULE
یا
-
if MATCHER MATCHER MATCHER RULE RULE
اگر هر یک از تطبیقدهندهها موفق شود، همهٔ قواعد دندانهدار اعمال خواهند شد. این قواعد معمولاً انتساب فیلدها هستند، اما قواعد ویژهٔ زیر نیز میتوانند درون یک بلوک if استفاده شوند:
- skip - رکوردِ تطبیقیافتهٔ CSV را نادیده میگیرد (هیچ تراکنشی از آن ایجاد نمیکند)
- end - از باقیماندهٔ فایل CSV جاری صرفنظر میکند.
چند مثال:
-
# اگر رکورد شامل «groceries» باشد، account2 را روی «expenses:groceries» تنظیم کن if groceries account2 expenses:groceries
-
# اگر رکورد شامل هر یک از این عبارتها باشد، account2 و یک توضیح تراکنش را مطابق نمایش دادهشده تنظیم کن if monthly service fee atm transaction fee banking thru software account2 expenses:business:banking comment XXX deductible ? check it
-
# اگر یک رکورد خالی مشاهده شود (با فرض پنج فیلد)، از بقیهٔ فایل CSV صرفنظر کن if ,,,, end دو نوع تطبیقدهنده وجود دارد:
- 1.
-
یک تطبیقدهنده کل رکورد سادهترین نوع است: صرفاً یک کلمه، تکهمتن تکخطی یا هر عبارت باقاعده دیگری است که hledger تلاش میکند آن را بدون حساسیت به بزرگی و کوچکی حروف در هر کجای رکورد CSV تطبیق دهد.
برای مثال: whole foods.
- 2.
-
یک تطبیقدهنده فیلد دارای شماره یا نام فیلد CSV با پیشوند درصد (%) قبل از الگو است.
برای مثال: %3 whole foods یا %description whole foods.
دستور hledger تلاش خواهد کرد تا الگو را صرفاً درون فیلد نامبردهشدهٔ CSV تطبیق دهد.
هنگام استفاده از اینها، باید به دو نکته توجه داشت:
- 1.
-
تطبیقدهندههای کل رکورد، رکورد اصلی و دقیق را نمیبینند؛ بلکه بازسازیشدهای از آن را میبینند که در آن مقادیر با کاما از یکدیگر جدا شدهاند و علامتهای نقلقولِ دربرگیرنده مقادیر و فاصلههای خالی خارج از آن نقلقولها حذف شدهاند.
برای مثال، هنگام خواندن یک رکورد SSV مانند:
2023-01-01 ; "Acme, Inc. " ; 1,000
تطبیقدهنده کل رکورد در عوض این مقدار را میبیند:
2023-01-01,Acme, Inc. ,1,000
- 2.
-
تطبیقدهندههای فیلد انتظار یک شماره فیلد CSV یا نام فیلد CSV تعریفشده با fields را دارند. هر مقدار دیگری باعث میشود که با رشته خالی تطبیق داده شود و احتمالاً بدون هیچ پیامی ناموفق شود (این رفتار، استفاده مجدد از قوانین مشترک با فایلهای مختلف CSV را آسانتر میکند). در اینجا از نام فیلد hledger استفاده نکنید (به بخش فیلدهای CSV و فیلدهای hledger مراجعه کنید).
همچنین میتوانید در ابتدای یک تطبیقدهنده از ! (و یک فاصله اختیاری) استفاده کنید تا آن را نقیض کنید. برای مثال ! whole foods، ! %3 whole foods و !%description whole foods در صورتی تطبیق مییابند که عبارت "whole foods" وجود نداشته باشد. اضافهشده در نسخه 1.32.
الگو، طبق معمول در hledger، یک عبارت باقاعده تعمیمیافته POSIX است که از مرزهای کلمه گنو (\b، \B، \< و \>) و هیچ چیز دیگری پشتیبانی نمیکند. برای جزئیات و نکات بیشتر، به بخش «عبارتهای باقاعده در قوانین CSV» در زیر مراجعه کنید.
چندین تطبیقدهنده (Multiple matchers)
هنگامی که یک بلوک if چندین تطبیقدهنده داشته باشد که هر کدام در خط خودش قرار دارد:
- به طور پیشفرض با یکدیگر OR میشوند (تطبیق هر یک از آنها کافی است).
- خطوط تطبیقدهندهای که با & (یا &&، از نسخه 1.42) شروع میشوند، با تطبیقدهنده بالایی AND میشوند (تمام موارد موجود در گروه AND شده باید تطبیق یابند).
- خطوط تطبیقدهندهای که با & ! (از نسخه 1.41، یا && !، از نسخه 1.42) شروع میشوند، ابتدا نقیض شده و سپس با تطبیقدهنده بالایی AND میشوند.
همچنین میتوانید چندین تطبیقدهنده را در همان خط با جداکننده && (عملگر AND) یا && ! (عملگر AND NOT) ترکیب کنید. برای مثال %description amazon && %date 2025-01-01 تنها در صورتی تطبیق مییابد که فیلد description شامل "amazon" و فیلد date شامل "2025-01-01" باشد. اضافهشده در نسخه 1.42.
گروههای تطبیق (Match groups)
اضافهشده در نسخه 1.32
تطبیقدهندهها میتوانند گروههای تطبیق تعریف کنند: بخشهای پرانتزدار از عبارت باقاعده که برای ارجاع در انتسابهای فیلد در دسترس هستند. گروهها در پرانتزهای معمولی (( و )) محصور میشوند و میتوانند تو در تو باشند. هر گروه با استفاده از نشانه \N در انتسابهای فیلد قابل دسترسی است، که در آن N نمایه گروه تطبیق برای این بلوک شرطی است (مانند \1، \2 و غیره).
مثال: انتقال ثبتهای پرداخت کارت اعتباری به ابتدای دوره صورتحساب (آغاز ماه)، برای تطابق با نحوه نمایش آنها در صورتحسابها با استفاده از تاریخهای ثبت:
-
if %date (....-..)-.. comment2 date:\1-01
مثالی دیگر: خواندن حساب هزینه از فیلد CSV، اما دور انداختن یک پیشوند:
-
if %account1 liabilities:family:(expenses:.*) account1 \1 «جدولهای if» جایگزینی برای بلوکهای if هستند؛ آنها میتوانند تطبیقدهندهها و انتسابهای فیلد متعددی را در قالب جدولی فشردهتر بیان کنند، مانند نمونه زیر: -
if,HLEDGERFIELD1,HLEDGERFIELD2,... MATCHERA,VALUE1,VALUE2,... MATCHERB && MATCHERC,VALUE1,VALUE2,... (*since 1.42*) ; Comment line that explains MATCHERD MATCHERD,VALUE1,VALUE2,... <empty line>
نخستین نویسه پس از if به عنوان جداکننده فیلد این جدول if در نظر گرفته میشود. این جداکننده ارتباطی با جداکننده استفادهشده در فایل CSV ندارد. باید یک نویسه غیرحرفی-عددی مانند , یا | باشد که در هیچ کجای دیگر جدول ظاهر نشود (نباید در نام فیلدها، تطبیقدهندهها یا مقادیر استفاده شود و نمیتوان آن را با یک بکاسلش گریز داد).
هر خط باید تعداد یکسانی جداکننده داشته باشد؛ مقادیر خالی مجاز هستند. میتوان برای خوانایی بیشتر از نویسههای فاصله (whitespace) در خطوط تطبیقدهنده استفاده کرد (اما در حال حاضر نه در خط if). میتوانید از خطوط توضیحات (کامنت) در بدنه جدول استفاده کنید. جدول باید با یک خط خالی (یا پایان فایل) خاتمه یابد.
یک جدول if مانند بالا به این صورت تفسیر میشود: تمام خطوط دارای تطبیقدهنده بررسی میشوند؛ هرگاه خطی با تطبیقدهنده موفق شود، تمام مقادیر آن خط به فیلدهای متناظر hledger انتساب مییابند؛ اگر چندین خط تطبیق یابند، خطوط بعدی فیلدهای انتسابیافته توسط خطوط قبلی را بازنویسی (override) خواهند کرد - دقیقاً همان رفتاری که توالی بلوکهای if دارند.
جدول if نشاندادهشده در بالا معادل این توالی از بلوکهای if است:
-
if MATCHERA HLEDGERFIELD1 VALUE1 HLEDGERFIELD2 VALUE2 ... if MATCHERB && MATCHERC HLEDGERFIELD1 VALUE1 HLEDGERFIELD2 VALUE2 ... ; Comment line which explains MATCHERD if MATCHERD HLEDGERFIELD1 VALUE1 HLEDGERFIELD2 VALUE2 ...
مثال:
-
if,account2,comment atm transaction fee,expenses:business:banking,deductible? check it %description groceries,expenses:groceries, ;; Comment line that desribes why this particular date is special 2023/01/12.*Plumbing LLC,expenses:house:upkeep,emergency plumbing call-out
balance-type
ارزیابیهای تراز (balance assertions) تولیدشده با مقداردهی به balanceN بهطور پیشفرض از نوع ساده = هستند که یک ارزیابی تککالایی و بدون احتساب زیرحسابها است. ممکن است گونههای شامل زیرحسابها را کاربردیتر بیابید؛ برای مثال اگر برای کمک به بودجهبندی، زیرحسابهای مجازی برای checking ایجاد کرده باشید. میتوانید با استفاده از قاعده balance-type نوع دیگری از ارزیابی را انتخاب کنید:
-
# balance assertions will consider all commodities and all subaccounts balance-type ==*
انواع ارزیابی تراز برای ارجاع سریع در زیر آورده شدهاند:
-
= single commodity, exclude subaccounts =* single commodity, include subaccounts == multi commodity, exclude subaccounts ==* multi commodity, include subaccounts
-
include RULESFILE
این دستور، محتویات یک فایل قوانین CSV دیگر را در این نقطه وارد میکند. RULESFILE یک مسیر فایل مطلق یا یک مسیر نسبی به دایرکتوری فایل فعلی است. این قابلیت میتواند برای بهاشتراکگذاری قوانین مشترک بین چندین فایل قوانین مفید باشد؛ برای مثال:
-
# someaccount.csv.rules ## someaccount-specific rules fields date,description,amount account1 assets:someaccount account2 expenses:misc ## common rules include categorisation.rules
کار با CSV
چند نکته:
بازخورد سریع
ایده خوبی است که در حین ایجاد یا عیبیابی قوانین CSV، بازخورد سریع دریافت کنید. در اینجا یک روش مناسب با استفاده از entr برگرفته از eradman.com/entrproject آورده شده است:
-
$ ls foo.csv* | entr bash -c 'echo ----; hledger -f foo.csv print desc:SOMEDESC'
یک پرسوجوی desc: (برای مثال) برای انتخاب تنها یک یا چند تراکنش مورد نظر استفاده میشود. از "bash -c" برای اجرای چندین دستور استفاده شده است تا بتوانیم با هر بار اجرای مجدد دستور یک جداکننده چاپ کنیم و خواندن خروجی آسانتر شود.
CSV معتبر
توجه داشته باشید که hledger فقط CSVهای معتبر منطبق بر RFC 4180 و قالبهای معادل SSV و TSV (مانند RFC 4180 اما با نقطه-ویرگول یا تب بهعنوان جداکننده) را میپذیرد. این بدان معناست که برای مثال:
- مقادیر ممکن است در علامت نقلقول جفتی قرار گیرند یا نگیرند. قرار دادن در علامت نقلقول تکی مجاز نیست. (برای مثال 'A','B' رد میشود.)
- هنگامی که مقادیر در علامت نقلقول جفتی قرار میگیرند، فاصلهها در بیرون علامت نقلقول مجاز نیستند. (برای مثال "A", "B" رد میشود.)
- هنگامی که مقادیر درون علامت نقلقول قرار ندارند، نباید شامل علامت نقلقول جفتی باشند. (برای مثال A"A, B رد میشود.)
اگر CSV/SSV/TSV شما از این نظر معتبر نیست، لازم است پیش از خواندن آن با hledger، آن را تبدیل کنید. استفاده از sed یا یک تجزیهکننده آسانگیرتر CSV مانند کتابخانه csv در python را امتحان کنید.
پسوند فایل
برای کمک به hledger در انتخاب خواننده فایل CSV و نمایش پیامهای خطای مناسب (و انتخاب نویسه جداکننده فیلد پیشفرض به شکل صحیح)، بهتر است فایلهای CSV/SSV/TSV با پسوند نام فایل .csv، .ssv یا .tsv نامگذاری شوند. (اطلاعات بیشتر در این زمینه در بخش قالبهای داده آمده است.)
هنگام خواندن فایلهایی با پسوند «اشتباه»، میتوانید با اضافه کردن پیشوند csv:، ssv: یا tsv: به ابتدای مسیر فایل، از خواننده CSV (و جداکننده فیلد پیشفرض) اطمینان حاصل کنید؛ برای مثال:
-
$ hledger -f ssv:foo.dat print
همچنین در صورت نیاز میتوانید نویسه جداکننده فیلد پیشفرض را با یک قاعده separator بازنویسی و لغو کنید.
خواندن CSV از ورودی استاندارد
هنگام خواندن CSV از stdin نیز به پیشوند قالب فایل نیاز خواهید داشت، چرا که hledger به طور پیشفرض قالب journal را در نظر میگیرد. برای مثال:
-
$ cat foo.dat | hledger -f ssv:- print اگر برای خواندن همزمان چندین فایل CSV از چندین گزینهٔ -f استفاده کنید، hledger برای هر فایل CSV به دنبال یک فایل قواعد (rules) با نام متناظر خواهد گشت. اما اگر یک فایل قواعد را با --rules مشخص کنید، آن فایل قواعد برای همهٔ فایلهای CSV استفاده خواهد شد.
خواندن فایلهای مشخصشده با قاعده
بهجای مشخص کردن یک فایل CSV در خط فرمان، میتوانید یک فایل قواعد را مشخص کنید، مانند hledger -f foo.csv.rules CMD. بهطور پیشفرض این کار دادهها را از foo.csv در همان دایرکتوری میخواند، اما میتوانید یک قاعدهٔ source برای مشخص کردن فایل دادهای متفاوت اضافه کنید، که شاید در دایرکتوری بارگیریهای مرورگر وب شما قرار داشته باشد.
این قابلیت در hledger 1.30 اضافه شده است، بنابراین آن را در بیشتر مثالهای قواعد CSV نخواهید دید. اما این ویژگی به حذف بخشی از کارهای تکراری مدیریت بارگیریهای CSV کمک میکند. نامهای پیشفرض فایلهای CSV در اکثر مؤسسات مالی شما متفاوت است و با یک الگوی glob قابل شناسایی است. بنابراین میتوانید قاعدهای مانند source Checking1*.csv را در foo-checking.csv.rules قرار دهید و سپس بهطور دورهای روال کاریای مانند زیر را دنبال کنید:
- 1.
- بارگیری CSV از وبسایت Foo، با استفاده از پیشفرضهای مرورگرتان
- 2.
- اجرای hledger import foo-checking.csv.rules برای وارد کردن هرگونه تراکنش جدید
پس از وارد کردن (import)، میتوانید به دلخواه خود: فایل CSV را دور بیندازید، یا آن را برای مدتی همانجا که هست رها کنید، یا آن را به بایگانیهای خود منتقل کنید. اگر کاری انجام ندهید، دفعهٔ بعد مرورگر شما فایلی مانند Checking1-2.csv را ذخیره خواهد کرد، و hledger به دلیل نویسهٔ عام (wildcard) * و به این دلیل که جدیدترین است، از آن استفاده خواهد کرد.
تراکنشهای معتبر
پس از خواندن یک فایل CSV، hledger ورودیهای دفترکل تولیدشده را همانند یک فایل دفترکل پسپردازش و اعتبارسنجی میکند - تراز کردن آنها، اعمال تخصیصهای تراز (balance assignments)، و استانداردسازی قالب مبالغ. هرگونه خطا در این مرحله به روش معمول با نمایش ورودی مشکلدار گزارش خواهد شد.
یک استثنا وجود دارد: در صورت ایجاد احکام تراز (balance assertions)، آنها بررسی نخواهند شد، زیرا این احکام معمولاً تنها زمانی عمل میکنند که دادههای CSV بخشی از دفترکل اصلی باشند. اگر نیاز دارید احکام تراز تولیدشده از CSV را فوراً بررسی کنید، آن را با لوله (pipe) به یک hledger دیگر بفرستید:
-
$ hledger -f file.csv print | hledger -f- print
حذف موارد تکراری، وارد کردن
هنگامی که یک فایل CSV را بهطور دورهای بارگیری میکنید (برای مثال دریافت آخرین تراکنشهای بانکیتان)، فایل جدید ممکن است با فایل قدیمی همپوشانی داشته باشد و شامل برخی از رکوردهای مشابه باشد.
دستور import اقدامات زیر را انجام میدهد: (الف) تراکنشهای جدید را شناسایی میکند، و (ب) فقط همان تراکنشها را به دفترکل اصلی شما پیوست (append) میکند. این دستور خنثیاثر (idempotent) است، بنابراین نیازی نیست به یاد داشته باشید که چند بار آن را اجرا کردهاید یا با کدام نسخه از CSV. (این دستور وضعیت را در یک فایل پنهان .latest.FILE.csv نگه میدارد.) این آسانترین راه برای وارد کردن دادههای CSV است. به عنوان مثال:
-
# download the latest CSV files, then run this command. # Note, no -f flags needed here. $ hledger import *.csv [--dry]
این روش برای بیشتر فایلهای CSV کار میکند. (جایی که رکوردها ترتیب زمانی پایداری دارند، و رکوردهای جدید فقط در انتهای جدیدتر ظاهر میشوند.)
تعدادی ابزار و روالهای کاری دیگر، چه اختصاصی hledger و چه غیر از آن، برای تبدیل، حذف تکرار، دستهبندی و مدیریت دادههای CSV وجود دارند. ببینید:
- https://hledger.org/cookbook.html#setups-and-workflows
- https://plaintextaccounting.org -> data import/conversion
عبارتهای منظم در قواعد CSV
عبارتهای منظم در شرطهای if (همچنین معروف به تطبیقدهندهها یا matchers) عبارتهای منظم گسترشیافتهٔ POSIX هستند که از مرزهای کلمهٔ گنو (\b، \B، \<، \>) نیز پشتیبانی میکنند، و نه چیز دیگر. (برای جزئیات بیشتر، Regular expressions را ببینید.)
در اینجا چند مثال آورده شده است که ممکن است در قواعد CSV مفید باشند:
- آیا فیلد "foo" واقعاً خالی است؟ if %foo ^$
- آیا خالی است یا فقط شامل نویسههای فاصلهای (whitespace) است؟ if %foo ^ *$
- آیا غیرخالی است؟ if %foo .
- آیا شامل نویسهٔ غیرفاصلهای است؟ if %foo [^ ]
آزمودن مقدار فیلدهای عددی کمی دشوارتر است. نمیتوانید از پرسوجوهای hledger مانند amt:0 یا amt:>10 در قواعد CSV استفاده کنید. اما اغلب میتوانید با یک عبارت منظم به همان نتیجه برسید.
توجه داشته باشید که محتوا و چیدمان فیلدهای عددی در CSV متفاوت است، و میتواند به مرور زمان تغییر کند (مثلاً اگر ارائهدهندهٔ داده را تغییر دهید). بنابراین عبارتهای منظم عددی همیشه تا حدودی مختص به دادههای CSV خاص شما هستند؛ و ایدهٔ خوبی است که در صورت امکان آنها را با رویکرد دفاعی و مقاوم (defensive and robust) بنویسید.
در اینجا چند مثال آورده شده است:
- آیا foo شامل یک عدد غیرصفر است؟ if %foo [1-9]
- آیا منفی است؟ if %foo -
- آیا نامنفی است؟ if ! %foo -
- آیا >= 10 است؟ if %foo [1-9][0-9]+\. (با فرض ممیز اعشاری نقطهای و بدون صفرهای ابتدایی)
- آیا >= 10 و < 20 است؟ if %foo \b1[0-9]\..SS تنظیم مقادیر در ادامهٔ فیلد مقدار در بالا، در اینجا نکات بیشتری برای تنظیم مقادیر آورده شده است:
- 1.
- اگر مقدار در یک فیلد تکی CSV باشد:
- a.
- اگر علامت آن نشاندهندهٔ جهت جریان باشد:
آن را به amountN اختصاص دهید تا مقدار ثبت N-ام تنظیم شود. N معمولاً ۱ یا ۲ است اما میتواند تا ۹۹ باشد.
- b.
- اگر فیلد دیگری نشاندهندهٔ جهت جریان باشد:
برای تنظیم علامت مناسب مقدار، از یک یا چند قاعدهٔ شرطی استفاده کنید. برای نمونه:
-
# assume a withdrawal unless Type contains "deposit": amount1 -%Amount if %Type deposit amount1 %Amount
- 2.
- اگر مقدار در دو فیلد CSV باشد (مانند Debit و Credit، یا In و Out):
- a.
- اگر هر دو فیلد بدون علامت باشند:
یک فیلد را به amountN-in و دیگری را به amountN-out اختصاص دهید. hledger بهطور خودکار فیلد "out" را منفی میکند و مقدار هر فیلدی را که غیرصفر باشد بهعنوان مقدار ثبت N-ام استفاده خواهد کرد.
- b.
- اگر هر یک از فیلدها دارای علامت باشد:
احتمالاً لازم خواهد بود علامت تعیینشده توسط hledger را برای یکی از فیلدها بازنویسی کنید، همانطور که در مثال زیر آمده است:
-
# Negate the -out value, but only if it is not empty: fields date, description, amount1-in, amount1-out if %amount1-out [1-9] amount1-out -%amount1-out
- c.
- اگر هر دو فیلد بتوانند شامل مقداری غیرصفر باشند (یا هر دو خالی باشند):
قواعد -in/-out معمولاً مقداری را انتخاب میکنند که غیرصفر/غیرخالی باشد. برخی جفتمقادیر ممکن است مبهم باشند، مانند 1 و none. برای چنین مواردی، از قواعد شرطی برای کمک به انتخاب مقدار استفاده کنید. برای مثال، برای مدیریت مورد بالا میتوانید مقداری را انتخاب کنید که شامل ارقام غیرصفر باشد:
-
fields date, description, in, out if %in [1-9] amount1 %in if %out [1-9] amount1 %out
- 3.
- اگر میخواهید مقدار ثبت ۲ به بهای تمامشده (cost) تبدیل شود:
از نحو بدون شمارهٔ amount (یا amount-in و amount-out) استفاده کنید.
- 4.
- اگر CSV تنها شامل مقادیر مانده باشد و نه مقادیر تراکنش:
آن را به balanceN اختصاص دهید تا یک انتساب مانده روی ثبت N-ام تنظیم شود و باعث محاسبهٔ خودکار مقدار ثبت گردد. balance بدون شماره معادل balance1 است. در این وضعیت احتمال اینکه hledger نام حساب پیشفرض را اشتباه حدس بزند بیشتر است، بنابراین ممکن است لازم باشد آن را بهطور صریح تنظیم کنید..SS علامتهای مقدار (Amount signs) رفتار ویژهای وجود دارد که تجزیه و معکوس کردن علامتهای مقدار را آسانتر میکند. (این قابلیت فقط برای مقادیر کامل کار میکند، نه برای مقادیر هزینه مانند COST در amount1 AMT @ COST):
- •
- اگر مقدار با یک علامت مثبت آغاز شود:
آن علامت حذف خواهد شد: +AMT تبدیل میشود به AMT
- •
- اگر مقدار درون پرانتز باشد:
پرانتزهای آن حذف شده و علامت آن معکوس میشود: (AMT) تبدیل میشود به -AMT
- •
- اگر مقدار دو علامت منفی داشته باشد (یا دو جفت پرانتز، یا یک علامت منفی و پرانتز):
اثر یکدیگر را خنثی کرده و حذف خواهند شد: --AMT یا -(AMT) تبدیل میشود به AMT
- •
- اگر مقدار فقط شامل یک علامت باشد (یا فقط یک جفت پرانتز):
آن علامت حذف شده و به یک مقدار خالی تبدیل میشود. "+" یا "-" یا "()" تبدیل میشود به "".
تنظیم یک مقدار روی قدر مطلق آن، یعنی نادیده گرفتن علامت آن، (بدون پیشپردازش CSV) امکانپذیر نیست.
تنظیم ارز/کالا (Setting currency/commodity)
اگر نماد ارز/کالا در فیلد(های) مقدارِ فایل CSV گنجانده شده باشد:
-
2023-01-01,foo,$123.00
نیازی به انجام کار خاصی برای نماد کالا ندارید، این نماد به عنوان بخشی از مقدار تخصیص داده میشود. به عنوان مثال:
-
fields date,description,amount
-
2023-01-01 foo expenses:unknown $123.00 income:unknown $-123.00
اگر ارز به صورت یک فیلد جداگانه در CSV ارائه شده باشد:
-
2023-01-01,foo,USD,123.00
میتوانید آن را به شبهفیلد currency تخصیص دهید، که این ویژگی خاص را دارد که به ابتدای هر مقدار در تراکنش اضافه میشود (در سمت چپ، بدون فاصله جداکننده):
-
fields date,description,currency,amount
-
2023-01-01 foo expenses:unknown USD123.00 income:unknown USD-123.00
یا میتوانید از انتساب فیلد برای ساختن مقدار توسط خودتان و با کنترل بیشتر استفاده کنید. برای مثال، جهت قرار دادن نماد در سمت راست و با یک فاصله جداکننده:
-
fields date,description,cur,amt amount %amt %cur
-
2023-01-01 foo expenses:unknown 123.00 USD income:unknown -123.00 USD
توجه داشته باشید که از نام فیلد موقتی (cur) استفاده کردیم که currency نیست - چرا که در غیر این صورت اثر پیشافزودن فعال میشد، چیزی که در اینجا نمیخواهیم..SS ارقام اعشار مبلغ هنگامی که دادههای CSV را میخوانید، مثلاً با دستوری مانند hledger -f foo.csv print، hledger دقت اعشار هر کالا (و دیگر شیوههای نمایش آن) را از روی مبالغ استنتاج میکند - بسیار شبیه به خواندن یک فایل دفتر روزنامه بدون دستورالعملهای commodity (پیوند را ببینید).
توجه داشته باشید که شیوههای نمایش کالا از اعداد موجود در دادههای اصلی CSV استنتاج نمیشوند؛ بلکه از مبالغ تولیدشده توسط قواعد CSV استنباط میگردند.
هنگامی که دادههای CSV را با دستور import وارد میکنید، به عنوان مثال hledger import foo.csv، گام دیگری نیز وجود دارد: import تلاش میکند مدخلهای جدید را با شیوههای موجود در دفتر روزنامه مطابقت دهد. بنابراین برای هر کالا - فرض کنید EUR باشد - دستور import موارد زیر را برمیگزیند:
- 1.
- شیوه اعلانشده برای EUR با یک دستورالعمل commodity در دفتر روزنامه
- 2.
- در غیر این صورت، شیوه استنتاجشده از مبالغ EUR در دفتر روزنامه
- 3.
- در غیر این صورت، شیوه استنتاجشده از مبالغ EUR تولیدشده توسط قواعد CSV.
خلاصه (TLDR): اگر import دقتها یا شیوههای مورد نظر شما را تولید نمیکند، یک دستورالعمل commodity برای مشخص کردن آنها اضافه کنید.
ارجاع به فیلدهای دیگر
در انتساب فیلدها، شما تنها میتوانید فیلدهای CSV را جایگذاری کنید، نه فیلدهای hledger را. در مثال زیر، هم یک فیلد CSV و هم یک فیلد hledger به نام amount1 وجود دارد، اما %amount1 همیشه به فیلد CSV اشاره دارد، نه فیلد hledger:
-
# Name the third CSV field "amount1" fields date,description,amount1 # Set hledger's amount1 to the CSV amount1 field followed by USD amount1 %amount1 USD # Set comment to the CSV amount1 (not the amount1 assigned above) comment %amount1
در اینجا، از آنجا که فیلد amount1 در CSV وجود ندارد، %amount1 مقدار لفظی "amount1" را تولید خواهد کرد:
-
fields date,description,csvamount amount1 %csvamount USD # Can't interpolate amount1 here comment %amount1
هنگامی که چندین انتساب فیلد به یک فیلد یکسان در hledger وجود دارد، تنها آخرین انتساب اعمال میشود. در اینجا، مقدار comment برابر با B خواهد بود، یا اگر عبارت "something" تطبیق داده شود مقدار آن C خواهد بود، اما هرگز A نخواهد بود:
-
comment A comment B if something comment C
نحوه ارزیابی قواعد CSV
در ادامه نحوه ارزیابی قواعد CSV تشریح شده است. اگر هنگام خواندن یک فایل CSV با خطایی نامفهوم مواجه شدید، درک اینکه کدامیک از این مراحل با شکست مواجه شده است میتواند به شما کمک کند:
- 1.
- تمام فایلهای قواعد الحاقشده (included)، از بالا به پایین و به روش اولعمق (بررسی بازگشتی هر فایل الحاقشده برای الحاقهای بعدی، پیش از ادامه) درونریزی میشوند.
- 2.
- قواعد سطح بالا (date-format، fields، newest-first، skip و غیره) از بالا به پایین خوانده میشوند. منظور از "قواعد سطح بالا" قواعد غیرشرطی است. اگر قاعدهای بیش از یک بار تکرار شود، آخرین قاعده اعمال میشود؛ به استثنای قواعد skip/end که در آنها اولین قاعده اولویت دارد.
- 3.
- فایل CSV به عنوان متن خوانده میشود. هر نویسه غیر ASCII با استفاده از کدگذاری متنی تعیینشده توسط قاعده encoding، و در غیر این صورت با کدگذاری متنی لوکال (locale) سیستم، رمزگشایی خواهد شد.
- 4.
- هر قاعده skip یا end در سطح بالا اعمال میشود. قاعده skip [N] بلافاصله از رکورد فعلی یا N رکورد بعدی CSV صرفنظر میکند؛ قاعده end بلافاصله از تمام رکوردهای باقیمانده CSV صرفنظر میکند (به طور معمول در سطح بالا استفاده نمیشود).
- 5.
- اکنون رکوردهای باقیمانده CSV پردازش میشوند. برای هر رکورد CSV، به ترتیبی که در فایل آمده است:
- •
- آیا قاعده skip/end شرطی وجود دارد که برای این رکورد اعمال شود؟ بلوکهای if را از بالا به پایین برای یافتن بلوک برقراری که حاوی قاعده skip یا end است جستجو کنید. در صورت یافتن، از تعداد مشخصشده رکوردهای CSV صرفنظر کرده و سپس از مرحله ۵ ادامه دهید.
در غیر این صورت...
- برخی اعتبارسنجیهای اولیه را روی این رکورد CSV انجام دهید (مثلاً بررسی اینکه حداقل دارای دو فیلد باشد).
- برای هر فیلد hledger (date، description، account1 و غیره):
- 1.
- مقدار انتسابیافته به فیلد را به دست آورید؛ ابتدا در انتسابهای سطح بالا (که مستقیماً یا توسط قاعده fields انجام شدهاند) و سپس در انتسابهای انجامشده درون بلوکهای موفق if جستجو میشود. اگر بیش از یک انتساب وجود داشته باشد، آخرین مورد اعمال میشود.
- 2.
- مقدار واقعی فیلد (به صورت متن) را با جایگذاری هرگونه ارجاع به %CSVFIELD درون مقدار انتسابیافته محاسبه کنید؛ یا در صورت عدم وجود انتساب، یک مقدار پیشفرض را انتخاب نمایید.
- •
- از روی مقادیر فیلدهای hledger یک تراکنش hledger ایجاد کرده و در صورت نیاز آنها را تجزیه کنید (مثلاً تبدیل متن به یک مبلغ).
تمام این مراحل توسط خواننده CSV انجام میشود؛ یکی از چندین خوانندهای که hledger میتواند برای خواندن تراکنشها از یک فایل ورودی به کار گیرد. هنگامی که همه فایلهای ورودی با موفقیت خوانده شدند، تراکنشهای آنها به هر دستوری از hledger که کاربر مشخص کرده باشد تحویل داده میشوند..SS قواعد خوشساختار مواردی که میتوانند به کاهش تکرار و پیچیدگی در فایلهای قواعد کمک کنند:
- استخراج قواعد مشترک قابل استفاده با چندین فایل CSV درون یک common.rules، و افزودن include common.rules به فایل قواعد هر CSV.
- تقسیم بلوکهای if به بلوکهای if کوچکتر و استخراج بخشهای پرکاربرد.
مثالهای قواعد CSV
Bank of Ireland
در اینجا یک فایل CSV با دو فیلد مبلغ (Debit و Credit) و یک فیلد موجودی (Balance) آمده است که میتوانیم از آن برای افزودن اعتبارسنجیهای موجودی (balance assertions) استفاده کنیم؛ این کار الزامی نیست اما امکان بررسی خطای بیشتری را فراهم میکند:
-
Date,Details,Debit,Credit,Balance 07/12/2012,LODGMENT 529898,,10.0,131.21 07/12/2012,PAYMENT,5,,126
-
# bankofireland-checking.csv.rules # skip the header line skip # name the csv fields, and assign some of them as journal entry fields fields date, description, amount-out, amount-in, balance # We generate balance assertions by assigning to "balance" # above, but you may sometimes need to remove these because: # # - the CSV balance differs from the true balance, # by up to 0.0000000000005 in my experience # # - it is sometimes calculated based on non-chronological ordering, # eg when multiple transactions clear on the same day # date is in UK/Ireland format date-format %d/%m/%Y # set the currency currency EUR # set the base account for all txns account1 assets:bank:boi:checking
-
$ hledger -f bankofireland-checking.csv print 2012-12-07 LODGMENT 529898 assets:bank:boi:checking EUR10.0 = EUR131.2 income:unknown EUR-10.0 2012-12-07 PAYMENT assets:bank:boi:checking EUR-5.0 = EUR126.0 expenses:unknown EUR5.0
اعتبارسنجیهای موجودی در بالا خطایی ایجاد نمیکنند، زیرا خواندن مستقیماً از CSV انجام میشود، اما اگر این مدخلها به یک فایل journal وارد شوند، بررسی خواهند شد.
Coinbase
یک مثال ساده با دادههای CSV از Coinbase. قیمت لحظهای (spot price) با استفاده از نمادگذاری هزینه (cost notation) ثبت شده است. نام فیلد قدیمی amount بهراحتی مبلغ ۲ (مبلغ posting دوم) را برابر با هزینه کل قرار میدهد.
-
# Timestamp,Transaction Type,Asset,Quantity Transacted,Spot Price Currency,Spot Price at Transaction,Subtotal,Total (inclusive of fees and/or spread),Fees and/or Spread,Notes # 2021-12-30T06:57:59Z,Receive,USDC,100,GBP,0.740000,"","","","Received 100.00 USDC from an external account"
-
# coinbase.csv.rules skip 1 fields Timestamp,Transaction_Type,Asset,Quantity_Transacted,Spot_Price_Currency,Spot_Price_at_Transaction,Subtotal,Total,Fees_Spread,Notes date %Timestamp date-format %Y-%m-%dT%T%Z description %Notes account1 assets:coinbase:cc amount %Quantity_Transacted %Asset @ %Spot_Price_at_Transaction %Spot_Price_Currency
-
$ hledger print -f coinbase.csv 2021-12-30 Received 100.00 USDC from an external account assets:coinbase:cc 100 USDC @ 0.740000 GBP income:unknown -74.000000 GBP در اینجا تاریخچهٔ سفارشهای amazon.com را تبدیل کرده و از یک بلوک if برای ایجاد یک ثبت (posting) سوم در صورت وجود کارمزد استفاده میکنیم. (در عمل احتمالاً این دادهها را به جای آن از بانک خود دریافت خواهید کرد، اما این فقط یک مثال است.) -
"Date","Type","To/From","Name","Status","Amount","Fees","Transaction ID" "Jul 29, 2012","Payment","To","Foo.","Completed","$20.00","$0.00","16000000000000DGLNJPI1P9B8DKPVHL" "Jul 30, 2012","Payment","To","Adapteva, Inc.","Completed","$25.00","$1.00","17LA58JSKRD4HDGLNJPI1P9B8DKPVHL"
-
# amazon-orders.csv.rules # رد کردن یک خط سربرگ skip 1 # نامگذاری فیلدهای csv، و انتساب تاریخ، مبلغ و کد تراکنش. # برای جلوگیری از سردرگمی، از نامهای فیلد hledger یعنی "status" و "amount" پرهیز شد. fields date, _, toorfrom, name, amzstatus, amzamount, fees, code # نحوهٔ تجزیهٔ تاریخ date-format %b %-d, %Y # ترکیب دو فیلد برای ساخت description description %toorfrom %name # ذخیرهٔ وضعیت به عنوان یک برچسب (tag) comment status:%amzstatus # تنظیم حساب پایه برای تمام تراکنشها account1 assets:amazon # خالی گذاشتن amount1 تا بتواند مورد(های) دیگر را تراز کند. # فرض میکنم amzamount کارمزدها را شامل نمیشود، دقیقاً به خاطر ندارم # تنظیم یک account2 عمومی account2 expenses:misc amount2 %amzamount # و شاید پالایش بیشتر آن: #include categorisation.rules # افزودن ثبت سوم برای کارمزدها، اما فقط در صورتی که غیرصفر باشند. if %fees [1-9] account3 expenses:fees amount3 %fees
-
$ hledger -f amazon-orders.csv print 2012-07-29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed assets:amazon expenses:misc $20.00 2012-07-30 (17LA58JSKRD4HDGLNJPI1P9B8DKPVHL) To Adapteva, Inc. ; status:Completed assets:amazon expenses:misc $25.00 expenses:fees $1.00
Paypal
در اینجا یک فایل قوانین واقعی برای CSV (سفارشیشدهٔ) Paypal، همراه با برخی قوانین ویژهٔ Paypal و یک فایل قوانین دوم گنجاندهشده آمده است:
-
"Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Item Title","Item ID","Reference Txn ID","Receipt ID","Balance","Note" "10/01/2019","03:46:20","PDT","Calm Radio","Subscription Payment","Completed","USD","-6.99","0.00","-6.99","simon@joyful.com","memberships@calmradio.com","60P57143A8206782E","MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month","","I-R8YLY094FJYR","","-6.99","" "10/01/2019","03:46:20","PDT","","Bank Deposit to PP Account ","Pending","USD","6.99","0.00","6.99","","simon@joyful.com","0TU1544T080463733","","","60P57143A8206782E","","0.00","" "10/01/2019","08:57:01","PDT","Patreon","PreApproved Payment Bill User Payment","Completed","USD","-7.00","0.00","-7.00","simon@joyful.com","support@patreon.com","2722394R5F586712G","Patreon* Membership","","B-0PG93074E7M86381M","","-7.00","" "10/01/2019","08:57:01","PDT","","Bank Deposit to PP Account ","Pending","USD","7.00","0.00","7.00","","simon@joyful.com","71854087RG994194F","Patreon* Membership","","2722394R5F586712G","","0.00","" "10/19/2019","03:02:12","PDT","Wikimedia Foundation, Inc.","Subscription Payment","Completed","USD","-2.00","0.00","-2.00","simon@joyful.com","tle@wikimedia.org","K9U43044RY432050M","Monthly donation to the Wikimedia Foundation","","I-R5C3YUS3285L","","-2.00","" "10/19/2019","03:02:12","PDT","","Bank Deposit to PP Account ","Pending","USD","2.00","0.00","2.00","","simon@joyful.com","3XJ107139A851061F","","","K9U43044RY432050M","","0.00","" "10/22/2019","05:07:06","PDT","Noble Benefactor","Subscription Payment","Completed","USD","10.00","-0.59","9.41","noble@bene.fac.tor","simon@joyful.com","6L8L1662YP1334033","Joyful Systems","","I-KC9VBGY2GWDB","","9.41",""
-
# paypal-custom.csv.rules # نکتهها: # برونبری از Activity -> Statements -> Custom -> Activity download # نوع تراکنش پیشنهادی: "Balance affecting" # فیلدهای پیشفرض Paypal در سال ۲۰۱۸ عبارت بودند از: # "Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Shipping Address","Address Status","Item Title","Item ID","Shipping and Handling Amount","Insurance Amount","Sales Tax","Option 1 Name","Option 1 Value","Option 2 Name","Option 2 Value","Reference Txn ID","Invoice Number","Custom Number","Quantity","Receipt ID","Balance","Address Line 1","Address Line 2/District/Neighborhood","Town/City","State/Province/Region/County/Territory/Prefecture/Republic","Zip/Postal Code","Country","Contact Phone Number","Subject","Note","Country Code","Balance Impact" # این فایل قوانین، فیلدهای دقیقتر زیر را که در "Customize report fields" پیکربندی شدهاند، فرض میکند: # "Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Item Title","Item ID","Reference Txn ID","Receipt ID","Balance","Note" fields date, time, timezone, description_, type, status_, currency, grossamount, feeamount, netamount, fromemail, toemail, code, itemtitle, itemid, referencetxnid, receiptid, balance, note skip 1 date-format %-m/%-d/%Y # نادیده گرفتن برخی رویدادهای paypal if In Progress Temporary Hold Update to skip # افزودن فیلدهای بیشتر به description description %description_ %itemtitle # ذخیرهٔ برخی فیلدهای دیگر به عنوان برچسب (tag) comment itemid:%itemid, fromemail:%fromemail, toemail:%toemail, time:%time, type:%type, status:%status_ # تبدیل به نمادهای کوتاه یکای پول if %currency USD currency $ if %currency EUR currency E if %currency GBP currency P # ایجاد ثبتها (postings) # ثبت نخست، پولی خواهد بود که از حساب paypal من خارج یا به آن وارد میشود # (در تمام فیلدهای مبلغ، منفی به معنای خروج از حساب من است) account1 assets:online:paypal amount1 %netamount # ثبت دوم، پول ارسالشده به یا دریافتشده از طرف دیگر خواهد بود # (account2 در پایین تنظیم میشود) amount2 -%grossamount # اگر کارمزدی وجود دارد، یک ثبت سوم برای پول برداشتشده توسط paypal اضافه کن. if %feeamount [1-9] account3 expenses:banking:paypal amount3 -%feeamount comment3 business: # انتخاب یک حساب برای ثبت دوم # بازنویسی نامهای پیشفرض حساب: # اگر مبلغ مثبت باشد، درآمد است (یک بدهکار) if %grossamount ^[^-] account2 income:unknown # اگر منفی باشد، هزینه است (یک بستانکار) if %grossamount ^- account2 expenses:unknown # اعمال قوانین مشترک برای تنظیم account2 و سایر تغییرات جزئی include common.rules # اعمال برخی بازنویسیهای ویژهٔ این csv # انتقالها از/به بانک. اینها معمولاً با عنوان Pending علامتگذاری میشوند، # که در این مورد میتوان آنها را نادیده گرفت. if Bank Account Bank Deposit to PP Account description %type for %referencetxnid %itemtitle account2 assets:bank:wf:pchecking account1 assets:online:paypal # تبدیلهای یکای پول if Currency Conversion account2 equity:currency conversion
-
# common.rules if darcs noble benefactor account2 revenues:foss donations:darcshub comment2 business: if Calm Radio account2 expenses:online:apps if electronic frontier foundation Patreon wikimedia Advent of Code account2 expenses:dues if Google account2 expenses:online:apps description google | music $ hledger -f paypal-custom.csv print 2019-10-01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed assets:online:paypal $-6.99 = $-6.99 expenses:online:apps $6.99 2019-10-01 (0TU1544T080463733) Bank Deposit to PP Account for 60P57143A8206782E ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:46:20, type:Bank Deposit to PP Account, status:Pending assets:online:paypal $6.99 = $0.00 assets:bank:wf:pchecking $-6.99 2019-10-01 (2722394R5F586712G) Patreon Patreon* Membership ; itemid:, fromemail:simon@joyful.com, toemail:support@patreon.com, time:08:57:01, type:PreApproved Payment Bill User Payment, status:Completed assets:online:paypal $-7.00 = $-7.00 expenses:dues $7.00 2019-10-01 (71854087RG994194F) Bank Deposit to PP Account for 2722394R5F586712G Patreon* Membership ; itemid:, fromemail:, toemail:simon@joyful.com, time:08:57:01, type:Bank Deposit to PP Account, status:Pending assets:online:paypal $7.00 = $0.00 assets:bank:wf:pchecking $-7.00 2019-10-19 (K9U43044RY432050M) Wikimedia Foundation, Inc. Monthly donation to the Wikimedia Foundation ; itemid:, fromemail:simon@joyful.com, toemail:tle@wikimedia.org, time:03:02:12, type:Subscription Payment, status:Completed assets:online:paypal $-2.00 = $-2.00 expenses:dues $2.00 expenses:banking:paypal ; business: 2019-10-19 (3XJ107139A851061F) Bank Deposit to PP Account for K9U43044RY432050M ; itemid:, fromemail:, toemail:simon@joyful.com, time:03:02:12, type:Bank Deposit to PP Account, status:Pending assets:online:paypal $2.00 = $0.00 assets:bank:wf:pchecking $-2.00 2019-10-22 (6L8L1662YP1334033) Noble Benefactor Joyful Systems ; itemid:, fromemail:noble@bene.fac.tor, toemail:simon@joyful.com, time:05:07:06, type:Subscription Payment, status:Completed assets:online:paypal $9.41 = $9.41 revenues:foss donations:darcshub $-10.00 ; business: expenses:banking:paypal $0.59 ; business:
ثبت زمان (Timeclock)
برنامهٔ hledger میتواند لاگهای زمان را در قالب ثبت زمان timeclock.el بخواند. همانند Ledger، قالب timeclock در hledger یک زیرمجموعه/گونه از قالب timeclock.el است.
قالب timeclock در hledger در نسخههای 1.43 و 1.50 بهروزرسانی شد. اگر لاگهای زمانی قدیمی شما پذیرفته نمیشوند، باید آنها را با hledger امروزی سازگار کنید؛ برای اکنون، میتوانید رفتار پیش از 1.43 را با پرچم --old-timeclock بازیابی کنید.
در اینجا قالب timeclock در hledger 1.50+ آورده شده است:
-
# Comment lines like these, and blank lines, are ignored: # comment line ; comment line * comment line # Lines beginning with b, h, or capital O are also ignored, for compatibility: b SIMPLEDATE HH:MM[:SS][+-ZZZZ][ TEXT] h SIMPLEDATE HH:MM[:SS][+-ZZZZ][ TEXT] O SIMPLEDATE HH:MM[:SS][+-ZZZZ][ TEXT] # Lines beginning with i or o are are clock-in / clock-out entries: i SIMPLEDATE HH:MM[:SS][+-ZZZZ] ACCOUNT[ DESCRIPTION][;COMMENT]] o SIMPLEDATE HH:MM[:SS][+-ZZZZ][ ACCOUNT][;COMMENT]
تاریخ، یک تاریخ ساده در hledger است (YYYY-MM-DD یا مشابه آن). بخشهای زمان باید از دو رقم استفاده کنند. ثانیهها اختیاری هستند. یک منطقه زمانی چهار رقمی با + یا - جهت سازگاری پذیرفته میشود، اما در حال حاضر نادیده گرفته میشود؛ زمانها همواره به صورت زمان محلی تفسیر میشوند.
در مدخلهای ثبت ورود (i)، نام حساب الزامی است. توضیحات تراکنش، که با ۲ فاصله یا بیشتر از نام حساب جدا میشود، اختیاری است. یادداشت تراکنش، که با ; آغاز میشود نیز اختیاری است. (خطوط یادداشت تورفتهٔ پسین نیز مجاز هستند، همانند آنچه در قالب دفتر روزنامه (journal) مرسوم است.)
در مدخلهای ثبت خروج (o) توضیحی وجود ندارد، اما در صورت تمایل میتوانند یک یادداشت داشته باشند. یک جفت ورود و خروج، یک "تراکنش" تشکیل میدهند که تعدادی ساعت را در یک حساب ثبت میکند - که به عنوان یک نشست (session) نیز شناخته میشود. برای نمونه:
-
i 2015/03/30 09:00:00 session1 o 2015/03/30 10:00:00
-
$ hledger -f a.timeclock print 2015-03-30 * 09:00-10:00 (session1) 1.00h
ورودها و خروجها بر اساس نام حساب/نشست خود تطبیق داده میشوند. اگر یک خروج نامی را تعیین نکند، تازهترین ورودِ بستهنشده بسته میشود. میتوانید چندین نشست فعال همزمان داشته باشید. مدخلها به ترتیبی که تجزیه میشوند پردازش خواهند شد. نشستهایی که بیش از یک روز به درازا میکشند، بهطور خودکار در مرز روزها تقسیم میشوند.
برای نمونه، لاگ زمانی زیر:
-
i 2015/03/30 09:00:00 some account optional description after 2 spaces ; optional comment, tags: o 2015/03/30 09:20:00 i 2015/03/31 22:21:45 another:account o 2015/04/01 02:00:34 i 2015/04/02 12:00:00 another:account ; this demonstrates multple sessions being clocked in i 2015/04/02 13:00:00 some account o 2015/04/02 14:00:00 o 2015/04/02 15:00:00 another:account
این تراکنشها را تولید میکند:
-
$ hledger -f t.timeclock print 2015-03-30 * optional description after 2 spaces ; optional comment, tags: (some account) 0.33h 2015-03-31 * 22:21-23:59 (another:account) 1.64h 2015-04-01 * 00:00-02:00 (another:account) 2.01h 2015-04-02 * 12:00-15:00 ; this demonstrates multiple sessions being clocked in (another:account) 3.00h 2015-04-02 * 13:00-14:00 (some account) 1.00h
در اینجا یک sample.timeclock برای دریافت و چند پرسمان برای آزمایش قرار دارد:
-
$ hledger -f sample.timeclock balance # current time balances $ hledger -f sample.timeclock register -p 2009/3 # sessions in march 2009 $ hledger -f sample.timeclock register -p weekly --depth 1 --empty # time summary by week
برای تولید لاگهای زمان، یعنی برای ثبت ورود و خروج، میتوانید:
- •
- از این نامهای مستعار پوسته در خط فرمان استفاده کنید:
-
alias ti='echo i `date "+%Y-%m-%d %H:%M:%S"` $* >>$TIMELOG' alias to='echo o `date "+%Y-%m-%d %H:%M:%S"` >>$TIMELOG'
- یا از timeclock.el توکار Emacs، یا نسخهٔ گسترشیافتهٔ timeclock-x.el، و احتمالاً امکانات جانبی در ledgerutils.el استفاده کنید
- یا از اسکریپتهای قدیمی ti و to در مخزن ledger 2.x بهره ببرید. این اسکریپتها به یک فایل اجرایی "timeclock" متکی هستند که به نظر میرسد همان فایل اجرایی ledger 2 با نام تغییریافته باشد. قالب timedot، قالب ثبت زمانِ انسانفهم در hledger است. در مقایسه با قالب timeclock، این قالب برای ثبت زمانِ سریع، تقریبی و گذشتهنگر مناسبتر بوده و برای انسان خواناتر است (میتوانید در یک نگاه ببینید زمان کجا صرف شده است). یک مثال سریع:
-
2023-05-01 hom:errands .... .... ; two hours; the space is ignored fos:hledger:timedot .. ; half an hour per:admin:finance ; no time spent yet
hledger این مورد را بهعنوان یک تراکنش در این روز با سه ثبت (ترازنشده) میخواند، که در آن هر نقطه نمایانگر "0.25" است. هیچ نماد کالایی در نظر گرفته نمیشود، اما معمولاً آن را بهعنوان ساعت تفسیر میکنیم.
-
$ hledger -f a.timedot print # .timedot file extension (or timedot: prefix) is required 2023-05-01 * (hom:errands) 2.00 ; two hours (fos:hledger:timedot) 0.50 ; half an hour (per:admin:finance) 0
یک فایل timedot شامل مجموعهای از تراکنشها است (معمولاً یکی در هر روز). هر تراکنش با یک تاریخ ساده (Y-M-D، Y/M/D یا Y.M.D) آغاز میشود، و میتواند به صورت اختیاری در همان خط با توضیحات تراکنش، و/یا یک کامنت تراکنش پس از یک سیمیکالن دنبال شود.
پس از خط تاریخ، صفر یا چند ثبتِ زمانی قرار میگیرد که شامل موارد زیر است:
- نام حساب - هر نام حسابی به سبک hledger، با تورفتگی اختیاری.
- دو یا چند فاصله - در صورت وجود مقدار، الزامی است (همانند قالب journal).
- یک مقدار timedot، که میتواند شامل موارد زیر باشد:
- خالی (بیانگر صفر)
- یک عدد، به صورت اختیاری به همراه یکی از یکاهای s، m، h، d، w، mo یا y، بیانگر تعداد دقیقی از ثانیهها، دقیقهها، ساعتها، روزها، هفتهها، ماهها یا سالها (بهطور پیشفرض ساعت در نظر گرفته میشود)، که طبق روابط 60s = 1m، 60m = 1h، 24h = 1d، 7d = 1w، 30d = 1mo و 365d = 1y به ساعت تبدیل خواهند شد.
- یک یا چند نقطه (نویسههای نقطه)، که هر کدام بیانگر 0.25 هستند. اینها همان نقطهها در "timedot" هستند. فاصلهها نادیده گرفته میشوند و میتوان از آنها برای گروهبندی یا تراز کردن استفاده کرد.
- اضافهشده در 1.32 یک یا چند حرف. اینها مانند نقطهها هستند، اما برچسبی به نام t: (مخفف "type") نیز با آن حرف بهعنوان مقدارش تولید میکنند، و برای هر یک از مقادیر یک ثبت جداگانه ایجاد میشود. این ویژگی بعد دومی از دستهبندی را فراهم میکند که در گزارشها با --pivot t قابل مشاهده است.
- •
- یک کامنت اختیاری پس از سیمیکالن (یک کامنتِ ثبت به سبک hledger).
انعطافپذیریهایی وجود دارد تا به نگهداری دادههای لاگ زمان و یادداشتها در همان فایل کمک کند:
- خطوط خالی و خطوطی که با # یا ; آغاز میشوند نادیده گرفته میشوند.
- پس از نخستین خط تاریخ، خطوطی که شامل دو فاصله نیستند، بهعنوان ثبتهایی با مقدار صفر پردازش میشوند. (گزارشهای register در hledger در صورت افزودن -E این موارد را نمایش خواهند داد).
- پیش از نخستین خط تاریخ، خطوطی که با * آغاز میشوند (مانند سربرگهای org) نادیده گرفته میشوند. و از نخستین خط تاریخ به بعد، پیشوندهای سربرگ Emacs org mode در ابتدای خطوط (یک یا چند * که پس از آنها یک فاصله آمده است) نادیده گرفته خواهند شد. این بدان معناست که لاگ زمان میتواند یک رئوس مطالب org (org outline) نیز باشد.
فایلهای timedot بر خلاف فایلهای journal از دستورالعملها (directives) پشتیبانی نمیکنند. بنابراین یک الگوی رایج این است که یک فایل journal اصلی (مانند time.journal) داشته باشید که شامل دستورالعملهای مورد نیاز باشد، و سپس فایل timedot را در بر بگیرد (include time.timedot)..SS مثالهای Timedot اعداد:
-
2016/2/3 inc:client1 4 fos:hledger 3h biz:research 60m
نقطهها:
-
# on this day, 6h was spent on client work, 1.5h on haskell FOSS work, etc. 2016/2/1 inc:client1 .... .... .... .... .... .... fos:haskell .... .. biz:research . 2016/2/2 inc:client1 .... .... biz:research .
-
$ hledger -f a.timedot print date:2016/2/2 2016-02-02 * (inc:client1) 2.00 2016-02-02 * (biz:research) 0.25 -
$ hledger -f a.timedot bal --daily --tree Balance changes in 2016-02-01-2016-02-03: || 2016-02-01d 2016-02-02d 2016-02-03d ============++======================================== biz || 0.25 0.25 1.00 research || 0.25 0.25 1.00 fos || 1.50 0 3.00 haskell || 1.50 0 0 hledger || 0 0 3.00 inc || 6.00 2.00 4.00 client1 || 6.00 2.00 4.00 ------------++---------------------------------------- || 7.75 2.25 8.00
حروف:
-
# Activity types: # c cleanup/catchup/repair # e enhancement # s support # l learning/research 2023-11-01 work:adm ccecces
-
$ hledger -f a.timedot print 2023-11-01 (work:adm) 1 ; t:c (work:adm) 0.5 ; t:e (work:adm) 0.25 ; t:s -
$ hledger -f a.timedot bal 1.75 work:adm -------------------- 1.75 -
$ hledger -f a.timedot bal --pivot t 1.00 c 0.50 e 0.25 s -------------------- 1.75
Org:
-
* 2023 Work Diary ** Q1 *** 2023-02-29 **** DONE 0700 yoga **** UNPLANNED **** BEGUN hom:chores cleaning ... water plants outdoor - one full watering can indoor - light watering **** TODO adm:planning: trip *** LATER
استفاده از . بهعنوان جداکننده نام حساب:
-
2016/2/4 fos.hledger.timedot 4h fos.ledger ..
-
$ hledger -f a.timedot --alias '/\./=:' bal -t 4.50 fos 4.00 hledger:timedot 0.50 ledger -------------------- 4.50
دورههای زمانی (Time periods)
تاریخ آغاز و پایان گزارش (Report start & end date)
بیشتر گزارشهای hledger بهطور پیشفرض کل دورهٔ زمانی بازنماییشده توسط journal را نمایش میدهند. تاریخ آغاز گزارش، کهنترین تاریخ تراکنش یا posting خواهد بود، و تاریخ پایان گزارش، تازهترین تاریخ تراکنش، posting، یا قیمت بازار خواهد بود.
اغلب مایل خواهید بود دورهٔ کوتاهتری مانند ماه جاری را مشاهده کنید. میتوانید تاریخ آغاز و/یا پایان را با گزینههای -b/--begin، -e/--end، یا -p/--period، یا یک آرگومان پرسوجوی date: که در ادامه توضیح داده شدهاند مشخص کنید. همهٔ اینها ساختار نحو تاریخ هوشمند (smart date) را که آن نیز در ادامه شرح داده شده میپذیرند.
تاریخهای پایان شاملِ خود آن روز نمیشوند (exclusive هستند)؛ روز بعد از آخرین روزی را که میخواهید در گزارش ببینید مشخص کنید.
هنگامی که تاریخها توسط چندین گزینه مشخص شوند، آخرین گزینه (راستترین) اعمال میشود. و هنگامی که پرسوجوهای date: و گزینههای تاریخ ترکیب شوند، دورهٔ گزارش اشتراک آنها خواهد بود.
مثالها:
- -b 2016/3/17
- شروع از روز سنت پاتریک ۲۰۱۶
- -e 12/1
- پایان در ابتدای ۱ دسامبر سال جاری
- -p 'this month'
- در طول ماه جاری
- -p thismonth
- مشابه بالا، فاصلهها اختیاری هستند
- -b 2023
- شروع از نخستین روز ۲۰۲۳
- date:2023.. یا date:2023-
- مشابه بالا
-b 2024 -e 2025 -p '2000 to 2030' date:2020-01 date:2020 :
در طول ژانویهٔ ۲۰۲۰ (کوچکترین دورهٔ مشترک، با تقدم -p بر -b و -e)
تاریخهای هوشمند (Smart dates)
در رابطهای کاربری hledger (البته نه در فایل journal)، میتوانید بهصورت اختیاری از نحو "smart date" استفاده کنید. تاریخهای هوشمند میتوانند با کلمات انگلیسی نوشته شوند، نسبی باشند، و بخشهایی از آنها حذف شده باشد. بخشهای جاافتاده در صورت نیاز ۱ در نظر گرفته میشوند. بسته به زمینه، تاریخهای هوشمند میتوانند به عنوان تاریخها یا دورهها تفسیر شوند.
مثالها:
2004-01-01، 2004/10/1، 2004.9.1، 20240504، 2024Q1 :
تاریخهای دقیق. سال باید دستکم چهار رقم داشته باشد، ماه باید ۱-۱۲ باشد، روز باید ۱-۳۱ باشد، جداکننده میتواند - یا / یا . یا بدون جداکننده باشد. حرف q میتواند بزرگ یا کوچک باشد و شمارهٔ سهماهه باید ۱-۴ باشد.
- 2004-10
- ابتدای ماه
- 2004q3
- ابتدای سهماههٔ سوم سال ۲۰۰۴
- q3
- ابتدای سهماههٔ سوم سال جاری
- 2004
- ابتدای سال
- 10/1 یا oct یا october
- ۱ اکتبر در سال جاری
- 21
- روز ۲۱ام در ماه جاری
- yesterday, today, tomorrow
- -1، 0، 1 روز از امروز
- last/this/next day/week/month/quarter/year
- -1، 0، 1 دوره از دورهٔ جاری
- last/this/next tuesday
- رخداد قبلی روز نامبرده، یا رخداد بعدیِ پس از امروز
- last/this/next february
- رخداد قبلی روز ۱امِ ماه نامبرده، یا رخداد بعدیِ پس از ماه جاری
- in n days/weeks/months/quarters/years
- n دوره از دورهٔ جاری
- n days/weeks/months/quarters/years ahead
- n دوره پس از دورهٔ جاری
- n days/weeks/months/quarters/years ago
- -n دوره از دورهٔ جاری
- 20181201
- ۸ رقم YYYYMMDD با سال، ماه و روز معتبر
- 201812
- ۶ رقم YYYYMM با سال و ماه معتبر
تاریخهای بدون جداکننده مجاز هستند اما در صورت اشتباه تایپی ممکن است نتایج غیرمنتظرهای ایجاد کنند:
- 20181301 (YYYYMMDD با ماه نامعتبر) به عنوان یک سال هشترقمی تجزیه میشود
- 20181232 (YYYYMMDD با روز نامعتبر) خطای تجزیه میدهد
- 201801012 (یک YYYYMMDD معتبر که در ادامهٔ آن ارقام اضافه آمده است) خطای تجزیه میدهد
معنای تاریخهای نسبی به تاریخ امروز (today) بستگی دارد. اگر نیاز به آزمایش یا بازتولید گزارشهای قدیمی دارید، میتوانید از گزینهٔ --today برای بازنویسی آن استفاده کنید. (به استثنای قواعد تراکنشهای دورهای، که تحت تأثیر --today قرار نمیگیرند.).SS بازههای گزارش میتوان یک بازه گزارش مشخص کرد تا گزارشهایی مانند register، balance یا activity چنددورهای شوند و هر زیردوره را در قالب یک سطر یا ستون جداگانه نمایش دهند.
بازههای استاندارد زیر را میتوان با پرچمهای خط فرمان فعال کرد:
- -D/--daily
- -W/--weekly
- -M/--monthly
- -Q/--quarterly
- -Y/--yearly
بازههای پیچیدهتر را میتوان با استفاده از -p/--period مشخص کرد که در ادامه شرح داده شدهاند.
تنظیمات تاریخ
تنظیم تاریخ شروع
اگر به hledger اجازه دهید تاریخ شروع یک گزارش را استنباط کند، آن را برای راحتی در گزارشهای دورهای، به مرز طبیعی پیشینِ بازه گزارش تنظیم میکند. (اگر چنین چیزی را نمیخواهید، یک تاریخ شروع مشخص کنید.)
برای نمونه، اگر نخستین تراکنش در دفتر روزنامه در ۱۰ ژانویه باشد:
- دستور hledger register (بدون بازه گزارش) گزارش را در ۱۰ ژانویه آغاز خواهد کرد.
- دستور hledger register --monthly گزارش را در مرز ماه پیشین، یعنی ۱ ژانویه آغاز میکند.
- دستور hledger register --monthly --begin 1/5 گزارش را در ۵ ژانویه آغاز میکند [1].
همچنین اگر با قواعد تراکنش دورهای در حال تولید تراکنشها یا اهداف بودجه هستید، ممکن است تاریخ شروع آنها نیز به روش مشابهی (در شرایط معین) تنظیم شود.
تنظیم تاریخ پایان
تاریخ پایان یک گزارش همیشه طوری تنظیم میشود که شامل تعداد کاملی از بازهها باشد، بهگونهای که آخرین زیردوره دارای طولی یکسان با سایر زیردورهها باشد.
برای نمونه، اگر آخرین تراکنش دفتر روزنامه در ۲۰ فوریه باشد:
- دستور hledger register گزارش را در ۲۰ فوریه به پایان میرساند.
- دستور hledger register --monthly گزارش را در پایان فوریه به پایان میرساند.
- دستور hledger register --monthly --end 2/14 نیز گزارش را در پایان فوریه به پایان میرساند (نادیده گرفتن تاریخ پایان درخواستشده).
- دستور hledger register --monthly --begin 1/5 --end 2/14 گزارش را در ۴ مارس به پایان میرساند [1].
[1] از hledger نسخه 1.29 به بعد.
سربرگهای دوره
در زیردورههای غیر استاندارد، hledger سربرگهای "STARTDATE..ENDDATE" را نشان میدهد. در زیردورههای استاندارد (یعنی شروع در یک مرز بازه طبیعی)، سربرگهای فشردهتری را خواهید دید که معمولاً مطلوبتر هستند. (اگرچه در حال حاضر، نام ماهها به انگلیسی خواهد بود.)
بنابراین اگر تاریخ شروع را مشخص میکنید و سربرگهای فشرده میخواهید: شروع سال را برای گزارشهای سالانه، شروع فصل را برای گزارشهای سهماهه، شروع ماه را برای گزارشهای ماهانه و غیره انتخاب کنید. (به یاد داشته باشید، میتوانید مثلاً -b 2024 یا 1/1 را به عنوان میانبری برای شروع سال، یا 2024-04 یا 202404 یا Apr را برای شروع ماه یا فصل بنویسید.)
برای گزارشهای هفتگی، تاریخی را انتخاب کنید که دوشنبه (Monday) باشد. (میتوانید تاریخهای متفاوتی را امتحان کنید تا زمانی که سربرگهای کوتاه را ببینید، یا مثلاً بنویسید -b '3 weeks ago'.)
عبارتهای دوره
گزینه -p/--period یک عبارت دوره را مشخص میکند، که روشی فشرده برای بیان تاریخ شروع، تاریخ پایان و/یا بازه گزارش است.
در اینجا نمونهای از یک عبارت دوره با تاریخ شروع و پایان آورده شده است (مشخصکننده فصل نخست سال ۲۰۰۹):
| -p "from 2009/1/1 to 2009/4/1" |
چندین کلیدواژه مانند "from" و "to" برای خوانایی بهتر پشتیبانی میشوند؛ این کلیدواژهها اختیاری هستند. "to" میتواند به صورت ".." یا "-" نیز نوشته شود. فاصلهها نیز اختیاری هستند، تا زمانی که دو تاریخ به هم نچسبند. بنابراین موارد زیر معادل عبارت بالا هستند:
| -p "2009/1/1 2009/4/1" |
| -p2009/1/1to2009/4/1 |
| -p2009/1/1..2009/4/1 |
تاریخها از نوع تاریخهای هوشمند (smart dates) هستند، بنابراین اگر سال جاری ۲۰۰۹ باشد، موارد زیر نیز معادل عبارت بالا خواهند بود:
| -p "1/1 4/1" |
| -p "jan-apr" |
| -p "this year to 4/1" |
اگر تنها یک تاریخ را مشخص کنید، تاریخ شروع یا پایان ناموجود برابر با زودترین یا دیرترین تاریخ تراکنش در دفتر روزنامه خواهد بود:
| -p "from 2009/1/1" | همه موارد پس از ۱ ژانویه ۲۰۰۹ |
| -p "since 2009/1" | همان، since یک مترادف است |
| -p "from 2009" | همان |
| -p "to 2009" | همه موارد پیش از ۱ ژانویه ۲۰۰۹ |
همچنین میتوانید با نوشتن یک تاریخ تکی جزئی یا کامل، یک دوره را مشخص کنید:
| -p "2009" | سال ۲۰۰۹؛ معادل “2009/1/1 to 2010/1/1” |
| -p "2009/1" | ماه ژانویه ۲۰۰۹؛ معادل “2009/1/1 to 2009/2/1” |
| -p "2009/1/1" | روز نخست سال ۲۰۰۹؛ معادل “2009/1/1 to 2009/1/2” |
یا با استفاده از ساختار فصلی "Q" (غیرحساس به حروف کوچک و بزرگ):.PP
| -p "2009Q1" | سهماهه نخست ۲۰۰۹، معادل با “2009/1/1 to 2009/4/1” |
| -p "q4" | سهماهه چهارم سال جاری |
عبارتهای دوره به همراه بازه گزارش (Period expressions with a report interval)
یک عبارت دوره میتواند با یک بازه گزارش نیز آغاز شود، که با یک فاصله یا کلمه in از تاریخهای شروع/پایان (در صورت وجود) جدا میشود:
| -p "weekly from 2009/1/1 to 2009/4/1" |
| -p "monthly in 2008" |
| -p "quarterly" |
بازههای گزارش پیچیدهتر (More complex report intervals)
برخی بازههای پیچیدهتر را میتوان در عبارتهای دوره مشخص کرد، مانند:
- biweekly (هر دو هفته یکبار)
- fortnightly
- bimonthly (هر دو ماه یکبار)
- every day|week|month|quarter|year
- every N days|weeks|months|quarters|years
هفتگی در یک روز دلخواه:
- every Nth day of week (پسوندهای th، nd، rd یا st همگی پس از عدد پذیرفته میشوند)
- every WEEKDAYNAME (نام انگلیسی روز هفته بهصورت کامل یا سهحرفی، بدون حساسیت به حروف بزرگ و کوچک)
ماهانه در یک روز دلخواه:
- every Nth day [of month] (31st day با آخرین روز هر ماه تطبیق داده خواهد شد)
- every Nth WEEKDAYNAME [of month]
سالانه در یک ماه و روز دلخواه:
- every MM/DD [of year] (شماره ماه و شماره روزِ ماه)
- every MONTHNAME DDth [of year] (نام انگلیسی ماه بهصورت کامل یا سهحرفی، بدون حساسیت به حروف بزرگ و کوچک، و شماره روزِ ماه)
- every DDth MONTHNAME [of year] (معادل با مورد بالا)
مثالها:
| -p "bimonthly from 2008" | |
| -p "every 2 weeks" | |
| -p "every 5 months from 2009/03" | |
| -p "every 2nd day of week" | دورهها از سهشنبه تا سهشنبه خواهند بود |
| -p "every Tue" | همان |
| -p "every 15th day" | مرزهای دوره در پانزدهم هر ماه خواهند بود |
| -p "every 2nd Monday" | مرزهای دوره در دومین دوشنبه هر ماه خواهند بود |
| -p "every 11/05" | دورههای سالانه با مرزهایی در پنجم نوامبر |
| -p "every 5th November" | همان |
| -p "every Nov 5th" | همان |
نمایش ترازهای تاریخی در پایان روز پانزدهم هر ماه (N تاریخ پایان است و طبق معمول، خود آن روز شامل نمیشود):
-
$ hledger balance -H -p "every 16th day"
دستهبندی ثبتها از ابتدای چهارشنبه تا انتهای سهشنبه بعد (N هم تاریخ شروع (شامل) و هم تاریخ پایان (غیرشامل) است):
-
$ hledger register checking -p "every 3rd day of week" این شکل ویژه نیز پشتیبانی میشود:
- •
-
every WEEKDAYNAME,WEEKDAYNAME,... (نامهای کامل یا سهحرفی روزهای هفته به انگلیسی، بدون حساسیت به بزرگی و کوچکی حروف)
همچنین، weekday و weekendday کوتاهنوشتهایی برای mon,tue,wed,thu,fri و sat,sun هستند.
این قابلیت عمدتاً برای استفاده با --forecast در نظر گرفته شده است، تا تراکنشهای دورهای را در روزهای دلخواهی از هفته ایجاد کند. استفاده از آن با -p ممکن است کاربرد کمتری داشته باشد، زیرا هر هفته را به زیردورههایی با طول نابرابر تقسیم میکند که غیرمعمول است. (مرتبط: #1632)
مثالها:
| -p "every mon,wed,fri" | تاریخها Mon، Wed، Fri خواهند بود؛ دورهها Mon-Tue، Wed-Thu، Fri-Sun خواهند بود |
| -p "every weekday" | تاریخها Mon، Tue، Wed، Thu، Fri خواهند بود؛ دورهها Mon، Tue، Wed، Thu، Fri-Sun خواهند بود |
| -p "every weekendday" | تاریخها Sat، Sun خواهند بود؛ دورهها Sat، Sun-Fri خواهند بود |
عمق (DEPTH)
با گزینه --depth NUM (شکل کوتاه، که معمولاً ترجیح داده میشود: -NUM)، گزارشها حسابها را تنها تا عمق تعیینشده نمایش میدهند و زیرحسابهای عمیقتر را پنهان میکنند. زمانی که خلاصهای با جزئیات کمتر میخواهید از این گزینه استفاده کنید. این پرچم همان تأثیر آرگومان پرسوجوی depth: را دارد. بنابراین همه این موارد معادل یکدیگرند: depth:2، --depth=2، -2.
همچنین میتوانید به جای تنها NUM، با ارائه یک آرگومان REGEX=NUM عمقهای سفارشی را برای حسابهای خاص تعیین کنید (از نسخه 1.41). برای مثال، --depth assets=2 (یا depth:assets=2) حسابهای منطبق با عبارت منظم "assets" را تا عمق ۲ جمع (خلاصه) میکند. بنابراین assets:bank:savings به assets:bank جمع میشود، اما liabilities:bank:credit card تحت تأثیر قرار نخواهد گرفت.
اگر REGEX شامل فاصله یا دیگر نویسههای خاص است، طبق معمول آن را داخل نقلقول قرار دهید. مانند: --depth 'credit card=2'
ترکیب گزینههای عمق
اگر یک خط فرمان شامل چندین گزینه عمومی عمق باشد، آخرین گزینه اعمال میشود. (برای بازنویسی و نادیدهگرفتن عمق مشخصشده توسط اسکریپتها مفید است.)
یا ممکن است یک دستور شامل ترکیبی از گزینههای عمومی و سفارشی عمق باشد. در این حالت، گزینهای که خاصترین (عمیقترین) تطابق را داشته باشد اعمال میشود. چند مثال:
- دستور --depth assets=3 --depth expenses=2 --depth 1 حسابهای حاوی "assets" را تا عمق ۳، حسابهای حاوی "expenses" را تا عمق ۲، و تمام حسابهای دیگر را تا عمق ۱ جمع میکند.
- دستور --depth assets=1 --depth savings=2 حساب assets:bank:savings را تا عمق ۲ جمع میکند (نه عمق ۱؛ زیرا "savings" نسبت به "assets" با بخش عمیقتری از نام حساب تطابق دارد).
توجه داشته باشید که در حال حاضر، برای لغو یک گزینه سفارشی عمق --depth REGEX=NUM با گزینهای پس از آن، گزینه بعدی باید از همان REGEX استفاده کند..SH "پرسوجوها (QUERIES)" بسیاری از دستورهای hledger آرگومانهای پرسوجو را میپذیرند که دامنهٔ عملکرد آنها را محدود کرده و امکان گزارشگیری از زیرمجموعهٔ دقیقی از دادههایتان را فراهم میکنند. در اینجا یک نمای کلی و سریع از پرسوجوهای hledger آمده است:
- •
- بهطور پیشفرض، یک آرگومان پرسوجو به عنوان یک الگوی زیررشتهای ناوابسته به بزرگی و کوچکی حروف برای تطبیق نام حسابها در نظر گرفته میشود. برای نمونه:
dining groceries
car:fuel
- •
- الگوهایی که شامل فاصله یا نویسههای خاص دیگر هستند باید درون نقلقول تکی یا دوتایی قرار گیرند:
'personal care'
- •
- الگوها در واقع عبارات باقاعده (regular expressions) هستند، بنابراین میتوانید برای دقت بیشتر فرانویسههای عبارت باقاعده را اضافه کنید (یا ممکن است لازم باشد نویسههای خاصی را با بکاسلش فراردهی کنید؛ بخش "Regular expressions" در بالا را ببینید):
'^expenses\b'
'food$'
'fuel|repair'
'accounts (payable|receivable)'
- •
- برای تطبیق چیزی به جز نام حساب، میتوانید یک پیشوند نوع پرسوجو اضافه کنید، مانند:
date:202312-
status:
desc:amazon
cur:USD
cur:\\$
amt:'>0'
acct:groceries (اما acct: حالت پیشفرض است، بنابراین معمولاً نیازی به نوشتن آن نیست)
- •
- برای نفی یک پرسوجو، پیشوند not: را اضافه کنید:
not:status:'*'
not:desc:'opening|closing'
not:cur:USD
- •
- چندین عبارت پرسوجو را میتوان به صورت پرسوجوهای جداشده با فاصله ترکیب کرد؛ برای نمونه: hledger print date:2022 desc:amazon desc:amzn (نمایش تراکنشهای با تاریخ سال 2022 که شرح آنها شامل "amazon" یا "amzn" است).
- •
- یا با انعطافپذیری بیشتر به صورت پرسوجوهای بولی (boolean). برای نمونه: hledger print expr:'date:2022 and (desc:amazon or desc:amzn) and not date:202210'
تمامی دستورهای hledger از یک زبان پرسوجوی یکسان استفاده میکنند، اما دستورهای مختلف ممکن است پرسوجو را به روشهای گوناگونی تفسیر کنند. ما هنوز دستورها را شرح ندادهایم (این مورد در «بخش ۴: دستورها» (PART 4: COMMANDS) در ادامه خواهد آمد) اما اساس کار به شرح زیر است:
- دستورهای تراکنشمحور (print، aregister، close، import، descriptions...) تلاش میکنند تراکنشها (شامل ثبتهای تراکنش) را تطبیق دهند.
- دستورهای ثبتمحور (register، balance، balancesheet، incomestatement، accounts...) تلاش میکنند ثبتها (postings) را تطبیق دهند. ثبتها ویژگیهای تراکنش خود را برای اهداف پرسوجو به ارث میبرند، بنابراین فیلدهای تراکنش مانند تاریخ یا شرح همچنان میتوانند در یک پرسوجوی ثبت مورد ارجاع قرار گیرند.
- تعداد کمی از دستورها به روشهای خاصتری تطبیق میدهند. (مانند aregister، که یک آرگومان اول ویژه دارد.).SS انواع پرسوجو (Query types) انواع پرسوجوهای موجود در زیر آمده است:
پرسوجوی acct:
acct:REGEX، یا صرفاً REGEX
نامهای حسابی را که شامل این عبارت باقاعده (غیرحساس به حروف بزرگ و کوچک) باشند مطابقت میدهد.
این نوع پرسوجوی پیشفرض است، بنابراین معمولاً نیازی به نوشتن پیشوند "acct:" نیست.
پرسوجوی amt:
amt:N, amt:'<N', amt:'<=N', amt:'>N', amt:'>=N'
ثبتهای با مقدار تککالایی برابر، کمتر، یا بیشتر از N را تطبیق میدهد. (ثبتهای دارای مقادیر چندکالایی بررسی نمیشوند و همیشه مطابقت خواهند داشت.) برای پنهان کردن علامتهای کوچکتری/بزرگتری از پوسته خط فرمان، amt: نیازمند علامت نقلقول است.
این مقایسه دو حالت دارد: اگر پیش از N علامت + یا - آمده باشد (یا ۰ باشد)، دو عدد دارای علامت با یکدیگر مقایسه میشوند. در غیر این صورت، اندازه قدر مطلق اعداد بدون در نظر گرفتن علامت مقایسه خواهد شد.
به یاد داشته باشید که amt: مقادیر ثبتها را مطابقت میدهد، نه تراز حسابها را.
پرسوجوی code:
code:REGEX
تطبیق بر اساس کد تراکنش (مانند شماره چک).
پرسوجوی cur:
cur:REGEX
ثبتها یا تراکنشهایی را تطبیق میدهد که شامل هر مقداری باشند که نماد ارز/کالای آن بهطور کامل با REGEX تطبیق یابد. (برخلاف روش معمول تطبیق میانی در hledger. برای انجام تطبیق میانی، .*REGEX.* را وارد کنید.) توجه داشته باشید که برای تطبیق نویسههای خاصی که در عبارت باقاعده معنای ویژه دارند، باید آنها را با \ گریزدهی (escape) کنید. و برای نویسههایی که برای پوسته شما معنای خاص دارند، معمولاً به یک سطح گریزدهی بیشتر نیاز خواهید داشت. به عنوان مثال برای تطبیق علامت دلار: cur:\\$ یا cur:'\$'
پرسوجوی desc:
desc:REGEX
توضیحات تراکنش را مطابقت میدهد.
پرسوجوی date:
date:PERIODEXPR
تاریخها (یا با پرچم --date2، تاریخهای ثانویه) را در دوره زمانی مشخصشده مطابقت میدهد. عبارت PERIODEXPR یک عبارت دوره زمانی است. مثالها:
date:2016، date:thismonth، date:2/1-2/15، date:2021-07-27..nextquarter.
عبارت PERIODEXPR میتواند شامل یک بازه گزارشگیری باشد (از نسخه 1.52). در خط فرمان، این معادل تعیین یک بازه گزارشگیری با استفاده از گزینههای خط فرمان است. در سایر محیطها (مانند hledger-ui و hledger-web)، بازه گزارشگیری ممکن است نادیده گرفته شود.
پرسوجوی date2:
date2:PERIODEXPR
اگر از تاریخهای ثانویه استفاده میکنید: این پرسوجو تاریخهای ثانویه را در دوره زمانی مشخصشده تطبیق میدهد. این پرسوجو تحت تأثیر پرچم --date2 قرار نمیگیرد. هرگونه بازه گزارشگیری در PERIODEXPR نادیده گرفته خواهد شد..SS پرسوجوی depth: depth:[REGEXP=]N
تطبیق (یا بسته به دستور، نمایش) حسابها در این عمق یا بالاتر از آن؛ به صورت اختیاری تنها برای حسابهایی که با یک عبارت باقاعده ارائهشده مطابقت دارند. برای قوانین دقیق، بخش Depth را ببینید.
پرسوجوی note:
note:REGEX
تطبیق یادداشتهای تراکنش (بخشی از توضیحات که در سمت راست | قرار دارد، یا کل توضیحات در صورتی که نویسهٔ | وجود نداشته باشد).
پرسوجوی payee:
payee:REGEX
تطبیق نامهای دریافتکننده/پرداختکنندهٔ تراکنش (بخشی از توضیحات که در سمت چپ | قرار دارد، یا کل توضیحات در صورتی که نویسهٔ | وجود نداشته باشد).
پرسوجوی real:
real:, real:0
تطبیق ثبتهای (postings) واقعی یا مجازی، به ترتیب.
پرسوجوی status:
status:, status:!, status:*
تطبیق تراکنشهای بدون علامت، در انتظار یا تسویهشده، به ترتیب.
پرسوجوی type:
type:TYPECODES
تطبیق بر اساس نوع حساب (بخش Declaring accounts > Account types را ببینید). TYPECODES یک یا چند کد تکحرفی نوع حساب از ALERXCVG، بدون حساسیت به بزرگی و کوچکی حروف است. توجه داشته باشید که type:A، type:E و type:R با زیرنوعهای مربوط به خود یعنی C (نقدینگی - Cash)، V (تبدیل - Conversion) و G (سود - Gain) نیز تطبیق خواهند یافت. انواع خاصی از نامهای مستعار حساب (alias) میتوانند انواع حساب را مختل کنند؛ بخش Rewriting accounts > Aliases and account types را ببینید.
پرسوجوی tag:
tag:NAMEREGEX[=VALREGEX]
تطبیق بر اساس نام برچسب، و بهطور اختیاری بر اساس مقدار برچسب نیز. نکته:
- •
- هر دو عبارت باقاعده تطبیق میانی انجام میدهند. اگر به تطبیق کامل نیاز دارید، از ^ و $ استفاده کنید.
برای مثال: tag:'^fullname$'، tag:'^fullname$=^fullvalue$
- برای تطبیق مقادیر با نادیده گرفتن نامها، از tag:.=VALREGEX استفاده کنید.
- حسابها برچسبهای حسابهای والد خود را نیز به ارث میبرند.
- ثبتها برچسبهای حساب و تراکنش خود را نیز به ارث میبرند.
- تراکنشها نیز برچسبهای ثبتهای خود را دریافت میکنند.
پرسوجوهای منفی
پرسوجوی not:
not:QUERY
میتوانید not: را به ابتدای یک پرسوجو اضافه کنید تا تطبیق نقیض شود.
برای مثال: not:equity، not:desc:apple
(همچنین، یک ترفند: عبارت not:not:... گاهی اوقات میتواند مشکلات پرسوجو را بهسادگی برطرف کند.).SS پرسوجوهای جداشده با فاصله هنگامی که چندین عبارت پرسوجوی جداشده با فاصله داده میشود، بیشتر دستورها مواردی را انتخاب میکنند که با این شرایط مطابقت داشته باشند:
- هر یک از عبارتهای شرح AND
- هر یک از عبارتهای حساب AND
- هر یک از عبارتهای وضعیت AND
- تمام عبارتهای دیگر.
دستور print کمی متفاوت است و تراکنشهایی را نمایش میدهد که:
- با هر یک از عبارتهای شرح مطابقت داشته باشند AND
- دارای ثبتهایی باشند که با هر یک از عبارتهای مثبت حساب مطابقت دارند AND
- هیچ ثبتی نداشته باشند که با هر یک از عبارتهای منفی حساب مطابقت داشته باشد AND
- با تمام عبارتهای دیگر مطابقت داشته باشند.
پرسوجوهای بولی
میتوانید عبارتهای پرسوجوی پیچیدهتر "بولی" بنویسید که در گیومه قرار گرفته و پیشوند expr: دارند. این عبارتها میتوانند زیرپرسوجوها را با عملگرهای NOT، AND و OR (غیرحساس به حروف بزرگ و کوچک) و پرانتزها برای گروهبندی ترکیب کنند. برای مثال، جهت نمایش تراکنشهایی که هم شامل حسابهای cash و هم expenses هستند:
-
hledger print expr:'cash AND expenses'
پیشوند و گیومههای دربرگیرنده الزامی هستند، بنابراین hledger print cash AND expenses را ننویسید. این حالت یک پرسوجوی جداشده با فاصله خواهد بود که تراکنشهای شامل حسابهایی با هر یک از "cash"، "and" یا "expenses" در نامشان را نشان میدهد.
میتوانید پرسوجوهای جداشده با فاصله را درون یک پرسوجوی بولی بنویسید، و آنها همانطور که در بالا توضیح داده شد ترکیب خواهند شد، اما این کار ممکن است گیجکننده باشد و بهتر است از آن اجتناب شود. برای مثال موارد زیر معادل هستند و تراکنشهای شامل حسابهای cash یا expenses را نمایش میدهند:
-
hledger print expr:'cash expenses' hledger print cash expenses
محدودیتی در مورد پرسوجوهای date: وجود دارد: آنها را نمیتوان درون عبارتهای OR استفاده کرد.
در واقع، سه نوع پرسوجوی بولی وجود دارد: expr: برای استفادهٔ عمومی، و گونههای any: و all: که میتوانند همراه با print مفید باشند.
پرسوجوی expr:
expr:'QUERYEXPR'
برای مثال، expr:'date:lastmonth AND NOT (food OR rent)' به این معنی است: "تطبیق مواردی که تاریخ آنها در ماه گذشته است و food یا rent در نام حساب آنها وجود ندارد".
هنگام استفاده از expr: با دستورهای مبتنی بر تراکنش مانند print، عبارتهای پرسوجوی مبتنی بر ثبت مانند acct: و amt: در صورتی منطبق بر تراکنش در نظر گرفته میشوند که با هر یک از ثبتهای آن مطابقت داشته باشند.
بنابراین، hledger print expr:'cash and amt:>0' به این معنی است: "نمایش تراکنشهایی با (حداقل یک ثبت شامل یک حساب cash) و (حداقل یک ثبت با مبلغ مثبت)".
پرسوجوی any:
any:'QUERYEXPR'
مانند expr: است، اما هنگامی که با دستورهای مبتنی بر تراکنش مانند print استفاده میشود، تراکنش را تنها در صورتی مطابقت میدهد که یک ثبت بتواند با تمام QUERYEXPR مطابقت داشته باشد.
بنابراین، hledger print any:'cash and amt:>0' به این معنی است: "نمایش تراکنشهایی که در آنها حداقل یک ثبت، مبلغ مثبتی را به یک حساب cash منظور میکند"..SS پرسمان all: all:'QUERYEXPR'
مشابه expr: است، اما هنگامی که با دستورهای تراکنشمحور مانند print استفاده میشود، تراکنش را تنها در صورتی مطابقت میدهد که تمام ثبتها (postings) با تمام بخشهای QUERYEXPR مطابقت داشته باشند (و حداقل یک ثبت وجود داشته باشد).
بنابراین، hledger print all:'cash and amt:0' به این معنی است: "تراکنشهایی را نشان بده که در آنها همهٔ ثبتها مربوط به یک حساب نقدی (cash) بوده و مقدار مبلغ آنها صفر باشد".
یا hledger print all:'cash or checking' یعنی "تراکنشهایی را نشان بده که تنها به حسابهای نقدی (cash) و/یا جاری (checking) مربوط میشوند".
پرسمانها و گزینههای دستور
برخی پرسمانها را میتوان به صورت گزینههای خط فرمان نیز بیان کرد: depth:2 معادل --depth 2 است، date:2023 معادل -p 2023 است، و غیره. هنگامی که گزینههای دستور و آرگومانهای پرسمان را با هم ترکیب میکنید، عموماً پرسمان حاصل اشتراک آنها خواهد بود.
پرسمانها و نامهای مستعار حساب
هنگامی که نامهای حساب با --alias یا alias بازنویسی میشوند، acct: با نام قدیم یا جدید حساب مطابقت خواهد داشت.
پرسمانها و ارزشگذاری
هنگامی که مبالغ در گزارشهای بهای تمامشده یا ارزش به کالاها/ارزهای دیگر تبدیل میشوند، cur: و amt: با نماد کالای قدیمی و مقدار مبلغ پیشین مطابقت داده میشوند، نه موارد جدید. (بهجز در hledger 1.22، شمارهٔ #1625.)
محورسازی (PIVOTING)
به طور معمول، hledger مبالغ را گروهبندی کرده و مجموع آنها را بر اساس (نام) حساب نمایش میدهد. با گزینهٔ --pivot PIVOTEXPR، مقدار یک فیلد دیگر (یا چند فیلد) به عنوان نام حساب ساختگی استفاده میشود که باعث گروهبندی و نمایش متفاوتی میگردد. PIVOTEXPR میتواند موارد زیر باشد:
- هر یک از این فیلدهای استاندارد تراکنش یا ثبت (که مقدار آنها جایگزین میشود): status، code، desc، payee، note، acct، comm/cur، amt، cost
- یا نام یک برچسب (tag)
- یا هر ترکیبی از این موارد، جداشده با دونقطه (colon-separated).
برخی موارد خاص:
- دونقطههایی که در PIVOTEXPR یا در مقدار یک برچسب محورسازیشده ظاهر شوند، سلسلهمراتب حساب ایجاد خواهند کرد.
- هنگام محورسازی ثبتی که چندین مقدار برای یک برچسب دارد، نخستین مقدار آن برچسب به عنوان مقدار محورسازیشده استفاده خواهد شد.
- هنگامی که یک ثبت دارای چندین کالا/ارز باشد، مقدار محورسازیشدهٔ "comm"/"cur" برابر "" خواهد بود. همچنین هنگامی که یک نام برچسب یا فیلد ناشناخته ارائه شود، مقدار محورسازیشدهٔ آن "" خواهد بود. (اگر این مسئله باعث ایجاد خروجی گیجکننده میشود، خارج کردن آن ثبتها از گزارش را در نظر بگیرید.)
مثالها:
-
2016/02/16 Yearly Dues Payment assets:bank account 2 EUR income:dues -2 EUR ; member: John Doe, kind: Lifetime
گزارش تراز عادی که نامهای حساب را نشان میدهد:
-
$ hledger balance 2 EUR assets:bank account -2 EUR income:dues -------------------- 0
گزارش تراز محورسازیشده، با استفاده از مقادیر برچسب member: به جای نام حساب:
-
$ hledger balance --pivot member 2 EUR -2 EUR John Doe -------------------- 0
یک روش برای نمایش تنها مبالغی که دارای مقدار member: هستند (با استفاده از یک پرسمان):
-
$ hledger balance --pivot member tag:member=. -2 EUR John Doe -------------------- -2 EUR
روشی دیگر (پرسمان acct: با "نام حساب" محورسازیشده مطابقت داده میشود):
-
$ hledger balance --pivot member acct:. -2 EUR John Doe -------------------- -2 EUR
گزارشهای سلسلهمراتبی میتوانند با مقادیر محوری چندگانه تولید شوند:
-
$ hledger balance Income:Dues --pivot kind:member -2 EUR Lifetime:John Doe -------------------- -2 EUR برنامهٔ hledger میتواند دادههای ارائهشده به آن را غنیتر کند، یا به چندین روش دادههای جدیدی تولید نماید. در بیشتر موارد، این کار تنها در صورتی انجام میشود که شما درخواست کنید:
-
مبالغ یا هزینههای ناموجود در تراکنشها در صورت امکان بهطور خودکار استنباط میشوند.
-
پرچم --infer-equity ثبتهای حقوق صاحبان سهام تبدیل (conversion equity postings) ناموجود را از روی هزینههای @/@@ استنباط میکند. -
پرچم --infer-costs هزینههای ناموجود را از روی ثبتهای حقوق صاحبان سهام تبدیل استنباط میکند. -
پرچم --infer-market-prices دستورالعملهای قیمت P را از روی هزینهها استنباط میکند.
-
پرچم --auto ثبتهای اضافی را به تراکنشهایی که با قوانین ثبت خودکار مطابقت دارند، اضافه میکند. -
گزینهٔ --forecast تراکنشها را از روی قوانین تراکنشهای دورهای تولید میکند. -
گزارش balance --budget اهداف بودجه را از روی قوانین تراکنشهای دورهای استنباط میکند. -
دستوراتی مانند close، rewrite و hledger-interest تراکنشها یا ثبتها را تولید میکنند.
-
دادههای CSV با اِعمال قوانین تبدیل CSV به تراکنشها تبدیل میشوند... و غیره.
چنین دادههای تولیدشدهای موقتی بوده و تنها در زمان گزارشگیری وجود دارند.
میتوانید با کارهایی نظیر دریافت خروجی hledger print و ذخیرهٔ آن در فایل دفتر روزنامه (journal) خود، آن را به دادههای ثبتشدهٔ دائمی تبدیل کنید.
این قابلیت گاهی میتواند به عنوان ابزار کمکی برای ورود دادهها مفید باشد.
اگر کنجکاوید بدانید چه دادههایی و به چه دلیلی در حال تولید هستند، دستور hledger print -x --verbose-tags را اجرا کنید. گزینهٔ -x/--explicit مبالغ استنباطشده را نشان میدهد و --verbose-tags برچسبهایی مانند generated-transaction (از قوانین دورهای) و generated-posting، modified (از قوانین ثبت خودکار) را اضافه میکند. برچسبهای پنهان مشابهی (با پیشوند خط زیرین _) نیز همواره وجود دارند، بنابراین همیشه میتوانید با پرسوجوهایی مانند tag:generated یا tag:modified این دادهها را تطبیق دهید.
پیشبینی (Forecasting)
پیشبینی یا گزارشگیری حدسی از آینده، میتواند برای برآورد موجودیهای آتی، یا برای بررسی سناریوهای مختلف آینده مفید باشد.
سادهترین و منعطفترین راه برای انجام این کار در hledger، ثبت دستی مجموعهای از تراکنشهای با تاریخ آینده است. میتوانید این تراکنشها را در یک فایل future.journal جداگانه نگه داشته و تنها زمانی که میخواهید آنها را مشاهده کنید، با -f آن را وارد نمایید.
--forecast
روش دیگری نیز وجود دارد: با گزینهٔ --forecast، ابزار hledger میتواند بر اساس قوانین تراکنشهای دورهای تعریفشده در دفتر روزنامه، "تراکنشهای پیشبینی" موقتی را برای اهداف گزارشگیری تولید کند. هر قاعده میتواند چندین تراکنش تکرارشونده ایجاد کند، بنابراین با تغییر یک قاعده میتوانید تعداد زیادی از تراکنشهای پیشبینیشده را دگرگون کنید.
تراکنشهای پیشبینی معمولاً پس از پایان تراکنشهای عادی آغاز میشوند. بهطور پیشفرض، آنها بعد از آخرین تاریخ تراکنش عادی شما، یا امروز (هر کدام که دیرتر باشد) شروع شده و شش ماه پس از امروز خاتمه مییابند. (قوانین دقیق کمی پیچیدهتر هستند و در ادامه ارائه شدهاند.)
این بازه، "دورهٔ پیشبینی" نامیده میشود که لزومی ندارد با دورهٔ گزارشگیری یکسان باشد. میتوانید با دادن یک آرگومان عبارت دوره به گزینهٔ --forecast آن را بازنویسی کنید - برای مثال جهت پیشبینی برای آیندهای دورتر، یا اجبار تراکنشهای پیشبینی به همپوشانی با تراکنشهای عادی خود - مانند --forecast=..2099 یا --forecast=2023-02-15... توجه داشته باشید که علامت = الزامی است.
بررسی تراکنشهای پیشبینی (Inspecting forecast transactions)
دستور print بهترین دستور برای بررسی و عیبیابی تراکنشهای پیشبینی است. برای مثال:
-
~ monthly from 2022-12-20 rent assets:bank:checking expenses:rent $1000 -
$ hledger print --forecast --today=2023/4/21 2023-05-20 rent ; generated-transaction: ~ monthly from 2022-12-20 assets:bank:checking expenses:rent $1000 2023-06-20 rent ; generated-transaction: ~ monthly from 2022-12-20 assets:bank:checking expenses:rent $1000 2023-07-20 rent ; generated-transaction: ~ monthly from 2022-12-20 assets:bank:checking expenses:rent $1000 2023-08-20 rent ; generated-transaction: ~ monthly from 2022-12-20 assets:bank:checking expenses:rent $1000 2023-09-20 rent ; generated-transaction: ~ monthly from 2022-12-20 assets:bank:checking expenses:rent $1000
در اینجا هیچ تراکنش عادی وجود ندارد، بنابراین تراکنشهای پیشبینیشده از اولین موعد پس از تاریخ امروز آغاز میشوند. (شما در حالت معمول از --today استفاده نخواهید کرد؛ این گزینه صرفاً برای تکرارپذیر ساختن این مثالها آورده شده است.).SS "گزارشهای پیشبینی (Forecast reports)" تراکنشهای پیشبینی همانطور که انتظار میرود بر تمام گزارشها تأثیر میگذارند. برای نمونه:
-
$ hledger areg rent --forecast --today=2023/4/21 Transactions in expenses:rent and subaccounts: 2023-05-20 rent as:ba:checking $1000 $1000 2023-06-20 rent as:ba:checking $1000 $2000 2023-07-20 rent as:ba:checking $1000 $3000 2023-08-20 rent as:ba:checking $1000 $4000 2023-09-20 rent as:ba:checking $1000 $5000
-
$ hledger bal -M expenses --forecast --today=2023/4/21 Balance changes in 2023-05-01..2023-09-30: || May Jun Jul Aug Sep ===============++=================================== expenses:rent || $1000 $1000 $1000 $1000 $1000 ---------------++----------------------------------- || $1000 $1000 $1000 $1000 $1000
برچسبهای پیشبینی (Forecast tags)
تراکنشهای پیشبینی ایجادشده با --forecast دارای یک برچسب پنهان، _generated-transaction هستند. بنابراین اگر زمانی نیاز به تطبیق تراکنشهای پیشبینی داشتید، میتوانید از tag:_generated-transaction (یا صرفاً tag:generated) در یک پرسوجو استفاده کنید.
برای عیبیابی، میتوانید پرچم --verbose-tags را اضافه کنید. سپس، برچسبهای آشکار generated-transaction نیز افزوده خواهند شد، بهگونهای که میتوانید آنها را با دستور print مشاهده کنید. مقدار آنها مشخص میکند کدام قاعده دورهای عامل ایجاد آن بوده است.
دوره پیشبینی، با جزئیات (Forecast period, in detail)
تاریخهای آغاز و پایان پیشبینی بهگونهای انتخاب میشوند که بهطور پیشفرض در تقریباً همه موقعیتها عملکرد مفیدی داشته باشند، در عین حال که انعطافپذیر نیز باقی بمانند. در اینجا قواعد دقیق (بهامید خدا) برای کمک به عیبیابی آورده شده است:
دوره پیشبینی از تاریخ زیر آغاز میشود:
- •
- تاریخ متأخرتر بین
- تاریخ آغاز در قاعده تراکنش دورهای
- تاریخ آغاز در آرگومان --forecast
- •
- در غیر این صورت (اگر آن موارد در دسترس نباشند): تاریخ متأخرتر بین
- تاریخ آغاز گزارش مشخصشده با -b/-p/date:
- روز بعد از آخرین تراکنش عادی در دفترکل (journal)
- •
- در غیر این صورت (اگر هیچیک از اینها موجود نباشد): امروز.
دوره پیشبینی در تاریخ زیر پایان مییابد:
- •
- تاریخ متقدمتر بین
- تاریخ پایان در قاعده تراکنش دورهای
- تاریخ پایان در آرگومان --forecast
- در غیر این صورت: تاریخ پایان گزارش مشخصشده با -e/-p/date:
- در غیر این صورت: ۱۸۰ روز (~۶ ماه) پس از امروز.
عیبیابی پیشبینی (Forecast troubleshooting)
هنگامی که --forecast آنطور که انتظار دارید عمل نمیکند، یکی از این نکات باید مفید باشد:
- به یاد داشته باشید که از گزینه --forecast استفاده کنید.
- به یاد داشته باشید که حداقل یک قاعده تراکنش دورهای در دفترکل خود داشته باشید.
- با دستور print --forecast آزمایش کنید.
- خطاهای نگارشی یا تاریخهای آغاز/پایان بیش از حد محدودکننده را در قاعده تراکنش دورهای خود بررسی کنید.
- حداقل ۲ فاصله بین عبارت دوره قاعده و فیلدهای توضیحات قرار دهید.
- بررسی کنید که آیا تراکنشهای عادی دارای تاریخ آینده مانع از نمایش تراکنشهای پیشبینیشده شدهاند یا خیر.
- تنظیم صریح تاریخهای آغاز و/یا پایان گزارش را با -b، -e، -p یا date: امتحان کنید.
- افزودن پرچم -E را برای تشویق به نمایش دورههای خالی/تراکنشهای صفر امتحان کنید.
- تنظیم صریح تاریخهای آغاز و/یا پایان پیشبینی را با --forecast=START..END امتحان کنید.
- به بخش «دوره پیشبینی، با جزئیات» در بالا مراجعه کنید.
- بررسی درون موتور: به عنوان نمونه --debug=2 را اضافه کنید..SH بودجهبندی با گزارش --budget در دستور balance، هر قاعده تراکنش دورهای، اهداف بودجهای تکرارشونده را در حسابهای مشخصشده تولید میکند و میتوان اهداف و عملکرد واقعی را با یکدیگر مقایسه کرد. مستندات دستور balance را در ادامه ببینید.
میتوانید اهداف بودجه و تراکنشهای پیشبینی را بهطور همزمان، از یک قاعده یا قواعد تراکنش دورهای متفاوت ایجاد کنید: hledger bal -M --budget --forecast ...
همچنین ببینید: بودجهبندی و پیشبینی (Budgeting and Forecasting).
قالببندی مبالغ
سبک نمایش کالا
برای مبالغ هر کالا (commodity)، hledger یک سبک نمایش یکدست (محل قرارگیری نماد، نشانگر اعشار و نشانگرهای گروهبندی ارقام، تعداد ارقام اعشار) را برای استفاده در بیشتر گزارشها انتخاب میکند. این مورد بهصورت زیر استنتاج میشود:
نخست، اگر یک دستورالعمل D وجود داشته باشد که کالای پیشفرض را اعلان میکند، نماد آن کالا و قالب مبلغ به تمام مبالغ بدون نماد در دفتر روزنامه (journal) اعمال میشود.
سپس سبک نمایش هر کالا بر اساس دستورالعمل commodity آن تعیین میشود. توصیه میکنیم همیشه کالاها را با دستورالعملهای commodity اعلان کنید، زیرا به اطمینان از یکدست بودن سبکهای نمایش و دقتها کمک میکنند و مزایای دیگری مانند بررسی خطای نمادهای کالا را به همراه دارند. در اینجا یک مثال آورده شده است:
-
# Set display styles (and decimal marks, for parsing, if there is no decimal-mark directive) # for the $, EUR, INR and no-symbol commodities: commodity $1,000.00 commodity EUR 1.000,00 commodity INR 9,99,99,999.00 commodity 1 000 000.9455
اما برای راحتی، در صورتی که دستورالعمل commodity وجود نداشته باشد، hledger سبکهای نمایش کالا را از مبالغ آن به همان صورت که در دفتر روزنامه نوشته شدهاند استنتاج میکند (بهاستثنای مبالغ بهای تمامشده و مبالغ موجود در قواعد تراکنش دورهای یا قواعد ثبت خودکار). برنامه از موارد زیر استفاده میکند:
- محل قرارگیری نماد و نشانگر اعشار اولین مبلغ دیدهشده
- نشانگرهای گروهبندی ارقامِ اولین مبلغی که دارای نشانگرهای گروهبندی ارقام باشد
- و بیشترین تعداد ارقام اعشار دیدهشده در تمام مبالغ.
و بهعنوان راهحل جایگزین (fallback)، اگر هیچ مبلغ مناسبی یافت نشود، از یک سبک پیشفرض استفاده خواهد کرد، مانند $1000.00 (نماد در سمت چپ بدون فاصله، نقطه بهعنوان نشانگر اعشار، و دو رقم اعشار).
در نهایت، سبکهای کالا را میتوان با گزینه خط فرمان -c/--commodity-style بازنویسی کرد.
گرد کردن
مبالغ در داخل برنامه بهصورت اعداد اعشاری تا ۲۵۵ رقم اعشار ذخیره میشوند. آنها در گزارشهای print و گزارشهای مشابه print با دقت اصلیشان در دفتر روزنامه نمایش داده میشوند، و در سایر گزارشها به دقت نمایشی خود (تعداد ارقام اعشار مشخصشده توسط سبک نمایش کالا) گرد میشوند. هنگام گرد کردن، hledger از گرد کردن بانکی (banker's rounding؛ گرد کردن به نزدیکترین رقم زوج) استفاده میکند. بنابراین برای مثال 0.5 در صورت نمایش با صفر رقم اعشار بهصورت "0" ظاهر میشود.
نشانگرهای اعشار پایانی
اگر تعجب میکنید که چرا گزارش print شما گاهی نشانگرهای اعشار پایانی را بدون هیچ رقم اعشاری نشان میدهد؛ این کار را هنگام نمایش مبالغی انجام میدهد که نشانگرهای گروهبندی ارقام دارند اما رقم اعشار ندارند، تا ابهامزدایی شده و امکان بازخوانی مطمئن آنها فراهم شود (بخش Decimal marks را ببینید). برای مثال:
-
commodity $1,000.00 2023-01-02 (a) $1000 -
$ hledger print 2023-01-02 (a) $1,000.
اگر این موضوع مشکلی ایجاد میکند (مثلاً هنگام برونبری به Ledger)، میتوانید با غیرفعال کردن نشانگرهای گروهبندی ارقام، مثلاً با -c/--commodity (برای هر کالای متأثر)، از آن جلوگیری کنید:
-
$ hledger print -c '$1000.00' 2023-01-02 (a) $1000
یا با وادار کردن print به نمایش همیشگی ارقام اعشار، با --round:
-
$ hledger print -c '$1,000.00' --round=soft 2023-01-02 (a) $1,000.00 بهطور کلیتر، خروجی hledger به سه دسته کلی تقسیم میشود که مبالغ را برای سازگاری با مصرفکنندگان گوناگون، کمی متفاوت قالببندی میکنند:
۱. "خروجی قابل خواندن برای hledger" - باید برای hledger (و انسانها) قابل خواندن باشد
-
این خروجی توسط گزارشهایی تولید میشود که مدخلهای کامل دفتر روزنامه را نشان میدهند: print، import، close، rewrite و غیره.
-
مبالغ را با دقت اصلی آنها در دفتر روزنامه نمایش میدهد، که ممکن است از یک مبلغ تا مبلغ دیگر یکدست نباشد.
-
در صورت نیاز، یک نشانگر اعشار پایانی اضافه میکند تا از نمایش مبالغ مبهم جلوگیری شود.
-
میتواند بهطور قابل اطمینان تجزیه شود (دستکم توسط hledger و ledger2beancount، اما شاید نه توسط Ledger..).
۲. "خروجی خوانا برای انسان" - معمولاً برای انسانها
-
این خروجی توسط تمام گزارشهای دیگر تولید میشود.
-
مبالغ را با دقتهای نمایش استاندارد نشان میدهد، که در هر کالا (commodity) یکدست خواهد بود.
-
مبالغ مبهم را بدون تغییر نمایش میدهد.
-
میتوان آن را در بستر یک گزارش شناختهشده بهطور قابل اطمینان تجزیه کرد (وقتی میدانید که اعشارها بهطور مداوم نمایش داده نمیشوند، میتوانید فرض کنید یک علامت منفرد، نشانگر جداساز ارقام است).
۳. "خروجی ماشینخوان" - معمولاً برای سایر نرمافزارها
-
این خروجی توسط تمام گزارشها هنگامی که قالب خروجیای مانند csv، tsv، json یا sql انتخاب شده باشد، تولید میشود.
-
مبالغ را مانند ۱ یا ۲ نشان میدهد، اما بدون نشانگرهای جداساز ارقام.
-
میتواند بهطور قابل اطمینان تجزیه شود (در صورت نیاز، نشانگر اعشار میتواند با -c/--commodity-style تغییر داده شود).
گزارش بهای تمامشده (Cost reporting)
در برخی تراکنشها - برای مثال تبدیل ارز، یا خرید یا فروش سهام - یک کالا با کالایی دیگر مبادله میشود. در این تراکنشها یک نرخ تبدیل وجود دارد که بهای تمامشده (cost، هنگام خرید) یا قیمت فروش (selling price، هنگام فروش) نیز نامیده میشود. (در مستندات hledger، صرفاً برای سهولت کار بهطور کلی از واژه "cost" استفاده میکنیم.) با پرچم -B/--cost، ابزار hledger میتواند مبالغ را "با بهای تمامشده" (at cost)، تبدیلشده به کالای بهای تمامشده نمایش دهد.
ثبت بهای تمامشده (Recording costs)
ما چندین روش برای ثبت تراکنشهای شامل بهای تمامشده را بررسی خواهیم کرد. این روشها همچنین در بخش hledger Cookbook > Cost notation خلاصه شدهاند.
بهای تمامشده را میتوان بهصورت صریح در دفتر روزنامه، با استفاده از نمادگذاری @ UNITCOST یا @@ TOTALCOST که در Journal > Costs شرح داده شده است، ثبت کرد:
حالت ۱
-
2022-01-01 assets:dollars $-135 assets:euros €100 @ $1.35 ; $1.35 per euro (unit cost)
حالت ۲
-
2022-01-01 assets:dollars $-135 assets:euros €100 @@ $135 ; $135 total cost
معمولاً نوشتن بهای تمامشده واحد (حالت ۱) ترجیح داده میشود؛ این کار ممکن است زحمت بیشتری داشته باشد و نیازمند توجه بیشتر به ارقام اعشار باشد؛ اما مبنای بهای تمامشده هر واحد را مشخص میکند و فروش سهام را آسانتر میسازد.
بهای تمامشده را همچنین میتوان بهصورت ضمنی رها کرد، و hledger بهایی را که با یک تراکنش تراز (balanced) همخوانی داشته باشد استنتاج خواهد کرد:
حالت ۳
-
2022-01-01 assets:dollars $-135 assets:euros €100
در اینجا، hledger بهای @@ €100 را به مبلغ نخست پیوست میکند (میتوانید آن را با hledger print -x مشاهده کنید). این شکل از ثبت راحت به نظر میرسد، اما معایبی دارد:
- برخی از بررسیهای خطا را فدا میکند. برای نمونه، اگر تصادفاً بهجای €100 مقدار €10 را مینوشتید، hledger قادر به تشخیص این اشتباه نبود.
- نسبت به ترتیب ثبتها (postings) حساس است - اگر ترتیب معکوس میشد، مدخل متفاوتی استنتاج میشد و گزارشها متفاوت میبودند.
- خواندن مبنای بهای تمامشده به ازای هر واحد آسان نیست.
بنابراین عموماً این نوع مدخل توصیه نمیشود. میتوانید با استفاده از -s (حالت strict)، یا با اجرای hledger check balanced اطمینان حاصل کنید که هیچیک از این موارد را ندارید..SS گزارشگیری به بهای تمامشده (Reporting at cost) اکنون هنگامی که پرچم -B/--cost را به گزارشها اضافه میکنید ("B" برگرفته از پرچم -B/--basis/--cost در Ledger است)، هر مقداری که با بهای تمامشده نشانهگذاری شده باشد، (در خروجی گزارش) به کالای بهای تمامشدهاش تبدیل خواهد شد. یعنی آنها "به بهای تمامشده" یا "به قیمت فروش" نمایش داده خواهند شد.
چند نکته که باید توجه داشت:
- بهای تمامشده به مقادیر ثبت مشخصی در تراکنشهای معین پیوست شده است و پس از ثبت، تغییر نمیکند. این برخلاف قیمتهای بازار است که محیطی و در حال نوسان هستند.
- تبدیل به بهای تمامشده پیش از تبدیل به ارزش بازار (که در ادامه شرح داده شده) انجام میشود.
ثبتهای تبدیل سرمایه (Equity conversion postings)
در ورودیهای بالا مشکلی وجود دارد - آنها نمادگذاری مرسوم دفترداری دوطرفه (DEB) نیستند، و به دلیل تبدیل "جادویی" یک کالا به کالای دیگر، باعث عدم تعادل در معادله حسابداری میشوند. این مسئله به صورت یک جمع کل غیرصفر در گزارشهای تراز مانند hledger bse نشان داده میشود.
برای بیشتر کاربران hledger، این موضوع در عمل اهمیتی ندارد و میتوان با خیال آسوده آن را نادیده گرفت! اما اگر میخواهید بیشتر بدانید، به خواندن ادامه دهید.
دفترداری دوطرفه (DEB) مرسوم، از یک جفت ثبت سرمایه (equity posting) اضافی برای متوازن ساختن تراکنش استفاده میکند. البته میتوانید این کار را در hledger نیز انجام دهید:
حالت ۴
-
2022-01-01 assets:dollars $-135 assets:euros €100 equity:conversion $135 equity:conversion €-100
اکنون تراکنش طبق DEB استاندارد کاملاً متوازن است و مجموع کل در hledger bse به هم نخواهد ریخت.
همچنین، hledger همچنان میتواند بهای تمامشده را برای گزارشگیری بهای تمامشده استنتاج کند، اما این کار به طور پیشفرض انجام نمیشود - باید پرچم --infer-costs را به این شکل اضافه کنید:
-
$ hledger print --infer-costs 2022-01-01 one hundred euros purchased at $1.35 each assets:dollars $-135 @@ €100 assets:euros €100 equity:conversion $135 equity:conversion €-100 -
$ hledger bal --infer-costs -B €-100 assets:dollars €100 assets:euros -------------------- 0
در ادامه برخی از معایب این نوع ورودی آورده شده است:
- مبنای بهای تمامشده به ازای هر واحد به آسانی خوانا نیست.
- به جای -B باید به خاطر داشته باشید که -B --infer-costs را وارد کنید.
- گزینه --infer-costs تنها زمانی کار میکند که hledger بتواند دو ثبت equity:conversion را شناسایی کرده و آنها را با دو ثبت غیرسرمایهای تطبیق دهد. بنابراین نوشتن مدخل روزنامه در یک قالب خاص اهمیت بیشتری پیدا میکند. توضیحات بیشتر در این باره در زیر آمده است.
استنتاج ثبتهای تبدیل سرمایه (Inferring equity conversion postings)
آیا میتوان در جهت دیگر عمل کرد؟ بله، اگر تراکنشهایی دارید که با نمادگذاری بهای تمامشده @/@@ نوشته شدهاند، در صورت افزودن پرچم --infer-equity، hledger میتواند ثبتهای سرمایه غایب را استنتاج کند. به عنوان مثال:
-
2022-01-01 assets:dollars -$135 assets:euros €100 @ $1.35
-
$ hledger print --infer-equity 2022-01-01 assets:dollars $-135 assets:euros €100 @ $1.35 equity:conversion:$-€:€ €-100 equity:conversion:$-€:$ $135.00
نامهای حساب سرمایه به صورت "equity:conversion:A-B:A" و "equity:conversion:A-B:B" خواهند بود که در آن A نماد کالایی است که به ترتیب الفبایی اول است. میتوانید بخش "equity:conversion" را با اعلان حسابی با نوع حساب V/Conversion سفارشیسازی کنید.
توجه داشته باشید اگر از check accounts یا check --strict استفاده میکنید، باید اعلانهای حساب را برای این موارد به روزنامه خود اضافه کنید. (و برخلاف ثبتهای عادی، ثبتهای سرمایه تولیدشده برچسبها را از اعلانهای حساب به ارث نمیبرند.).SS ترکیب هزینهها و ثبتهای تبدیل حقوق صاحبان سهام در نهایت، میتوانید همزمان از هر دو نماد هزینه @/@@ و ثبتهای حقوق صاحبان سهام (equity) استفاده کنید. این کار در تئوری بهترین حالت ممکن را فراهم میکند - حفظ معادله حسابداری، آشکار ساختن بهای تمامشده بر مبنای هر واحد، و ارائه انعطافپذیری بیشتر در نحوه نوشتن مدخل:
حالت ۵
-
2022-01-01 one hundred euros purchased at $1.35 each assets:dollars $-135 equity:conversion $135 equity:conversion €-100 assets:euros €100 @ $1.35
تمام حالتهای دیگر بالا (معمولاً) میتوانند با دستور زیر به این فرم نهایی بازنویسی شوند:
-
$ hledger print -x --infer-costs --infer-equity
معایب:
- قالب دقیق مدخل دفتر روزنامه اهمیت بیشتری پیدا میکند. اگر hledger نتواند ثبتهای هزینه و equity را تشخیص داده و با یکدیگر تطبیق دهد، خطای تراز نبودن تراکنش صادر خواهد کرد.
- دستور add هنوز این نوع مدخل را نمیپذیرد (#2056).
- این پرجزئیاتترین قالب است.
پیشنیازهای تشخیص ثبتهای تبدیل حقوق صاحبان سهام
گزینه --infer-costs نیازمندیهای خاصی دارد (برخلاف --infer-equity که همیشه کار میکند). این گزینه هزینهها را فقط در تراکنشهایی استنتاج میکند که دارای موارد زیر باشند:
- دو ثبت غیر از حقوق صاحبان سهام (non-equity)، با کالاهای (commodities) متفاوت. ترتیب آنها مهم است: هزینه به اولین مورد از آنها افزوده خواهد شد.
- دو ثبت در حسابهای تبدیل equity، در کنار یکدیگر، که دو ثبتِ غیر از equity را تراز کنند. این تراز بودن با همان دقتی (تعداد ارقام اعشار) بررسی میشود که در مقدار ثبتِ تبدیل استفاده شده است. حسابهای تبدیل equity عبارتاند از:
- هر حسابی که با نوع حساب V/Conversion اعلان شده باشد، یا زیرحسابهای آنها
- در غیر این صورت، حسابهایی با نام equity:conversion، equity:trade، یا equity:trading، یا زیرحسابهای آنها.
و چندین گروه چهارثبتی از این دست میتوانند در یک تراکنش واحد در کنار یکدیگر قرار گیرند. هنگامی که --infer-costs ناموفق باشد، هزینهای را در آن تراکنش استنتاج نمیکند و خطایی نیز صادر نمیکند (یعنی تا جایی که بتواند هزینهها را استنتاج میکند).
خواندن مدخلهای حالت ۵ دفتر روزنامه، که نماد هزینه و ثبتهای حقوق صاحبان سهام را ترکیب میکنند، دقیقاً همین نیازمندیها را دارد. هنگامی که خواندن چنین مدخلی ناموفق باشد، hledger خطای "unbalanced transaction" (تراکنش ناتراز) صادر میکند.
استنتاج هزینه و حقوق صاحبان سهام بهصورت پیشفرض؟
آیا --infer-costs و --infer-equity باید بهطور پیشفرض فعال باشند؟ استفاده همیشگی از آنها را امتحان کنید، برای مثال با یک نام مستعار پوسته (alias):
-
alias h="hledger --infer-equity --infer-costs"
و مشکلاتی که مییابید را به ما اطلاع دهید.
گزارش ارزش (VALUE REPORTING)
برنامه hledger همچنین میتواند مبالغ را «به ارزش بازار» ("at market value")، تبدیلشده به کالایی دیگر با استفاده از قیمت بازار یا نرخ تبدیل در تاریخی مشخص، نمایش دهد.
این رفتار با گزینه --value=TYPE[,COMMODITY] کنترل میشود. ما همچنین نامهای مستعار سادهتر -V و -X COMMODITY را برای این منظور ارائه میدهیم که اغلب کافی هستند. قیمتهای بازار با یک دستورالعمل ویژه P اعلان میشوند، و/یا میتوان آنها را با استفاده از پرچم --infer-market-prices از هزینههای ثبتشده در تراکنشها استنتاج کرد..SS -X: ارزش در کالای مشخصشده گزینهٔ -X COMM (یا --exchange=COMM) مقادیر را با استفاده از قیمتهای بازار معتبر در تاریخ(های) ارزشگذاری (در صورت وجود)، به ارزش بازار آنها در کالای مشخصشده تبدیل میکند. (در ادامه بیشتر به این موضوع پرداخته میشود.)
از این گزینه زمانی استفاده کنید که میخواهید (برای مثال) تا حد امکان همه چیز را بر حسب ارز پایهٔ خود نمایش دهید. (کالاهایی که هیچ نرخ تبدیلی برای آنها پیدا نشود، تبدیل نخواهند شد.)
مقدار COMM باید نماد یا نام کامل کالا باشد. به یاد داشته باشید که در صورت نیاز، نویسههای ویژهٔ پوسته را درون نقلقول قرار دهید. چند مثال:
- -X€
- -X$ (چیزی پس از $ نیست، نیازی به نقلقول نیست)
- -X CNY (فاصلهٔ بعد از -X اختیاری است)
- -X 'red apples'
- -X 'r&r'
-V: ارزش در کالا(های) پیشفرض
پرچم -V/--market گونهای از -X است که در آن نیازی نیست COMM را مشخص کنید. در عوض تلاش میکند بر اساس قیمتهای بازار معتبر در تاریخ(های) ارزشگذاری، یک کالای ارزشگذاری پیشفرض را برای هر کالای اصلی حدس بزند.
گزینهٔ -V اغلب میتواند میانبر مناسبی برای -X MYCURRENCY باشد، اما نه همیشه؛ بسته به دادههای شما ممکن است چندین کالای ارزشگذاری را حدس بزند. معمولاً هدف تبدیل به یک کالای واحد است، بنابراین بهتر است از -X استفاده کنید، مگر اینکه مطمئن باشید -V همان کاری را انجام میدهد که میخواهید.
تاریخ ارزشگذاری
قیمتهای بازار میتوانند روز به روز تغییر کنند. دستور hledger از قیمتهای موجود در یک تاریخ ارزشگذاری مشخص (یا در بیش از یک تاریخ) استفاده خواهد کرد. بهطور پیشفرض، hledger از تاریخهای "end" (پایان) برای ارزشگذاری استفاده میکند. بهطور دقیقتر:
- •
- برای گزارشهای تکدورهای (از جمله گزارشهای عادی print و register):
- اگر تاریخ پایان صریحی برای گزارش مشخص شده باشد، همان به کار میرود.
- در غیر این صورت، تاریخ آخرین تراکنش یا تاریخ دستورالعمل P غیرآینده استفاده میشود.
- •
- برای گزارشهای چنددورهای، ارزشگذاری هر دوره بر اساس آخرین روز آن انجام میشود.
این رفتار را میتوان با گزینهٔ --value که در ادامه توضیح داده شده سفارشی کرد؛ این گزینه میتواند یکی از تاریخهای "then"، "end"، "now" یا "custom" را انتخاب کند.
یافتن قیمت بازار
برای تبدیل کالای A به ارزش بازار آن در کالای دیگر B، برنامهٔ hledger به ترتیب اولویت زیر به دنبال یک قیمت بازار (نرخ تبدیل) مناسب میگردد:
- 1.
- یک قیمت بازار اعلامشده یا قیمت بازار استنتاجشده: آخرین قیمت بازار A در B در تاریخ ارزشگذاری یا پیش از آن، همانطور که با یک دستورالعمل P اعلام شده، یا (با پرچم --infer-market-prices) از هزینهها استنتاج شده است.
- 2.
- یک قیمت بازار معکوس: معکوس یک قیمت بازار اعلامشده یا استنتاجشده از B به A.
- 3.
- یک زنجیرهٔ مستقیم از قیمتهای بازار: قیمتی ترکیبی که از ترکیب کوتاهترین زنجیره از قیمتهای بازار «مستقیم» ("forward"، تنها مورد ۱ در بالا) که از A به B میرسد تشکیل شده است.
- 4.
- هر زنجیرهای از قیمتهای بازار: زنجیرهای از هر نوع قیمت بازار، شامل هر دو نوع قیمت مستقیم و معکوس (موارد ۱ و ۲ در بالا)، که از A به B منتهی میشوند.
طول این زنجیرههای قیمت محدودیت دارد؛ اگر hledger بدون یافتن یک زنجیرهٔ کامل یا تمام کردن همهٔ احتمالات به آن حد برسد، متوقف خواهد شد (همراه با پیام "gave up" که در خروجی --debug=2 قابل مشاهده است). این محدودیت در حال حاضر ۱۰۰۰ است.
مبالغی که هیچ قیمت بازار مناسبی برای آنها پیدا نشود، تبدیل نخواهند شد..SS --infer-market-prices: قیمتهای بازار از روی تراکنشها بهطور معمول، ارزش بازار در hledger کاملاً توسط دستورالعملهای P در دفتر روزنامه شما کنترل شده و به آنها نیازمند است. از آنجا که افزودن و بهروزرسانی آنها میتواند کاری خستهکننده باشد، و از آنجا که تراکنشها معمولاً با قیمتی نزدیک به ارزش بازار انجام میشوند، چرا از بهاهای ثبتشده بهعنوان قیمتهای بازار اضافی (همانطور که Ledger انجام میدهد) استفاده نکنیم؟ افزودن پرچم --infer-market-prices به -V، -X یا --value این قابلیت را فعال میکند.
بنابراین برای نمونه، hledger bs -V --infer-market-prices قیمتهای بازار را هم از دستورالعملهای P و هم از تراکنشها دریافت خواهد کرد. اگر هر دو در یک روز رخ دهند، دستورالعمل P اولویت دارد.
یک نکته منفی وجود دارد: گزارشهای ارزش ممکن است گاهی اوقات به شیوههایی گیجکننده یا ناخواسته تحت تأثیر ورودیهای دفتر روزنامه قرار گیرند. اگر این اتفاق برای شما رخ داد، تمام این بخش «گزارش ارزش» (Value reporting) را با دقت بخوانید، و برای عیبیابی سعی کنید --debug یا --debug=2 را اضافه کنید.
گزینه --infer-market-prices میتواند قیمتهای بازار را از موارد زیر استنتاج کند:
- تراکنشهای چندکالایی با قیمتهای صریح (@/@@)
- تراکنشهای چندکالایی با قیمتهای ضمنی (بدون @، دو کالا، نامتوازن). (در این موارد، ترتیب ثبتها اهمیت دارد. hledger print -x میتواند برای عیبیابی مفید باشد.)
- تراکنشهای چندکالایی با ثبتهای سرمایه (equity postings)، در صورتی که بها با --infer-costs استنتاج شده باشد.
در حال حاضر یک محدودیت (باگ) وجود دارد: هنگامی که کالای ارزشگذاری مشخص نشده باشد، قیمتهای استنتاجشده با --infer-market-prices بر خلاف قیمتهای P، به انتخاب کالای ارزشگذاری پیشفرض کمکی نمیکنند. بنابراین ممکن است تبدیل صورت نگیرد زیرا هیچ کالای ارزشگذاری شناسایی نشده است (--debug=2 این موضوع را نشان خواهد داد). برای اطمینان، کالای ارزشگذاری را مشخص کنید، برای نمونه:
- -X EUR --infer-market-prices، نه -V --infer-market-prices
- --value=then,EUR --infer-market-prices، نه --value=then --infer-market-prices
بهاها و قیمتهای بازار علامتدار میتوانند گیجکننده باشند. برای مرجع، رفتار فعلی از hledger 1.25 به بعد در اینجا آورده شده است. (اگر فکر میکنید باید طور دیگری کار کند، شماره ۱۸۷۰# را ببینید.)
-
2022-01-01 Positive Unit prices a A 1 b B -1 @ A 1 2022-01-01 Positive Total prices a A 1 b B -1 @@ A 1 2022-01-02 Negative unit prices a A 1 b B 1 @ A -1 2022-01-02 Negative total prices a A 1 b B 1 @@ A -1 2022-01-03 Double Negative unit prices a A -1 b B -1 @ A -1 2022-01-03 Double Negative total prices a A -1 b B -1 @@ A -1
همه تراکنشهای بالا متوازن در نظر گرفته میشوند (و در هر روز، آن دو تراکنش معادل یکدیگر به شمار میآیند). قیمتهای بازار استنتاجشده برای B به شرح زیر است:
-
$ hledger -f- --infer-market-prices prices P 2022-01-01 B A 1 P 2022-01-01 B A 1.0 P 2022-01-02 B A -1 P 2022-01-02 B A -1.0 P 2022-01-03 B A -1 P 2022-01-03 B A -1.0 هنگامی که یک کالای ارزشگذاری مشخص میکنید (-X COMM یا --value TYPE,COMM):
دستور hledger تمام مبالغ را به COMM تبدیل میکند، هر جا که بتواند قیمت بازار مناسبی بیابد (از جمله با معکوس کردن یا زنجیرهسازی قیمتها).
هنگامی که کالای ارزشگذاری را نامشخص رها میکنید (-V یا --value TYPE):
برای هر کالای A، برنامه hledger یک کالای ارزشگذاری پیشفرض را به شرح زیر و به ترتیب اولویت انتخاب میکند:
- 1.
-
کالای قیمتی از آخرین قیمت بازار اعلامشده با دستور P برای A در تاریخ ارزشگذاری یا پیش از آن.
- 2.
-
کالای قیمتی از آخرین قیمت بازار اعلامشده با دستور P برای A در هر تاریخی. (این مورد امکان تبدیل را در صورتی که قیمتهای استنباطشده قبل از تاریخ ارزشگذاری وجود داشته باشند فراهم میکند.)
- 3.
-
اگر اصلاً هیچ دستور P وجود نداشته باشد (برای هر کالا یا تاریخی) و پرچم --infer-market-prices استفاده شده باشد: کالای قیمتی از آخرین قیمت استنباطشده از تراکنش برای A در تاریخ ارزشگذاری یا پیش از آن.
این بدان معناست که:
-
اگر دستورهای P داشته باشید، آنها تعیین میکنند که -V کدام کالاها را و به چه چیزی تبدیل کند. -
اگر هیچ دستور P نداشته باشید و از پرچم --infer-market-prices استفاده کنید، بهای تمامشده آن را تعیین میکند.
مبالغی که هیچ کالای ارزشگذاری برای آنها یافت نشود تبدیل نخواهند شد.
--value: ارزشگذاری منعطف
گزینههای -V و -X حالتهای خاصی از گزینه جامعتر --value هستند:
-
--value=TYPE[,COMM] TYPE is then, end, now or YYYY-MM-DD. COMM is an optional commodity symbol. Shows amounts converted to: - default valuation commodity (or COMM) using market prices at posting dates - default valuation commodity (or COMM) using market prices at period end(s) - default valuation commodity (or COMM) using current market prices - default valuation commodity (or COMM) using market prices at some date
بخش TYPE هزینه یا ارزش، و تاریخ ارزشگذاری را انتخاب میکند:
- --value=then
- تبدیل مبالغ به ارزش آنها در کالای ارزشگذاری پیشفرض، با استفاده از قیمتهای بازار در تاریخ هر ثبت (posting).
- --value=end
- تبدیل مبالغ به ارزش آنها در کالای ارزشگذاری پیشفرض، با استفاده از قیمتهای بازار در آخرین روز دوره گزارش (یا در صورت نامشخص بودن، تاریخ پایان دفتر روزنامه)؛ یا در گزارشهای چنددورهای، قیمتهای بازار در آخرین روز هر زیردوره.
- --value=now
- تبدیل مبالغ به ارزش آنها در کالای ارزشگذاری پیشفرض با استفاده از قیمتهای جاری بازار (در زمان تولید گزارش).
- --value=YYYY-MM-DD
- تبدیل مبالغ به ارزش آنها در کالای ارزشگذاری پیشفرض با استفاده از قیمتهای بازار در این تاریخ.
برای انتخاب یک کالای ارزشگذاری متفاوت، بخش اختیاری ,COMM را اضافه کنید: یک ویرگول، سپس نماد کالای مقصد. برای مثال: --value=now,EUR. برنامه hledger نهایت تلاش خود را برای تبدیل مبالغ به این کالا، با استنباط قیمتهای بازار طبق توضیحات بالا، انجام خواهد داد.
مثالهای ارزشگذاری
در اینجا چند مثال سریع از -V آورده شده است:
-
; one euro is worth this many dollars from nov 1 P 2016/11/01 € $1.10 ; purchase some euros on nov 3 2016/11/3 assets:euros €100 assets:checking ; the euro is worth fewer dollars by dec 21 P 2016/12/21 € $1.03
چه مقدار یورو دارم؟
-
$ hledger -f t.j bal -N euros €100 assets:euros
ارزش آنها در پایان ۳ نوامبر چقدر است؟
-
$ hledger -f t.j bal -N euros -V -e 2016/11/4 $110.00 assets:euros
ارزش آنها پس از 2016/12/21 چقدر است؟ (هیچ تاریخ پایان گزارشی مشخص نشده است، پیشفرض امروز است)
-
$ hledger -f t.j bal -N euros -V $103.00 assets:euros
در اینجا چند مثال آورده شده است که اثر --value را، آنگونه که با print دیده میشود، نشان میدهند:
-
P 2000-01-01 A 1 B P 2000-02-01 A 2 B P 2000-03-01 A 3 B P 2000-04-01 A 4 B 2000-01-01 (a) 1 A @ 5 B 2000-02-01 (a) 1 A @ 6 B 2000-03-01 (a) 1 A @ 7 B
نمایش بهای تمامشده هر ثبت:
-
$ hledger -f- print --cost 2000-01-01 (a) 5 B 2000-02-01 (a) 6 B 2000-03-01 (a) 7 B
نمایش ارزش در آخرین روز دوره گزارش (2000-02-29):
-
$ hledger -f- print --value=end date:2000/01-2000/03 2000-01-01 (a) 2 B 2000-02-01 (a) 2 B
بدون تعیین دوره گزارش، آخرین تاریخ تراکنش یا تاریخ قیمت به عنوان تاریخ ارزشگذاری استفاده میشود (2000-04-01):
-
$ hledger -f- print --value=end 2000-01-01 (a) 3 B 2000-02-01 (a) 3 B 2000-03-01 (a) 3 B
ارزش امروز نیز یکسان است (قیمت 2000-04-01 همچنان معتبر است):
-
$ hledger -f- print --value=now 2000-01-01 (a) 4 B 2000-02-01 (a) 4 B 2000-03-01 (a) 4 B نمایش ارزش در 2000/01/15: -
$ hledger -f- print --value=2000-01-15 2000-01-01 (a) 1 B 2000-02-01 (a) 1 B 2000-03-01 (a) 1 B
تعامل ارزشگذاری و پرسوجوها
هنگام تطبیق ثبتها بر اساس پرسوجوها در حضور ارزشگذاری، رویدادهای زیر رخ میدهد:
- 1.
- پرسوجو به دو بخش تقسیم میشود:
- 1.
- ارز (cur:) یا مبلغ (amt:).
- 2.
- تمام بخشهای دیگر.
- 2.
- ثبتها بر اساس مبالغ پیش از ارزشگذاری با پرسوجوهای ارز و مبلغ تطبیق داده میشوند.
- 3.
- ارزشگذاری روی ثبتها اعمال میشود.
- 4.
- ثبتها بر اساس مبالغ پس از ارزشگذاری با سایر بخشهای پرسوجو تطبیق داده میشوند.
مرتبط: #1625
اثر ارزشگذاری بر گزارشها
در اینجا مرجعی برای چگونگی تأثیر ارزشگذاری بر هر بخش از گزارشهای hledger' آورده شده است. این بخش ممکن است هنگام عیبیابی مفید باشد. اگر مشکلی یافتید، لطفاً آن را گزارش دهید؛ در حالت ایدهآل همراه با یک نمونهٔ قابل بازتولید. مرتبط: #329، #1083.
نخست، یک واژهنامهٔ کوتاه:
- cost (بهای تمامشده)
- با استفاده از قیمت(های) ثبتشده در تراکنش(ها) محاسبه میشود.
- value (ارزش)
- ارزش بازار با استفاده از اعلانهای قیمت بازار موجود، یا مقدار بدون تغییر در صورت پیدا نشدن نرخ تبدیل.
- report start (آغاز گزارش)
- نخستین روز از دورهٔ گزارش مشخصشده با -b یا -p یا date:، در غیر این صورت امروز.
- report or journal start (آغاز گزارش یا دفتر روزنامه)
- نخستین روز از دورهٔ گزارش مشخصشده با -b یا -p یا date:، در غیر این صورت نخستین تاریخ تراکنش در دفتر روزنامه، در غیر این صورت امروز.
- report end (پایان گزارش)
- آخرین روز از دورهٔ گزارش مشخصشده با -e یا -p یا date:، در غیر این صورت امروز.
- report or journal end (پایان گزارش یا دفتر روزنامه)
- آخرین روز از دورهٔ گزارش مشخصشده با -e یا -p یا date:، در غیر این صورت آخرین تاریخ تراکنش در دفتر روزنامه، در غیر این صورت امروز.
- report interval (بازهٔ گزارش)
- یک پرچم (-D/-W/-M/-Q/-Y) یا عبارت دوره که حالت چنددورهای گزارش را فعال میکند (خواه یک زیردوره یا چندین زیردوره را نشان دهد).
| نوع گزارش | -B, --cost | -V, -X | --value=then | --value=end | --value=DATE, --value=now |
| مبالغ ثبتها | بهای تمامشده | ارزش در پایان گزارش یا امروز | ارزش در تاریخ ثبت | ارزش در پایان گزارش یا دفتر روزنامه | ارزش در DATE/امروز |
| تأییدیهها/تخصیصهای تراز | بدون تغییر | بدون تغییر | بدون تغییر | بدون تغییر | بدون تغییر |
| register | |||||
| تراز آغازین (-H) | بهای تمامشده | ارزش در پایان گزارش یا دفتر روزنامه | ارزشگذاریشده در روز انجام هر ثبت تاریخی | ارزش در پایان گزارش یا دفتر روزنامه | ارزش در DATE/امروز |
| تراز آغازین (-H) با بازهٔ گزارش | بهای تمامشده | ارزش در روز پیش از آغاز گزارش یا دفتر روزنامه | ارزشگذاریشده در روز انجام هر ثبت تاریخی | ارزش در روز پیش از آغاز گزارش یا دفتر روزنامه | ارزش در DATE/امروز |
| مبالغ ثبتها | بهای تمامشده | ارزش در پایان گزارش یا دفتر روزنامه | ارزش در تاریخ ثبت | ارزش در پایان گزارش یا دفتر روزنامه | ارزش در DATE/امروز |
| خلاصهٔ مبالغ ثبتها با بازهٔ گزارش | بهای تمامشدهٔ خلاصهشده | ارزش در پایان دورهها | مجموع ثبتها در بازه، ارزشگذاریشده در آغاز بازه | ارزش در پایان دورهها | ارزش در DATE/امروز |
| مجموع/میانگین تجمعی | مجموع/میانگین مقادیر نمایشیافته | مجموع/میانگین مقادیر نمایشیافته | مجموع/میانگین مقادیر نمایشیافته | مجموع/میانگین مقادیر نمایشیافته | مجموع/میانگین مقادیر نمایشیافته |
| balance (bs, bse, cf, is) | |||||
| تغییرات تراز | مجموع بهای تمامشده | ارزش در پایان گزارش یا امروز برای مجموع ثبتها | ارزش در تاریخ ثبت | ارزش در پایان گزارش یا دفتر روزنامه برای مجموع ثبتها | ارزش در DATE/امروز برای مجموع ثبتها |
| مبالغ بودجه (--budget) | مانند تغییرات تراز | مانند تغییرات تراز | مانند تغییرات تراز | مانند ترازها | مانند تغییرات تراز |
| مجموع کل | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته |
| balance (bs, bse, cf, is) با بازهٔ گزارش | |||||
| ترازهای آغازین (-H) | مجموع بهای تمامشدهٔ ثبتهای پیش از آغاز گزارش | ارزش در آغاز گزارش برای مجموع تمام ثبتهای پیش از آغاز گزارش | مجموع ارزشهای ثبتهای پیش از آغاز گزارش در تاریخهای ثبت مربوطه | ارزش در آغاز گزارش برای مجموع تمام ثبتهای پیش از آغاز گزارش | مجموع ثبتهای پیش از آغاز گزارش |
| تغییرات تراز (bal, is, bs --change, cf --change) | مجموع بهای تمامشدهٔ ثبتها در دوره | مشابه --value=end | مجموع ارزشهای ثبتها در دوره در تاریخهای ثبت مربوطه | تغییر تراز در هر دوره، ارزشگذاریشده در پایان دورهها | ارزش در DATE/امروز برای مجموع ثبتها |
| ترازهای پایانی (bal -H, is --H, bs, cf) | مجموع بهای تمامشدهٔ ثبتها از پیش از آغاز گزارش تا پایان دوره | مشابه --value=end | مجموع ارزشهای ثبتها از پیش از آغاز دوره تا پایان دوره در تاریخهای ثبت مربوطه | ترازهای پایان دوره، ارزشگذاریشده در پایان دورهها | ارزش در DATE/امروز برای مجموع ثبتها |
| مبالغ بودجه (--budget) | مانند تغییرات تراز/ترازهای پایانی | مانند تغییرات تراز/ترازهای پایانی | مانند تغییرات تراز/ترازهای پایانی | مانند ترازها | مانند تغییرات تراز/ترازهای پایانی |
| مجموع سطرها، میانگین سطرها (-T, -A) | مجموعها، میانگینهای مقادیر نمایشیافته | مجموعها، میانگینهای مقادیر نمایشیافته | مجموعها، میانگینهای مقادیر نمایشیافته | مجموعها، میانگینهای مقادیر نمایشیافته | مجموعها، میانگینهای مقادیر نمایشیافته |
| مجموع ستونها | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته | مجموع مقادیر نمایشیافته |
| مجموع کل، میانگین کل | مجموع، میانگین مجموع ستونها | مجموع، میانگین مجموع ستونها | مجموع، میانگین مجموع ستونها | مجموع، میانگین مجموع ستونها | مجموع، میانگین مجموع ستونها |
| .TE گزینهٔ --cumulative برای صرفهجویی در فضا حذف شده است؛ این گزینه مانند -H اما با تراز آغازین صفر عمل میکند. "بخش ۴: دستورها (PART 4: COMMANDS)" در اینجا زیردستورهای استاندارد hledger آورده شدهاند. میتوانید با اجرای hledger این دستورها را فهرست کنید. اگر دستورهای افزودنی بیشتری نصب کرده باشید، آنها نیز فهرست خواهند شد. در مستندات دستورهای زیر، گزینههای ویژهٔ هر دستور نمایش داده شده است. بیشتر دستورها همچنین از گزینههای عمومی که در بالا توضیح داده شد پشتیبانی میکنند، اگرچه ممکن است برخی از آنها بیاثر باشند. (معمولاً اگر روش معقولی وجود داشته باشد که یک گزینهٔ عمومی بر دستوری اثر بگذارد، اثر خواهد گذاشت.) میتوانید تمام گزینههای یک دستور را با اجرای hledger CMD -h فهرست کنید. دستورهای راهنما • 2 commands - نمایش فهرست دستورهای hledger (پیشفرض) • 2 demo - نمایش پیشنمایشهای کوتاه hledger در ترمینال • 2 help - نمایش راهنمای hledger با info، man یا صفحهبند (pager) دستورهای رابط کاربری • 2 repl - اجرای دستورها از یک اعلان تعاملی • 2 run - اجرای دستورها از یک اسکریپت • 2 ui - (در صورت نصب بودن) اجرای رابط کاربری ترمینالی hledger • 2 web - (در صورت نصب بودن) اجرای رابط کاربری وب hledger دستورهای ورود داده • 2 add - افزودن تراکنشها با استفاده از اعلانهای ترمینال • 2 import - افزودن تراکنشهای جدید از فایلهای دیگر، مانند فایلهای CSV دستورهای گزارش پایه • 2 accounts - نمایش نام حسابها • 2 codes - نمایش کدهای تراکنش • 2 commodities - نمایش نمادهای کالا/ارز • 2 descriptions - نمایش توضیحات تراکنش • 2 files - نمایش مسیرهای فایل ورودی • 2 notes - نمایش بخش یادداشتهای توضیحات تراکنش • 2 payees - نمایش بخش دریافتکنندگان وجه در توضیحات تراکنش • 2 prices - نمایش قیمتهای بازار • 2 stats - نمایش آمار دفتر روزنامه • 2 tags - نمایش نام برچسبها دستورهای گزارش استاندارد • 2 print - نمایش تراکنشها یا برونبری دادههای دفتر روزنامه • 2 aregister (areg) - نمایش تراکنشها در یک حساب مشخص • 2 register (reg) - نمایش ثبتها در یک یا چند حساب و مجموع جاری • 2 balancesheet (bs) - نمایش داراییها، بدهیها و ارزش خالص • 2 balancesheetequity (bse) - نمایش داراییها، بدهیها و حقوق صاحبان سهام • 2 cashflow (cf) - نمایش تغییرات در داراییهای نقد • 2 incomestatement (is) - نمایش درآمدها و هزینهها دستورهای گزارش پیشرفته • 2 balance (bal) - نمایش تغییرات تراز، ترازهای پایانی، بودجهها، سودها... • 2 roi - نمایش بازده سرمایهگذاری (ROI) دستورهای نمودار • 2 activity - نمایش نمودارهای میلهای از تعداد ثبتها در هر دوره دستورهای تولید داده • 2 close - تولید تراکنشهای صفر کردن/بازیابی تراز • 2 rewrite - تولید ثبتهای خودکار، مانند print --auto دستورهای نگهداری • 2 check - بررسی انواع مختلف خطا در دادهها • 2 diff - مقایسه تراکنشهای حساب در دو فایل دفتر روزنامه • 2 setup - بررسی و نمایش وضعیت نصب hledger • 2 test - اجرای آزمونهای داخلی (self tests) در ادامه، این دستورها به تفصیل شرح داده شدهاند..SH "دستورهای راهنما (Help commands)" commands نمایش فهرست دستورهای hledger. گزینهها: --builtin فقط نمایش دستورهای توکار، نه افزونهها demo پخش دموهای نحوه استفاده از hledger در ترمینال، در صورت نصب بودن asciinema. گزینهها: -s --speed=SPEED سرعت پخش (1 سرعت اصلی است، 0.5 نصف، 2 دو برابر و غیره (پیشفرض: 2)) این دستور را بدون هیچ آرگومانی اجرا کنید تا دموها فهرست شوند. برای پخش یک دمو، شماره آن یا یک پیشوند یا زیررشتهای از عنوان آن را بنویسید. نکات: پنجره ترمینال خود را به اندازه کافی بزرگ کنید تا دمو را به وضوح ببینید. از گزینه -s/--speed SPEED برای تعیین سرعت پخش دلخواه خود استفاده کنید، برای نمونه -s4 برای پخش با 4 برابر سرعت اصلی یا -s.5 برای پخش با نصف سرعت. سرعت پیشفرض 2x است. هنگام پخش، چند کلید در دسترس است: SPACE برای توقف موقت/ادامه، . برای رفتن به جلو (در حالت توقف)، و CTRL-c برای خروج. مثالها: $ hledger demo # فهرست دموهای موجود $ hledger demo 1 # پخش اولین دمو با سرعت پیشفرض (2x) $ hledger demo install -s4 # پخش دموی "install" با سرعت 4x این دستور آزمایشی است: هنوز دموهای کاربردی زیادی وجود ندارد. help نمایش دفترچه راهنمای کاربر hledger با info، man، یا یک صفحهبند (pager). با یک آرگومان TOPIC (غیرحساس به بزرگی و کوچکی حروف)، تلاش میکند تا آن را در عنوان آن بخش باز کند. گزینهها: -i نمایش دفترچه راهنما با info -m نمایش دفترچه راهنما با man -p نمایش دفترچه راهنما با $PAGER یا less (در صورت تعیین TOPIC، همیشه less استفاده میشود) این دستور، دفترچه راهنمای hledger تعبیهشده در فایل اجرایی hledger شما را نمایش میدهد. این قابلیت زمانی که آفلاین هستید، یا وقتی که ترمینال را به یک مرورگر وب ترجیح میدهید، یا زمانی که دفترچه راهنما یا نمایشدهندههای مناسب hledger بهدرستی روی سیستم شما نصب نشدهاند، میتواند مفید باشد. بهطور پیشفرض، بهترین نمایشدهنده یافتشده در $PATH را انتخاب میکند و به این ترتیب بررسی میکند: info، man، $PAGER، less، more و stdout. (اگر TOPIC مشخص شده باشد، $PAGER و more بررسی نمیشوند.) میتوانید با گزینههای -i، -m یا -p استفاده از info، man یا یک صفحهبند را اجباری کنید. اگر هیچ نمایشدهندهای پیدا نشود، یا در صورت اجرا بهصورت غیرتعاملی، راهنما را تنها در stdout چاپ میکند. هنگام استفاده از info، آرگومان TOPIC میتواند با عنوان کامل یا یک پیشوند مطابقت داشته باشد. اگر نسخه info --version شما کمتر از 6 است، باید آن را ارتقا دهید، مثلاً در مک با 'brew install texinfo'. هنگام استفاده از man یا less، آرگومان TOPIC باید با عنوان کامل مطابقت داشته باشد. برای تطبیق پیشوند، میتوانید بنویسید: 'TOPIC.*'. مثالها $ hledger help -h # نمایش نحوه استفاده از دستور help $ hledger help # نمایش راهنما با info، man یا $PAGER $ hledger help 'time periods' # نمایش مبحث "Time periods" در راهنما $ hledger help 'time periods' -m # استفاده از man، حتی اگر info نصب باشد repl یک اعلان (prompt) تعاملی را آغاز میکند که در آن میتوانید هر یک از دستورهای hledger را اجرا کنید. فایلهای داده تنها یکبار تجزیه میشوند، از این رو دستورها سریعتر اجرا میشوند. Flags: no command-specific flags این دستور آزمایشی است و ممکن است در آینده تغییر کند. دستور hledger repl یک حلقهٔ خواندن-ارزیابی-چاپ (REPL) را آغاز میکند که در آن میتوانید دستورها را بهصورت تعاملی وارد نمایید. همانند دستور run، هر فایل ورودی (یا هر ترکیب فایل ورودی/گزینههای ورودی) تنها یکبار تجزیه میشود، بنابراین دستورها سریعتر از زمانی که آنها را بهصورت جداگانه در خط فرمان اجرا کنید، اجرا خواهند شد. همچنین مانند run، فایل(های) ورودی مشخصشده برای دستور repl ورودی پیشفرض تمام دستورهای تعاملی خواهد بود. میتوانید با مشخص کردن گزینهٔ -f در دستورهایی خاص، این مورد را موقتاً نادیده بگیرید (override کنید). اما توجه داشته باشید تا زمانی که از REPL خارج نشوید و آن را دوباره اجرا نکنید، دستورها تغییرات اعمالشده در فایلهای ورودی را (برای نمونه توسط add) نخواهند دید. نحو دستور همانند run است: • 2 در هر نوبت یک دستور hledger وارد کنید، بدون کلمهٔ نخست معمول یعنی hledger • 2 خطهای خالی و متنهای توضیحی از # تا انتهای خط نادیده گرفته میشوند • 2 در صورت نیاز، برای نقلقول کردن آرگومانها از علامت نقلقول تکی یا دوتایی استفاده کنید • 2 برای خروج از REPL عبارت exit یا quit را تایپ کنید یا control-D را بفشارید. در زمان اجرا، REPL تاریخچهٔ دستورهای شما را به خاطر میسپارد و میتوانید به روشهای معمول در آن پیمایش کنید: • 2 کلیدهای جهتنما یا کلیدهای پیمایش Emacs برای ویرایش خط فرمان جاری • 2 کلیدهای بالا/پایین یا control-P/control-N برای حرکت به عقب/جلو در تاریخچه • 2 کلیدهای control-R برای جستجو به دنبال دستوری در گذشته • 2 کلید TAB برای تکمیل خودکار مسیر فایلها. بهطور کلی خط فرمانهای repl بسیار شبیه به رابط خط فرمان معمول hledger هستند، اما ممکن است متوجه تفاوتهایی شوید. دستور repl کمی سختگیرتر است؛ مثلاً به نامهای کامل دستورها یا مخففهای رسمی (همانطور که در فهرست دستورها دیده میشود) نیاز دارد. دستورهای commands و help، و پرچمهای راهنمای دستورها (CMD --tldr، CMD -h/--help، CMD --info، CMD --man) میتوانند مفید باشند. میتوانید control-C را برای لغو دستوری با اجرای طولانی بفشارید (اما فقط یکبار؛ فشردن مجدد آن سبب خروج از REPL خواهد شد). و در بیشتر پوستهها میتوانید control-Z را برای خروج موقت به پوسته بفشارید (و سپس با fg به REPL بازگردید). "مثالها (EXAMPLES)" اجرای REPL و وارد کردن چند دستور: $ hledger repl Enter hledger commands. To exit, enter 'quit' or 'exit', or send EOF. % stats Main file : .../2025.journal ... % stats -f 2024/2024.journal Main file : .../2024.journal ... % stats Main file : .../2025.journal ... یا: $ hledger repl -f some.journal Enter hledger commands. To exit, enter 'quit' or 'exit', or send EOF. % bs ... % print -b 'last week' ... % bs -f other.journal ... اجرای توالیای از دستورهای hledger که در قالب فایل یا آرگومانهای خط فرمان ارائه میشوند. فایلهای داده تنها یکبار تجزیه میشوند، بنابراین دستورها سریعتر اجرا خواهند شد. پرچمها: هیچ پرچم خاصی برای این دستور وجود ندارد این دستور آزمایشی است و ممکن است در آینده تغییر کند. میتوانید از run به سه روش استفاده کنید: • 2 hledger run -- CMD1 -- CMD2 -- CMD3 - خواندن دستورها از خط فرمان، تفکیکشده با -- • 2 hledger run SCRIPTFILE1 SCRIPTFILE2 - خواندن دستورها از یک یا چند فایل • 2 cat SCRIPTFILE1 | hledger run - خواندن دستورها از ورودی استاندارد. دستور run ابتدا فایل(های) ورودی مشخصشده توسط LEDGER_FILE یا گزینههای -f را به شیوهٔ معمول بارگذاری میکند. سپس هر دستور را به نوبت اجرا مینماید، که هر یک از همان دادههای ورودی یکسان استفاده میکنند. اما اگر میخواهید یک دستور خاص از ورودی متفاوتی استفاده کند، میتوانید گزینهٔ -f را درون آن دستور مشخص کنید. این کار ورودی پیشفرض را صرفاً برای همان دستور بازنویسی میکند (نه اینکه به آن بیفزاید). هر فایل ورودی (بهطور دقیقتر، هر ترکیب از فایل ورودی و گزینههای ورودی) تنها یکبار تجزیه میشود. این بدان معناست که دستورها تا اجرای بعدی، متوجه هیچگونه تغییری که در این فایلها ایجاد شده باشد نخواهند شد. اما دستورها نسبت به زمانی که به صورت جداگانه اجرا شوند سریعتر اجرا خواهند شد (معمولاً حدود دو برابر سریعتر). اسکریپتهای دستوری، چه در یک فایل و چه در خط فرمان نوشته شده باشند، نحو سادهای دارند: • 2 هر خط میتواند شامل یک دستور منفرد hledger و آرگومانهای آن باشد، بدون واژهٔ نخستین معمول hledger • 2 خطوط خالی نادیده گرفته میشوند • 2 متن از # تا انتهای خط، توضیح (کامنت) محسوب شده و نادیده گرفته میشود • 2 در صورت نیاز میتوانید مانند خط فرمان، از نقلقول تکی یا دوتایی برای محصور کردن آرگومانها استفاده کنید • 2 این دستورهای اضافی نیز در دسترس هستند: echo TEXT متنی را چاپ میکند، و exit یا quit به اجرا خاتمه میدهد. در سیستمهای یونیکس میتوانید از #!/usr/bin/env hledger run در خط نخست یک فایل دستوری استفاده کنید تا آن را به یک اسکریپت قابل اجرا تبدیل نمایید. اگر این کار با خطا مواجه شد، از #!/usr/bin/env -S hledger run استفاده کنید. استفاده از دستور run بهصورت بازگشتی در داخل یک اسکریپت دستوری بلامانع است. ممکن است متوجه تفاوتهایی در رفتار بین خطوط فرمان run و خطوط فرمان معمول hledger شوید. دستور run کمی سختگیرتر است؛ مثلاً به نام کامل دستورها یا مخففهای رسمی (همانطور که در فهرست دستورها آمده) نیاز دارد، و گزینههای دستور باید حتماً پس از نام دستور نوشته شوند. "مثالها (EXAMPLES)" اجرای دستورها از خط فرمان: hledger -f some.journal run -- balance assets --depth 2 -- balance liabilities -f /some/other.journal --depth 3 --transpose -- stats این دستور some.journal را بارگذاری میکند، balance assets --depth 2 را روی آن اجرا مینماید، سپس balance liabilities --depth 3 --transpose را روی /some/other.journal اجرا کرده، و در نهایت stats را روی some.journal به اجرا درمیآورد. اجرای دستورها از ورودی استاندارد: (echo "files"; echo "stats") | hledger -f some.journal run اجرای دستورها در قالب یک اسکریپت: $ cat report #!/usr/bin/env -S hledger run -f some.journal echo "List of accounts in some.journal" accounts echo "Assets of some.journal" balance assets --depth 2 echo "Liabilities from /some/other.journal" balance liabilities -f /some/other.journal --depth 3 --transpose echo "Commands from another.script, applied to another.journal" run -f another.journal another.script $ chmod +x report $ ./report List of accounts in some.journal ... برنامه hledger-ui را (در صورت نصب بودن) اجرا میکند. web برنامه hledger-web را (در صورت نصب بودن) اجرا میکند. "دستورهای ورود داده (DATA ENTRY COMMANDS)" add افزودن تراکنشهای جدید به یک فایل دفتر روزنامه (journal)، با اعلانهای تعاملی. Flags: --no-new-accounts عدم اجازه برای ایجاد حسابهای جدید بسیاری از کاربران hledger دفترهای روزنامه خود را مستقیماً با یک ویرایشگر متن ویرایش میکنند یا آنها را از CSV تولید مینمایند. برای ورود تعاملیتر دادهها، دستور add وجود دارد که در کنسول به صورت تعاملی اعلانهایی را برای تراکنشهای جدید نمایش میدهد و آنها را به انتهای فایل اصلی دفتر روزنامه (که باید در قالب journal باشد) الحاق میکند. تراکنشهای موجود تغییر داده نمیشوند. این یکی از معدود دستورهای hledger است که در فایل دفتر روزنامه مینویسد (همچنین import را ببینید). برای استفاده از آن، کافی است hledger add را اجرا کرده و اعلانها را دنبال کنید. میتوانید هر تعداد تراکنش که مایلید اضافه کنید؛ هنگامی که کارتان تمام شد، برای خروج . را وارد کرده یا کلیدهای control-d یا control-c را فشار دهید. ویژگیها: • 2 دستور add تلاش میکند با استفاده از مشابهترین تراکنش اخیر (بر اساس شرح) به عنوان الگو (که در صورت وجود، با پرسمان فیلتر شده است)، مقادیر پیشفرض مفیدی را ارائه دهد. • 2 همچنین میتوانید مقادیر پیشفرض اولیه را با آرگومانهای خط فرمان تعیین کنید. • 2 هنگام ورود دادهها میتوان از کلیدهای ویرایشی به سبک Readline استفاده کرد. • 2 کلید tab تا جای ممکن موارد را به طور خودکار تکمیل میکند - حسابها، دریافتکنندگان/شرحها، تاریخها (yesterday، today، tomorrow). اگر بخش ورودی خالی باشد، مقدار پیشفرض را درج میکند. • 2 میتوان پس از تاریخ، یک کد تراکنش داخل پرانتز وارد کرد. • 2 میتوان به دنبال شرح یا مبلغ، کامنتها و برچسبها را وارد نمود. • 2 اگر مرتکب اشتباه شدید، در هر اعلانی < را وارد کنید تا یک مرحله به عقب بازگردید. • 2 در صورت پشتیبانی ترمینال، اعلانهای ورودی با رنگ متفاوتی نمایش داده میشوند. نکات: • 2 اگر عددی را بدون نماد کالا (commodity) وارد کنید، و با یک دستورالعمل D کالای پیشفرضی را تعریف کرده باشید، ممکن است انتظار داشته باشید add این نماد را برای شما اضافه کند. این دستور چنین کاری انجام نمیدهد؛ فرض ما بر این است که اگر از یک دستورالعمل D استفاده میکنید، ترجیح میدهید نماد کالا روی مقادیر در دفتر روزنامه تکرار نشود. • 2 دستور add مدخلها را در قالب journal ایجاد میکند؛ و با فایلهای timeclock یا timedot کار نخواهد کرد. • 2 در صورتی که این نسخه hledger از stackage ساخته شده باشد، یک مشکل شناختهشده در Windows وجود دارد: اعلانها به جای رنگها، کاراکترهای زائد ANSI را نشان میدهند (#2410). میتوانید با استفاده از باینریهای رسمی منتشرشده hledger یا ساخت آن با haskeline >=0.8.4 از این مشکل دوری کنید؛ یا اینکه add را با --color=no اجرا نمایید، که احتمالاً در فایل پیکربندی شما نیز قابل تنظیم است. مثالها: • 2 ثبت تراکنشهای جدید و ذخیره در فایل پیشفرض دفتر روزنامه: 2 hledger add • 2 افزودن تراکنشها به 2024.journal، اما بارگذاری 2023.journal برای تکمیل خودکار: 2 hledger add --file 2024.journal --file 2023.journal • 2 ارائه پاسخها برای چهار اعلان نخست: 2 hledger add today 'best buy' expenses:supplies '$20' یک راهنمای جامع در https://hledger.org/add.html وجود دارد..SS add و اعلانهای تراز از hledger نسخهٔ 1.43 به بعد، میتوانید هنگام درخواست مبلغ، با نوشتن AMOUNT = BALANCE یک اعلان تراز اضافه کنید. بهعنوان مثال 100 = 500. همچنین، هر بار که مبلغ جدیدی را وارد میکنید، hledger تمام اعلانهای تراز موجود در دفتر روزنامه را دوباره بررسی میکند و اگر مقدار جدید باعث رد شدن هر یک از آنها شود، آن را رد میکند. میتوانید add را با -I/--ignore-assertions اجرا کنید تا بررسی اعلان تراز غیرفعال شود. add و تخصیصهای تراز از hledger نسخهٔ 1.51 به بعد، میتوانید هنگام درخواست مبلغ، با نوشتن = BALANCE (یا ==، =* و غیره) یک تخصیص تراز اضافه کنید. مبلغ ناموجود بهطور خودکار محاسبه خواهد شد. دستور add در حالت عادی به شما اجازه نخواهد داد ثبت (posting) جدیدی اضافه کنید که تاریخ آن قبل از یک تخصیص ترازِ موجود باشد. (زیرا هنگام اجرای add، تخصیصهای ترازِ موجود قبلاً محاسبه شده و به مبالغ و اعلانهای تراز تبدیل شدهاند.) میتوانید با غیرفعال کردن بررسی اعلان تراز با استفاده از -I این کار را مجاز کنید. import وارد کردن تراکنشهای جدید از یک یا چند فایل داده به دفتر روزنامهٔ اصلی. Flags: --catchup just mark all transactions as already imported --dry-run just show the transactions to be imported این دستور تراکنشهای جدید را در یک یا چند فایل دادهٔ مشخصشده بهعنوان آرگومان شناسایی کرده و آنها را به دفتر روزنامهٔ اصلی اضافه میکند. شما میتوانید از هر قالب فایل ورودی که hledger پشتیبانی میکند داده وارد کنید، اما فایلهای CSV/SSV/TSV دانلودشده از مؤسسات مالی، رایجترین منبع وارد کردن هستند. مقصد وارد کردن، فایل پیشفرض دفتر روزنامه است، یا فایل دیگری که به روش معمول با $LEDGER_FILE یا -f/--file مشخص شده باشد. این فایل باید در قالب journal باشد. مثالها: $ hledger import bank1-checking.csv bank1-savings.csv $ hledger import *.csv اجرای آزمایشی وارد کردن (dry run) پیشنمایش وارد کردن با اجرای اولیه به همراه --dry-run بسیار مفید است؛ تا بررسی صحت روی محدودهٔ تاریخهای در حال وارد شدن انجام گیرد و در صورت تبدیل از CSV، تأثیر قواعد تبدیل شما بررسی شود. بهعنوان مثال: $ hledger import bank.csv --dry-run خروجی اجرای آزمایشی دارای قالب معتبر journal است، بنابراین hledger میتواند آن را دوباره تجزیه کند. اگر خروجی حجیم است، میتوانید فقط تراکنشهای دستهبندینشده را بهاین صورت نمایش دهید: $ hledger import --dry-run bank.csv | hledger -f- -I print unknown همچنین میتوانید این دستور را بهطور مکرر اجرا کنید تا تأثیر ویرایشهای اعمالشده بر قواعد تبدیل خود را مشاهده کنید: $ watchexec -- "hledger import --dry-run bank.csv | hledger -f- -I print unknown" هنگامی که تبدیل و تاریخها برای وارد شدن به دفتر روزنامهٔ شما به اندازهٔ کافی مناسب به نظر رسیدند (شاید همراه با اصلاحات دستی در ادامه)، میتوانید وارد کردن واقعی را انجام دهید: $ hledger import bank.csv خواندن فایلهای CSV به صورت توکار در hledger وجود دارد و منحصر به import نیست؛ بنابراین میتوانید درونریزی را با انجام hledger -f bank.csv print >>$LEDGER_FILE نیز انجام دهید. اما import سادهتر است و مزایایی به همراه دارد. مهمترین مزیت این است که از درونریزی مجدد تراکنشهایی که در اجراهای قبلی دیده است جلوگیری میکند. این بدان معناست که نیازی نیست نگران همپوشانی دادهها در دریافتهای متوالی فایل CSV بانک خود باشید؛ تنها هر زمان که مایل بودید فایل را دریافت و import کنید، و هر بار تنها تراکنشهای جدید درونریزی خواهند شد. ما این کار را "حذف موارد تکراری" نمینامیم، چرا که به طور کلی تشخیص مطمئن موارد تکراری در فایلهای CSV بانکی امکانپذیر نیست. در عوض، import آخرین تاریخ پردازششده از هر فایل CSV در دفعات قبل را به خاطر میسپارد (با ذخیره کردن آن در یک فایل مخفی)، و از تمام رکوردهای پیش از آن تاریخ صرفنظر میکند. این سازوکار برای بیشتر فایلهای CSV در دنیای واقعی که شرایط زیر را دارند بهخوبی کار میکند: "1." 3 نام فایل داده بین درونریزیهای مختلف ثابت باشد (تغییر نکند) "2." 3 تاریخ اقلام بین درونریزیهای مختلف ثابت باشد "3." 3 ترتیب اقلامِ دارای تاریخ یکسان بین درونریزیهای مختلف ثابت بماند "4." 3 جدیدترین اقلام، جدیدترین تاریخها را داشته باشند (نقض گاهبهگاه موارد ۲ تا ۴ اغلب بیضرر است؛ میتوانید با دریافت و درونریزی در فواصل کوتاهتر، احتمال اختلال را کاهش دهید.) تشخیص همپوشانی خودکار است و نباید نیاز به توجه چندانی از سوی شما داشته باشد، مگر شاید در نخستین درونریزی (به بخش زیر مراجعه کنید). اما شیوه کارکرد آن بدین صورت است: • 2 به ازای هر FILE که از آن درونریزی انجام میشود: 2 "1." 3 برنامه hledger فایلی به نام .latest.FILE را در صورت وجود در همان دایرکتوری میخواند. این فایل شامل آخرین تاریخ رکورد درونریزیشده از FILE در گذشته، در قالب YYYY-MM-DD است. اگر چندین رکورد با آن تاریخ درونریزی شده باشند، آن تاریخ در N خط تکرار میشود. "2." 3 برنامه hledger رکوردها را از FILE میخواند. اگر آخرین تاریخی در مرحله ۱ یافت شود، تمام رکوردهای پیش از آن تاریخ، و N رکورد نخست در آن تاریخ نادیده گرفته میشوند. • 2 پس از یک درونریزی موفق از تمام FILEها، بدون خطا و بدون گزینه --dry-run، برنامه hledger فایل .latest.FILE مربوط به هر FILE را برای دفعات بعدی بهروزرسانی میکند. اگر این فرآیند دچار مشکل شود، اصلاح آن نسبتاً آسان است: • 2 پیش از درونریزی، هنگامی که با import --dry-run پیشنمایش را بررسی میکنید متوجه آن خواهید شد. • 2 یا پس از درونریزی، هنگامی که تلاش میکنید تراز حسابهای hledger خود را با بانک تطبیق دهید. • 2 دستور hledger print -f FILE.csv تمام تراکنشهای اخیراً دریافتشده را نمایش میدهد. این موارد را با دفتر روزنامه (journal) خود مقایسه کنید. در صورت نیاز رونوشت/جایگذاری (Copy/paste) کنید. • 2 قوانین تبدیل خود را بهروزرسانی کرده و در صورت نیاز دوباره خروجی را چاپ کنید. • 2 میتوانید فایل .latest را به صورت دستی بهروزرسانی یا حذف کنید، یا از import --catchup FILE استفاده نمایید. • 2 دریافت و درونریزی را در فواصل کوتاهتر، مثلاً دو بار در هفته انجام دهید، حداقل تا زمانی که در حال یادگیری هستید. وقتی تراکنشها کمتر باشند، بررسی و عیبیابی آسانتر خواهد بود. "نخستین درونریزی (First import)" نخستین باری که از یک فایل درونریزی میکنید، زمانی که هنوز فایل .latest متناظری ایجاد نشده است، تمام رکوردها درونریزی خواهند شد. اما شاید دادهها را پیشتر به صورت دستی وارد کرده باشید، بنابراین میدانید که تمام این تراکنشها از قبل در دفتر روزنامه ثبت شدهاند. در این صورت میتوانید دستور hledger import --catchup را یکبار اجرا کنید. این کار یک فایل .latest حاوی آخرین تاریخ رکورد فایل CSV ایجاد میکند، بهطوریکه هیچیک از آن رکوردها مجدداً درونریزی نخواهند شد. یا اگر میدانید که برخی از تراکنشها (نه همه آنها) در دفتر روزنامه وجود دارند، میتوانید خودتان فایل .latest را بسازید. برای مثال، فرض کنید قبلاً تراکنشهای foobank را تا تاریخ 2024-10-31 در دفتر روزنامه ثبت کردهاید. آنگاه در دایرکتوریای که foobank.csv را در آن ذخیره میکنید، فایلی به نام .latest.foobank.csv شامل محتوای زیر میسازید: 2024-10-31 یا اگر سه تراکنش foobank ثبتشده با آن تاریخ داشته باشید، آن تاریخ را به همان تعداد تکرار میکنید: 2024-10-31 2024-10-31 2024-10-31 سپس دستور hledger import foobank.csv [--dry-run] تنها رکوردهای جدیدتر را درونریزی خواهد کرد..SS وارد کردن انتسابهای موجودی ورودیهای دفتر روزنامه که با import اضافه میشوند، تمام مقادیر ثبت را بهصورت صریح خواهند داشت (مانند print -x). این بدان معناست که هرگونه انتساب موجودی در ورودیهای واردشده باید ارزیابی شود. اما این کار عموماً امکانپذیر نیست، زیرا موجودی حسابهای فایل اصلی در طول import قابل مشاهده نیستند. بنابراین سعی کنید از ایجاد انتسابهای موجودی با قواعد CSV خود یا وارد کردن از دفتر روزنامهای که حاوی انتسابهای موجودی است، خودداری کنید. (در هر صورت بهتر است از انتسابهای موجودی اجتناب شود.) اما اگر مجبور به استفاده از آنها هستید، مثلاً به این دلیل که CSV شما فقط شامل موجودیها است: میتوانید با print وارد کنید، که مقادیر ضمنی را بهصورت ضمنی باقی میگذارد. (print همچنین میتواند با پرچم --new مانند import تشخیص همپوشانی را انجام دهد): $ hledger print --new -f bank.csv >> $LEDGER_FILE (اگر فکر میکنید import باید موجودیهای ضمنی را حفظ کند، لطفاً آن را آزمایش کرده و یک درخواست pull ارسال کنید.) وارد کردن و سبکهای کالا مبالغ در ورودیهای اضافهشده توسط import بر اساس سبکهای استاندارد کالای دفتر روزنامه، طبق آنچه در دستورالعملهای commodity تعیین شده یا از مبالغ دفتر روزنامه استنتاج شده است، قالببندی خواهند شد. مرتبط: CSV > Amount decimal places. بایگانی در import هنگام وارد کردن از یک فایل قواعد CSV (hledger import bank.rules)، میتوانید از قاعده archive برای فعال کردن بایگانی خودکار فایل داده استفاده کنید. پس از یک import موفق، فایل داده (مشخصشده توسط source) به یک پوشه بایگانی (data/، در کنار فایل قواعد، با ایجاد خودکار) منتقل شده و مشابه با نام فایل قواعد، به همراه یک تاریخ تغییر نام مییابد. این قابلیت میتواند برای عیبیابی، تشخیص تغییرات در دادههای CSV بانکها، تولید مجدد ورودیها با قواعد بهبودیافته و غیره مفید باشد. قاعده archive همچنین باعث میشود import با الگوهای glob در source رفتار متفاوتی داشته باشد: هنگامی که چندین فایل مطابقت داشته باشند، قدیمیترین را انتخاب میکند، نه جدیدترین را. موارد خاص import حذف موارد تکراری در اینجا دو نوع از "حذف موارد تکراری" آورده شده است که import به آنها رسیدگی نمیکند (و نباید هم بکند، زیرا این موارد میتوانند بهطور مشروع در دادههای مالی رخ دهند): • 2 دو یا چند رکورد از رکوردهای جدید CSV یکسان هستند و ورودیهای یکسانی در دفتر روزنامه ایجاد میکنند. • 2 یک رکورد جدید CSV ورودی دفتر روزنامهای ایجاد میکند که با ورودی(های) موجود در دفتر روزنامه یکسان است. نام فایل متغیر اگر فایلی بارگیریشده دارید که نام فایل آن تغییر میکند، میتوانید پس از هر بار بارگیری، نام آن را به یک نام ثابت تغییر دهید. یا میتوانید از قاعده source در CSV با یک الگوی glob مناسب استفاده کرده و از فایل rules. وارد کنید. نسخههای چندگانه فرض کنید bank.csv را بارگیری و آن را وارد میکنید، اما فراموش میکنید آن را از پوشه بارگیریهای خود حذف کنید. دفعه بعد که آن را بارگیری میکنید، مرورگر وب شما آن را بهصورت (مثلاً) bank (2).csv ذخیره خواهد کرد. الگوهای glob در قاعده source دقیقاً برای چنین موقعیتی هستند: به جای مشخص کردن source bank.csv، مقدار source bank*.csv را مشخص کنید. سپس hledger -f bank.rules CMD یا hledger import bank.rules بهطور خودکار جدیدترین فایل مطابقتیافته (bank (2).csv) را انتخاب خواهد کرد. از طرف دیگر، چه میشود اگر فایلی را بارگیری کنید، اما وارد کردن یا حذف آن را فراموش کرده و سپس دوباره بارگیری کنید؟ اکنون ممکن است هر یک از فایلهای bank.csv و bank (2).csv حاوی دادههایی باشند که در دیگری و همچنین در دفتر روزنامه شما وجود ندارند. در این حالت، بهتر است هر کدام را به نوبت، از قدیمیترین به جدیدترین وارد کنید (در غیر این صورت، تشخیص همپوشانی ممکن است باعث نادیده گرفته شدن رکوردهای جدید شود). فعال کردن بایگانی در import این موضوع را تضمین میکند. سپس دستور hledger import bank.rules; hledger import bank.rules ابتدا bank.csv و سپس bank (2).csv را وارد و بایگانی خواهد کرد..SH "دستورهای پایه گزارش (Basic report commands)" accounts نامهای حساب استفادهشده یا اعلانشده در ژورنال را فهرست میکند. پرچمها: -u --used فهرست کردن حسابهای استفادهشده -d --declared فهرست کردن حسابهای اعلانشده --undeclared فهرست کردن حسابهای استفادهشده اما اعلاننشده --unused فهرست کردن حسابهای اعلانشده اما استفادهنشده --find فهرست کردن نخستین حساب منطبق با اولین آرگومان (یک عبارت باقاعده میانی ناوابسته به بزرگی و کوچکی حروف) --directives نمایش بهصورت دستورالعملهای حساب، برای استفاده در ژورنالها --locations همچنین نمایش محل اعلان حسابها --types همچنین نمایش نوع حسابها در صورت مشخص بودن -l --flat حالت فهرست/درخت: نمایش حسابها بهصورت یک فهرست مسطح (پیشفرض) -t --tree حالت فهرست/درخت: نمایش حسابها بهصورت یک درخت --drop=N حالت مسطح: صرفنظر کردن از N بخش ابتدایی نام حساب این دستور نامهای حساب را فهرست میکند - بهطور پیشفرض همهی آنها را، یا فقط مواردی که در تراکنشها استفاده شدهاند (-u/--used)، یا با دستورالعملهای account اعلان شدهاند (-d/--declared)، یا استفاده شده اما اعلان نشدهاند (--undeclared)، یا اعلان شده اما استفاده نشدهاند (--unused)، یا تنها نخستین موردی که با یک الگو منطبق شود (--find، که در صورت عدم موفقیت یک کد خروج غیرصفر بازمیگرداند). میتوانید برای انتخاب زیرمجموعهای از تراکنشها یا حسابها، آرگومانهای پرسوجو اضافه کنید. با --directives، دستورالعملهای معتبر حساب را نمایش میدهد که میتوان آنها را در یک فایل ژورنال جایگذاری کرد. این گزینه همراه با --undeclared هنگام بهروزرسانی اعلانهای حساب خود برای برآورده کردن شرایط hledger check accounts مفید است. با --locations، همچنین فایل و شماره خط اعلان هر حساب (در صورت وجود) و ترتیب کلی اعلان حساب را نمایش میدهد؛ این اطلاعات ممکن است هنگام عیبیابی ترتیب نمایش حسابها مفید باشد. با --types، همچنین نوع هر حساب را در صورت مشخص بودن نمایش میدهد. (ببینید: Declaring accounts > Account types.) این دستور بهطور پیشفرض یک فهرست مسطح نمایش میدهد. با --tree، از تورفتگی برای نمایش سلسلهمراتب حساب استفاده میکند. در حالت مسطح میتوانید --drop N را برای حذف چند بخش ابتدایی نام حساب اضافه کنید. نام حسابها را میتوان با depth:N، --depth N یا -N از نظر عمق محدود کرد. مثالها: $ hledger accounts assets:bank:checking assets:bank:saving assets:cash expenses:food expenses:supplies income:gifts income:salary liabilities:debts $ hledger accounts --undeclared --directives >> $LEDGER_FILE $ hledger check accounts codes کدهای دیدهشده در تراکنشها را به ترتیبی که تجزیه شدهاند، فهرست میکند. پرچمها: بدون پرچم خاص برای این دستور این دستور مقدار فیلد کد هر تراکنش را به ترتیبی که تراکنشها تجزیه شدهاند، چاپ میکند. کد تراکنش یک مقدار اختیاری است که در پرانتز بین تاریخ و شرح نوشته میشود، و اغلب برای ذخیره شماره چک، شماره سفارش یا موارد مشابه استفاده میشود. تراکنشها الزامی به داشتن کد ندارند و کدهای موجودنبوده یا خالی بهطور پیشفرض نمایش داده نمیشوند. با پرچم -E/--empty، آنها بهصورت خطوط خالی چاپ خواهند شد. میتوانید برای انتخاب زیرمجموعهای از تراکنشها، یک پرسوجو اضافه کنید. مثالها: 2022/1/1 (123) Supermarket Food $5.00 Checking 2022/1/2 (124) Post Office Postage $8.32 Checking 2022/1/3 Supermarket Food $11.23 Checking 2022/1/4 (126) Post Office Postage $3.21 Checking $ hledger codes 123 124 126 $ hledger codes -E 123 124 126 فهرست کردن نمادهای کالای استفادهشده یا اعلانشده در دفتر روزنامه. پرچمها: --used فهرست کردن کالاهای استفادهشده --declared فهرست کردن کالاهای اعلانشده --undeclared فهرست کردن کالاهای استفادهشده اما اعلاننشده --unused فهرست کردن کالاهای اعلانشده اما استفادهنشده --find فهرست کردن نخستین کالای منطبق با اولین آرگومان (یک regexp میانی غیرحساس به بزرگی و کوچکی حروف) این دستور نمادها/نامهای کالا را فهرست میکند - بهطور پیشفرض همهی آنها، یا فقط مواردی که در تراکنشها یا دستورالعملهای P استفاده شدهاند، یا با دستورالعملهای commodity اعلان شدهاند، یا استفاده شده اما اعلان نشدهاند، یا اعلان شده اما استفاده نشدهاند، یا فقط نخستین موردی که با یک الگو مطابقت دارد (با --find، که در صورت شکست یک کد خروج غیرصفر بازمیگرداند). میتوانید آرگومانهای پرسوجوی cur: را برای محدود کردن بیشتر کالاها اضافه کنید. descriptions فهرست کردن شرحهای یکتای استفادهشده در تراکنشها. پرچمها: بدون پرچم اختصاصی برای دستور این دستور شرحهای یکتایی را که در تراکنشها آمده است، به ترتیب الفبایی فهرست میکند. میتوانید یک پرسوجو برای انتخاب زیرمجموعهای از تراکنشها اضافه کنید. مثال: $ hledger descriptions Store Name Gas Station | Petrol Person A files فهرست کردن تمام فایلهای گنجاندهشده در دفتر روزنامه. با یک آرگومان REGEX، تنها نام فایلهای منطبق با عبارت منظم (حساس به بزرگ و کوچکی حروف) نشان داده میشوند. پرچمها: بدون پرچم اختصاصی برای دستور notes فهرست کردن یادداشتهای یکتایی که در تراکنشها آمده است. پرچمها: بدون پرچم اختصاصی برای دستور این دستور یادداشتهای یکتایی را که در تراکنشها آمده است، به ترتیب الفبایی فهرست میکند. میتوانید یک پرسوجو برای انتخاب زیرمجموعهای از تراکنشها اضافه کنید. یادداشت، بخشی از شرح تراکنش پس از نویسهی | است (یا در صورت نبود |، کل شرح). مثال: $ hledger notes Petrol Snacks payees فهرست کردن نامهای دریافتکننده/پرداختکننده استفادهشده یا اعلانشده در دفتر روزنامه. پرچمها: --used فهرست کردن دریافتکنندگان استفادهشده --declared فهرست کردن دریافتکنندگان اعلانشده --undeclared فهرست کردن دریافتکنندگان استفادهشده اما اعلاننشده --unused فهرست کردن دریافتکنندگان اعلانشده اما استفادهنشده --find فهرست کردن نخستین دریافتکننده منطبق با نخستین آرگومان (یک regexp میانی غیرحساس به بزرگی و کوچکی حروف) این دستور نامهای یکتای دریافتکننده/پرداختکننده را فهرست میکند - بهطور پیشفرض همهی آنها، یا فقط مواردی که در شرح تراکنشها استفاده شدهاند، یا با دستورالعملهای payee اعلان شدهاند، یا استفاده شده اما اعلان نشدهاند، یا اعلان شده اما استفاده نشدهاند، یا فقط نخستین موردی که با یک الگو مطابقت دارد (با --find، که در صورت شکست یک کد خروج غیرصفر بازمیگرداند). نام دریافتکننده/پرداختکننده، بخشی از شرح تراکنش قبل از نویسهی | است (یا در صورت نبود |، کل شرح). میتوانید آرگومانهای پرسوجو را برای انتخاب زیرمجموعهای از تراکنشها یا دریافتکنندگان اضافه کنید. مثال: $ hledger payees Store Name Gas Station Person A چاپ قیمتهای بازار اعلانشده با دستورالعملهای P. با --infer-market-prices، هرگونه قیمت اضافی استنتاجشده از هزینهها نیز نمایش داده میشود. با --show-reverse، قیمتهای اضافی استنتاجشده از معکوسکردن قیمتهای شناختهشده نیز نمایش داده میشوند. گزینهها: --show-reverse همچنین نمایش قیمتهای استنتاجشده با معکوسکردن قیمتهای شناختهشده مقادیر قیمت همیشه با دقت کامل نمایش داده میشوند، به استثنای قیمتهای معکوس که به ۸ رقم اعشار محدود شدهاند. قیمتها را میتوان با یک پرسوجوی date:، cur: یا amt: فیلتر کرد. بهطور کلی اگر این دستور را با --infer-market-prices و --show-reverse اجرا کنید، همان قیمتهایی را نشان میدهد که بهطور داخلی برای محاسبهٔ گزارشهای ارزش استفاده میشوند. اما اگر تردید دارید، میتوانید با اجرای گزارش ارزش همراه با --debug=2 مستقیماً آنها را بررسی کنید. stats نمایش آمار دفتر روزنامه و عملکرد. گزینهها: -1 نمایش خروجی در یک سطر -v --verbose نمایش خروجی با جزئیات بیشتر -o --output-file=FILE نوشتن خروجی در FILE. دستور stats اطلاعات خلاصهای را برای کل دفتر روزنامه یا بخشی از آن که تطبیق یافته است، نمایش میدهد. با تعیین یک بازهٔ گزارشگیری، گزارشی را برای هر دورهٔ گزارش نشان میدهد. این دستور همچنین برخی از آمارهای عملکرد را نمایش میدهد: • 2 مدت زمانی که برنامه اجرا شده است • 2 تعداد تراکنشهای پردازششده در هر ثانیه • 2 اوج حافظهٔ زندهٔ در حال استفاده توسط برنامه برای انجام کار خود • 2 اوج حافظهٔ تخصیصیافته از دید برنامه بهطور پیشفرض، خروجی تا حد مناسبی گزیده و محتاطانه است؛ این خروجی نام فایل اصلی، سطح فعالیت شما و سرعت سیستم شما را آشکار میسازد. با -v/--verbose، جزئیات بیشتری نشان داده میشود: مسیرهای کامل همهٔ فایلها، و نام کالاهایی که با آنها کار میکنید. با -1، تنها یک خط خروجی در قالبی جداشده با تب و مناسب برای ماشین نمایش داده میشود: نسخهٔ برنامه، نام فایل اصلی دفتر روزنامه، و آمارهای عملکرد. زمان اجرای stats مشابه با یک گزارش تراز است. مثال: $ hledger stats -f examples/1ktxns-1kaccts.journal Main file : .../1ktxns-1kaccts.journal Included files : 0 Txns span : 2000-01-01 to 2002-09-27 (1000 days) Last txn : 2002-09-26 (7827 days ago) Txns : 1000 (1.0 per day) Txns last 30 days : 0 (0.0 per day) Txns last 7 days : 0 (0.0 per day) Payees/descriptions : 1000 Accounts : 1000 (depth 10) Commodities : 26 Market prices : 1000 Runtime stats : 0.12 s elapsed, 8266 txns/s, 4 MB live, 16 MB alloc $ hledger stats -1 -f examples/10ktxns-1kaccts.journal 1.50.99-g0835a2485-20251119, mac-aarch64 10ktxns-1kaccts.journal 0.66 s elapsed 15244 txns/s 28 MB live 86 MB alloc این دستور از گزینهٔ -o/--output-file پشتیبانی میکند (اما از -O/--output-format پشتیبانی نمیکند)..SS tags فهرست کردن نام برچسبهای استفادهشده یا اعلانشده در دفتر روزنامه، یا مقادیر آنها. Flags: --used فهرست کردن برچسبهای استفادهشده --declared فهرست کردن برچسبهای اعلانشده --undeclared فهرست کردن برچسبهای استفادهشده اما اعلاننشده --unused فهرست کردن برچسبهای اعلانشده اما استفادهنشده --find فهرست نخستین برچسبی که نام آن با آرگومان نخست مطابقت دارد (یک عبارت باقاعده میانیِ غیرحساس به بزرگیکوچکی حروف) --values فهرست کردن مقادیر برچسب بهجای نام برچسبها --parsed نمایش آنها به ترتیبی که تجزیه شدهاند (غالباً)، شامل موارد تکراری این دستور نام برچسبها را فهرست میکند - بهطور پیشفرض همه آنها را، یا فقط آنهایی را که در تراکنشها/ثبتها/حسابها استفاده شدهاند، یا با دستورالعملهای tag اعلان شدهاند، یا استفاده شده اما اعلان نشدهاند، یا اعلان شده اما استفاده نشدهاند، یا فقط نخستین موردی را که با یک الگو مطابقت دارد (با --find، که در صورت عدم موفقیت یک کد خروج غیرصفر بازمیگرداند). به آرگومان نخست غیراستاندارد این دستور توجه کنید: این آرگومان یک عبارت باقاعده میانیِ غیرحساس به بزرگی و کوچکی حروف برای تطبیق نام برچسبها است، که برچسبهای نمایشدادهشده را محدود میکند. هر آرگومان اضافی، یک آرگومان پرسوجوی استاندارد است که تراکنشها، ثبتها یا حسابهای ارائهدهنده برچسبها را محدود میسازد. با --values، بهجای نامها، مقادیر یکتا و غیرخالیِ برچسبها فهرست میشوند. با -E/--empty، مقادیر سفید/خالی نیز نشان داده میشوند. با --parsed، برچسبها یا مقادیر به همان ترتیبی که تجزیه شدهاند نشان داده میشوند، همراه با موارد تکراری. (به استثنای برچسبهای حاصل از اعلان حسابها که همیشه اول نشان داده میشوند.) به یاد داشته باشید که حسابها برچسبها را از والد خود نیز به ارث میبرند؛ ثبتها نیز برچسبها را از حساب و تراکنشِ مربوطه کسب میکنند؛ و تراکنشها نیز برچسبها را از ثبتهای خود میگیرند. "دستورهای استاندارد گزارشگیری (Standard report commands)" print نمایش مدخلهای کامل دفتر روزنامه، که نشاندهنده تراکنشها هستند. Flags: -x --explicit نمایش صریح تمامی مبالغ --invert نمایش تمام مبالغ با علامت معکوس (قرینه) --locations افزودن برچسبهایی که مسیر فایلها و شماره خطها را نشان میدهند -m --match=DESC جستوجوی فازی برای یک تراکنش اخیر با توضیحاتی که بیشترین شباهت را به DESC دارد --new تنها نمایش تراکنشهای با تاریخ جدیدتر اضافهشده در هر فایل از زمان آخرین اجرا --round=TYPE هنگام نمایش مبالغ چه میزان گرد کردن یا فاصلهگذاری انجام شود؟ none - نمایش ارقام اعشاری اصلی، همانطور که در دفتر روزنامه آمده است (پیشفرض) soft - صرفاً افزودن یا حذف صفرهای اعشاری برای تطابق با دقت hard - گرد کردن مبالغ ثبتها تا حد دقت (میتواند تراکنشها را ناتراز کند) all - گرد کردن مبالغ بهای تمامشده تا حد دقت (میتواند تراکنشها را ناتراز کند) --base-url=URLPREFIX در خروجی html، تولید پیوندها به hledger-web با این پیشوند. (معمولاً URL پایهای که توسط hledger-web نشان داده میشود؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt, beancount, csv, tsv, html, fods, json, sql. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا مطابقت داشته باشد، آن قالب را برمیگزیند. دستور print مدخلهای کامل دفتر روزنامه (تراکنشها) را از فایل دفتر روزنامه، مرتبشده بر پایه تاریخ (یا با --date2، بر پایه تاریخ ثانویه) نمایش میدهد. در حال حاضر دستورالعملها و یادداشتهای میان تراکنشها نمایش داده نمیشوند. این بدان معناست که دستور print تا حدی با اتلاف اطلاعات همراه است، و چنانچه از آن برای قالببندی مجدد یا بازتولید دفتر روزنامه خود استفاده میکنید، باید دقت داشته باشید که دستورالعملها و یادداشتهای میان تراکنشها را نیز کپی کنید. برای مثال: $ hledger print -f examples/sample.journal date:200806 2008/06/01 gift assets:bank:checking $1 income:gifts $-1 2008/06/02 save assets:bank:saving $1 assets:bank:checking $-1 2008/06/03 * eat & shop expenses:food $1 expenses:supplies $1 assets:cash $-2 بهطور معمول، ضمنی یا صریح بودن مبالغ ثبتها حفظ میشود. برای مثال، هنگامی که مبلغی در دفتر روزنامه حذف شده باشد، در خروجی نیز ظاهر نخواهد شد. بههمین ترتیب، اگر هزینه تبدیل بهصورت ضمنی در نظر گرفته شده اما نوشته نشده باشد، در خروجی نمایش داده نمیشود. میتوانید از پرچم -x/--explicit برای اجبار به نمایش صریح تمام مبالغ و هزینهها استفاده کنید. این گزینه میتواند برای عیبیابی یا خواناتر کردن دفتر روزنامه و مقاومسازی آن در برابر خطاهای ورود داده مفید باشد. استفاده از هر یک از گزینههای -B، -V، -X یا --value نیز بهطور خودکار -x را فعال میکند. پرچم -x/--explicit باعث میشود هر ثبتی با مبلغ چندکالایی (که میتواند ناشی از داشتن مبلغ ضمنی در یک تراکنش چندکالایی باشد) به چندین ثبت تککالایی تقسیم شود تا خروجی همچنان قابل تجزیه باقی بماند. ترازبندی در print مبالغ در هر تراکنش بهصورت راستچین نمایش داده میشوند (اما در سراسر تمام تراکنشها همتراز نمیشوند؛ برای رسیدن به این هدف میتوانید از ledger-mode در Emacs استفاده کنید). سبک نمایش مبالغ در print مبالغ اغلب بر اساس سبک نمایش کالای (واحد ارزی) خود، با جایگذاری استاندارد نماد، علامت اعشار و نشانگرهای گروهبندی ارقام نمایش داده میشوند. این موضوع شامل ارقام اعشاری آنها نمیشود؛ print بهطور معمول همان ارقام اعشاری را که در هر ورودی دفتر روزنامه ثبت شده است نشان میدهد. میتوانید با گزینه ویژه --round در print (از نسخه 1.32) دقت اعشار را بازنویسی کنید. گزینه --round تلاش میکند مبالغ را با دقت اعشار استاندارد کالاها، با سطوح سختگیری فزاینده نشان دهد: • 2 --round=none نمایش مبالغ با دقت اصلی (پیشفرض) • 2 --round=soft افزودن/حذف صفرهای اعشاری در مبالغ (بهجز هزینهها) • 2 --round=hard گرد کردن مبالغ (بهجز هزینهها)، با احتمال پنهانسازی ارقام بااهمیت • 2 --round=all گرد کردن تمام مبالغ و هزینهها حالت soft برای مرتبسازی بدون اتلاف داده، نمایش اعشارهای یکدستتر در صورت امکان، و بدون برهم زدن تراز ورودیها مناسب است. حالتهای hard یا all برای مرتبسازیهای قویتر، در مواقعی که گرد کردن اعشار مورد نیاز است، کاربرد دارند. توجه داشته باشید که گرد کردن میتواند ورودیهای نامتراز در دفتر روزنامه ایجاد کند که ممکن است نیازمند اصلاح دستی باشد. قابلیت تجزیه خروجی print بهطور معمول، خروجی print یک دفتر روزنامه معتبر hledger است که میتوانید آن را برای پردازشهای بعدی به یک دستور دیگر hledger پایپ ("pipe") کنید. این کار گاهی برای اجرای انواع خاصی از پرسوجوها مناسب است (اگرچه اکنون که پرسوجوها قدرتمندتر شدهاند کمتر مورد نیاز است): # نمایش جمع جاری هزینههای خوراک پرداختشده از وجه نقد. # -f- از stdin میخواند. -I/--ignore-assertions گاهی لازم است. $ hledger print assets:cash | hledger -f- -I reg expenses:food اما در اینجا مواردی آورده شده است که میتوانند موجب غیرقابل تجزیه شدن خروجی print شوند: • 2 --round (توضیحات بالا را ببینید) میتواند تراز تراکنش را مختل کند. • 2 نامهای مستعار حساب (Account aliases) یا چرخش (pivoting) میتوانند نام حسابها، بررسیهای تراز (balance assertions) یا انتسابهای تراز (balance assignments) را برهم بزنند. • 2 گزارشگیری ارزش (Value reporting) نیز میتواند بررسیهای تراز یا انتسابهای تراز را مختل کند. • 2 ثبتهای خودکار (Auto postings) میتوانند تعداد بیش از حدی ثبتِ بدون مبلغ ایجاد کنند. • 2 --infer-costs یا --infer-equity میتوانند هزینههای مازاد و بیش از حد پیچیده تولید کنند. • 2 از آنجا که print همیشه تراکنشها را بر اساس تاریخ مرتب میکند، بررسیهای تراز شامل تراکنشهای نامرتب از نظر تاریخی (و ثبتهای مربوط به یک روز) ممکن است مختل شوند..SS "سایر قابلیتهای print (print, other features)" با -B/--cost، مبالغ دارای بهای تمامشده، بهصورت تبدیلشده به بهای تمامشده نمایش داده میشوند. با --invert، مبالغ ثبت (posting) با علامت معکوس نمایش داده میشوند. این گزینه در صورتی که بهطور تصادفی برخی تراکنشها را با علامتهای نادرست ثبت کرده باشید، میتواند مفید باشد. با --new، دستور print تنها تراکنشهایی را نمایش میدهد که در اجرای قبلی ندیده باشد. این قابلیت از همان سامانه یکتاسازی و حذف موارد تکراری (deduplication) مشابه دستور import استفاده میکند. (برای جزئیات، مستندات import را ببینید.) با -m DESC/--match=DESC، دستور print یک تراکنش اخیر را که شرح آن بیشترین شباهت را به DESC دارد نمایش میدهد. آرگومان DESC باید دستکم شامل دو نویسه باشد. اگر تطابق به اندازه کافی مشابهی وجود نداشته باشد، هیچ تراکنشی نمایش داده نخواهد شد و کد خروج برنامه غیرصفر خواهد بود. با --locations، دستور print نام فایل منبع و شماره سطر را بهصورت یک برچسب (tag) به هر تراکنش اضافه میکند. "قالب خروجی print (print output format)" این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، beancount (افزودهشده در 1.32)، csv، tsv (افزودهشده در 1.32)، json و sql. قالب beancount تلاش میکند خروجی سازگار با Beancount تولید کند، به شرح زیر: • 2 تراکنشها و ثبتهای با وضعیت بدون علامت (unmarked) به وضعیت تسویهشده (*) تبدیل میشوند. • 2 دریافتکننده وجه (payee) و یادداشت (note) تراکنشها با بکاسلش و نقلقول دوتایی گریز داده شده (escaped) و درون نقلقولهای دوتایی قرار میگیرند. • 2 برچسبهای تراکنش به قالب #tag در Beancount کپی میشوند. • 2 نمادهای کالا/ارز (commodity) به حروف بزرگ تبدیل میشوند، و تعداد اندکی از نمادهای ارزی مانند $ به نامهای ارز متناظر تبدیل میگردند. • 2 بخشهای نام حساب با حروف بزرگ آغاز میشوند و نویسههای پشتیبانینشده با - جایگزین میشوند. اگر بخشی از نام حساب با یک حرف آغاز نشود، یا اگر بخش نخست یکی از موارد Assets، Liabilities، Equity، Income یا Expenses نباشد، خطایی صادر میشود. (برای سازگار کردن حسابهای خود، از گزینههای --alias استفاده کنید.) • 2 یک دستورالعمل (directive) open برای هر حساب استفادهشده، در نخستین تاریخ تراکنش تولید میشود. برخی محدودیتها: • 2 تأییدیههای تراز (balance assertions) حذف میشوند. • 2 تخصیصهای تراز (balance assignments) به مبالغ نامشخص تبدیل میشوند. • 2 ثبتهای مجازی (virtual) و مجازی ترازشده به ثبتهای عادی تبدیل میشوند. • 2 دستورالعملها (directives) تبدیل نمیشوند. در اینجا نمونهای از خروجی CSV دستور print آمده است: $ hledger print -Ocsv "txnidx","date","date2","status","code","description","comment","account","amount","commodity","credit","debit","posting-status","posting-comment" "1","2008/01/01","","","","income","","assets:bank:checking","1","$","","1","","" "1","2008/01/01","","","","income","","income:salary","-1","$","1","","","" "2","2008/06/01","","","","gift","","assets:bank:checking","1","$","","1","","" "2","2008/06/01","","","","gift","","income:gifts","-1","$","1","","","" "3","2008/06/02","","","","save","","assets:bank:saving","1","$","","1","","" "3","2008/06/02","","","","save","","assets:bank:checking","-1","$","1","","","" "4","2008/06/03","","*","","eat & shop","","expenses:food","1","$","","1","","" "4","2008/06/03","","*","","eat & shop","","expenses:supplies","1","$","","1","","" "4","2008/06/03","","*","","eat & shop","","assets:cash","-2","$","2","","","" "5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","","" "5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","","" • 2 به ازای هر ثبت (posting)، یک رکورد CSV وجود دارد که در آن فیلدهای تراکنش والد تکرار میشوند. • 2 فیلد "txnidx" (شناسهٔ تراکنش) نشان میدهد که کدام ثبتها متعلق به یک تراکنش یکسان هستند. (این شماره ممکن است در صورت تغییر ترتیب تراکنشها در فایل، پردازش یا گنجاندن فایلها با ترتیبی دیگر، و غیره تغییر کند.) • 2 مبلغ به دو فیلد "commodity" (نماد) و "amount" (مقدار عددی) تفکیک میشود. • 2 مقدار عددی برای راحتی در یکی از ستونهای "credit" یا "debit" تکرار میشود. (این نامها از نظر حسابداری دقیق نیستند؛ برنامه صرفاً مبالغ منفی را زیر credit و مبالغ صفر یا مثبت را زیر debit قرار میدهد.).SS aregister (areg) نمایش تراکنشها و ماندههای جاری در یک حساب، با قرار گرفتن هر تراکنش در یک خط. پرچمها: --txn-dates فیلتر دقیق بر اساس تاریخ تراکنش، نه تاریخ ثبت (posting date). هشدار: این کار میتواند مانده جاری نادرستی را نشان دهد. --no-elide عدم محدودسازی به نمایش تنها ۲ کالا به ازای هر مقدار --cumulative حالت تجمیعی: نمایش مجموع جاری از تاریخ شروع گزارش -H --historical حالت تجمیعی: نمایش مجموع/مانده جاری تاریخی (شامل ثبتهای پیش از تاریخ شروع گزارش) (پیشفرض) --invert نمایش تمام مقادیر با علامت معکوس --drop=N حذف N بخش ابتدایی نام حساب --heading=YN نمایش سطر سربرگ بالای جدول: yes (پیشفرض) یا no -w --width=N تنظیم عرض خروجی (پیشفرض: عرض ترمینال). -wN,M عرض توضیحات را نیز تعیین میکند. --align-all تضمین تراز بودن در تمام خطوط (کندتر) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt، html، csv، tsv، json. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا مطابقت داشته باشد، آن قالب را انتخاب میکند. دستور aregister تراکنشهای کلی تأثیرگذار بر یک حساب خاص (و هرگونه زیرحساب آن) را نمایش میدهد. هر خط گزارش نشاندهنده یک تراکنش در این حساب است. تراکنشهای پیش از تاریخ آغاز گزارش در مانده جاری گنجانده میشوند (حالت --historical پیشفرض است). میتوانید با استفاده از گزینهٔ --cumulative این رفتار را لغو کنید. این دستور در مقایسه با دستور register (که ثبتهای جداگانه را، احتمالاً از چندین حساب و نه لزوماً در حالت تاریخی نشان میدهد)، نمایی «واقعیتر» و شبیه به صورتحسابهای بانکی ارائه میدهد. به عنوان یک قاعده کلی: • 2 دستور aregister بهترین گزینه برای تطبیق و مغایرتگیری حسابهای واقعی دارایی/بدهی است • 2 دستور register بهترین گزینه برای بازبینی تکتک درآمدها/هزینهها است. به نخستین آرگومان غیر استاندارد و الزامی این دستور توجه داشته باشید؛ این آرگومان حسابی را که دفتر روزنامهٔ آن باید نمایش داده شود مشخص میکند. میتوانید نام حساب را وارد کنید، یا (برای کاهش تایپ) از یک عبارت منظم میانی غیرحساس به بزرگ و کوچکی حروف مطابق با نام آن استفاده کنید، که حسابی را که از نظر الفبایی اولین تطابق را داشته باشد انتخاب میکند. (برای نمونه، اگر حسابهای assets:personal checking و assets:business checking را داشته باشید، دستور hledger areg checking حساب assets:business checking را انتخاب خواهد کرد.) تراکنشهای شامل زیرحسابهای این حساب نیز نمایش داده خواهند شد. دستور aregister محدودیتهای عمق را نادیده میگیرد، بنابراین مجموع نهایی آن همواره با یک گزارش مانده تاریخی با آرگومانهای مشابه مطابقت خواهد داشت. هرگونه آرگومان اضافی، یک آرگومان پرسمان استاندارد محسوب میشود که تراکنشهای نمایشدادهشده را محدود میکند. توجه داشته باشید که برخی از پرسمانها مانده جاری را تغییر میدهند و باعث میشوند با مانده جاری واقعی حساب متفاوت باشد. یک مثال: این دستور تراکنشها و مانده جاری تاریخی را در طول ماه ژوئیه در نخستین حسابی که نام آن شامل "checking" است نمایش میدهد: $ hledger areg checking date:jul هر سطر در خروجی aregister موارد زیر را نمایش میدهد: • 2 تاریخ تراکنش (یا تاریخ ثبت مربوطه در صورت متفاوت بودن، پایینتر را ببینید) • 2 نام تمام حسابهای دیگری که در این تراکنش دخیل هستند (احتمالاً به صورت مخفف) • 2 تغییر کلی در مانده این حساب بر اثر این تراکنش • 2 مانده جاری تاریخی حساب پس از انجام این تراکنش. تراکنشهایی که تغییر خالص آنها صفر است بهطور پیشفرض نمایش داده نمیشوند؛ برای نمایش آنها پرچم -E/--empty را اضافه کنید. به دلایل کارایی، عرض ستونها بر اساس ۱۰۰۰ خط اول تعیین میشود؛ این بدان معناست که مقادیر بیش از حد عریض در خطوط بعدی ممکن است هنگام تنظیم مجدد عرض ستونها باعث ناهماهنگی دیداری شوند. اگر میخواهید از تراز بودن کامل ستونها اطمینان حاصل کنید (به بهای صرف زمان و حافظه بیشتر)، از پرچم --align-all استفاده کنید. بهطور پیشفرض، aregister یک سربرگ در بالای دادهها نمایش میدهد. با این حال، هنگام گزارشگیری به زبانی غیر از انگلیسی، آسانتر است که این سربرگ را حذف کرده و سربرگ مورد نظر خود را درج کنید. برای این منظور، از گزینهٔ --heading=no استفاده کنید. این دستور همچنین از گزینههای تعیین مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، csv، tsv (افزودهشده در 1.32)، html، fods (افزودهشده در 1.41) و json..SS aregister و تاریخهای ثبت (posting dates) دستور aregister همواره بهازای هر تراکنش یک خط (و یک تاریخ و مبلغ) را نمایش میدهد. اما گاهی تراکنشها دارای ثبتهایی (postings) با تاریخهای متفاوت هستند. همچنین، ممکن است تمام ثبتهای یک تراکنش در بازه زمانی گزارش قرار نگیرند. برای حل این مسئله، aregister کهنترین تاریخ میان تاریخ تراکنش و تاریخهای ثبت را که در دوره گزارش قرار دارند، بههمراه مجموع ثبتهای درون دوره نمایش میدهد. به عبارت دیگر، یک ردیف ادغامشده را تنها با کهنترین تاریخ نشان خواهد داد، و تراز جاری (موقتاً، تا آخرین ثبت تراکنش) نادقیق خواهد بود. اگر نیاز به مشاهده تکتک ثبتها دارید، از register -H استفاده کنید. همچنین پرچم --txn-dates نیز وجود دارد که صرفاً بر اساس تاریخ تراکنش پالایش میکند و تاریخهای ثبت را نادیده میگیرد. این مورد نیز میتواند باعث نادقیق شدن تراز جاری شود. register (reg) نمایش ثبتها و مجموع جاری آنها. Flags: --cumulative حالت انباشتگی: نمایش مجموع جاری از تاریخ شروع گزارش (پیشفرض) -H --historical حالت انباشتگی: نمایش مجموع/تراز جاری تاریخی (شامل ثبتیهای پیش از تاریخ شروع گزارش) -A --average نمایش میانگین جاری مقادیر ثبتی بهجای مجموع (بهمعنای --empty نیز هست) -m --match=DESC جستوجوی فازی برای یک ثبتی اخیر با شرحی که نزدیکترین به DESC باشد -r --related نمایش موارد همزاد (siblings) ثبتیها بهجای خود آنها --invert نمایش همه مقادیر با علامت معکوس --drop=N حذف N بخش ابتدایی نام حساب --sort=FIELDS مرتبسازی بر اساس: date، desc، account، amount، absamount یا ترکیبی از آنها با کاما. برای مرتبسازی نزولی، پیشوند - بگذارید. (پیشفرض: date) -w --width=N تنظیم عرض خروجی (پیشفرض: عرض ترمینال). -wN,M عرض شرح را نیز تنظیم میکند. --align-all تضمین تراز بودن در تمام خطوط (کندتر) --base-url=URLPREFIX در خروجی html، تولید پیوندها به hledger-web با این پیشوند. (معمولاً base url ارائهشده توسط hledger-web؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt، csv، tsv، html، fods، json. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا مطابقت داشته باشد آن قالب را انتخاب میکند. دستور register ثبتهای منطبق را در تمام حسابها، به ترتیب تاریخ، همراه با مجموع جاری یا تراز تاریخی جاری آنها نمایش میدهد. (همچنین دستور aregister را ببینید که تراکنشهای منطبق را در یک حساب خاص نشان میدهد.) دستور register بهطور معمول برای هر ثبت یک خط را نمایش میدهد، اما توجه داشته باشید که مبالغ چندکالایی (multi-commodity) چند خط را اشغال خواهند کرد (یک خط بهازای هر کالا). این دستور معمولاً با یک پرسوجو برای انتخاب حسابی خاص استفاده میشود تا فعالیتهای آن حساب مشاهده شود: $ hledger register checking 2008/01/01 income assets:bank:checking $1 $1 2008/06/01 gift assets:bank:checking $1 $2 2008/06/02 save assets:bank:checking $-1 $1 2008/12/31 pay off assets:bank:checking $-1 0 با گزینهٔ --date2، بهجای آن بر اساس تاریخ ثانویه نمایش داده و مرتب میکند. به دلایل کارایی، عرض ستونها بر اساس ۱۰۰۰ خط اول تعیین میشود؛ این بدان معناست که مقادیر با عرض نامتعارف در خطوط بعدی میتوانند با تنظیم مجدد عرض ستونها، ناهماهنگیهای بصری ایجاد کنند. اگر میخواهید تراز بودن کامل خطوط را تضمین کنید (به بهای صرف زمان و حافظهٔ بیشتر)، از پرچم --align-all استفاده کنید. پرچم --historical/-H، تراز ثبتهای پیشین نمایشدادهنشده را به مجموع جاری اضافه میکند. این قابلیت زمانی مفید است که میخواهید تنها فعالیتهای اخیر را با یک تراز جاری دقیق از نظر تاریخی مشاهده کنید: $ hledger register checking -b 2008/6 --historical 2008/06/01 gift assets:bank:checking $1 $2 2008/06/02 save assets:bank:checking $-1 $1 2008/12/31 pay off assets:bank:checking $-1 0 گزینهٔ --depth میزان جزئیات نمایشدادهشده از زیرحسابها را محدود میکند. گزینهٔ --drop بخشهای ابتدایی از نام حسابها را حذف میکند. پرچم --average/-A میانگین جاری مقادیر ثبت را بهجای مجموع جاری نمایش میدهد (بنابراین، آخرین عدد نمایشدادهشده میانگین کل دوره گزارش است). این پرچم مستلزم --empty است (به بخش زیر مراجعه کنید). این گزینه تحت تأثیر --historical قرار میگیرد. این ویژگی زمانی بهترین عملکرد را دارد که تنها یک حساب و یک کالا نمایش داده شود. پرچم --related/-r ثبتهای دیگر تراکنشهایی را نمایش میدهد که ثبتهای آنها در حالت عادی نمایش داده میشدند. پرچم --invert علامت تمام مبالغ را معکوس میکند. بهعنوان مثال، میتوان از آن در یک حساب درآمد استفاده کرد که مبالغ آن معمولاً بهصورت اعداد منفی نمایش داده میشوند. همچنین برای نمایش ثبتهای حساب checking به همراه حساب مرتبط با آن مفید است: پرچم --sort=FIELDS بر اساس فیلدهای ارائهشده مرتبسازی میکند که میتوانند هر یک از موارد account، amount، absamount، date، یا desc/description باشند که با کاما از هم جدا شدهاند. برای نمونه، --sort account,amount تمام تراکنشها را در هر حساب گروهبندی کرده و بر اساس مبلغ تراکنش مرتب میکند. هر فیلد میتواند با یک پیشوند - معکوس شود، بنابراین --sort -amount تراکنشها را از کوچکترین مبلغ به بزرگترین مبلغ نمایش خواهد داد. $ hledger register --related --invert assets:checking با تعیین بازهٔ گزارشگیری، register ثبتهای خلاصهشده را نمایش میدهد؛ یک ثبت بهازای هر بازه، که ثبتهای هر حساب را تجمیع میکند: $ hledger register --monthly income 2008/01 income:salary $-1 $-1 2008/06 income:gifts $-1 $-2 دورههای بدون فعالیت، و ثبتهای خلاصه با مبلغ صفر، بهطور پیشفرض نمایش داده نمیشوند؛ برای دیدن آنها از پرچم --empty/-E استفاده کنید: $ hledger register --monthly income -E 2008/01 income:salary $-1 $-1 2008/02 0 $-1 2008/03 0 $-1 2008/04 0 $-1 2008/05 0 $-1 2008/06 income:gifts $-1 $-2 2008/07 0 $-2 2008/08 0 $-2 2008/09 0 $-2 2008/10 0 $-2 2008/11 0 $-2 2008/12 0 $-2 اغلب مایل خواهید بود که فقط یک خط بهازای هر بازه مشاهده کنید. گزینهٔ --depth در این زمینه کمک میکند و باعث تجمیع زیرحسابها میشود: $ hledger register --monthly assets --depth 1 2008/01 assets $1 $1 2008/06 assets $-1 0 2008/12 assets $-1 $-1 توجه داشته باشید هنگام استفاده از بازههای زمانی گزارشگیری، اگر تاریخهای شروع/پایان را مشخص کنید، در صورت لزوم به سمت بیرون تنظیم میشوند تا تعداد کاملی از بازهها را در بر گیرند. این امر تضمین میکند که بازههای اول و آخر دارای طول کامل بوده و با سایر بازههای موجود در گزارش قابل مقایسه باشند. اگر درخت حسابهای شما دارای سطوح تودرتوی عمیقی است، ممکن است برخی گزارشها با حذف بخشهای ابتدایی از نام حسابها با استفاده از --drop سودمندتر شوند. $ hledger register --monthly income --drop 1 2008/01 salary $-1 $-1 2008/06 gifts $-1 $-2 با -m DESC/--match=DESC، دستور register یک جستوجوی فازی (fuzzy search) برای یک ثبت (posting) اخیر که شرح آن بیشترین شباهت را به DESC دارد انجام میدهد. DESC باید دستکم شامل دو نویسه باشد. اگر تطابق بهاندازه کافی مشابهی وجود نداشته باشد، هیچ ثبتی نمایش داده نخواهد شد و کد خروج برنامه غیرصفر خواهد بود. خروجی سفارشی register دستور register بهطور معمول از تمام عرض ترمینال (یا ۸۰ ستون اگر نتواند آن را تشخیص دهد) استفاده میکند. میتوانید با گزینهٔ --width/-w این مقدار را تغییر دهید. ستونهای شرح (description) و حساب (account) بهطور معمول فضا را بهطور مساوی تقسیم میکنند (هر کدام حدود نیمی از (width - 40)). میتوانید این مقدار را با افزودن عرض شرح بهعنوان بخشی از آرگومان --width، با کاما جدا شده، تنظیم کنید: --width W,D . در اینجا نموداری آورده شده است (در --help بهدرستی نمایش داده نخواهد شد): <--------------------------------- width (W) ----------------------------------> date (10) description (D) account (W-41-D) amount (12) balance (12) DDDDDDDDDD dddddddddddddddddddd aaaaaaaaaaaaaaaaaaa AAAAAAAAAAAA AAAAAAAAAAAA و چند مثال: $ hledger reg # استفاده از عرض ترمینال (یا ۸۰ در ویندوز) $ hledger reg -w 100 # استفاده از عرض ۱۰۰ $ hledger reg -w 100,40 # تنظیم عرض کلی ۱۰۰، عرض شرح ۴۰ این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، csv، tsv (افزودهشده در 1.32) و json. balancesheet (bs) نمایش موجودیهای پایانی در حسابهای دارایی (asset) و بدهی (liability). مبالغ با علامت مثبت عادی نمایش داده میشوند، همانند صورتهای مالی متداول. گزینهها (Flags): --sum حالت محاسبه: نمایش مجموع مبالغ ثبتها (پیشفرض) --valuechange حالت محاسبه: نمایش کل تغییر ارزش موجودیهای تاریخی پایان دوره (ناشی از واریزها، برداشتها، نوسانات قیمت بازار) --gain حالت محاسبه: نمایش سود/زیان سرمایهای تحققنیافته (ارزش موجودی تاریخی منهای بهای تمامشده) --count حالت محاسبه: نمایش تعداد ثبتها --change حالت تجمیع: تجمیع مبالغ از ابتدای ستون تا انتهای ستون (در گزارشهای چندستونی) --cumulative حالت تجمیع: تجمیع مبالغ از ابتدای گزارش (مشخصشده مثلاً با -b/--begin) تا انتهای ستون -H --historical حالت تجمیع: تجمیع مبالغ از ابتدای دفتر روزنامه تا انتهای ستون (شامل ثبتهای پیش از تاریخ آغاز گزارش) (پیشفرض) -l --flat حالت فهرست/درخت: نمایش حسابها بهصورت یک فهرست مسطح (پیشفرض). مبالغ شامل مبالغ زیرحسابها نمیشوند، مگر در مواردی که عمق حساب محدود شده باشد. -t --tree حالت فهرست/درخت: نمایش حسابها بهصورت درختی. مبالغ شامل مبالغ زیرحسابها میشوند. --drop=N در حالت فهرست، حذف N بخش ابتدایی نام حساب --declared شامل حسابهای تعریفشده غیر والد (بهترین حالت استفاده همراه با -E) -A --average نمایش یک ستون میانگین ردیف (در گزارشهای چندستونی) -T --row-total نمایش یک ستون مجموع ردیف (در گزارشهای چندستونی) --summary-only تنها نمایش خلاصههای ردیف (مانند مجموع ردیف، میانگین) (در گزارشهای چندستونی) -N --no-total حذف ردیف مجموع نهایی --no-elide در حالت درختی، عدم ادغام حسابهای والد بدون تغییر --format=FORMATSTR استفاده از این قالب خط سفارشی (در گزارشهای ساده) -S --sort-amount مرتبسازی بر اساس مبلغ بهجای کد/نام حساب -% --percent بیان مقادیر بهصورت درصدی از مجموع هر ستون --layout=ARG نحوه نمایش مبالغ چندکالایی: 'wide[,WIDTH]': تمام کالاها در یک خط 'tall' : هر کالا در یک خط جدید 'bare' : تنها اعداد، نمادها در یک ستون --base-url=URLPREFIX در خروجی html، تولید ابرپیوندها به hledger-web با این پیشوند. (معمولاً URL پایهای که توسط hledger-web نشان داده میشود؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt، html، csv، tsv، json. -o --output-file=FILE نوشتن خروجی در FILE. یک پسوند فایل که با یکی از قالبهای بالا مطابقت داشته باشد آن قالب را انتخاب میکند. این دستور یک ترازنامه را نمایش میدهد که موجودیهای پایانی تاریخی حسابهای دارایی و بدهی را نشان میدهد. (برای دیدن حقوق صاحبان سهام نیز، از دستور balancesheetequity استفاده کنید.) حسابهای تعریفشده با نوع Asset، Cash یا Liability نمایش داده میشوند (انواع حساب را ببینید). یا اگر چنین حسابهایی تعریف نشده باشند، حسابهای سطح بالایی با نام asset یا liability (غیرحساس به حروف بزرگ و کوچک، حالتهای جمع مجاز است) و زیرحسابهای آنها را نشان میدهد. مثال: $ hledger balancesheet Balance Sheet 2008-12-31 || 2008-12-31 ====================++============ Assets || --------------------++------------ assets:bank:saving || $1 assets:cash || $-2 --------------------++------------ || $-1 ====================++============ Liabilities || --------------------++------------ liabilities:debts || $-1 --------------------++------------ || $-1 ====================++============ Net: || 0 این دستور نوعی سطحبالاتر از دستور balance است و از بسیاری از ویژگیهای آن دستور، مانند گزارشهای چنددورهای پشتیبانی میکند. مشابه hledger balance -H assets liabilities است، اما با تشخیص هوشمندانهتر حسابها و نمایش بدهیها با علامت معکوسشده. این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، csv، tsv (افزودهشده در 1.32)، html و json..SS balancesheetequity (bse) این دستور یک ترازنامه را نمایش میدهد و ماندههای پایانی تاریخی حسابهای دارایی، بدهی و سرمایه را نشان میدهد. مبالغ با علامت مثبت عادی نمایش داده میشوند، همانند صورتهای مالی متداول. پرچمها: --sum حالت محاسبه: نمایش مجموع مبالغ ثبتها (پیشفرض) --valuechange حالت محاسبه: نمایش کل تغییر ارزش ماندههای تاریخی پایان دوره (ناشی از واریزها، برداشتها، نوسانات قیمت بازار) --gain حالت محاسبه: نمایش سود/زیان سرمایهای تحققنیافته (ارزش مانده تاریخی منهای بهای تمامشده) --count حالت محاسبه: نمایش تعداد ثبتها --change حالت انباشت: انباشت مبالغ از آغاز ستون تا پایان ستون (در گزارشهای چندستونی) --cumulative حالت انباشت: انباشت مبالغ از آغاز گزارش (تعیینشده مثلاً با -b/--begin) تا پایان ستون -H --historical حالت انباشت: انباشت مبالغ از آغاز دفتر روزنامه تا پایان ستون (شامل ثبتهای پیش از تاریخ آغاز گزارش) (پیشفرض) -l --flat حالت فهرست/درخت: نمایش حسابها به صورت فهرست همسطح (پیشفرض). مبالغ شامل مبالغ زیرحسابها نمیشوند، مگر در جایی که عمق حساب محدود شده باشد. -t --tree حالت فهرست/درخت: نمایش حسابها به صورت درختی. مبالغ شامل مبالغ زیرحسابها میشوند. --drop=N در حالت فهرست، حذف N بخش ابتدایی نام حساب --declared شامل کردن حسابهای تعریفشدهٔ غیروالد (بهترین کاربرد با -E) -A --average نمایش یک ستون میانگین سطر (در گزارشهای چندستونی) -T --row-total نمایش یک ستون مجموع سطر (در گزارشهای چندستونی) --summary-only تنها نمایش خلاصههای سطر (مثلاً مجموع سطر، میانگین) (در گزارشهای چندستونی) -N --no-total حذف سطر مجموع نهایی --no-elide در حالت درختی، فشرده نکردن حسابهای والد میانی --format=FORMATSTR استفاده از این قالب خط سفارشی (در گزارشهای ساده) -S --sort-amount مرتبسازی بر اساس مبلغ به جای کد/نام حساب -% --percent بیان مقادیر به صورت درصدی از مجموع هر ستون --layout=ARG چگونگی نمایش مبالغ چندکالایی: 'wide[,WIDTH]': همه کالاها در یک خط 'tall' : هر کالا در یک خط جدید 'bare' : فقط اعداد، نمادها در یک ستون --base-url=URLPREFIX در خروجی html، ایجاد ابرپیوندها به hledger-web با این پیشوند. (معمولاً URL پایهٔ نمایشدادهشده با hledger-web؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt, html, csv, tsv, json. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا همخوانی داشته باشد، آن قالب را انتخاب میکند. این گزارش حسابهایی را نشان میدهد که با نوع Asset، Cash، Liability یا Equity تعریف شدهاند (انواع حساب را ببینید). یا اگر چنین حسابهایی تعریف نشده باشند، حسابهای سطح بالایی با نامهای asset، liability یا equity (بدون حساسیت به حروف کوچک و بزرگ، جمع مجاز است) و زیرحسابهای آنها را نشان میدهد. مثال: $ hledger balancesheetequity Balance Sheet With Equity 2008-12-31 || 2008-12-31 ====================++============ Assets || --------------------++------------ assets:bank:saving || $1 assets:cash || $-2 --------------------++------------ || $-1 ====================++============ Liabilities || --------------------++------------ liabilities:debts || $-1 --------------------++------------ || $-1 ====================++============ Equity || --------------------++------------ --------------------++------------ || 0 ====================++============ Net: || 0 این دستور گونهای سطحبالاتر از دستور balance است، و از بسیاری از قابلیتهای آن دستور، مانند گزارشهای چنددورهای پشتیبانی میکند. این دستور مشابه hledger balance -H assets liabilities equity است، اما با تشخیص هوشمندانهتر حسابها، و با معکوس کردن علامت بدهیها و سرمایه (liabilities/equity) برای نمایش. این گزارش سادهترین روش برای بررسی برقراری معادله حسابداری (A+L+E = 0) است (پس از آنکه یک close --retain برای ادغام درآمدها و هزینهها در سرمایه اجرا کردید، و احتمالاً --infer-equity را برای تراز کردن تبدیل ارزها/کالاهای خود افزودید). این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتاند از: txt، csv، tsv، html و json..SS cashflow (cf) این دستور یک صورت جریان وجوه نقد (ساده) را نمایش میدهد که ورودیها و خروجیهای مؤثر بر داراییهای "نقد" (یعنی داراییهای نقدشونده با قابلیت تبدیل آسان) را نشان میدهد. مبالغ با علامت مثبت معمول، همانند صورتهای مالی متداول، نشان داده میشوند. گزینهها: --sum حالت محاسبه: نمایش مجموع مبالغ ثبتی (پیشفرض) --valuechange حالت محاسبه: نمایش کل تغییر ارزش ماندههای تاریخی پایان دوره (ناشی از واریزها، برداشتها، نوسانات قیمت بازار) --gain حالت محاسبه: نمایش سود/زیان سرمایهای تحققنیافته (ارزش مانده تاریخی منهای بهای تمامشده) --count حالت محاسبه: نمایش تعداد ثبتها --change حالت انباشت: انباشت مبالغ از ابتدای ستون تا انتهای ستون (در گزارشهای چندستونی) (پیشفرض) --cumulative حالت انباشت: انباشت مبالغ از ابتدای گزارش (مشخصشده مثلاً توسط -b/--begin) تا انتهای ستون -H --historical حالت انباشت: انباشت مبالغ از ابتدای دفتر روزنامه تا انتهای ستون (شامل ثبتهای پیش از تاریخ شروع گزارش) -l --flat حالت فهرست/درخت: نمایش حسابها به صورت فهرست مسطح (پیشفرض). مبالغ شامل مبالغ زیرحسابها نمیشود، مگر در جایی که عمق حساب محدود شده باشد. -t --tree حالت فهرست/درخت: نمایش حسابها به صورت درختی. مبالغ شامل مبالغ زیرحسابها میشود. --drop=N در حالت فهرست، حذف N بخش ابتدایی نام حساب --declared شامل کردن حسابهای اعلامشده غیروالد (بهترین کاربرد همراه با -E) -A --average نمایش ستون میانگین ردیف (در گزارشهای چندستونی) -T --row-total نمایش ستون مجموع ردیف (در گزارشهای چندستونی) --summary-only تنها نمایش خلاصه ردیفها (مانند مجموع ردیف، میانگین) (در گزارشهای چندستونی) -N --no-total صرفنظر از ردیف نهایی مجموع --no-elide در حالت درختی، عدم ادغام حسابهای والد بدون تراکنش --format=FORMATSTR استفاده از این قالب سفارشی سطر (در گزارشهای ساده) -S --sort-amount مرتبسازی بر اساس مبلغ به جای کد/نام حساب -% --percent بیان مقادیر به صورت درصدی از مجموع هر ستون --layout=ARG نحوه نمایش مبالغ چندکالایی: 'wide[,WIDTH]': همه کالاها در یک سطر 'tall' : هر کالا در یک سطر جدید 'bare' : اعداد خام، نمادها در یک ستون --base-url=URLPREFIX در خروجی html، ایجاد ابرپیوندها به hledger-web با این پیشوند. (معمولاً نشانی پایه نمایشیافته توسط hledger-web؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt, html, csv, tsv, json. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا مطابقت داشته باشد آن قالب را انتخاب میکند. این گزارش حسابهای اعلامشده با نوع Cash را نمایش میدهد (انواع حساب را ببینید). یا اگر چنین حسابهایی اعلام نشده باشند، حسابهایی را نشان میدهد که • 2 زیر یک حساب سطحبالا به نام asset قرار دارند (غیرحساس به حروف بزرگ و کوچک، جمع مجاز است) • 2 نام آنها شامل گونهای از cash، bank، checking یا saving باشد. بهطور دقیقتر: تمامی حسابهایی که با این عبارت باقاعده غیرحساس به حروف بزرگ و کوچک مطابقت دارند: ^assets?(:.+)?:(cash|bank|che(ck|que?)(ing)?|savings?|currentcash)(:|$) و زیرحسابهای آنها. یک نمونه گزارش cashflow: $ hledger cashflow Cashflow Statement 2008 || 2008 ====================++====== Cash flows || --------------------++------ assets:bank:saving || $1 assets:cash || $-2 --------------------++------ || $-1 این دستور گونهای سطحبالاتر از دستور balance است و از بسیاری از ویژگیهای آن دستور، مانند گزارشهای چنددورهای پشتیبانی میکند. مشابه با hledger balance assets not:fixed not:investment not:receivable است، اما با تشخیص هوشمندانهتر حسابها. این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، csv، tsv (اضافهشده در 1.32)، html و json..SS incomestatement (is) نمایش جریانهای ورودی درآمد و خروجیهای هزینه در طول دورهٔ گزارش. مبالغ همانند صورتهای مالی متداول، با علامت مثبتِ عادی نمایش داده میشوند. گزینهها: --sum حالت محاسبه: نمایش مجموع مبالغ ثبتها (پیشفرض) --valuechange حالت محاسبه: نمایش تغییر کل ارزش موجودیهای تاریخی پایان دوره (ناشی از واریزها، برداشتها، نوسانات قیمت بازار) --gain حالت محاسبه: نمایش سود/زیان سرمایهای محققنشده (ارزش موجودی تاریخی منهای بهای تمامشده) --count حالت محاسبه: نمایش تعداد ثبتها --change حالت انباشت: انباشت مبالغ از ابتدای ستون تا انتهای ستون (در گزارشهای چندستونی) (پیشفرض) --cumulative حالت انباشت: انباشت مبالغ از شروع گزارش (مشخصشده مثلاً با -b/--begin) تا انتهای ستون -H --historical حالت انباشت: انباشت مبالغ از ابتدای دفتر روزنامه تا انتهای ستون (شامل ثبتهای پیش از تاریخ شروع گزارش) -l --flat حالت فهرست/درخت: نمایش حسابها بهصورت یک فهرست تخت (پیشفرض). مبالغ شامل مبالغ زیرحسابها نمیشوند، مگر در مواردی که عمق حساب محدود شده باشد. -t --tree حالت فهرست/درخت: نمایش حسابها بهصورت یک درخت. مبالغ شامل مبالغ زیرحسابها میشوند. --drop=N در حالت فهرست، حذف N بخش ابتدایی از نام حساب --declared شامل حسابهای تعریفشدهٔ غیر والد (بهترین کاربرد همراه با -E) -A --average نمایش ستون میانگین سطر (در گزارشهای چندستونی) -T --row-total نمایش ستون مجموع سطر (در گزارشهای چندستونی) --summary-only صرفاً نمایش خلاصههای سطر (مانند مجموع سطر، میانگین) (در گزارشهای چندستونی) -N --no-total حذف سطر مجموع نهایی --no-elide در حالت درختی، حسابهای والد غیرضروری فشرده نشوند --format=FORMATSTR استفاده از این قالب خط سفارشی (در گزارشهای ساده) -S --sort-amount مرتبسازی بر اساس مبلغ بهجای کد/نام حساب -% --percent بیان مقادیر بهصورت درصدی از مجموع هر ستون --layout=ARG نحوهٔ نمایش مبالغ چندکالایی: 'wide[,WIDTH]': تمام کالاها در یک خط 'tall' : هر کالا در یک خط جدید 'bare' : اعداد خالص، نمادها در یک ستون --base-url=URLPREFIX در خروجی html، تولید ابرپیوندها به hledger-web با این پیشوند. (معمولاً نشانی وب پایهٔ نمایشدادهشده توسط hledger-web؛ همچنین میتواند نسبی باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt, html, csv, tsv, json. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا همخوانی داشته باشد، آن قالب را انتخاب میکند. این دستور صورت سود و زیان را نمایش میدهد که درآمدها و هزینهها را در طول یک یا چند دوره نشان میدهد. این دستور حسابهای تعریفشده با نوع Revenue یا Expense را نشان میدهد (انواع حساب را ببینید). یا اگر چنین حسابهایی تعریف نشده باشند، حسابهای سطح بالا با نام revenue، income یا expense (غیرحساس به بزرگی و کوچکی حروف، با امکان استفاده از حالت جمع) و زیرحسابهای آنها را نمایش میدهد. مثال: $ hledger incomestatement Income Statement 2008 || 2008 ===================++====== Revenues || -------------------++------ income:gifts || $1 income:salary || $1 -------------------++------ || $2 ===================++====== Expenses || -------------------++------ expenses:food || $1 expenses:supplies || $1 -------------------++------ || $2 ===================++====== Net: || 0 این دستور یک نگارش سطحبالاتر از دستور balance است و از بسیاری از قابلیتهای آن دستور، مانند گزارشهای چنددورهای پشتیبانی میکند. این دستور شبیه به hledger balance '(revenues|income)' expenses است، اما با تشخیص هوشمندانهتر حسابها، و نمایش درآمدها با علامت معکوسشده. این دستور همچنین از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند. قالبهای خروجی پشتیبانیشده عبارتند از txt، csv، tsv (افزودهشده در 1.32)، html و json..SH "دستورهای گزارشگیری پیشرفته (Advanced report commands)" balance (bal) یک گزارش انعطافپذیر و چندمنظوره برای «جمعبندی» که حسابها را به همراه نوعی از دادههای عددی نمایش میدهد. این دادهها میتوانند تغییرات تراز در هر دوره، ترازهای پایانی، عملکرد بودجه، سود/زیان محققنشدهٔ سرمایه و غیره باشند. گزینهها: --sum حالت محاسبه: نمایش مجموع مقادیر ثبتها (پیشفرض) --valuechange حالت محاسبه: نمایش کل تغییر ارزش ترازهای تاریخی پایان دوره (ناشی از واریزها، برداشتها، نوسانات قیمت بازار) --gain حالت محاسبه: نمایش سود/زیان محققنشدهٔ سرمایه (ارزش تراز تاریخی منهای بهای تمامشده) --budget[=DESCPAT] حالت محاسبه: نمایش مجموع مقادیر ثبتها همراه با اهداف بودجه تعیینشده با تراکنشهای دورهای. با آرگومان DESCPAT (باید با = جدا شود نه با فاصله)، تنها از تراکنشهای دورهای با شرح مطابق استفاده شود (تطابق زیررشته بدون حساسیت به بزرگی و کوچکی حروف). --count حالت محاسبه: نمایش تعداد ثبتها --change حالت تجمیع: انباشت مقادیر از ابتدای ستون تا انتهای ستون (در گزارشهای چندستونه، پیشفرض) --cumulative حالت تجمیع: انباشت مقادیر از آغاز گزارش (تعیینشده مثلاً با -b/--begin) تا انتهای ستون -H --historical حالت تجمیع: انباشت مقادیر از ابتدای دفتر روزنامه تا انتهای ستون (شامل ثبتهای پیش از تاریخ آغاز گزارش) -l --flat حالت فهرست/درخت: نمایش حسابها به صورت فهرستی همسطح (پیشفرض). مبالغ شامل مقادیر زیرحسابها نمیشوند، مگر در جایی که عمق حساب محدود شده باشد. -t --tree حالت فهرست/درخت: نمایش حسابها به صورت درختی. مبالغ شامل مقادیر زیرحسابها میشوند. --drop=N در حالت فهرست، حذف N بخش ابتدایی نام حساب --declared شامل کردن حسابهای اظهارشدهٔ غیر والد (بهترین حالت استفاده همراه با -E) -A --average نمایش ستون میانگین سطر (در گزارشهای چندستونه) -T --row-total نمایش ستون مجموع سطر (در گزارشهای چندستونه) --summary-only تنها نمایش خلاصههای سطر (مانند مجموع سطر، میانگین) (در گزارشهای چندستونه) -N --no-total حذف سطر مجموع پایانی --no-elide در حالت درختی، عدم ادغام حسابهای والد بدون تغییر --format=FORMATSTR استفاده از این قالب خط سفارشی (در گزارشهای ساده) -S --sort-amount مرتبسازی بر اساس مبلغ به جای کد/نام حساب (در حالت همسطح). در صورت چندستونه بودن، بر اساس مجموع سطر یا میانگین سطر (در صورت نمایش) مرتب میشود. -% --percent بیان مقادیر به صورت درصد از کل هر ستون -r --related نمایش حسابهای طرف معامله به جای حساب اصلی --invert نمایش تمامی مبالغ با علامت معکوس --transpose جابهجایی سطرها و ستونها (استفاده از محور زمان عمودی) --layout=ARG نحوه چیدمان مبالغ چندکالایی و جدول کلی: 'wide[,W]': کالاها در همان خط، حداکثر تا عرض W 'tall' : کالاها در خطوط جداگانه 'bare' : نمادهای کالا در ستونی جداگانه 'tidy' : هر فیلد داده در ستون جداگانهٔ خود --base-url=URLPREFIX در خروجی html، ایجاد پیوندها به hledger-web با این پیشوند. (معمولاً نشانی پایهٔ نمایشیافته توسط hledger-web؛ میتواند نسبی نیز باشد.) -O --output-format=FMT انتخاب قالب خروجی. قالبهای پشتیبانیشده: txt, html, csv, tsv, json, fods. -o --output-file=FILE نوشتن خروجی در FILE. پسوند فایلی که با یکی از قالبهای بالا مطابقت داشته باشد، آن قالب را انتخاب میکند. دستور balance یکی از قدیمیترین و همهکارهترین دستورهای hledger برای فهرست کردن تراز حسابها، تغییرات تراز، ارزشها، تغییرات ارزش و موارد دیگر در طول یک یا چند دورهٔ زمانی است. به طور کلی این دستور جدولی را نشان میدهد که سطرهای آن بیانگر حسابها و ستونهای آن بیانگر دورهها هستند. توجه داشته باشید که چند گونه از دستور balance با پیشفرضهای مناسب وجود دارند که استفاده از آنها سادهتر است: balancesheet، balancesheetequity، cashflow و incomestatement. هنگامی که به کنترل بیشتری نیاز دارید، از balance استفاده کنید..SS ویژگیهای balance در اینجا مروری گذرا بر قابلیتهای دستور balance آمده است و بهدنبال آن توضیحات و مثالهای دقیقتر ارائه میشود. بسیاری از این قابلیتها با سایر دستورهای مشابه balance نیز کار میکنند (bs، cf، is..). دستور balance میتواند نمایش دهد.. • 2 حسابها را بهصورت فهرست (-l) یا درخت (-t) • 2 اختیاراً با محدودیت عمق (-[1-9]) • 2 مرتبشده بر اساس ترتیب اعلان و نام، یا بر اساس مقدار ..و.. • 2 تغییرات موجودی آنها را (پیشفرض) • 2 یا تغییرات موجودی واقعی و برنامهریزیشده (--budget) • 2 یا ارزش تغییرات موجودی (-V) • 2 یا تغییر در ارزش موجودیها (--valuechange) • 2 یا سود/زیان سرمایهای تحققنیافته (--gain) • 2 یا تغییرات موجودی ناشی از ثبتهای همتا (--related/-r) • 2 یا تعداد ثبتها (--count) ..در.. • 2 یک دوره زمانی (بهطور پیشفرض کل دوره دفتر روزنامه) • 2 یا دورههای چندگانه (-D، -W، -M، -Q، -Y، -p INTERVAL) ..خواه.. • 2 بهازای هر دوره (پیشفرض) • 2 یا انباشتهشده از تاریخ شروع گزارش (--cumulative) • 2 یا انباشتهشده از زمان ایجاد حساب (--historical/-H) ..احتمالاً تبدیلشده به.. • 2 بهای تمامشده (--value=cost[,COMM]/--cost/-B) • 2 یا ارزش بازار، در تاریخ تراکنشها (--value=then[,COMM]) • 2 یا در پایان دورهها (--value=end[,COMM]) • 2 یا در زمان حال (--value=now) • 2 یا در تاریخی دیگر (--value=YYYY-MM-DD) ..همراه با.. • 2 مجموعها (-T)، میانگینها (-A)، درصدها (-%)، علامت معکوس (--invert) • 2 سطرها و ستونهای جابهجاشده (--transpose) • 2 استفاده از فیلدی دیگر بهعنوان نام حساب (--pivot) • 2 ردیفهای قالببندیشده بهصورت سفارشی (تنها در گزارشهای تکدورهای) (--format) • 2 کالاهای نمایشیافته در یک سطر یا چندین سطر (--layout) این دستور از گزینههای مقصد خروجی و قالب خروجی پشتیبانی میکند، با قالبهای خروجی txt، csv، tsv (اضافهشده در 1.32)، json، و (تنها در گزارشهای چنددورهای:) html، fods (اضافهشده در 1.40). در خروجی txt در پایانههای با قابلیت پشتیبانی از رنگ، مقادیر منفی با رنگ قرمز نمایش داده میشوند..SS "گزارش تراز ساده (Simple balance report)" بدون هیچ آرگومانی، balance فهرستی از همهٔ حسابها و تغییرات تراز آنها را نشان میدهد - یعنی مجموع مبالغ ثبتشده، هم ورودیها و هم خروجیها - در تمام طول دورهٔ دفتر روزنامه. (منظور از "ساده" در اینجا تنها یک ستون از اعداد است که یک دورهٔ منفرد را پوشش میدهد. همچنین میتوانید گزارشهای چنددورهای داشته باشید که جلوتر شرح داده شدهاند.) برای حسابهای دنیای واقعی، این اعداد معمولاً تراز پایانی آنها در پایان دورهٔ دفتر روزنامه خواهند بود؛ در این باره در ادامه بیشتر توضیح داده میشود. حسابها بر اساس ترتیب تعریف (در صورت وجود) و سپس بر اساس الفبا طبق نام حساب مرتب میشوند. به عنوان نمونه (با استفاده از examples/sample.journal): $ hledger -f examples/sample.journal bal $1 assets:bank:saving $-2 assets:cash $1 expenses:food $1 expenses:supplies $-1 income:gifts $-1 income:salary $1 liabilities:debts -------------------- 0 حسابهای با تراز صفر (و بدون زیرحسابهای غیرصفر، در حالت درختی - زیر را ببینید) بهطور پیشفرض پنهان هستند. برای نمایش آنها از -E/--empty استفاده کنید (که در اینجا assets:bank:checking را آشکار میکند): $ hledger -f examples/sample.journal bal -E 0 assets:bank:checking $1 assets:bank:saving $-2 assets:cash $1 expenses:food $1 expenses:supplies $-1 income:gifts $-1 income:salary $1 liabilities:debts -------------------- 0 مجموع مقادیر نشاندادهشده در آخرین خط نمایش داده میشود، مگر آنکه از -N/--no-total استفاده شده باشد. "قالب خط گزارش تراز (Balance report line format)" برای گزارشهای تراز تکدورهای که در ترمینال نمایش داده میشوند (فقط)، میتوانید از --format FMT برای سفارشیسازی قالب و محتوای هر خط استفاده کنید. برای نمونه: $ hledger -f examples/sample.journal balance --format "%20(account) %12(total)" assets $-1 bank:saving $1 cash $-2 expenses $2 food $1 supplies $1 income $-2 gifts $-1 salary $-1 liabilities:debts $1 --------------------------------- 0 رشتهٔ قالب FMT قالببندی اعمالشده روی هر جفت حساب/تراز را مشخص میکند. این رشته میتواند شامل هر متن مناسبی باشد، بهطوری که فیلدهای داده به این صورت درون آن جایگذاری میشوند: %[MIN][.MAX](FIELDNAME) • 2 مقدار MIN حداقل تا این پهنا با فاصله پر میکند (اختیاری) • 2 مقدار MAX در این پهنا برش میزند (اختیاری) • 2 مقدار FIELDNAME باید در پرانتز قرار گیرد و میتواند یکی از موارد زیر باشد: 2 • 2 depth_spacer - تعدادی فاصله برابر با عمق حساب، یا در صورت تعیین شدن MIN، برابر با MIN * عمق، فاصله قرار میدهد. • 2 account - نام حساب • 2 total - تراز/مجموع ثبتشدهٔ حساب، راستچینشده همچنین، FMT میتواند با یک پیشوند اختیاری برای کنترل نحوهٔ رندر مبالغ چندکالایی (multi-commodity) شروع شود: • 2 %_ - رندر در چندین خط، تراز از پایین (پیشفرض) • 2 %^ - رندر در چندین خط، تراز از بالا • 2 %, - رندر در یک خط، با جداکنندهٔ ویرگول برخی رفتارهای خاص وجود دارد. برای نمونه در حالت تکخطی، %(depth_spacer) هیچ تأثیری ندارد، در عوض %(account) دارای تورفتگی توکار است. ممکن است برای رسیدن به نتایج مطلوب به آزمون و خطا نیاز باشد. چند قالب نمونه: • 2 %(total) - مجموع حساب • 2 %-20.20(account) - نام حساب، چپچینشده، پرشده با فاصله تا ۲۰ نویسه و برشخورده در ۲۰ نویسه • 2 %,%-50(account) %25(total) - نام حساب پرشده با فاصله تا ۵۰ نویسه، مجموع پرشده تا ۲۰ نویسه، همراه با رندر چندکالایی در یک خط • 2 %20(total) %2(depth_spacer)%-(account) - قالب پیشفرض برای گزارش تراز تکستونی.SS گزارش تراز فیلترشده میتوانید با استفاده از آرگومانهای پرسوجو (query) یا گزینهها برای محدود کردن ثبتهای (postings) مورد تطبیق، حسابهای کمتری را نمایش دهید، بازه زمانی متفاوتی را بررسی کنید، مجموعها را فقط از تراکنشهای تسویهشده (cleared) نمایش دهید و غیره. برای مثال: $ hledger -f examples/sample.journal bal --cleared assets date:200806 $-2 assets:cash -------------------- $-2 حالت فهرستی یا درختی بهطور پیشفرض، یا با استفاده از -l/--flat، حسابها همانند مثالهای بالا به صورت یک فهرست تخت و با نمایش نام کاملشان ارائه میشوند. با گزینهٔ -t/--tree، سلسلهمراتب حسابها نمایش داده میشود، به طوری که نامهای "برگ" (انتهایی) زیرحسابها با تورفتگی در زیر حساب والد خود قرار میگیرند: $ hledger -f examples/sample.journal balance $-1 assets $1 bank:saving $-2 cash $2 expenses $1 food $1 supplies $-2 income $-1 gifts $-1 salary $1 liabilities:debts -------------------- 0 نکات: • 2 حسابهای "کسلکننده" (boring) برای خروجی فشردهتر با زیرحساب خود ادغام میشوند، مگر اینکه از --no-elide استفاده شود. حسابهای کسلکننده خودشان ترازی ندارند و تنها دارای یک زیرحساب هستند (مانند assets:bank و liabilities در بالا). • 2 تمامی ترازهای نمایش دادهشده "جامع" (inclusive) هستند، یعنی شامل ترازهای همهٔ زیرحسابها نیز میشوند. توجه داشته باشید که این امر موجب مقداری تکرار در خروجی میشود، که هنگام بهاشتراکگذاری گزارشها با کاربرانی که با سیستم حسابداری متنساده (plaintext accounting) آشنایی ندارند نیازمند توضیح است. مجموع نهایی گزارش در حالت درختی، حاصلجمع ترازهای سطح بالا است، نه جمع تمامی ترازهای نشاندادهشده. • 2 هر گروه از حسابهای همسطح (همنیا، یعنی تحت یک والد مشترک) بهطور جداگانه مرتب میشوند. محدود کردن عمق با پرسوجوی depth:NUM، گزینهٔ --depth NUM، یا صرفاً -NUM (مانند: -3)، گزارشهای تراز حسابها را فقط تا عمق تعیینشده نمایش میدهند و زیرحسابهای عمیقتر را پنهان میکنند. این قابلیت برای دریافت یک دید کلی بدون جزئیات بیشازحد مفید است. تراز حسابها در حد عمق تعیینشده، همواره شامل ترازهای زیرحسابهای عمیقتر است (حتی در حالت فهرستی). برای مثال، محدود کردن به عمق ۱: $ hledger -f examples/sample.journal balance -1 $-1 assets $2 expenses $-2 income $1 liabilities -------------------- 0 حذف سطوح بالایی حسابها همچنین میتوانید با استفاده از --drop NUM، یک یا چند بخش از نام حسابهای سطح بالا را پنهان کنید. این قابلیت میتواند برای پنهان کردن نامهای تکراری حسابهای سطح بالا مفید باشد: $ hledger -f examples/sample.journal bal expenses --drop 1 $1 food $1 supplies -------------------- $2 نمایش حسابهای اعلانشده با --declared، حسابهایی که با دستورالعمل account اعلان شدهاند، حتی در صورت نداشتن تراکنش، در گزارش تراز گنجانده میشوند. (از آنجا که این حسابها تراز صفر خواهند داشت، برای مشاهدهٔ آنها به -E/--empty نیز نیاز خواهید داشت.) بهطور دقیقتر، حسابهای اعلانشدهٔ برگ (leaf - بدون زیرحساب) گنجانده خواهند شد، چرا که این حسابها معمولاً در گزارشها کاربردیتر هستند. هدف از این قابلیت، امکان مشاهدهٔ یک گزارش تراز "کامل" و مفید است، حتی زمانی که هنوز در تمام حسابهای اعلانشدهٔ خود تراکنشی ثبت نکردهاید. مرتبسازی بر اساس مقدار با -S/--sort-amount، حسابهای دارای بیشترین (مثبتترین) تراز در ابتدا نمایش داده میشوند. برای مثال: hledger bal expenses -MAS بیشترین میانگین هزینههای ماهانهٔ شما را اول نشان میدهد. هنگامی که بیش از یک کالا (commodity) وجود داشته باشد، ابتدا بر اساس کالایی که از نظر الفبایی زودتر میآید مرتب میشوند، و سپس بر اساس کالاهای بعدی (اگر مقداری فاقد کالا باشد، به عنوان 0 در نظر گرفته میشود). با این حال، ترازهای درآمد و بدهی معمولاً منفی هستند، بنابراین -S این موارد را به ترتیب معکوس نشان میدهد. برای رفع این مشکل، میتوانید --invert را برای معکوس کردن علامتها اضافه کنید. یا میتوانید از یکی از گزارشهای تراز سطح بالاتر (bs، is..) استفاده کنید که علامت را بهطور خودکار معکوس میکنند (مانند: hledger is -MAS). درصدها با -%/--percent، گزارشهای تراز ارزش هر حساب را به صورت درصدی از مجموع (ستون) نشان میدهند. توجه داشته باشید که اگر مقادیر موجود در یک ستون دارای علامتهای مختلف باشند، محاسبهٔ درصدها مفید نخواهد بود. در این حالت، برای هر علامت یک گزارش جداگانه تهیه کنید؛ به عنوان مثال: $ hledger bal -% amt:`>0` $ hledger bal -% amt:`<0` بهطور مشابه، اگر مقادیر موجود در یک ستون شامل کالاهای متعددی باشند، آنها را با -B، -V، -X یا --value به یک کالا تبدیل کنید، یا برای هر کالا یک گزارش جداگانه تهیه نمایید: $ hledger bal -% cur:\\$ $ hledger bal -% cur:€ گزارش تراز چنددورهای با تعیین یک بازهٔ گزارش (توسط پرچمهای -D/--daily، -W/--weekly، -M/--monthly، -Q/--quarterly، -Y/--yearly، یا -p/--period)، دستور balance گزارشی جدولبندیشده نمایش میدهد که ستونهای آن نشاندهندهٔ دورههای زمانی پیاپی هستند (به همراه عنوان): $ hledger -f examples/sample.journal bal --quarterly income expenses -E Balance changes in 2008: || 2008q1 2008q2 2008q3 2008q4 ===================++================================= expenses:food || 0 $1 0 0 expenses:supplies || 0 $1 0 0 income:gifts || 0 $-1 0 0 income:salary || $-1 0 0 0 -------------------++--------------------------------- || $-1 $1 0 0 نکات: • 2 تاریخهای شروع/پایان گزارش در صورت لزوم گسترش مییابند تا زیردورههای نمایشدادهشده را بهطور کامل در بر بگیرند (تا اولین و آخرین زیردوره مدت زمانی برابر با سایر دورهها داشته باشند). • 2 دورههای (ستونهای) ابتدایی و انتهایی که تماماً حاوی مقادیر صفر هستند، نمایش داده نمیشوند مگر اینکه از -E/--empty استفاده شود. • 2 حسابهای (سطرهای) تماماً حاوی صفر نمایش داده نمیشوند مگر اینکه از -E/--empty استفاده شود. • 2 مقادیر دارای کالاهای گوناگون بهشکل کوتاه و خلاصه نمایش داده میشوند، مگر اینکه از --no-elide استفاده شود. • 2 ستونهای میانگین و/یا مجموع را میتوان با پرچمهای -A/--average و -T/--row-total اضافه کرد. • 2 از پرچم --transpose میتوان برای جابهجایی سطرها و ستونها استفاده کرد. • 2 گزینهٔ --pivot FIELD باعث میشود یک فیلد تراکنش دیگر به عنوان "نام حساب" استفاده شود. بخش PIVOTING را ببینید. • 2 پرچم --summary-only (--summary نیز کار میکند) تمام ستونها را بهجز ستونهای Total و Average پنهان میکند (این ستونها باید با --row-total و -A/--average فعال شوند). گزارشهای چنددورهای با دورههای زیاد ممکن است بیش از حد عریض باشند و به راحتی در ترمینال دیده نشوند. در ادامه روشهایی برای رفع این مشکل آمده است: • 2 پنهان کردن سطر مجموع با -N/--no-total • 2 فیلتر کردن روی یک ارز خاص با cur: • 2 تبدیل به یک ارز واحد با -V [--infer-market-price] • 2 استفاده از طرحبندی فشردهتر مانند --layout=bare • 2 بزرگنمایی پنجرهٔ ترمینال (Maximize) • 2 کاهش اندازهٔ قلم ترمینال • 2 مشاهده از طریق یک صفحهبند مانند less؛ برای نمونه: hledger bal -D --color=yes | less -RS • 2 خروجی گرفتن به صورت CSV و استفاده از یک نمایشدهندهٔ CSV مانند visidata (hledger bal -D -O csv | vd -f csv)، حالت csv-mode ایمکس (M-x csv-mode, C-c C-a)، یا یک نرمافزار صفحهگسترده (hledger bal -D -o a.csv && open a.csv) • 2 خروجی گرفتن به فرمت HTML و مشاهده با مرورگر: hledger bal -D -o a.html && open a.html.SS تغییر مانده، مانده پایانی (Balance change, end balance) درک دقیق مفهوم اعداد نمایشدادهشده در گزارشهای balance بسیار مهم است. در اینجا اصطلاحاتی که استفاده میکنیم آورده شده است: یک تغییر مانده (balance change) عبارت است از مقدار خالصی که در طول یک دوره مشخص به یک حساب اضافه یا از آن کسر شده است. یک مانده پایانی (end balance) مقدار انباشتهشده در یک حساب تا یک تاریخ مشخص است (و زمانی معین، اما hledger آن را ذخیره نمیکند؛ پایان روز را در منطقه زمانی خود فرض کنید). این مقدار مجموع تغییرات قبلی مانده است. اگر این مقدار شامل تمام تغییرات مانده از زمان ایجاد حساب باشد، آن را مانده پایانی تاریخی (historical end balance) مینامیم. برای یک حساب در دنیای واقعی، این بدان معناست که با «سوابق تاریخی» مطابقت خواهد داشت، مانند ماندههای گزارششده در صورتحسابهای بانکی یا رابط وب بانک شما. (اگر درست باشند!) بهطور کلی، تغییرات مانده همان چیزی است که هنگام بررسی درآمدها و هزینهها میخواهید ببینید، و ماندههای پایانی تاریخی مواردی هستند که میخواهید هنگام بررسی یا تطبیق حسابهای دارایی، بدهی و سرمایه مشاهده کنید. دستور balance بهطور پیشفرض تغییرات مانده را نشان میدهد. برای مشاهده ماندههای پایانی تاریخی دقیق: "1." 3 ماندههای اولیه حساب را با یک تراکنش «ماندههای افتتاحیه» (opening balances) مقداردهی اولیه کنید (انتقال از سرمایه به حساب)، مگر اینکه دفتر روزنامه کل طول عمر حساب را پوشش دهد. "2." 3 با مشخص نکردن تاریخ شروع گزارش، یا با استفاده از پرچم -H/--historical، تمام ثبتهای پیشین حساب را در گزارش بگنجانید. (-H باعث میشود هنگام جمع بستن ثبتها، تاریخ شروع گزارش نادیده گرفته شود.) حالتهای گزارش تراز (Balance report modes) دستور balance کاملاً انعطافپذیر است؛ در اینجا جزئیات کامل نحوه کنترل آنچه گزارش میدهد آورده شده است. اگر موارد زیر پیچیده به نظر میرسند، نگران نباشید - این بخش برای گزارشگیری پیشرفته است، و آشنایی با تمام حالتهای گزارش نیازمند زمان و آزمایش است. سه گروه گزینه مهم وجود دارد: hledger balance [CALCULATIONMODE] [ACCUMULATIONMODE] [VALUATIONMODE] ... حالت محاسبه (Calculation mode) محاسبه پایهای که باید برای هر سلول جدول انجام شود. یکی از موارد زیر است: • 2 --sum : جمع بستن مقادیر ثبتها (پیشفرض) • 2 --budget : جمع بستن مقادیر، و همچنین نمایش مقدار هدف بودجه (برای هر حساب/دوره) • 2 --valuechange : نمایش تغییر در ارزش ماندههای تاریخی پایان دوره (ناشی از واریزها، برداشتها و/یا نوسانات قیمت بازار) • 2 --gain : نمایش سود/زیان سرمایهای تحققنیافته، (مانده ارزشگذاریشده فعلی منهای بهای تمامشده اولیه هر مقدار) • 2 --count : نمایش تعداد ثبتها حالت انباشت (Accumulation mode) نحوه انباشته شدن مقادیر در زیردورهها/ستونهای یک گزارش. به بیان دیگر: ثبتهای کدام دوره زمانی باید در محاسبه هر سلول مشارکت داشته باشند. یکی از موارد زیر است: • 2 --change : محاسبه با ثبتها از شروع ستون تا پایان ستون، یعنی «فقط همین ستون». معمولاً برای مشاهده درآمدها/هزینهها استفاده میشود. (پیشفرض برای balance، cashflow، incomestatement) • 2 --cumulative : محاسبه با ثبتها از شروع گزارش تا پایان ستون، یعنی «ستونهای قبلی به علاوه این ستون». معمولاً برای نشان دادن تغییرات انباشتهشده از تاریخ شروع گزارش استفاده میشود. چندان پرکاربرد نیست. • 2 --historical/-H : محاسبه با ثبتها از شروع دفتر روزنامه تا پایان ستون، یعنی «تمام ثبتها از قبل از تاریخ شروع گزارش تا پایان این ستون». معمولاً برای مشاهده ماندههای پایانی تاریخیِ داراییها/بدهیها/سرمایه استفاده میشود. (پیشفرض برای balancesheet، balancesheetequity).SS حالت ارزشگذاری (Valuation mode) مشخص میکند که در صورت نیاز، چه نوع تبدیل ارزش یا بهایی باید پیش از نمایش گزارش اعمال شود. برای اطلاعات بیشتر دربارهٔ تبدیلها، بخشهای «Cost reporting» و «Value reporting» را ببینید. حالت ارزشگذاری (یا بها) را میتوان با گزینهٔ --value انتخاب کرد: • 2 بدون تبدیل : به بها یا ارزش تبدیل نمیشود (پیشفرض) • 2 --value=cost[,COMM] : تبدیل مقادیر به بها (سپس در صورت تمایل به کالایی دیگر) • 2 --value=then[,COMM] : تبدیل مقادیر به ارزش بازار در تاریخهای تراکنش • 2 --value=end[,COMM] : تبدیل مقادیر به ارزش بازار در تاریخ(های) پایان دوره 0 (پیشفرض همراه با --valuechange، --gain) • 2 --value=now[,COMM] : تبدیل مقادیر به ارزش بازار در تاریخ امروز • 2 --value=YYYY-MM-DD[,COMM] : تبدیل مقادیر به ارزش بازار در تاریخی دیگر یا با گزینههای موروثی -B/-V/-X که معادل بوده و تایپ کردن آنها آسانتر است: • 2 -B/--cost : مانند --value=cost • 2 -V/--market : مانند --value=end • 2 -X COMM/--exchange COMM : مانند --value=end,COMM توجه داشته باشید که گزینهٔ --value برای راحتی کار میتواند به بها نیز تبدیل کند؛ اما در واقع --cost و --value گزینههای مستقلی هستند و میتوانند با یکدیگر استفاده شوند. ترکیب حالتهای گزارش تراز (Combining balance report modes) بیشتر ترکیبهای این حالتها باید گزارشهای معقولی تولید کنند، اما اگر موردی یافتید که نادرست یا گمراهکننده به نظر میرسد، به ما اطلاع دهید. محدودیتهای زیر اعمال میشوند: • 2 --valuechange مستلزم --value=end است • 2 --valuechange هنگام استفاده با دستورهای balancesheet/balancesheetequity، گزینهٔ --change را پیشفرض قرار میدهد • 2 --cumulative یا --historical گزینهٔ --row-total/-T را غیرفعال میکنند جهت اطلاع، آنچه ترکیبهای انباشت و ارزشگذاری نشان میدهند در اینجا آمده است: tab(@); lw(7.9n) lw(16.4n) lw(16.9n) lw(15.1n) lw(13.7n). T{ ارزشگذاری:> انباشت:v | |||||
| بدون ارزشگذاری | |||||
| T} | --value= then | --value= end | --value= YYYY-MM-DD /now | ||
| --change | تغییرات در دوره | مجموع ارزش بازار در تاریخهای ثبت در دوره | ارزش تغییرات دوره در پایان دوره | ارزش تغییرات دوره در DATE | |
| --cumulative | تغییرات از آغاز گزارش تا پایان دوره | مجموع ارزش بازار در تاریخهای ثبت از آغاز گزارش تا پایان دوره | ارزش تغییرات از آغاز گزارش تا پایان دوره در پایان دوره | ارزش تغییرات از آغاز گزارش تا پایان دوره در DATE | |
| --historical /-H | تغییرات از آغاز دفتر روزنامه تا پایان دوره (ماندهٔ نهایی تاریخی) | مجموع ارزش بازار در تاریخهای ثبت از آغاز دفتر روزنامه تا پایان دوره | ارزش تغییرات از آغاز دفتر روزنامه تا پایان دوره در پایان دوره | ارزش تغییرات از آغاز دفتر روزنامه تا پایان دوره در DATE | |
| گزارش --budget شبیه به یک گزارش تراز معمولی است، اما با دو تفاوت اصلی: | |||||
| • 2 | |||||
| اهداف بودجه و درصدهای عملکرد نیز درون کروشه نمایش داده میشوند | |||||
| • 2 | |||||
| حسابهایی که هدف بودجه ندارند، بهطور پیشفرض پنهان میشوند. | |||||
| این ویژگی برای مقایسهٔ درآمدها، هزینهها، میزان مصرف زمان و موارد دیگر، بین مقادیر برنامهریزیشده و واقعی مفید است. | |||||
| از قوانین تراکنشهای دورهای برای تعریف اهداف بودجه استفاده میشود. | |||||
| بهعنوان مثال، در اینجا یک قانون دورهای آورده شده است که اهداف ماهانه را برای هزینههای اتوبوس و غذا تعیین میکند: | |||||
| ;; Budget | |||||
| ~ monthly | |||||
| (expenses:bus) $30 | |||||
| (expenses:food) $400 | |||||
| پس از ثبت چند هزینهٔ واقعی، | |||||
| ;; Two months worth of expenses | |||||
| 2017-11-01 | |||||
| income $-1950 | |||||
| expenses:bus $35 | |||||
| expenses:food:groceries $310 | |||||
| expenses:food:dining $42 | |||||
| expenses:movies $38 | |||||
| assets:bank:checking | |||||
| 2017-12-01 | |||||
| income $-2100 | |||||
| expenses:bus $53 | |||||
| expenses:food:groceries $380 | |||||
| expenses:food:dining $32 | |||||
| expenses:gifts $100 | |||||
| assets:bank:checking | |||||
| میتوانیم گزارش بودجهای مانند این را ببینیم: | |||||
| $ hledger bal -M --budget | |||||
| Budget performance in 2017-11-01..2017-12-31: | |||||
| || Nov Dec | |||||
| ===============++============================================ | |||||
| <unbudgeted> || $-425 $-565 | |||||
| expenses || $425 [ 99% of $430] $565 [131% of $430] | |||||
| expenses:bus || $35 [117% of $30] $53 [177% of $30] | |||||
| expenses:food || $352 [ 88% of $400] $412 [103% of $400] | |||||
| ---------------++-------------------------------------------- | |||||
| || 0 [ 0% of $430] 0 [ 0% of $430] | |||||
| این روش «بودجهبندی مبتنی بر هدف» ("goal-based budgeting") نامیده میشود؛ شما اهدافی را برای حسابها و دورهها، اغلب بهصورت تکرارشونده، تعیین میکنید و hledger عملکرد را نسبت به این اهداف نشان میدهد. | |||||
| این در مقایسه با «بودجهبندی پاکتی» ("envelope budgeting") است که جزئیتر و سختگیرانهتر بوده و در زمان محدود بودن نقدینگی کارآمد است، اما زحمت بسیار بیشتری دارد. | |||||
| در https://plaintextaccounting.org/Budgeting اطلاعات بیشتری پیرامون این موضوع وجود دارد. | |||||
| استفاده از گزارش بودجه (Using the budget report) | |||||
| از گذشته این گزارش گیجکننده و ناپایدار بوده است. | |||||
| نسخهٔ hledger باید نسبتاً پایدار و قابل درک باشد، اما ممکن است همچنان با موارد پیشبینینشدهای مواجه شوید. | |||||
| در ادامه نکات بیشتری برای کمک به یادگیری و عیبیابی آورده شده است. | |||||
| • 2 | |||||
| در مثال بالا، expenses:bus و expenses:food نشان داده شدهاند زیرا در طول دورهٔ گزارش دارای اهداف بودجه هستند. | |||||
| • 2 | |||||
| حساب والد آنها یعنی expenses نیز نشان داده شده است، همراه با اهداف بودجهای که از حسابهای فرزند تجمیع شدهاند. | |||||
| • 2 | |||||
| زیرحسابهای expenses:food:groceries و expenses:food:dining نمایش داده نمیشوند چرا که هدف بودجهٔ اختصاصی ندارند، اما در مقدار واقعی expenses:food سهیم هستند. | |||||
| • 2 | |||||
| حسابهای بدون بودجهٔ expenses:movies و expenses:gifts نیز نشان داده نمیشوند، اما در مقدار واقعی expenses مشارکت دارند. | |||||
| • 2 | |||||
| سایر حسابهای بدون بودجه یعنی income و assets:bank:checking تحت عنوان <unbudgeted> دستهبندی میشوند. | |||||
| • 2 | |||||
| میتوان از --depth یا depth: برای محدود کردن عمق گزارش به شیوهٔ معمول استفاده کرد (اما زیرحسابهای بدون بودجه را آشکار نخواهد کرد). | |||||
| • 2 | |||||
| مبالغ همواره شامل زیرحسابها هستند (حتی در حالت -l/--list). | |||||
| • 2 | |||||
| اعدادی که در یک گزارش --budget نمایش داده میشوند، به دلیل حسابهای بدون بودجهٔ پنهانشده، همیشه با جمع کل همخوانی نخواهند داشت؛ این موضوع طبیعی است. | |||||
| میتوان از -E/--empty برای آشکار کردن حسابهای پنهان استفاده کرد. | |||||
| • 2 | |||||
| در قوانین دورهای که برای تنظیم اهداف بودجه به کار میروند، استفاده از ثبتهای نامتوازن (unbalanced postings) کار را راحتتر میکند. | |||||
| • 2 | |||||
| میتوانید گزارشهای بودجه را با پرسوجوهای معمول فیلتر کنید، به عنوان مثال برای تمرکز بر روی حسابهای خاص. | |||||
| محدود کردن آنها صرفاً به هزینهها (expenses) رایج است. | |||||
| (مستثنی کردن حساب <unbudgeted> گاهی دشوار است؛ این موضوع به دلیل رفتارهای پیشبینینشده در تاریخها رخ میدهد که در ادامه شرح داده شده است.) | |||||
| • 2 | |||||
| هنگامی که چندین ارز دارید، ممکن است بخواهید آنها را به یک ارز تبدیل کنید (-X COMM --infer-market-prices) و/یا در هر زمان فقط یکی را نشان دهید (cur:COMM). | |||||
| اگر نیاز دارید چند ارز را همزمان نمایش دهید، --layout bare میتواند مفید باشد. | |||||
| • 2 | |||||
| میتوانید با استفاده از --cumulative مقادیر (واقعی و بودجهبندیشده) را به دورهٔ بعدی انتقال دهید (اصطلاحاً "roll over" کنید). | |||||
| همچنین ببینید: https://hledger.org/budgeting.html.SS موارد غیرمنتظره در تاریخ بودجه | |||||
| با دادههای اندک، یا در زمان شروع کار، ممکن است برخی از تاریخهای تراکنشهای هدف بودجه تولیدشده خارج از دورههای گزارش قرار گیرند. | |||||
| بهعنوان مثال، با دفتر روزنامه (journal) و گزارش زیر، به نظر میرسد دوره اول هیچ بودجهای برای expenses:food ندارد. | |||||
| (همچنین حساب <unbudgeted> باید توسط پرسمان expenses مستثنی میشد، اما نشده است): | |||||
| ~ monthly in 2020 | |||||
| (expenses:food) $500 | |||||
| 2020-01-15 | |||||
| expenses:food $400 | |||||
| assets:checking | |||||
| $ hledger bal --budget expenses | |||||
| Budget performance in 2020-01-15: | |||||
| || 2020-01-15 | |||||
| ===============++==================== | |||||
| <unbudgeted> || $400 | |||||
| expenses:food || 0 [ 0% of $500] | |||||
| ---------------++-------------------- | |||||
| || $400 [80% of $500] | |||||
| در این حالت، تراکنشهای هدف بودجه در روزهای اول ماه تولید میشوند (این موضوع با دستور | |||||
| hledger print --forecast tag:generated expenses قابل مشاهده است). | |||||
| در حالی که دوره گزارش بهطور پیشفرض تنها به روز ۱۵ام ژانویه محدود میشود (این نکته از سرستونهای جدول گزارش مشخص است). | |||||
| برای رفع اینگونه موارد، بازه زمانی گزارش (و/یا تاریخهای قواعد دورهای) را صریحتر مشخص کنید. | |||||
| در این مورد، افزودن -b 2020 مشکل را حل میکند. | |||||
| انتخاب اهداف بودجه | |||||
| بهطور پیشفرض، گزارش بودجه از تمام قواعد تراکنش دورهایِ موجود برای تولید اهداف استفاده میکند. | |||||
| این شامل قواعدی با بازه زمانی متفاوت از گزارش شما نیز میشود. | |||||
| برای مثال، اگر قواعد دورهای روزانه، هفتگی و ماهانه داشته باشید، همه آنها در تعیین اهداف یک گزارش بودجه ماهانه سهیم خواهند بود. | |||||
| میتوانید با ارائه یک آرگومان به پرچم --budget، زیرمجموعهای از قواعد دورهای را انتخاب کنید. | |||||
| گزینه --budget=DESCPAT با تمام قواعد دورهای که توضیحات آنها شامل DESCPAT باشد، بهصورت زیررشتهای و بدون حساسیت به حروف بزرگ و کوچک (نه یک عبارت باقاعده یا پرسمان) مطابقت داده میشود. | |||||
| این بدان معناست که میتوانید به قواعد دورهای خود توضیحاتی اختصاص دهید (به خاطر داشته باشید که بین عبارت دوره و توضیحات دو فاصله لازم است)، و سپس از میان چندین بودجه تعریفشده در دفتر روزنامه خود، مورد دلخواه را انتخاب کنید. | |||||
| بودجهبندی در برابر پیشبینی | |||||
| هر دو گزینه --forecast و --budget از قواعد تراکنشهای دورهای در دفتر روزنامه برای تولید تراکنشهای موقت جهت مقاصد گزارشگیری استفاده میکنند. | |||||
| با این حال، این دو قابلیتهایی مجزا هستند - هرچند در صورت تمایل میتوانید از هر دو بهطور همزمان استفاده کنید. | |||||
| در اینجا برخی از تفاوتهای میان آنها آمده است: | |||||
| tab( | ); | ||||
| lw(38.2n) lw(31.8n). | |||||
| --forecast | --budget | ||||
| یک گزینه عمومی است؛ پیشبینی را در تمام گزارشها فعال میکند | یک گزینه برای دستور balance است؛ حالت بودجه گزارش balance را انتخاب میکند | ||||
| تراکنشهای مرئی تولید میکند که در گزارشها ظاهر میشوند | تراکنشهای نامرئی تولید میکند که مقادیر هدف را میسازند | ||||
| تراکنشهای پیشبینی را از پس از آخرین تراکنش عادی تا پایان دوره گزارش تولید میکند؛ یا با آرگومان --forecast=PERIODEXPR آنها را در سراسر دوره مشخصشده تولید میکند (در هر دو حالت، بهطور اختیاری توسط دورههای مشخصشده در قواعد تراکنش دورهای محدود میشود) | تراکنشهای هدف بودجه را در سراسر دوره گزارش تولید میکند (بهطور اختیاری توسط دورههای مشخصشده در قواعد تراکنش دورهای محدود میشود) | ||||
| از تمام قواعد دورهای استفاده میکند | از تمام قواعد دورهای استفاده میکند؛ یا با آرگومان --budget=DESCPAT تنها از قواعدی که با DESCPAT مطابقت دارند استفاده میکند | ||||
| گزینهٔ --layout بر نحوهٔ نمایش مقادیر چندکالایی و نمادهای | |||||
| کالا توسط balance و سایر دستورهای مشابه تراز تأثیر میگذارد. | |||||
| این گزینه میتواند خوانایی را برای انسانها و/یا ماشینها (سایر نرمافزارها) بهبود بخشد. | |||||
| چهار مقدار ممکن برای آن وجود دارد: | |||||
| • 2 | |||||
| --layout=wide[,WIDTH]: کالاها در یک سطر واحد نمایش داده میشوند، و | |||||
| بهصورت اختیاری تا WIDTH کوتاه (خلاصه) میشوند | |||||
| • 2 | |||||
| --layout=tall: هر کالا در یک سطر جداگانه نمایش داده میشود | |||||
| • 2 | |||||
| --layout=bare: نمادهای کالا در ستون اختصاصی خود قرار میگیرند و | |||||
| مقادیر بهصورت اعداد خالص هستند | |||||
| • 2 | |||||
| --layout=tidy: دادهها به شکل "tidy" (مرتب) با استفادهٔ آسان، | |||||
| با یک سطر به ازای هر مقدار داده، نرمالسازی میشوند. | |||||
| (این حالت در حال حاضر تنها توسط دستور balance پشتیبانی میشود.) | |||||
| حالتهای --layout پشتیبانیشده توسط هر قالب خروجی در ادامه آورده شده است. | |||||
| تنها خروجی CSV از همهٔ آنها پشتیبانی میکند: | |||||
| tab( | ); | ||||
| l l l l l l. | |||||
| - | txt | csv | html | json | sql |
| wide | Y | Y | Y | ||
| tall | Y | Y | Y | ||
| bare | Y | Y | Y | ||
| tidy | Y |
مثالها:.SS "چیدمان عریض (Wide layout)" در صورت وجود کالاهای متعدد، گزارشها میتوانند بسیار عریض شوند:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -T -Y --layout=wide Balance changes in 2012-01-01..2014-12-31: || 2012 2013 2014 Total ==================++==================================================================================================================================================================================================================== Assets:US:ETrade || 10.00 ITOT, 337.18 USD, 12.00 VEA, 106.00 VHT 70.00 GLD, 18.00 ITOT, -98.12 USD, 10.00 VEA, 18.00 VHT -11.00 ITOT, 4881.44 USD, 14.00 VEA, 170.00 VHT 70.00 GLD, 17.00 ITOT, 5120.50 USD, 36.00 VEA, 294.00 VHT ------------------++-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- || 10.00 ITOT, 337.18 USD, 12.00 VEA, 106.00 VHT 70.00 GLD, 18.00 ITOT, -98.12 USD, 10.00 VEA, 18.00 VHT -11.00 ITOT, 4881.44 USD, 14.00 VEA, 170.00 VHT 70.00 GLD, 17.00 ITOT, 5120.50 USD, 36.00 VEA, 294.00 VHT
تعیین محدودیت عرض، پهنا را کاهش میدهد، اما برخی از کالاها پنهان خواهند شد:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -T -Y --layout=wide,32 Balance changes in 2012-01-01..2014-12-31: || 2012 2013 2014 Total ==================++=========================================================================================================================== Assets:US:ETrade || 10.00 ITOT, 337.18 USD, 2 more.. 70.00 GLD, 18.00 ITOT, 3 more.. -11.00 ITOT, 3 more.. 70.00 GLD, 17.00 ITOT, 3 more.. ------------------++--------------------------------------------------------------------------------------------------------------------------- || 10.00 ITOT, 337.18 USD, 2 more.. 70.00 GLD, 18.00 ITOT, 3 more.. -11.00 ITOT, 3 more.. 70.00 GLD, 17.00 ITOT, 3 more..
چیدمان طولی (Tall layout)
هر کالا در یک سطر جدید قرار میگیرد (که ممکن است در هر ستون متفاوت باشد) و نامهای حساب تکرار میشوند:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -T -Y --layout=tall Balance changes in 2012-01-01..2014-12-31: || 2012 2013 2014 Total ==================++================================================== Assets:US:ETrade || 10.00 ITOT 70.00 GLD -11.00 ITOT 70.00 GLD Assets:US:ETrade || 337.18 USD 18.00 ITOT 4881.44 USD 17.00 ITOT Assets:US:ETrade || 12.00 VEA -98.12 USD 14.00 VEA 5120.50 USD Assets:US:ETrade || 106.00 VHT 10.00 VEA 170.00 VHT 36.00 VEA Assets:US:ETrade || 18.00 VHT 294.00 VHT ------------------++-------------------------------------------------- || 10.00 ITOT 70.00 GLD -11.00 ITOT 70.00 GLD || 337.18 USD 18.00 ITOT 4881.44 USD 17.00 ITOT || 12.00 VEA -98.12 USD 14.00 VEA 5120.50 USD || 106.00 VHT 10.00 VEA 170.00 VHT 36.00 VEA || 18.00 VHT 294.00 VHT
چیدمان ساده (Bare layout)
نمادهای کالا در یک ستون نگه داشته میشوند، هر کالا ردیف مخصوص به خود را دارد، مبالغ صرفاً عدد خام هستند و نامهای حساب تکرار میشوند:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -T -Y --layout=bare Balance changes in 2012-01-01..2014-12-31: || Commodity 2012 2013 2014 Total ==================++============================================= Assets:US:ETrade || GLD 0 70.00 0 70.00 Assets:US:ETrade || ITOT 10.00 18.00 -11.00 17.00 Assets:US:ETrade || USD 337.18 -98.12 4881.44 5120.50 Assets:US:ETrade || VEA 12.00 10.00 14.00 36.00 Assets:US:ETrade || VHT 106.00 18.00 170.00 294.00 ------------------++--------------------------------------------- || GLD 0 70.00 0 70.00 || ITOT 10.00 18.00 -11.00 17.00 || USD 337.18 -98.12 4881.44 5120.50 || VEA 12.00 10.00 14.00 36.00 || VHT 106.00 18.00 170.00 294.00
چیدمان bare خروجی CSV را نیز تحت تأثیر قرار میدهد، که برای تولید دادههایی با پردازش و استفادهٔ آسانتر (مثلاً برای رسم نمودارها) سودمند است:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -O csv --layout=bare "account","commodity","balance" "Assets:US:ETrade","GLD","70.00" "Assets:US:ETrade","ITOT","17.00" "Assets:US:ETrade","USD","5120.50" "Assets:US:ETrade","VEA","36.00" "Assets:US:ETrade","VHT","294.00" "Total:","GLD","70.00" "Total:","ITOT","17.00" "Total:","USD","5120.50" "Total:","VEA","36.00" "Total:","VHT","294.00"
چیدمان bare گاهی اوقات به دلیل مقادیر صفر، یک سطر اضافی برای کالاهای بدون نماد (no-symbol) نمایش میدهد (معمولاً hledger مقادیر صفر را بدون کالا در نظر میگیرد). این موضوع میتواند باعث ایجاد خطای گیجکننده در hledger-bar شود (راهکار: اضافه کردن یک پرسوجوی cur: برای حذف سطر بدون نماد)..SS چیدمان مرتب (Tidy layout) این مورد "tidy data" نرمالسازیشده تولید میکند (ببینید: https://cran.r-project.org/web/packages/tidyr/vignettes/tidy-data.html) که در آن هر متغیر ستون مخصوص به خود را دارد و هر سطر نمایانگر یک نقطه داده تکی است. این سادهترین نوع داده برای پردازش توسط سایر نرمافزارها است:
-
$ hledger -f examples/bcexample.hledger bal assets:us:etrade -3 -Y -O csv --layout=tidy "account","period","start_date","end_date","commodity","value" "Assets:US:ETrade","2012","2012-01-01","2012-12-31","GLD","0" "Assets:US:ETrade","2012","2012-01-01","2012-12-31","ITOT","10.00" "Assets:US:ETrade","2012","2012-01-01","2012-12-31","USD","337.18" "Assets:US:ETrade","2012","2012-01-01","2012-12-31","VEA","12.00" "Assets:US:ETrade","2012","2012-01-01","2012-12-31","VHT","106.00" "Assets:US:ETrade","2013","2013-01-01","2013-12-31","GLD","70.00" "Assets:US:ETrade","2013","2013-01-01","2013-12-31","ITOT","18.00" "Assets:US:ETrade","2013","2013-01-01","2013-12-31","USD","-98.12" "Assets:US:ETrade","2013","2013-01-01","2013-12-31","VEA","10.00" "Assets:US:ETrade","2013","2013-01-01","2013-12-31","VHT","18.00" "Assets:US:ETrade","2014","2014-01-01","2014-12-31","GLD","0" "Assets:US:ETrade","2014","2014-01-01","2014-12-31","ITOT","-11.00" "Assets:US:ETrade","2014","2014-01-01","2014-12-31","USD","4881.44" "Assets:US:ETrade","2014","2014-01-01","2014-12-31","VEA","14.00" "Assets:US:ETrade","2014","2014-01-01","2014-12-31","VHT","170.00"
خروجی گزارش تراز (Balance report output)
همانطور که در «قالب خروجی» (Output format) اشاره شد، اگر خروجی HTML را انتخاب کنید (با استفاده از -O html یا -o somefile.html)، میتوانید یک فایل hledger.css در همان دایرکتوری ایجاد کنید تا ظاهر گزارش را شخصیسازی نمایید.
قالبهای خروجی HTML و FODS میتوانند برای هر حساب و دوره، ابرپیوندهایی به نمای دفترکل در hledger-web ایجاد کنند. برای مثال، اگر سرور hledger-web شما در http://localhost:5000 در دسترس باشد، میتوانید دستور balance را با گزینه اضافی --base-url=http://localhost:5000 اجرا کنید. (همچنین میتوانید پیوندهای نسبی ایجاد کنید، مانند --base-url="some/path" یا --base-url="".)
برخی گزارشهای مفید balance (Some useful balance reports)
برخی از گزینهها/گزارشهای پرکاربرد balance عبارتند از:
- •
- bal -M revenues expenses
نمایش درآمدها/هزینهها در هر ماه. همچنین از طریق دستور incomestatement در دسترس است.
- •
- bal -M -H assets liabilities
نمایش تراز تاریخی داراییها/بدهیها در پایان هر ماه. همچنین از طریق دستور balancesheet در دسترس است.
- •
- bal -M -H assets liabilities equity
نمایش تراز تاریخی داراییها/بدهیها/سرمایه در پایان هر ماه. همچنین از طریق دستور balancesheetequity در دسترس است.
- •
- bal -M assets not:receivable
نمایش تغییرات داراییهای نقدی در هر ماه. همچنین از طریق دستور cashflow در دسترس است.
همچنین:
- •
- bal -M expenses -2 -SA
نمایش هزینههای ماهانه خلاصهشده تا عمق ۲ و مرتبشده بر اساس میانگین مقدار.
- •
- bal -M --budget expenses
نمایش هزینههای ماهانه و اهداف بودجه.
- •
- bal -M --valuechange investments
نمایش تغییرات ماهانه در ارزش بازار داراییهای سرمایهگذاری.
- •
- bal investments --valuechange -D date:lastweek amt:'>1000' -STA [--invert]
نمایش بیشترین سودها [یا زیانها] در هفته گذشته.SS roi نرخ بازده وزنی-زمانی (TWR) و وزنی-پولی (IRR) را برای سرمایهگذاریهای شما نمایش میدهد.
-
Flags: --cashflow show all amounts that were used to compute returns --investment=QUERY query to select your investment transactions --profit-loss=QUERY --pnl query to select profit-and-loss or appreciation/valuation transactions
در کمترین حالت، باید یک پرسوجو (که میتواند صرفاً یک نام حساب باشد) با --inv برای انتخاب سرمایهگذاری(ها) و پرسوجویی دیگر با --pnl برای مشخص کردن تراکنشهای سود و زیان خود ارائه دهید.
اگر تغییرات در ارزش سرمایهگذاری خود را به صورت دستی ثبت نمیکنید، یا نیازی به محاسبهٔ بازده وزنی-زمانی (TWR) ندارید، --pnl میتواند یک پرسوجوی خالی باشد (--pnl "" یا --pnl STR که در آن STR با هیچیک از حسابهای شما مطابقت ندارد).
این دستور نرخ بازده داخلی (IRR، همچنین شناختهشده با عنوان نرخ بازده وزنی-پولی) و نرخ بازده وزنی-زمانی (TWR) را برای سرمایهگذاریهای شما در بازهٔ زمانی درخواستی محاسبه و نمایش میدهد. به دلیل نحوهٔ محاسبه، IRR همواره سالانه میشود، اما TWR هم به صورت یک نرخ در طول دورهٔ گزارشگیری انتخابشده و هم به عنوان یک نرخ سالانه گزارش میشود.
در صورت ارائهٔ پرچمهای مناسب --cost یا --value، دستورالعملهای قیمت لحاظ خواهند شد (بخش VALUATION را ببینید).
توجه داشته باشید که در برخی موارد این گزارش ممکن است به دلایل زیر ناموفق باشد:
- خطای Error (NotBracketed): راهحلی برای نرخ بازده داخلی (IRR) یافت نشد. علل احتمالی: مقدار IRR بسیار بزرگ است (>1000000%)، موجودی سرمایهگذاری در مقطعی از زمان منفی میشود.
- خطای Error (SearchFailed): یافتن راهحل برای نرخ بازده داخلی (IRR) با شکست مواجه شد. یا جستوجو به یک راهحل همگرا نمیشود، یا بسیار کند همگرا میشود.
مثالها:
- استفاده از roi برای محاسبهٔ بازده کل سرمایهگذاری در سهام: https://github.com/simonmichael/hledger/blob/master/examples/investing/roi-unrealised.ledger
- Cookbook > Return on Investment: https://hledger.org/roi.html
فاصلهها و نویسههای خاص در --inv و --pnl
توجه داشته باشید که آرگومان --inv و --pnl یک پرسوجو است، و پرسوجوها میتوانند شامل چندین عبارت جداشده با فاصله باشند (بخش QUERIES را ببینید).
برای مشخص کردن اینکه همهٔ عبارتهای جستوجو یک آرگومان واحد خط فرمان را تشکیل میدهند، باید آنها را داخل نقلقول قرار دهید (بخش Special characters را ببینید):
-
$ hledger roi --inv 'term1 term2 term3 ...'
اگر هر یک از عبارتهای پرسوجو خود حاوی فاصله باشند، به یک سطح اضافی از نقلقول تودرتو نیاز خواهید داشت، برای مثال:
-
$ hledger roi --inv="'Assets:Test 1'" --pnl="'Equity:Unrealized Profit and Loss'"
معناشناسی --inv و --pnl
پرسوجوی ارائهشده به --inv باید با تمام تراکنشهای مرتبط با سرمایهگذاری شما مطابقت داشته باشد. تراکنشهایی که با --inv تطابق ندارند نادیده گرفته خواهند شد.
در این تراکنشها، ROI ثبتهایی (postings) را که با --inv مطابقت دارند بهعنوان "ثبتهای سرمایهگذاری" در نظر میگیرد و سایر ثبتها (که با --inv مطابقت ندارند) به دو دسته تفکیک میشوند: "جریان وجوه نقد" و "سود و زیان"؛ چرا که ROI باید بداند کدام بخش از ارزش سرمایهگذاری مربوط به آوردههای شماست و کدام بخش ناشی از بازده سرمایهگذاری است.
- •
- "جریان وجوه نقد" عبارت است از واریز یا برداشت پول، خرید یا فروش داراییها، یا هرگونه تبدیل دیگر بین کالای سرمایهگذاری شما و هر کالای دیگر. مثال:
-
2019-01-01 Investing in Snake Oil assets:cash -$100 investment:snake oil 2020-01-01 Selling my Snake Oil assets:cash $10 investment:snake oil = 0
- •
- "سود و زیان" تغییر در ارزش سرمایهگذاری شما است:
-
2019-06-01 Snake Oil falls in value investment:snake oil = $57 equity:unrealized profit or loss
تمام ثبتهای غیرسرمایهگذاری "جریان وجوه نقد" فرض میشوند، مگر اینکه با پرسوجوی --pnl مطابقت داشته باشند. تغییرات در ارزش سرمایهگذاری شما ناشی از ثبتهای "سود و زیان" بهعنوان بخشی از بازده سرمایهگذاری شما لحاظ خواهد شد.
مثال: اگر از --inv snake --pnl equity:unrealized استفاده کنید، آنگاه ثبتها در مثال زیر به این صورت طبقهبندی میشوند:
-
2019-01-01 Snake Oil #1 assets:cash -$100 ; cash flow posting investment:snake oil ; investment posting 2019-03-01 Snake Oil #2 equity:unrealized pnl -$100 ; profit and loss posting snake oil ; investment posting 2019-07-01 Snake Oil #3 equity:unrealized pnl ; profit and loss posting cash -$100 ; cash flow posting snake oil $50 ; investment posting "ROI" مخفف "بازگشت سرمایه" (return on investment) است. بهطور سنتی، این مقدار به صورت تفاوت میان ارزش فعلی سرمایهگذاری و ارزش اولیه آن محاسبه میشد و به صورت درصدی از ارزش اولیه بیان میگردید.
با این حال، این رویکرد تنها در موارد ساده کاربرد دارد، جایی که سرمایهگذاری هیچگونه جریان ورودی یا خروجی پول دریافت نمیکند و نرخ رشد در طول زمان ثابت است. برای سناریوهای پیچیدهتر، به روشهای متفاوتی برای محاسبه نرخ بازده نیاز دارید، و این دستور دو مورد از آنها را پیادهسازی میکند: IRR و TWR.
نرخ بازده داخلی، یا "IRR" (که "نرخ بازده وزنی-پولی" نیز نامیده میشود) اثرات جریانهای ورودی و خروجی و زمان بین آنها را در نظر میگیرد. سرمایهگذاری با یک نرخ بهره ثابت مشخص، بهره بیشتری نسبت به همان مقدار سرمایهگذاریشده با همان نرخ بهره ولی در زمانی دیرتر، برای شما به همراه خواهد داشت. اگر از سرمایهگذاری خود برداشت کنید، سودهای آتی شما (در ارقام مطلق) کمتر خواهد بود و درصد کمتری از سرمایهگذاری اولیه شما را تشکیل میدهد، بنابراین IRR شما کمتر خواهد شد. و اگر به سرمایهگذاری خود بیفزایید، سودهای مطلق بزرگتری دریافت خواهید کرد که درصد بیشتری از سرمایهگذاری اولیه شما خواهد بود، بنابراین IRR شما بزرگتر خواهد شد.
همانطور که پیشتر ذکر شد، جریانهای ورودی و خروجی شامل هرگونه وجه نقدی است که شخصاً وارد یا برداشت میکنید، و برای دستور "roi"، اینها ثبتهایی (postings) هستند که با پرسوجوی آرگومان --inv مطابقت داشته و با پرسوجوی آرگومان --pnl مطابقت ندارند.
اگر تغییرات ارزش سرمایهگذاری خود را به صورت دستی و در قالب تراکنشهایی ثبت میکنید که آنها را در برابر حساب "سود و زیان" (یا "سودهای تحققنیافته") تراز میکند یا از دستورالعملهای قیمت (price directives) استفاده میکنید، برای اینکه IRR اثر دقیق جریانهای ورودی و خروجی شما را بر نرخ بازده محاسبه کند، باید ارزش سرمایهگذاری خود را در همان روزها یا نزدیک به روزهایی که ورود یا خروج پول رخ میدهد ثبت نمایید.
از نظر فنی، IRR از همان رویکرد محاسبه ارزش خالص فعلی استفاده میکند و تلاش میکند تا نرخ تنزیلی را بیابد که مجموع ارزش خالص فعلی تمام جریانهای نقدی سرمایهگذاری شما را برابر با صفر کند.
درک این موضوع ممکن است دشوار باشد، بهویژه اگر قبلاً تحلیل جریان نقدی تنزیلشده را انجام نداده باشید.
پیادهسازی IRR در hledger باید نتایجی مطابق با فرمول =XIRR در Excel تولید کند.
دومین روش برای محاسبه نرخ بازده که دستور roi پیادهسازی میکند، "نرخ بازده وزنی-زمانی" یا "TWR" نامیده میشود.
مانند IRR، این روش اثر جریانهای ورودی و خروجی شما را در نظر میگیرد، اما بر خلاف IRR تلاش میکند تا نرخ بازده واقعی دارایی مبنا را با خنثی کردن اثری که واریزها و برداشتها بر نرخ رشد ظاهری سرمایهگذاری شما میگذارند، محاسبه نماید.
روش TWR سرمایهگذاری شما را مانند یک "صندوق سرمایهگذاری واحدی" فرضی نشان میدهد که در آن جریانهای ورودی/خروجی منجر به خرید یا فروش "واحدها"ی سرمایهگذاری شما شده و تغییرات ارزش آن، ارزش "واحد سرمایهگذاری" را تغییر میدهد. تغییر در "قیمت هر واحد" در طول دوره گزارش، نرخ بازده سرمایهگذاریتان را به شما میدهد و حساسیت TWR را نسبت به اثرات جریانهای نقدی ورودی و خروجی در مقایسه با IRR کمتر میکند.
منابع:
-
توضیح نرخ بازده
-
توضیح IRR
-
توضیح TWR
-
مقایسه IRR و TWR
-
مثالهایی از محاسبه IRR و TWR و بحث درباره محدودیتهای هر دو معیار
دستورهای نمودار (CHART COMMANDS)
activity
نمایش یک نمودار میلهای اسکی از تعداد ثبتها (postings) در هر بازه زمانی.
-
Flags: no command-specific flags
دستور activity یک هیستوگرام اسکی را نمایش میدهد که تعداد تراکنشها را بر اساس روز، هفته، ماه یا سایر بازههای گزارشدهی نشان میدهد (پیشفرض روزانه است). با آرگومانهای پرسوجو، این دستور تنها تراکنشهای مطابقتیافته را میشمارد.
مثالها:
-
$ hledger activity --quarterly 2008-01-01 ** 2008-04-01 ******* 2008-07-01 2008-10-01 **
close
(equity)
دستور close چندین نوع از تراکنشهای «بستن» و/یا «باز کردن» را چاپ میکند که در موقعیتهای گوناگونی کاربرد دارند: انتقال ترازها به یک فایل دفتر روزنامه جدید، انتقال سود انباشته به حقوق صاحبان سهام (equity)، تجمیع ترازها، مشاهده بهای تمامشده دستهها (lot costs)... مانند print، این دستور ثبتهای معتبر دفتر روزنامه را چاپ میکند. میتوانید پس از اطمینان و رضایت از نحوه نمایش آنها، آنها را در فایل(های) دفتر روزنامه خود کپی کنید.
-
Flags: --clopen[=TAGVAL] نمایش تراکنشهای ترازهای بستن و باز کردن، بهطور پیشفرض برای حسابهای AL --close[=TAGVAL] تنها نمایش یک تراکنش ترازهای بستن --open[=TAGVAL] تنها نمایش یک تراکنش ترازهای باز کردن --assert[=TAGVAL] نمایش یک تراکنش اعلانهای تراز (balance assertions) --assign[=TAGVAL] نمایش یک تراکنش تخصیصهای تراز (balance assignments) --retain[=TAGVAL] نمایش یک تراکنش سود انباشته، بهطور پیشفرض برای حسابهای RX -x --explicit نمایش صریح تمام مبالغ --show-costs نمایش جداگانه مبالغ با هزینههای متفاوت --interleaved نمایش همزمان ثبتهای مبدأ و مقصد در کنار یکدیگر --assertion-type=TYPE =* یا ==* ،== ،= --close-desc=DESC تنظیم شرح تراکنش بستن --close-acct=ACCT تنظیم حساب مقصد تراکنش بستن --open-desc=DESC تنظیم شرح تراکنش باز کردن --open-acct=ACCT تنظیم حساب مبدأ تراکنش باز کردن --round=TYPE چه میزان گرد کردن یا فاصلهگذاری هنگام نمایش مبالغ باید انجام شود؟ none - نمایش ارقام اعشاری اصلی، همانطور که در دفتر روزنامه است (پیشفرض) soft - فقط افزودن یا حذف صفرهای اعشاری جهت تطابق با دقت (precision) hard - گرد کردن مبالغ ثبت به میزان دقت (میتواند تراز تراکنش را برهم زند) all - همچنین گرد کردن مبالغ هزینه به میزان دقت (میتواند تراز تراکنش را برهم زند)
دستور close دارای شش حالت است که با انتخاب یکی از پرچمهای حالت تعیین میشوند: --clopen، --close (پیشفرض)، --open، --assert، --assign، یا --retain. همه آنها نوع یکسانی از عملیات را انجام میدهند، اما با مقادیر پیشفرض متفاوت برای موقعیتهای گوناگون.
ثبتهای دفتر روزنامه تولیدشده توسط close دارای یک برچسب clopen: خواهند بود که هنگام تمایل به مستثنی کردن آنها از گزارشها مفید است. اگر نام فایل اصلی دفتر روزنامه شامل یک عدد باشد، مقدار برچسب همان نام پایه فایل با یک واحد افزایش عدد خواهد بود. بهعنوان مثال، اگر فایل دفتر روزنامه 2025.journal باشد، برچسب clopen:2026 خواهد بود. یا میتوانید مقدار برچسب را با ارائه یک آرگومان به پرچم حالت تنظیم کنید؛ مانند --close=foo یا --clopen=2025-main.
close --clopen
این حالت زمانی مفید است که بخواهید در آغاز یک سال جدید، ترازها را به یک فایل دفتر روزنامه جدید انتقال دهید. این دستور یک تراکنش «ترازهای بستن» چاپ میکند که تراز حسابها را صفر میکند (بهطور پیشفرض حسابهای دارایی [Asset] و بدهی [Liability])، و یک تراکنش متضاد «ترازهای باز کردن» که دوباره آنها را بازیابی میکند. بهطور معمول، چنین دستوری را اجرا میکنید:
-
hledger close --clopen -e NEWYEAR >> $LEDGER_FILE
و سپس تراکنش باز کردن را از فایل قدیمی به فایل جدید منتقل میکنید (و احتمالاً متغیر محیطی LEDGER_FILE خود را نیز بهروزرسانی خواهید کرد).
چرا ممکن است این کار را انجام دهید؟ اگر گزارشهای شما با سرعت بالا تولید میشوند، ممکن است نیازی به این کار نداشته باشید. اما در نقطهای احتمالاً مایل خواهید بود دادههای خود را به دلایل کارایی، حفظ یکپارچگی دادهها یا الزامات قانونی، بر اساس زمان بخشبندی کنید. ایجاد یک فایل یا مجموعهای از فایلهای جدید برای هر سال امری متداول است. سپس، احاطه شدن هر فایل/مجموعهفایل با تراکنشهای تراز باز کردن در ابتدا و بستن در انتها به شما امکان میدهد آزادانه انتخاب کنید کدام فایلها خوانده شوند - فقط سال جاری، هر سالی در گذشته، هر توالی از سالها، یا تمام آنها - در حالی که در هر حالت، ترازهای صحیح حسابها نمایش داده میشوند. نخستین تراکنش ترازهای باز کردن، ترازهای آغازین صحیح را تعیین میکند و هر جفت بستن/باز کردن بعدی بدون ایجاد مشکل اثر یکدیگر را خنثی خواهند کرد.
ترازها بهطور پیشفرض به حساب equity:opening/closing balances و از آن منتقل خواهند شد. میتوانید با استفاده از --close-acct و/یا --open-acct این رفتار را لغو و حساب دیگری را تعیین کنید.
میتوانید با ارائه یک پرسوجوی حساب، مجموعه متفاوتی از حسابها را برای بستن/باز کردن انتخاب کنید. برای مثال، جهت افزودن حسابهای سرمایه (Equity)، آرگومانهایی مانند assets liabilities equity یا type:ALE ارائه دهید. هنگام انتقال به یک فایل جدید، معمولاً میخواهید حسابهای AL یا ALE را منتقل کنید، نه حسابهای RX (درآمد [Revenue]، هزینه [Expense]).
اعلانهایی (assertions) اضافه خواهند شد که ترازهای جدید حسابهای بستهشده/بازشده را نشان داده و صحت آنها را بررسی میکنند..SS close --close این دستور صرفاً تراکنش ترازهای پایانی مربوط به --clopen را چاپ میکند. اگر حالتی را مشخص نکنید، این حالت پیشفرض است.
گزینههای سفارشیسازی بیشتر در زیر توضیح داده شدهاند. افزون بر موارد دیگر، میتوانید از close --close برای ایجاد تراکنشی استفاده کنید که ترازها را از هر مجموعهای از حسابها به یک حساب متفاوت منتقل میکند. (اگر نیاز دارید فقط بخشی از تراز را منتقل کنید، hledger-move را ببینید.)
close --open
این دستور صرفاً تراکنش ترازهای آغازین مربوط به --clopen را چاپ میکند. (مشابه دستور equity در Ledger است.)
close --assert
این دستور تراکنشی را چاپ میکند که ترازهای حساب را همانگونه که در تاریخ پایانی هستند اثبات (assert) میکند (و یک برچسب assert: میافزاید). این کار میتواند به عنوان مستندسازی و محافظت در برابر تغییرات مفید باشد.
close --assign
این دستور تراکنشی را چاپ میکند که ترازهای حساب را همانگونه که در تاریخ پایانی هستند تخصیص میدهد (و یک برچسب "assign:" میافزاید). برخلاف اثبات ترازها، تخصیصها برای رسیدن به مقادیر مشخصشده، در صورت نیاز تغییراتی را در ترازها ثبت خواهند کرد.
این روش دیگری برای تنظیم ترازهای آغازین هنگام مهاجرت به یک فایل جدید است و آنها را حتی در صورت وجود فایلهای قبلی که فاقد تراکنش ترازهای پایانی هستند بهدرستی تنظیم میکند. با این حال، این روش میتواند خطاها را پنهان کرده و معادله حسابداری را بر هم بزند؛ بنابراین معمولاً استفاده از --clopen توصیه میشود.
close --retain
این گزینه مشابه --close است، اما بهطور پیشفرض ترازهای حسابهای درآمد (Revenue) و هزینه (Expense) را میبندد. این مقادیر به equity:retained earnings یا حساب دیگری که با --close-acct مشخص شده است منتقل خواهند شد.
درآمدها و هزینهها متناظر با تغییرات در حقوق صاحبان سهام و سرمایه (equity) هستند. آنها برای مقاصد گزارشدهی بهطور جداگانه دستهبندی میشوند، اما طبق سنت در پایان هر دوره حسابداری، کسبوکارها آنها را در سرمایه تجمیع میکنند. این کار «سود انباشته» ("retaining earnings") یا «بستن حسابها» ("closing the books") نامیده میشود.
در حسابداری شخصی دلیل چندانی برای انجام این کار وجود ندارد و بیشتر افراد آن را انجام نمیدهند. (یک دلیل برای انجام این کار، کمک به گزارش balancesheetequity است تا مجموع صفر را نشان دهد و اثبات کند که معادله حسابداری (A-L=E) برقرار است.)
سفارشیسازی close (close customisation)
در تمام حالتها، موارد زیر را میتوان بازنویسی (override) کرد:
- حسابهایی که باید بسته/باز شوند، با آرگومانهای پرسوجوی حساب
- تاریخهای بستن/باز کردن، با -e OPENDATE
- حساب ترازکننده، با --close-acct=ACCT و/یا --open-acct=ACCT
- توضیحات تراکنش، با --close-desc=DESC و --open-desc=DESC
- مقدار برچسب clopen تراکنشها، با یک آرگومان TAGVAL برای پرچم حالت (به بالا مراجعه کنید).
بهطور پیشفرض، تاریخ بستن روز گذشته است، یا تاریخ پایان دفتر روزنامه (journal)، هر کدام که دیرتر باشد؛ و تاریخ باز کردن همواره یک روز پس از تاریخ بستن است. میتوانید با تعیین یک تاریخ پایان گزارش، این موارد را تغییر دهید؛ تاریخ بستن آخرین روز دوره گزارش خواهد بود. برای نمونه -e 2024 به معنی "بستن در 2023-12-31، باز کردن در 2024-01-01" است.
با --x/--explicit، مقدار ترازکننده بهصورت صریح نمایش داده میشود، و اگر شامل چندین کالا/ارز (commodity) باشد، برای هر کدام از آنها یک ثبتی (posting) جداگانه ایجاد خواهد شد (مشابه print -x).
با --interleaved، هر انتقالِ جداگانه همراه با ثبتهای مبدأ و مقصد در کنار یکدیگر نمایش داده میشود (که ممکن است برای عیبیابی مفید باشد).
با --show-costs، بهای تمامشده ترازها نیز نمایش داده میشود و هزینهها/بهاهای متفاوت جدا از هم نگهداری میشوند. این امر در صورت وجود تراکنشهای متعدد تبدیل ارز یا سرمایهگذاری، ممکن است مدخلهای بسیار بزرگی در دفتر روزنامه ایجاد کند. در حال حاضر close --show-costs بهترین راه برای مشاهده بستههای سرمایهگذاری (lots) با hledger است. (برای جابجایی یا بستن lotها، اسکریپت توانمندتر hledger-move را ببینید.).SS دستور close و ادعاهای تراز دستور close ادعاهای ترازی را اضافه میکند که بررسی میکنند آیا حسابها در یک تراکنش بستن، صفر شدهاند یا در یک تراکنش افتتاحیه، به ترازهای پیشین خود بازگردانده شدهاند. این ادعاها بررسی خطای مفیدی را فراهم میکنند، اما میتوانید با -I موقتاً آنها را نادیده بگیرید، یا در صورت تمایل آنها را حذف کنید.
بهطور پیشفرض، ادعاهای تراز تککالایی و بدون احتساب زیرحسابها (=) تولید میشوند. این مورد را میتوان تغییر داد، برای نمونه با --assertion-type='==*'.
هنگام اجرای close احتمالاً باید از بهکارگیری -C، -R، status: (فیلتر کردن بر اساس وضعیت یا واقعی بودن) یا --auto (تولید ثبتها) خودداری کنید، چرا که ادعاهای تراز تولیدشده پس از آن به این موارد نیاز خواهند داشت.
تراکنشهایی با چندین تاریخ (مانند تاریخهای ثبت) که از مرز فایل فراتر میروند نیز میتوانند ادعاهای تراز را با اختلال مواجه کنند:
-
2023-12-30 a purchase made in december, cleared in january expenses:food 5 assets:bank:checking -5 ; date: 2023-01-02
برای حل این مشکل میتوانید پول را به و از یک حساب موقت منتقل کنید، و تراکنش چندروزه را به دو تراکنش یکروزه تقسیم نمایید:
-
; in 2022.journal: 2022-12-30 a purchase made in december, cleared in january expenses:food 5 equity:pending -5 ; in 2023.journal: 2023-01-02 last year's transaction cleared equity:pending 5 = 0 assets:bank:checking -5
مثالهای close
سود انباشته (Retain earnings)
ثبت درآمدها/هزینههای سال 2022 به عنوان سود انباشته در تاریخ 2022-12-31، با الحاق تراکنش تولیدشده به انتهای فایل journal:
-
$ hledger close --retain -f 2022.journal -p 2022 >> 2022.journal
پس از این کار، برای مشاهده درآمدها و هزینههای سال 2022 باید تراکنش سود انباشته (retain earnings) را مستثنی کنید:
-
$ hledger -f 2022.journal is not:desc:'retain earnings'
انتقال ترازها به یک فایل جدید
بستن داراییها/بدهیها در تاریخ 2022-12-31 و بازگشایی مجدد آنها در تاریخ 2023-01-01:
-
$ hledger close --clopen -f 2022.journal -p 2022 # copy/paste the closing transaction to the end of 2022.journal # copy/paste the opening transaction to the start of 2023.journal
پس از این کار، برای مشاهده ترازهای پایان سال 2022 باید تراکنش ترازهای پایانی (closing balances) را مستثنی کنید:
-
$ hledger -f 2022.journal bs not:desc:'closing balances'
برای انعطافپذیری بیشتر، برچسبگذاری تراکنشهای بستن و بازگشایی با مواردی نظیر clopen:NEWYEAR کمککننده است؛ سپس میتوانید با مستثنی کردن تمام تراکنشهای بازگشایی/بستن به جز مورد اول، از درستی ترازها اطمینان حاصل کنید، مانند زیر:
-
$ hledger bs -Y -f 2021.j -f 2022.j -f 2023.j expr:'tag:clopen=2021 or not tag:clopen' $ hledger bs -Y -f 2021.j -f 2022.j expr:'tag:clopen=2021 or not tag:clopen' $ hledger bs -Y -f 2022.j -f 2023.j expr:'tag:clopen=2022 or not tag:clopen' $ hledger bs -Y -f 2021.j expr:'tag:clopen=2021 or not tag:clopen' $ hledger bs -Y -f 2022.j expr:'tag:clopen=2022 or not tag:clopen' $ hledger bs -Y -f 2023.j # unclosed file, no query needed به examples/multi-year مراجعه کنید.
rewrite
تمام تراکنشها را با بازنویسی ثبتهای تراکنشهای منطبق چاپ میکند. در حال حاضر تنها بازنویسی موجود، افزودن ثبتهای جدید است، مانند print --auto.
-
Flags: --add-posting='ACCT AMTEXPR' add a posting to ACCT, which may be parenthesised. AMTEXPR is either a literal amount, or *N which means the transaction's first matched amount multiplied by N (a decimal number). Two spaces separate ACCT and AMTEXPR. --diff generate diff suitable as an input for patch tool
این ابزار، آغازی برای یک بازنویس عمومی ورودیهای تراکنش است. دفتر روزنامه پیشفرض را میخواند و همانند print تراکنشها را چاپ میکند، اما یک یا چند ثبت مشخصشده را به هر تراکنش منطبق با QUERY اضافه میکند. مبالغ ثبتها میتواند ثابت باشد، یا ضریبی از مبلغ اولین ثبت تراکنش موجود.
مثالها:
-
$ hledger-rewrite.hs ^income --add-posting '(liabilities:tax) *.33 ; income tax' --add-posting '(reserve:gifts) $100' $ hledger-rewrite.hs expenses:gifts --add-posting '(reserve:gifts) *-1"' $ hledger-rewrite.hs -f rewrites.hledger
فایل rewrites.hledger میتواند شامل ورودیهایی مانند این باشد:
-
= ^income amt:<0 date:2017 (liabilities:tax) *0.33 ; tax on income (reserve:grocery) *0.25 ; reserve 25% for grocery (reserve:) *0.25 ; reserve 25% for grocery
به علامتهای نقلقول تکی (single quotes) برای محافظت از علامت دلار در برابر bash، و دو فاصله میان حساب و مبلغ دقت کنید.
موارد بیشتر:
-
$ hledger rewrite [QUERY] --add-posting "ACCT AMTEXPR" ... $ hledger rewrite ^income --add-posting '(liabilities:tax) *.33' $ hledger rewrite expenses:gifts --add-posting '(budget:gifts) *-1"' $ hledger rewrite ^income --add-posting '(budget:foreign currency) *0.25 JPY; diversify'
آرگومان گزینه --add-posting یک ثبت معمولی تراکنش است با این استثنا که در مشخص کردن مبلغ تفاوت دارد. بهطور دقیقتر، میتوانید از نماد ستاره ('*') پیش از مبلغ استفاده کنید تا نشان دهید که این مقدار، ضریبی برای مبلغِ ثبت منطبقشده اولیه است. اگر مبلغ شامل نام یک کالا (commodity) باشد، مبلغ ثبت جدید برحسب کالای جدید خواهد بود؛ در غیر این صورت، برحسب کالای مبلغ ثبت منطبقشده خواهد بود.
قواعد بازنویسی در یک فایل
این ابزار هنگام اجرا، بهاصطلاح «تراکنشهای خودکار» ("Automated Transactions") موجود در هر دفتر روزنامهای را که پردازش میکند اجرا خواهد کرد. به این معنی که به جای مشخص کردن این عملیاتها در خط فرمان، میتوانید آنها را در یک فایل دفتر روزنامه قرار دهید.
-
$ rewrite-rules.journal
محتویات را به این شکل تنظیم کنید:
-
= ^income (liabilities:tax) *.33 = expenses:gifts budget:gifts *-1 assets:budget *1
به نماد مساوی ('=') دقت کنید که به جای تاریخ، در تراکنشهایی که معمولاً مینویسید استفاده شده است. این نماد، پرسمانی (query) را مشخص میکند که میخواهید ثبتها را با آن تطبیق دهید تا ثبتهای جدید اضافه شوند.
-
$ hledger rewrite -f input.journal -f rewrite-rules.journal > rewritten-tidy-output.journal
این عملکرد مشابه خط لوله (pipeline) دستورهای زیر است:
-
$ hledger rewrite -f input.journal '^income' --add-posting '(liabilities:tax) *.33' \ | hledger rewrite -f - expenses:gifts --add-posting 'budget:gifts *-1' \ --add-posting 'assets:budget *1' \ > rewritten-tidy-output.journal
درک این نکته ضروری است که ترتیب نسبی این ورودیها در دفتر روزنامه اهمیت دارد. شما میتوانید از نتیجه ثبتهایی که پیشتر اضافه شدهاند مجدداً استفاده کنید..SS قالب خروجی Diff برای استفاده از این ابزار جهت تغییرات دستهای (batch) فایلهای journal خود، خروجی در قالب تفاوت یکپارچه (unified diff) میتواند برای شما مفید باشد.
-
$ hledger rewrite --diff -f examples/sample.journal '^income' --add-posting '(liabilities:tax) *.33'
خروجی ممکن است به این صورت باشد:
-
--- /tmp/examples/sample.journal +++ /tmp/examples/sample.journal @@ -18,3 +18,4 @@ 2008/01/01 income - assets:bank:checking $1 + assets:bank:checking $1 income:salary + (liabilities:tax) 0 @@ -22,3 +23,4 @@ 2008/06/01 gift - assets:bank:checking $1 + assets:bank:checking $1 income:gifts + (liabilities:tax) 0
اگر این خروجی را به ابزار patch منتقل کنید، تراکنشهای شامل ثبتهایی (posting) که با پرسوجوی شما مطابقت دارند بهروزرسانی خواهند شد. توجه داشته باشید که بر اساس فهرست فایلهای ورودی مشخصشده از طریق گزینههای --file و دستورالعملهای include درون این فایلها، ممکن است چندین فایل بهروزرسانی شوند.
مراقب باشید. کل تراکنش به سبک خروجی دستور hledger print بازقالببندی میشود.
همچنین ببینید:
مقایسه rewrite با print --auto
این دستور پیش از print --auto ارائه شده است و در حال حاضر تا حد زیادی عملکرد مشابهی دارد، اما با این تفاوتها:
- در حالت چندفایلی، rewrite اجازه میدهد تا قوانین موجود در هر فایل بر تمام فایلهای دیگر تأثیر بگذارند. print --auto از محدودهبندی استاندارد دستورالعملها استفاده میکند؛ بدین ترتیب قوانین تنها بر فایلهای فرزند اثر میگذارند.
- پرسوجوی rewrite تعیین میکند کدام تراکنشها میتوانند بازنویسی شوند؛ در حالی که همه تراکنشها چاپ میشوند. پرسوجوی print --auto مشخص میکند که کدام تراکنشها چاپ شوند.
- دستور rewrite قواعد مشخصشده در خط فرمان یا در journal را اعمال میکند. دستور print --auto قواعد مشخصشده در journal را اعمال میکند.
دستورهای نگهداری (MAINTENANCE COMMANDS)
check
بررسی انواع مختلف خطاها در دادههای شما.
-
Flags: no command-specific flags
ابزار hledger تعدادی بررسی توکار برای سنجش درستی ارائه میدهد تا به اعتبارسنجی دادههای شما و جلوگیری از خطاها کمک کند. برخی از آنها بهصورت خودکار اجرا میشوند و برخی هنگام فعال کردن حالت --strict؛ یا میتوانید هر کدام را برحسب نیاز با ارائه بهعنوان آرگومان به دستور check اجرا کنید. اگر همهچیز درست باشد، check هیچ خروجی تولید نمیکند و با کد وضعیت صفر خارج میشود. برای مثال:
-
hledger check # run basic checks hledger check -s # run basic and strict checks hledger check ordereddates payees # run basic checks and two others
اگر از کاربران Emacs هستید، میتوانید flycheck-hledger را نیز برای اجرای این بررسیها پیکربندی کنید تا هنگام ویرایش journal، بازخورد آنی دریافت نمایید.
بررسیهای موجود در حال حاضر در اینجا آمده است. این موارد معمولاً به همان ترتیبی که در اینجا نشان داده شده بررسی میشوند و فقط اولین خطا گزارش خواهد شد..SS "بررسیهای پایه (Basic checks)" این بررسیهای مهم بهطور پیشفرض توسط تقریباً تمامی دستورهای hledger انجام میشوند:
- parseable - فایلهای داده در قالبی پشتیبانیشده هستند و هیچ خطای نحوی یا دستورالعمل include نامعتبری ندارند. این بررسی تضمین میکند که همهٔ فایلها وجود دارند و قابل خواندن هستند.
- autobalanced - همهٔ تراکنشها پس از استنتاج خودکار مقادیر ناموجود و نرخهای تبدیل و سپس تبدیل مبالغ به بهای تمامشده، تراز هستند. این بررسی تضمین میکند که مدخل دفتر روزنامهٔ هر تراکنش ساختار درستی دارد.
- assertions - همهٔ ادعاهای تراز (balance assertions) در دفتر روزنامه برقرار هستند. ادعاهای تراز دفاعی محکم در برابر خطاها هستند و مشکلات زیادی را شناسایی میکنند. این بررسی بهطور پیشفرض فعال است، اما اگر برایتان مانعی ایجاد میکند، میتوانید آن را موقتاً با -I/--ignore-assertions یا بهطور پیشفرض با افزودن این پرچم به فایل پیکربندی خود غیرفعال کنید. (سپس هر زمان که مایل به فعالسازی مجدد آن بودید از -s/--strict یا hledger check assertions استفاده کنید).
بررسیهای سختگیرانه (Strict checks)
هنگامی که پرچم -s/--strict استفاده شود (معروف به حالت سختگیرانه یا strict mode)، تمامی دستورها بررسیهای تکمیلی زیر (و همچنین assertions در بالا) را انجام خواهند داد. این بررسیها قدرت خطایابی بیشتری را فراهم میکنند تا به شما در تمیز و صحیح نگهداشتن دادههایتان کمک کنند:
- balanced - مانند autobalanced است، اما تبدیلهای ضمنی میان کالاها مجاز نیستند؛ تمامی تراکنشهای تبدیل باید از نمادگذاری بهای تمامشده یا ثبتهای ارزش ویژه (equity postings) استفاده کنند. این بررسی از تبدیلهای نادرست ناشی از خطاهای تایپی جلوگیری میکند.
- commodities - تمامی نمادهای کالای (commodity) استفادهشده باید تعریف شده باشند. این بررسی در برابر خطای تایپی یا جا انداختن نمادهای کالا محافظت میکند.
- accounts - تمامی نامهای حساب استفادهشده باید تعریف شده باشند. این بررسی از بهکارگیری نامهای حساب دارای غلط املایی یا منسوخشده جلوگیری میکند.
سایر بررسیها (Other checks)
این بررسیها مورد نیاز همگان نیستند، اما میتوان آنها را با استفاده از دستور check اجرا کرد:
- tags - تمامی برچسبهای استفادهشده باید تعریف شده باشند. این کار از نامهای برچسب دارای غلط املایی جلوگیری میکند. توجه داشته باشید که hledger اغلب اوقات برچسبهای ناخواستهای را در توضیحات پیدا میکند.
- payees - تمامی دریافتکنندگان وجه (payees) استفادهشده در تراکنشها باید تعریف شده باشند. این بررسی شما را وادار میکند تا پیش از استفاده از هر نام طرف حساب جدید، آن را تعریف کنید. احتمالاً بیشتر افراد این مورد را کمی بیش از حد سختگیرانه میدانند.
- ordereddates - درون هر فایل، تراکنشها باید بر اساس تاریخ مرتب شده باشند. این یک خطایاب ساده و مؤثر است. این مورد در حالت سختگیرانه گنجانده نشده است، اما میتوانید با اجرای hledger check -s ordereddates آن را اضافه کنید. در صورت فعال بودن، این بررسی پیش از ادعاهای تراز انجام میشود.
- recentassertions - تمامی حسابهای دارای ادعای تراز باید دستکم یک ادعا داشته باشند که در بازهٔ ۷ روز پیش از آخرین ثبت (posting) آنها باشد. این کار شما را به افزودن ادعاهای تراز برای حسابهای فعال دارایی/بدهی تشویق میکند، که به نوبهٔ خود شما را به تطبیق و مغایرتگیری منظم با ماندههای دنیای واقعی ترغیب خواهد کرد - که دفاع محکم دیگری در برابر خطاهاست. (hledger close --assert >>$LEDGER_FILE روشی مناسب برای افزودن ادعاهای تراز جدید است. بعداً این موارد کاملاً زاید میشوند و ممکن است برای کاهش شلوغی، حذف آنها را انتخاب کنید).
- uniqueleafnames - هیچ دو حسابی نباید بخش انتهایی نام حسابِ یکسانی داشته باشند (برای نمونه checking در assets:bank:checking). این امر تضمین میکند که هر حساب با یک نام کوتاه یکتا قابل تطبیق باشد، که به خاطر سپردن و تایپ آن آسانتر است.
بررسیهای سفارشی (Custom checks)
میتوانید بررسیهای سفارشی خود را با اسکریپتهای دستوری الحاقی (add-on) بسازید. همچنین بخش Cookbook > Scripting را ببینید. در اینجا چند نمونه از hledger/bin/ آورده شده است:
- hledger-check-tagfiles - تمامی مقادیر برچسب حاوی / بهعنوان مسیر فایل وجود داشته باشند
- hledger-check-fancyassertions - ادعاهای تراز پیچیدهتر با موفقیت برقرار شوند.SS diff تراکنشهای یک حساب مشخص را در دو فایل ورودی با یکدیگر مقایسه میکند. تراکنشهای مربوط به این حساب را که در یکی از فایلها وجود دارند ولی در دیگری نیستند، نمایش میدهد.
-
Flags: no command-specific flags
بهطور دقیقتر: برای هر ثبت (posting) مؤثر بر این حساب در هر یک از دو فایل، این دستور بهدنبال ثبتی متناظر در فایل دیگر میگردد که همان مبلغ را به همان حساب منتقل کرده باشد (با نادیده گرفتن تاریخ، شرح و غیره).
از آنجا که این دستور ثبتها (postings) را مقایسه میکند و نه تراکنشها را، در مواردی که چند تراکنش بانکی در قالب یک مدخل دفتر روزنامه (journal entry) ترکیب شده باشند نیز کار میکند.
این دستور بهعنوان مثال زمانی مفید است که تراکنشهای یک حساب را از بانک خود دریافت کرده باشید (مثلاً در قالب دادههای CSV): هنگامی که hledger و بانک شما بر سر موجودی حساب اختلاف دارند، میتوانید دادههای بانک را با دفتر روزنامهٔ خود مقایسه کنید تا علت را بیابید.
مثالها:
-
$ hledger diff -f $LEDGER_FILE -f bank.csv assets:bank:giro These transactions are in the first file only: 2014/01/01 Opening Balances assets:bank:giro EUR ... ... equity:opening balances EUR -... These transactions are in the second file only:
setup
بررسی وضعیت نصب hledger.
-
Flags: no command-specific flags
دستور setup وضعیت نصب hledger شما را آزمایش کرده و فهرستی از نتایج را، گاهی همراه با راهنماییهای مفید، چاپ میکند. این دستور، نخستین دستور مناسب برای اجرا پس از نصب hledger است؛ همچنین پس از ارتقا، یا هنگامی که چیزی درست کار نمیکند، یا صرفاً زمانی که میخواهید یادآوری شود که اجزای مختلف در کجا قرار دارند.
این دستور یک درخواست شبکه برای شناسایی آخرین نسخهٔ منتشرشدهٔ hledger ارسال میکند. در صورتی که این درخواست با خطا مواجه شود یا مهلت زمانی آن پایان یابد (timeout)، مشکلی ایجاد نمیشود. بهطور پیشفرض از رنگهای ANSI استفاده خواهد شد، مگر اینکه توسط NO_COLOR یا --color=n غیرفعال شده باشد. از صفحهبند (pager) یا فایل پیکربندی استفاده نمیکند.
این دستور انتظار دارد نسخهٔ hledger در حال اجرا، در PATH شما نصب شده باشد. اگر چنین نباشد، تا زمانی که این کار را انجام ندهید متوقف خواهد شد (برای ساده نگهداشتن امور).
مثال:
-
$ hledger setup Checking your hledger setup.. Legend: good, neutral, unknown, warning hledger * is a released version ? no hledger 1.42.99-gbca4b39c5-20250425, mac-aarch64 * is up to date ? yes 1.42.99 installed, latest is 1.42.1 * is a native binary for this machine ? yes aarch64 * is installed in PATH ? yes /Users/simon/.local/bin/hledger * has a system text encoding configured ? yes UTF-8, data files should use this encoding * has a user config file ? (optional) no * current directory has a local config ? yes /Users/simon/src/hledger/hledger.conf * the config file is readable ? yes /Users/simon/src/hledger/hledger.conf terminal * the NO_COLOR variable is defined ? no * --color is configured by config file ? no * hledger will use color by default ? yes * the PAGER variable is defined ? yes less * --pager is configured by config file ? no * hledger will use a pager when needed ? yes /opt/homebrew/bin/less * the LESS variable is defined ? yes * the HLEDGER_LESS variable is defined ? no * adjusting LESS variable for color etc. ? yes * --pretty is enabled by config file ? no tables will use ASCII characters * bash shell completions are installed ? ? * zsh shell completions are installed ? ? journal * the LEDGER_FILE variable is defined ? yes /Users/simon/finance/2025/2025.journal * a default journal file is readable ? yes /Users/simon/finance/2025/2025.journal * it includes additional files ? yes 15 * all commodities are declared ? yes 10 * all accounts are declared ? yes 160 * all accounts have types ? no 14 untyped * accounts of each type were detected ? yes ALERXCV * commodities/accounts are checked ? no use -s to check commodities/accounts * balance assertions are checked ? yes use -I to ignore assertions اجرای آزمونهای واحد توکار.
-
Flags: no command-specific flags
این دستور آزمونهای واحد توکار در hledger و hledger-lib را اجرا کرده و نتایج را در stdout چاپ میکند. اگر آزمونی شکست بخورد، وضعیت خروج غیرصفر خواهد بود.
این دستور عمدتاً توسط توسعهدهندگان hledger استفاده میشود، اما شما نیز میتوانید برای بررسی سلامت (sanity-check) فایل اجرایی hledger نصبشده روی پلتفرم خود از آن استفاده کنید. انتظار میرود همهٔ آزمونها با موفقیت سپری شوند - اگر با شکستی مواجه شدید، لطفاً آن را بهعنوان باگ گزارش دهید!
هر آرگومانی قبل از یک آرگومان -- بهعنوان الگوهای -p انتخاب آزمون به اجراکنندهٔ آزمون tasty ارسال خواهد شد، و هر آرگومانی بعد از -- بدون تغییر به tasty تحویل داده میشود.
مثالها:
-
$ hledger test # run all unit tests $ hledger test balance # run tests with "balance" in their name $ hledger test -- -h # show tasty's options
بخش ۵: کارهای متداول (PART 5: COMMON TASKS)
در اینجا چند مثال سریع از نحوهٔ انجام برخی کارهای پایهای با hledger آورده شده است.
دریافت راهنمایی (Getting help)
روش فهرست کردن دستورها و مشاهدهٔ گزینهها و مستندات دستورها به این صورت است:
-
$ hledger # show available commands $ hledger --help # show common options $ hledger CMD --help # show CMD's options, common options and CMD's documentation
شما همچنین میتوانید با استفاده از دستور help، کتابچهٔ راهنمای نسخهٔ hledger خود را در چندین قالب مختلف مشاهده کنید. بهعنوان مثال:
-
$ hledger help # show the hledger manual with info, man or $PAGER (best available) $ hledger help journal # show the journal topic in the hledger manual $ hledger help --help # find out more about the help command
برای مشاهدهٔ کتابچههای راهنما و مستندات مقدماتی در وب، به https://hledger.org مراجعه کنید. پشتیبانی گفتگو و فهرست پستی و بایگانی بحثها را میتوانید در https://hledger.org/support بیابید.
ساخت خطوط فرمان (Constructing command lines)
دستور hledger دارای یک رابط خط فرمان انعطافپذیر است. ما تلاش میکنیم آن را ساده و ارگونومیک نگه داریم، اما اگر به یکی از نکات دشوار توصیفشده در گزینهها (OPTIONS) برخوردید، این نکات ممکن است کمککننده باشند:
- گزینههای ویژهٔ دستور باید پس از دستور قرار گیرند (قرار دادن گزینههای عمومی در آنجا نیز مانعی ندارد: hledger CMD OPTS ARGS)
- میتوانید دستورهای افزونه را از طریق hledger (hledger ui [ARGS]) یا مستقیماً (hledger-ui [ARGS]) اجرا کنید
- آرگومانهای "مشکلساز" را در علامت نقلقول تکی (single quotes) قرار دهید
- در صورت نیاز، یک بکاسلش اضافه کنید تا نویسههای خاص عبارت باقاعده از دید پوسته پنهان بمانند
- برای مشاهدهٔ نحوهٔ تجزیه شدن خط فرمانی که رفتار نادرستی دارد، --debug=2 را اضافه کنید.
شروع یک فایل journal
دستور hledger بهطور پیشفرض دادههای حسابداری شما را در یک فایل journal به نشانی $HOME/.hledger.journal جستجو میکند:
-
$ hledger stats The hledger journal file "/Users/simon/.hledger.journal" was not found. Please create it first, eg with "hledger add" or a text editor. Or, specify an existing journal file with -f or LEDGER_FILE.
میتوانید با تنظیم متغیر محیطی LEDGER_FILE این مقدار را بازنویسی کنید (به پایین مراجعه کنید). نگهداری این فایل مهم تحت کنترل نسخه (version control) و شروع یک فایل جدید در هر سال، روش کاری بسیار مناسبی است. بنابراین میتوانید کاری شبیه به این انجام دهید:
-
$ mkdir ~/finance $ cd ~/finance $ git init Initialized empty Git repository in /Users/simon/finance/.git/ $ touch 2023.journal $ echo "export LEDGER_FILE=$HOME/finance/2023.journal" >> ~/.profile $ source ~/.profile $ hledger stats Main file : /Users/simon/finance/2023.journal Included files : Transactions span : to (0 days) Last transaction : none Transactions : 0 (0.0 per day) Transactions last 30 days: 0 (0.0 per day) Transactions last 7 days : 0 (0.0 per day) Payees/descriptions : 0 Accounts : 0 (depth 0) Commodities : 0 () Market prices : 0 ()
تنظیم LEDGER_FILE در یونیکس
این موضوع به شل (shell) شما بستگی دارد، اما اجرای این دستورها در ترمینال برای بیشتر افراد کارساز خواهد بود؛ در صورت نیاز آن را تطبیق دهید:
-
$ echo 'export LEDGER_FILE=~/finance/main.journal' >> ~/.profile $ source ~/.profile
هنگامی که به درستی پیکربندی شود:
- دستور env | grep LEDGER_FILE تنظیمات جدید شما را نمایش خواهد داد
- و hledger setup و hledger files نیز باید همین کار را انجام دهند.
تنظیم LEDGER_FILE در مک
در یک پنجرهٔ ترمینال، مراحل یونیکس ذکرشده در بالا را دنبال کنید.
همچنین، این مرحلهٔ اختیاری ممکن است برای برنامههای دارای رابط گرافیکی (GUI) مفید باشد:
- 1.
- یک مدخل به ~/.MacOSX/environment.plist اضافه کنید، مانند:
-
{ "LEDGER_FILE" : "~/finance/main.journal" }
- 2.
- دستور killall Dock را در یک پنجرهٔ ترمینال اجرا کنید (یا رایانه را مجدداً راهاندازی کنید) تا تغییرات اعمال شوند.
هنگامی که به درستی برای برنامههای گرافیکی پیکربندی شود:
- •
- برنامههایی که از dock یا جستجوی spotlight اجرا میشوند، مانند Emacs گرافیکی، از تنظیم جدید LEDGER_FILE مطلع خواهند شد.
تنظیم LEDGER_FILE در ویندوز
ایجاد یک فایل پیشفرض در مسیر C:\Users\USER\.hledger.journal و درج فایلهای دیگر درون آن میتواند سادهتر باشد. به بخش "I'm on Windows, how do I keep my files in AppData?" رجوع کنید.
در غیر این صورت، استفاده از رابط گرافیکی آسانترین راه است:
- 1.
- در نوار وظیفه (task bar)، عبارت environment variables را جستجو کرده و گزینهٔ "Edit environment variables for your account" را انتخاب کنید.
- 2.
- در بخش متغیرهای کاربر (User variables)، تنظیم LEDGER_FILE را ایجاد کرده یا تغییر دهید. یک مقدار معمول بدین شکل است: C:\Users\USER\finance\main.journal.
- 3.
- برای نهاییسازی تغییرات روی OK کلیک کنید.
- 4.
- و یک پنجرهٔ powershell جدید باز کنید. (پنجرههای موجود این تغییر را مشاهده نخواهند کرد.)
یا در خط فرمان، میتوانید این کار را بدین صورت انجام دهید:
- 1.
- در یک پنجرهٔ powershell، دستور زیر را اجرا کنید: [Environment]::SetEnvironmentVariable("LEDGER_FILE", "C:\User\USER\finance\main.journal", [System.EnvironmentVariableTarget]::User)
- 2.
- و یک پنجرهٔ powershell جدید باز کنید. (پنجرههای موجود این تغییر را مشاهده نخواهند کرد.)
هشدار: انجام این کار از خط فرمان ویندوز میتواند پیچیده باشد؛ روشهای دیگری که ممکن است در اینترنت بیابید:
- ممکن است بر پنجرهٔ فعلی تأثیر نگذارند
- ممکن است دائمی نباشند
- ممکن است کار نکنند مگر اینکه مدیر سیستم (administrator) باشید
- ممکن است مقدارها را به ۱۰۲۴ نویسه محدود کنند
- ممکن است ارجاعات پویا به متغیرهای دیگر را با خطا مواجه کنند
- ممکن است به نگارش بهاندازهٔ کافی جدیدی از powershell نیاز داشته باشند
- یا ممکن است برای پنجرهٔ خط فرمان قدیمیتر (command window) طراحی شده باشند.
- اگر همچنان با مشکل مواجه هستید، برای نمونه به "Setting Windows PowerShell environment variables" یا "Adding path permanently to windows using powershell doesn't appear to work" رجوع کنید.
هنگامی که به درستی پیکربندی شود:
- در یک پنجرهٔ powershell جدید، دستور $env:LEDGER_FILE تنظیمات جدید شما را نمایش خواهد داد
- و hledger setup و (پس از ایجاد فایل) hledger files نیز باید همین کار را انجام دهند..SS تنظیم ماندههای آغازین یک تاریخ آغازین انتخاب کنید که در آن بتوانید ماندههای برخی از داراییهای واقعی (حسابهای بانکی، کیف پول و...) و بدهیها (کارتهای اعتباری و...) را بررسی کنید.
برای جلوگیری از ورود حجم زیادی از دادهها، ممکن است بخواهید تنها با یک یا دو حساب شروع کنید، مانند حساب جاری یا کیف پول نقد؛ و یک تاریخ آغازین نزدیک را انتخاب نمایید، مانند امروز یا ابتدای هفته. همیشه میتوانید بعداً بازگردید و حسابهای بیشتر و تراکنشهای قدیمیتری را اضافه کنید، به عنوان مثال تا اول ژانویه به عقب برگردید.
یک تراکنش ماندههای آغازین به دفتر روزنامه (journal) اضافه کنید و ماندهها را در این تاریخ اعلام نمایید. در اینجا دو روش برای انجام این کار آورده شده است:
- •
- روش اول: دفتر روزنامه را در هر ویرایشگر متنی باز کرده و مدخلی مانند این را ذخیره کنید:
-
2023-01-01 * opening balances assets:bank:checking $1000 = $1000 assets:bank:savings $2000 = $2000 assets:cash $100 = $100 liabilities:creditcard $-50 = $-50 equity:opening/closing balances
اینها ماندههای ابتدای روز هستند، یعنی هر آنچه که در پایان روز قبل در حساب موجود بوده است.
علامت * پس از تاریخ یک پرچم وضعیت اختیاری است. در اینجا این علامت به معنای "تسویهشده و تأییدشده" است.
نمادهای ارز اختیاری هستند، اما معمولاً ایدهٔ خوبی است زیرا دیر یا زود با چندین ارز سر و کار خواهید داشت.
مبالغ دارای = تصدیقهای اختیاری مانده (balance assertions) هستند که امکان خطایابی مضاعف را فراهم میکنند.
- •
- روش دوم: دستور hledger add را اجرا کرده و اعلانها را برای ثبت یک تراکنش مشابه دنبال کنید:
-
$ hledger add Adding transactions to journal file /Users/simon/finance/2023.journal Any command line arguments will be used as defaults. Use tab key to complete, readline keys to edit, enter to accept defaults. An optional (CODE) may follow transaction dates. An optional ; COMMENT may follow descriptions or amounts. If you make a mistake, enter < at any prompt to go one step backward. To end a transaction, enter . when prompted. To quit, enter . at a date prompt or press control-d or control-c. Date [2023-02-07]: 2023-01-01 Description: * opening balances Account 1: assets:bank:checking Amount 1: $1000 Account 2: assets:bank:savings Amount 2 [$-1000]: $2000 Account 3: assets:cash Amount 3 [$-3000]: $100 Account 4: liabilities:creditcard Amount 4 [$-3100]: $-50 Account 5: equity:opening/closing balances Amount 5 [$-3050]: Account 6 (or . or enter to finish this transaction): . 2023-01-01 * opening balances assets:bank:checking $1000 assets:bank:savings $2000 assets:cash $100 liabilities:creditcard $-50 equity:opening/closing balances $-3050 Save this transaction to the journal ? [y]: Saved. Starting the next transaction (. or ctrl-D/ctrl-C to quit) Date [2023-01-01]: .
اگر از سیستم کنترل نسخه استفاده میکنید، اکنون میتواند زمان مناسبی برای commit کردن دفتر روزنامه باشد. به عنوان مثال:
-
$ git commit -m 'initial balances' 2023.journal هنگامی که پولی خرج کرده یا دریافت میکنید، میتوانید این تراکنشها را با استفاده از یکی از روشهای بالا (ویرایشگر متن، hledger add)، با استفاده از افزونههای hledger-iadd یا hledger-web، یا با استفاده از دستور import برای تبدیل دادههای CSV بارگیریشده از بانک خود ثبت کنید.
در اینجا چند نمونه تراکنش ساده آورده شده است؛ برای ایدههای بیشتر دفترچه
راهنمای hledger_journal(5) و hledger.org را ببینید:
-
2023/1/10 * gift received assets:cash $20 income:gifts 2023.1.12 * farmers market expenses:food $13 assets:cash 2023-01-15 paycheck income:salary assets:bank:checking $1000
تطبیق و مغایرتگیری (Reconciling)
بهطور دورهای باید حسابها را تطبیق دهید - یعنی موجودیهای گزارششده توسط hledger را با منابع خارجی موثق، مانند صورتحسابهای بانکی یا وبگاه بانک خود مقایسه کنید - تا مطمئن شوید که دفتر شما بهدرستی موجودیهای دنیای واقعی را نشان میدهد (و همچنین اینکه مؤسسات مالی دنیای واقعی اشتباهی نکرده باشند!). این کار با (۱) تمرین و (۲) تکرار مداوم، آسان و سریع میشود. اگر آن را روزانه انجام دهید، ممکن است بین ۲ تا ۱۰ دقیقه زمان ببرد. اگر بگذارید روی هم انباشته شود، با صرف وقت برای یافتن خطاها و مغایرتها، انتظار داشته باشید که زمان بیشتری طول بکشد.
یک گردش کار معمول:
- 1.
- تطبیق وجه نقد. آنچه را که در کیف پولتان هست بشمارید. آن را با آنچه hledger گزارش میدهد مقایسه کنید (hledger bal cash). اگر متفاوت هستند، سعی کنید تراکنش فراموششده را به خاطر بیاورید، یا به دنبال خطا در تراکنشهای ثبتشده بگردید. یک گزارش دفتر روزنامه میتواند مفید باشد (hledger reg cash). اگر نمیتوانید خطا را پیدا کنید، یک تراکنش تعدیل اضافه کنید. به عنوان مثال اگر پس از موارد بالا ۱۰۵ دلار دارید، و نمیتوانید ۲ دلار گمشده را توجیه کنید، میتواند به این شکل باشد:
-
2023-01-16 * adjust cash assets:cash $-2 = $105 expenses:misc
- 2.
- تطبیق حساب جاری (checking). وارد وبگاه بانک خود شوید. موجودی امروز (تسویهشده یا cleared) را با موجودی تسویهشده در hledger مقایسه کنید (hledger bal checking -C). اگر متفاوت هستند، خطا را ردیابی کنید یا تراکنش(های) فراموششده را ثبت کنید یا مشابه بالا، یک تراکنش تعدیل اضافه نمایید. برخلاف حالت وجه نقد، معمولاً میتوانید تاریخچه تراکنشها و مانده لحظهای بانک خود را با آنچه توسط hledger reg checking -C گزارش شده است مقایسه کنید. اگر عموماً تاریخ تراکنشها را کاملاً نزدیک به تاریخهای تسویه بانک خود ثبت کنید، این کار سادهتر خواهد بود.
- 3.
- این روند را برای سایر حسابهای دارایی/بدهی تکرار کنید.
نکته: به جای دستور register، از hledger-ui استفاده کنید تا هنگام ویرایش دفتر، ثبتی با بهروزرسانی زنده را مشاهده کنید: hledger-ui --watch --register checking -C
پس از مغایرتگیری، در صورتی که مایل به ردیابی آن هستید، زمان مناسبی است تا وضعیت تراکنشهای تطبیقیافته را با افزودن نشانگر * به صورت "تسویهشده و تأییدشده" علامتگذاری کنید. به عنوان مثال در تراکنش حقوق (paycheck) در بالا، علامت * را بین 2023-01-15 و paycheck درج کنید.
اگر از ابزارهای کنترل نسخه استفاده میکنید، اکنون زمان مناسب دیگری برای ثبت تغییرات (commit) است:
-
$ git commit -m 'txns' 2023.journal در اینجا چند گزارش پایهای آورده شده است.
نمایش تمام تراکنشها:
-
$ hledger print 2023-01-01 * opening balances assets:bank:checking $1000 assets:bank:savings $2000 assets:cash $100 liabilities:creditcard $-50 equity:opening/closing balances $-3050 2023-01-10 * gift received assets:cash $20 income:gifts 2023-01-12 * farmers market expenses:food $13 assets:cash 2023-01-15 * paycheck income:salary assets:bank:checking $1000 2023-01-16 * adjust cash assets:cash $-2 = $105 expenses:misc
نمایش نام حسابها و سلسلهمراتب آنها:
-
$ hledger accounts --tree assets bank checking savings cash equity opening/closing balances expenses food misc income gifts salary liabilities creditcard
نمایش مجموع کل حسابها:
-
$ hledger balance $4105 assets $4000 bank $2000 checking $2000 savings $105 cash $-3050 equity:opening/closing balances $15 expenses $13 food $2 misc $-1020 income $-20 gifts $-1000 salary $-50 liabilities:creditcard -------------------- 0
نمایش تنها ماندههای دارایی و بدهی، بهصورت یک فهرست مسطح، محدود به عمق ۲:
-
$ hledger bal assets liabilities -2 $4000 assets:bank $105 assets:cash $-50 liabilities:creditcard -------------------- $4055
نمایش همان موارد بدون اعداد منفی، قالببندیشده بهصورت یک ترازنامه ساده:
-
$ hledger bs -2 Balance Sheet 2023-01-16 || 2023-01-16 ========================++============ Assets || ------------------------++------------ assets:bank || $4000 assets:cash || $105 ------------------------++------------ || $4105 ========================++============ Liabilities || ------------------------++------------ liabilities:creditcard || $50 ------------------------++------------ || $50 ========================++============ Net: || $4055
مجموع نهایی، "ارزش خالص" شما در تاریخ پایانی است. (یا از bse برای یک ترازنامه کامل به همراه حقوق صاحبان سهام استفاده کنید.)
نمایش مجموع درآمدها و هزینهها، قالببندیشده بهصورت صورت سود و زیان:
-
hledger is Income Statement 2023-01-01-2023-01-16 || 2023-01-01-2023-01-16 ===============++======================= Revenues || ---------------++----------------------- income:gifts || $20 income:salary || $1000 ---------------++----------------------- || $1020 ===============++======================= Expenses || ---------------++----------------------- expenses:food || $13 expenses:misc || $2 ---------------++----------------------- || $15 ===============++======================= Net: || $1005
مجموع نهایی، درآمد خالص شما در این بازه زمانی است.
نمایش تراکنشهای اثرگذار بر وجه نقد، به همراه مانده تجمعی:
-
$ hledger register cash 2023-01-01 opening balances assets:cash $100 $100 2023-01-10 gift received assets:cash $20 $120 2023-01-12 farmers market assets:cash $-13 $107 2023-01-16 adjust cash assets:cash $-2 $105
نمایش تعداد ثبتها در هفته بهصورت یک نمودار میلهای:
-
$ hledger activity -W 2019-12-30 ***** 2023-01-06 **** 2023-01-13 **** در پایان سال، ممکن است بخواهید دفتر روزنامه خود را در یک فایل جدید ادامه دهید، تا تراکنشهای قدیمی سرعت گزارشهای شما را کاهش ندهند یا آنها را شلوغ نکنند، و همچنین به تضمین یکپارچگی تاریخچه حسابداری شما کمک شود. دستور close را ببینید.
در صورت استفاده از سامانه کنترل نسخه، فراموش نکنید فایل جدید را
git add کنید.
گزارش باگها (BUGS)
ما از گزارشهای باگ در سامانه پیگیری اشکالات hledger (https://bugs.hledger.org) یا در گفتوگو یا فهرست پستی hledger (https://hledger.org/support) استقبال میکنیم.
برخی از مشکلات و محدودیتهای شناختهشده:
برنامه hledger هنگام خواندن متنهای غیر ascii از کدگذاری متن سیستم استفاده میکند. اگر هیچ کدگذاری سیستمی پیکربندی نشده باشد، یا اگر کدگذاری دادهها متفاوت باشد، hledger خطا خواهد داد. (بخشهای Text encoding و عیبیابی را ببینید.)
در Microsoft Windows، بسته به نوع پنجره ترمینالی که استفاده میکنید، ممکن است نویسههای غیر ascii، قالببندی متن ANSI، و/یا کلید TAB در دستور add بهطور کامل پشتیبانی نشوند. (برای دستیابی به بهترین نتیجه، یک پنجره powershell را امتحان کنید.)
هنگام پردازش فایلهای داده بزرگ، hledger نسبت به Ledger حافظه بیشتری مصرف میکند.
عیبیابی
در اینجا برخی از مشکلات رایجی که ممکن است هنگام اجرای hledger با آنها مواجه شوید و نحوه رفع آنها آورده شده است (همچنین به یاد داشته باشید که معمولاً میتوانید پشتیبانی سریعی دریافت کنید):
مشکلات PATH: خطایی مانند "No command 'hledger' found" دریافت میکنم
بسته به نحوه نصب hledger، ممکن است فایلهای اجرایی در PATH پوسته شما قرار نداشته باشند. به عنوان مثال در سیستمهای unix، ابزار stack برنامه hledger را در ~/.local/bin و cabal آن را در ~/.cabal/bin نصب میکند. ممکن است لازم باشد یکی از این دایرکتوریها را به PATH پوسته خود اضافه کنید، و/یا یک پنجره ترمینال جدید باز کنید.
مشکلات LEDGER_FILE: متغیر LEDGER_FILE را پیکربندی کردهام اما hledger از آن استفاده نمیکند
- متغیر LEDGER_FILE باید یک متغیر محیطی واقعی باشد، نه صرفاً یک متغیر پوسته. به عنوان مثال در unix، دستور env | grep LEDGER_FILE باید آن را نمایش دهد. ممکن است نیاز به استفاده از دستور export داشته باشید (ببینید: https://stackoverflow.com/a/7411509). در Windows، دستور $env:LEDGER_FILE باید آن را نمایش دهد.
- ممکن است لازم باشد پوسته خود را مجبور کنید تا پیکربندی جدید را ببیند. یک راه ساده این است که پنجره ترمینال خود را ببندید و یک پنجره جدید باز کنید.
مشکلات رمزگشایی متن: خطاهایی مانند "Illegal byte sequence" یا "Invalid or incomplete multibyte or wide character" یا "commitAndReleaseBuffer: invalid argument (invalid character)" دریافت میکنم
برنامه hledger معمولاً نیاز دارد که ورودی آن با کدگذاری متن محلی (locale) سیستم قابل رمزگشایی باشد. بخشهای Text encoding و Install: Text encoding را ببینید.
مشکلات سازگاری: hledger در پردازش فایل Ledger من خطا میدهد
تمامی نحو
فایل دفتر
روزنامه یا
مجموعه
قابلیتهای
Ledger پشتیبانی
نمیشود.
برای
جزئیات
کامل
بخشهای hledger و
Ledger را ببینید..SH
"نویسندگان
(AUTHORS)" Simon Michael <simon@joyful.com> و
مشارکتکنندگان.
http://hledger.org/CREDITS.html را
ببینید.
کپیرایت و تکثیر (COPYRIGHT)
کپیرایت 2007-2023 متعلق به Simon Michael و مشارکتکنندگان.
مجوز (LICENSE)
تحت مجوز GNU GPL v3 یا بالاتر منتشر شده است.
همچنین ببینید (SEE ALSO)
hledger(1), hledger-ui(1), hledger-web(1), ledger(1)
| March 2026 | hledger-1.52 |