Ръководство за миграция от QuickBooks към Beancount
Етап 1: Експортиране на данни от QuickBooks
Мигрирането на данни за пет години започва с извличането на всички записи от QuickBooks в използваем формат. QuickBooks Desktop и QuickBooks Online имат различни опции за експорт:
1.1 QuickBooks Desktop – Опции за експорт
IIF (Intuit Interchange Format): QuickBooks Desktop може да експортира списъци (като сметкоплан, клиенти, доставчици) в текстови файлове .IIF. В QuickBooks Desktop отидете на Файл → Помощни програми → Експорт → Списъци в IIF (File → Utilities → Export → Lists to IIF), след което изберете списъците, от които се нуждаете (напр. Сметкоплан, Клиенти, Доставчици). Това създава текстов файл, който включва имена на сметки, типове и данни от списъците. IIF е патентован, но текстов формат, който е сравнително лесен за анализиране. Използвайте го, за да заснемете своя Сметкоплан и списъци с контакти за справка в Beancount.
Главна книга/Оборотна ведомост чрез CSV: За транзакционни данни QuickBooks Desktop не предоставя експорт с едно кликване, но можете да използвате отчети. Препоръчителният метод е да експортирате Главния журнал (General Journal) (всички транзакции) за желания период. В QuickBooks Desktop отворете Отчети → Счетоводител и данъци → Журнал (Reports → Accountant & Taxes → Journal), задайте датите от най-ранната транзакция до днес и кликнете върху Експорт → Excel. Запазете резултата като CSV, след като премахнете заглавките/долните колонтитули на отчета и празните колони. Уверете се, че числовите данни са чисти: включете стотинки (напр. 3.00, а не 3), без излишни кавички и без символи за валута или двойни минуси в CSV файла. CSV файлът трябва да има колони като Дата, № на транзакция, Име, Сметка, Бележка, Дебит, Кредит, Салдо (или една колона за сума в зависимост от формата на отчета).
Съвет: QuickBooks Desktop 2015+ може също да експортира транзакции чрез диалоговия прозорец На миране (Find). Използвайте Редактиране → Намиране → Разширено (Edit → Find → Advanced), задайте периода от пет години, след което експортирайте резултатите в CSV. Внимание: Някои версии ограничават експорта до 32 768 реда. Ако имате много големи данни, експортирайте година по година (или по-малки части), за да избегнете орязване, след което ги комбинирайте. Уверете се, че периодите не се застъпват, за да предотвратите дубликати.
Други формати (QBO/QFX/QIF): QuickBooks Desktop може да импортира банкови транзакции чрез файлове .QBO (Web Connect) или .QFX/.OFX, но те не са типични за експортиране от QuickBooks. Ако целта ви е да извлечете само банкови транзакции, може би вече ги имате в QBO/OFX от вашата банка. Въпреки това, за пълен експорт на главната книга, придържайте се към IIF и CSV. QuickBooks Desktop не може директно да експортира в QIF (Quicken Interchange Format) без инструменти от трети страни. Ако намерите начин да получите QIF, имайте предвид, че някои стари инструменти за счетоводство (по-стари версии на Ledger 2.x) могат да четат QIF, но е по-добре да работите с CSV в нашия процес.
1.2 QuickBooks Online – Опции за експорт
Вграден експорт в Excel/CSV: QuickBooks Online (QBO) предоставя инструмент за Експорт на данни (Export Data). Отидете на Настройки ⚙ → Инструменти → Експорт на данни (Settings ⚙ → Tools → Export Data). В диалоговия прозорец за експорт използвайте раздела Отчети (Reports), за да изберете данни (напр. Главна книга или Списък на транзакциите) и раздела Списъци (Lists) за списъци (сметкоплан и др.), изберете Всички дати (All dates) и експортирайте в Excel. QuickBooks Online ще изтегли ZIP архив, съдържащ множество Excel файлове за избраните отчети и списъци (например, Отчет за приходите и разходите, Баланс, Главна книга, Клиенти, Доставчици, Сметкоплан и др.). След това можете да конвертирате тези Excel файлове в CSV за обработка.
Отчет с детайли на транзакциите: Ако експортът по подразбиране на QBO не включва един файл с Главна книга, можете ръчно да генерирате подробен отчет:
- Отидете на Отчети (Reports) и намерете Детайли на транзакциите по сметка (Transaction Detail by Account) (или Главна книга (General Ledger) в някои версии на QBO).
- Задайте Период на отчета (Report period) за целия петгодишен период.
- Под опциите на отчета задайте Групиране по = Няма (Group by = None) (за да се изброят отделните транзакции без междинни суми).
- Персонализирайте колоните, за да включват поне: Дата, Тип на транзакцията, Номер, Име (Получател/Клиент), Бележка/Описание, Сметка, Дебит, Кредит (или една колона Сума) и Салдо. Включете клас или местоположение, ако се използват.
- Генерирайте отчета и след това Експортирайте в Excel.
Това дава подробна книга на всички транзакции. Запазете я като CSV. Всеки ред ще представлява едно записване (осчетоводяване) на транзакция. По-късно ще трябва да групирате редовете по транзакции за конвертиране.
Сметкоплан и други списъци: QuickBooks Online може да експортира сметкопла на чрез Счетоводство → Сметкоплан → Групови действия → Експорт в Excel (Accounting → Chart of Accounts → Batch Actions → Export to Excel). Направете това, за да получите имената и типовете на сметките. По същия начин експортирайте Клиенти, Доставчици и др., ако искате да прехвърлите имената за метаданни.
QuickBooks Online API (По избор): За програмен подход, Intuit предоставя REST API за данни от QBO. Напредналите потребители могат да създадат приложение за QuickBooks Online (изисква се акаунт на разработчик) и да използват API за извличане на данни в JSON. Например, можете да заявите крайната точка Account за сметкоплана и крайната точка за отчет JournalEntry или GeneralLedger за транзакциите. Има Python SDK-та като python-quickbooks, които обвиват API-то. Въпреки това, използването на API включва OAuth удостоверяване и е прекалено сложно за еднократна миграция, освен ако не предпочитате автоматизация. В повечето случаи ръчният експорт в CSV/Excel е по-прост и по-малко податлив на грешки.
Етап 2: Трансформиране и почистване на данни
След като имате данните от QuickBooks в CSV (и/или IIF), следващата стъпка е да ги конвертирате в текстовия формат на счетоводната книга на Beancount. Това включва анализиране на експортите, съпоставяне на сметките от QuickBooks със сметкоплана на Beancount и форматиране на транзакциите в синтаксиса на Beancount.
2.1 Анализиране на експорти от QuickBooks с Python
Използването на Python ще гарантира точност и възпроизводимост на трансформацията. Ще очертаем скриптове за две ключови задачи: импортиране на сметкоплана и конвертиране на транзакции.
Импортиране и съпоставяне на сметки: От решаващо значение е да настроите сметките си в Beancount, преди да добавите транзакции. Сметките в QuickBooks имат типове (Банка, Вземания, Разходи и др.), които ще съпоставим с йерархията на Beancount (Активи, Пасиви, Приходи, Разходи и др.). Например, можем да използваме съпоставка като:
# Съпоставяне на типа сметка в QuickBooks с основната категория в Beancount
AccountTypeMap = {
'BANK': 'Assets',
'CCARD': 'Liabilities',
'AR': 'Assets', # Вземания като актив
'AP': 'Liabilities', # Задължения като пасив
'FIXASSET': 'Assets',
'OASSET': 'Assets', # Други активи
'OCASSET': 'Assets', # Други текущи активи
'LTLIAB': 'Liabilities', # Дългосрочни задължения
'OCLIAB': 'Liabilities', # Други текущи задължения
'EQUITY': 'Equity',
'INC': 'Income',
'EXP': 'Expenses',
'EXINC': 'Income', # Други приходи
'EXEXP': 'Expenses', # Други разходи
}
Използвайки експорта на IIF от QuickBooks Desktop или CSV файла със списъка на сметките от QBO, извличаме името и типа на всяка сметка. След това:
-
Създайте имена на сметки в Beancount: QuickBooks понякога използва двоеточие (
:) в имената на сметките, за да обозначи подсметки (напр. „Current Assets:Checking“). Beancount използва същата нотация с двоеточие за йерархия. Често можете да използвате името директно. Ако имената на сметките в QuickBooks не започват с категория, добавете съпоставената категория отпред. Например, сметка в QuickBooks от типBANK, наречена "Checking", ще станеAssets:Checkingв Beancount. СметкаEXP(разход), наречена "Meals", ставаExpenses:Mealsи т.н. -
Осигурете валидни имена: Премахнете или заменете всякакви символи, които могат да объркат Beancount. QuickBooks позволява симв оли като
&или/в имената. Разумно е да премахнете или замените специалните символи (напр. заменете&сand, премахнете наклонени черти или интервали). Също така се уверете, че всички имена на сметки са уникални след трансформацията – QuickBooks може да е позволил едно и също име на подсметка под различни родителски сметки, което е добре, но в Beancount пълното име (с родителите) трябва да е уникално. Ако е необходимо, преименувайте или добавете квалификатор, за да ги разграничите. -
Генериране на откривания на сметки: В Beancount всяка използвана сметка трябва да бъде открита с директива
open. Можете да изберете дата преди първата ви транзакция (напр. ако мигрирате данни за 2019–2023 г., използвайте2018-12-31или дори по-ранна дата за всички откривания). Скриптът ще запише редове като:2018-12-31 open Assets:Checking USD2018-12-31 open Expenses:Meals USDза всяка сметка (ако приемем, че USD е основната валута). Използвайте подходящата валута за всяка сметка (вижте бележките за многовалутност по-долу).
Конвертиране на транзакции: Основното предизвикателство е конвертирането на експорта на транзакции от QuickBooks (CSV) в записи на Beancount. Всяка транзакция в QuickBooks (фактура, сметка, чек, счетоводна статия и др.) може да има множество записвания (редове), които трябва да бъдат събрани в една транзакция на Beancount.
Ще използваме CSV четеца на Python, за да обходим експортираните редове и да натрупаме записванията:
import csv
from collections import defaultdict
# Прочитане на всички редове от CSV файла с журнал от QuickBooks
rows = []
with open('quickbooks_exported_journal.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for line in reader:
rows.append(line)
# Групиране на редовете по транзакция (ако приемем, че 'Trans #' идентифицира транзакциите)
transactions = defaultdict(list)
for line in rows:
trans_id = line.get('Trans #') or line.get('Transaction ID') or line.get('Num')
transactions[trans_id].append(line)
Сега transactions е речник, където всеки ключ е ID/номер на транзакция, а стойността е списъкът със записвания за тази транзакция. След това конвертираме всяка група в Beancount:
def format_date(qb_date):
# Датите в QuickBooks може да са като "12/31/2019"
m, d, y = qb_date.split('/')
return f"{y}-{int(m):02d}-{int(d):02d}"
output_lines = []
for trans_id, splits in transactions.items():
# Сортиране на записванията по ред, ако е необходимо (обикновено излизат подредени)
splits = sorted(splits, key=lambda x: x.get('Line') or 0)
first = splits[0]
date = format_date(first['Date'])
payee = first.get('Name', "").strip()
memo = first.get('Memo', "").strip()
# Заглавие на транзакцията
output_lines.append(f"{date} * \"{payee}\" \"{memo}\"")
if first.get('Num'): # включване на референтен номер, ако има
output_lines.append(f" number: \"{first['Num']}\"")
# Обхождане на всяко записване/осчетоводяване
for split in splits:
acct_name = split['Account'].strip()
# Съпоставяне на името на сметката в QuickBooks с тази в Beancount (използвайки по-ранното съпоставяне)
beancount_acct = account_map.get(acct_name, acct_name)
# Определяне на сумата със знак:
amount = split.get('Amount') or ""
debit = split.get('Debit') or ""
credit = split.get('Credit') or ""
if amount:
# Някои експорти имат една колона "Amount" (отрицателна за кредити)
amt_str = amount
else:
# Ако има отделни колони Debit/Credit
amt_str = debit if debit else f"-{credit}"
# Премахване на запетаи в числата за сигурност
amt_str = amt_str.replace(",", "")
# Добавяне на валута
currency = split.get('Currency') or "USD"
amt_str = f"{amt_str} {currency}"
# Бележка/описание за записването
line_memo = split.get('Memo', "").strip()
comment = f" ; {line_memo}" if line_memo else ""
output_lines.append(f" {beancount_acct:<40} {amt_str}{comment}")
# Край на транзакцията – празен ред
output_lines.append("")
Тази логика на скрипта прави следното:
-
Форматира датата в YYYY-MM-DD за Beancount.
-
Използва получателя (Name) и бележката (memo) за описанието на транзакцията. Например:
2020-05-01 * "ACME Corp" "Плащане по фактура"(Ако няма получател, можете да използвате типа на транзакцията в QuickBooks или да оставите кавичките за получател празни). -
Добавя метаданни
number, ако има референтен номер (номер на чек, номер на фактура и др.). -
Обхожда всеки ред на записване:
- Съпоставя името на сметката в QuickBooks с тази в Beancount, използвайки речник
account_map(попълнен от стъпката със сметкоплана). - Определя сумата. В зависимост от вашия експорт, може да имате една колона Amount (с положителни/отрицателни стойности) или отделни колони Debit и Credit. Кодът по-горе обработва и двата случая. Той гарантира, че кредитите са представени като отрицателни суми за Beancount (тъй като в Beancount се използва едно число със знак за всяко записване).
- Прикача валутата (ако приемем USD, освен ако не присъства друга колона за валута).
- Записва реда на записване в Beancount със сметката, сумата и коментар с бележката от реда. Например:
Assets:Checking 500.00 USD ; ДепозитIncome:Sales -500.00 USD ; ДепозитТова отразява депозит от $500 (от Приходи към Разплащателна сметка).
- Съпоставя името на сметката в QuickBooks с тази в Beancount, използвайки речник
-
След изброяването на всички записвания, празен ред разделя транзакцията.
Обработка на многовалутност: Ако данните ви в QuickBooks включват няколко валути, включете кода на валутата при всяко записване (както е показано по-горе). Уверете се, че сметките, които са в чуждестранни валути, са открити с тази валута. Например, ако и мате банкова сметка в EUR, ще генерирате open Assets:Bank:Checking EUR и транзакциите в тази сметка ще използват EUR. Beancount поддържа многовалутни книги и ще проследява имплицитните превалутирания, но може да се наложи да добавите записи за цени за обменните курсове, ако искате превалутиране в базова валута в отчетите. Също така се препоръчва да декларирате основната си оперативна валута в горната част на файла на Beancount (напр. option "operating_currency" "USD").
Изпълнение на конверсията: Запазете Python скрипта (например като qb_to_beancount.py) и го изпълнете върху експортираните файлове. Той трябва да произведе .beancount файл, съдържащ всички сметки и транзакции.
2.2 Справяне с гранични случаи и почистване на данни
По време на трансформацията имайте предвид тези често срещани капан и и как да се справите с тях:
-
Несъответствия в имената на сметките: QuickBooks може да има имена на сметки, които са в конфликт с йерархичните имена на Beancount. Например, QuickBooks може да има две различни родителски сметки, всяка с подсметка на име "Застраховка". В Beancount
Expenses:Insuranceтрябва да бъде уникална. Решете това, като преименувате едната (напр. "Застраховка-Автомобил" срещу "Застраховка-Здраве") преди експорта или ги съпоставете с уникални сметки в Beancount във вашия скрипт. Последователните конвенции за именуване (без специални символи и използване на йерархия) ще спестят главоболия. Използвайте подхода с файл за пресъпоставяне, ако е необходимо: поддържайте CSV или речник на старо име → ново име в Beancount и го прилагайте по време на конверсията (нашият примерен код използваaccount_mapи може да зарежда замествания от файл). -
Дати и формати: Уверете се, че всички дати са форматирани последователно. Скриптът по-горе нормализира M/D/Y в ISO формат. Също така, внимавайте за проблеми с фискална срещу календарна година, ако петгодишният ви период пресича края на годината. Beancount не се интересува от границите на фискалната година, но по-късно може да искате да разделите файловете по години за удобство.
-
Числова точност: QuickBooks работи с валута със стотинки, така че работата в стотинки обикновено е добре. Всички суми в идеалния случай трябва да имат две цифри след десетичната запетая в CSV файла. Ако някои суми са се превърнали в цели числа (без десетична запетая) или имат запетаи/скоби (за отрицателни стойности), почистете ги в скрипта (премахнете запетаите, конвертирайте
(100.00)в-100.00и т.н.). Правилно направеният CSV експорт (съгласно инструкциите) би трябвало вече да избягва тези проблеми с форматирането. -
Отрицателни суми и знаци: Отчетите на QuickBooks понякога показват отрицателни стойности като
-100.00или(100.00)или дори--100.00в някои експорти в Excel. Стъпката на почистване трябва да се справи с тях. Уверете се, че дебитите и кредитите на всяка транзакция се балансират до нула. Beancount ще наложи това (ако не е балансирано, ще хвърли грешка при импортиране). -
Дублирани т ранзакции: Ако се е наложило да експортирате транзакции на партиди (напр. година по година или сметка по сметка), бъдете внимателни да ги обедините без припокриване. Проверете дали първата транзакция на една година не е и последната от предишната партида и т.н. Лесно е случайно да дублирате няколко транзакции на границите. Ако подозирате дубликати, можете да сортирате крайните записи в Beancount по дата и да търсите идентични записи, или да използвате уникалните тагове за транзакции на Beancount, за да ги уловите. Една стратегия е да включите номерата на транзакциите от QuickBooks като метаданни (напр. използвайте
Trans #или номер на фактура като тагtxnили метаданниquickbooks_id) и след това да се уверите, че няма дубликати на тези ID-та. -
Небалансирани записвания / Сметки за уреждане: QuickBooks може да има странни случаи като транзакция с небаланс, който QuickBooks автоматично е коригирал към „Начален собствен капитал“ или „Неразпределена печалба“. Например, при задаване на начални салда на сметки, QuickBooks често осчетоводява разликите в сметка от Собствен капитал. Те ще се появят в ек спортираните транзакции. Beancount ще изисква изрично балансиране. Може да се наложи да въведете сметка от Собствен капитал за начални салда (обикновено
Equity:Opening-Balances), за да отразите QuickBooks. Добра практика е да имате запис за начално салдо в първия ден на вашата счетоводна книга, който установява началните салда на всички сметки (вижте Етап 5). -
Гранични случаи с многовалутност: Ако използвате многовалутност, експортът от QuickBooks може да изброява всички суми в домашна валута или в тяхната собствена валута. В идеалния случай, вземете данните в собствената валута за всяка сметка (отчетите на QuickBooks Online обикновено правят това). В Beancount всяко записване носи валута. Ако QuickBooks е предоставил обменни курсове или превалутиране в домашна валута, можете да ги игнорирате и да разчитате на записите за цени в Beancount. Ако QuickBooks не е експортирал обменни курсове, може да искате ръчно да добавите записи за цени (напр. използвайки директивата
priceна Beancount) за ключови дати, за да съответстват на оценката. Въпреки това, за основна цялостност на счетоводната книга е достатъчно транзакциите да се балансират в оригиналните си валути – нереализираните печалби/загуби не е необходимо да се записват изрично, освен ако не искате същите отчети. -
Вземания / Задължения: QuickBooks проследява детайли по фактури и сметки (падежни дати, статус на плащане и др.), които няма да се прехвърлят напълно в обикновена счетоводна книга. Ще получите транзакциите по Вземания и Задължения (фактури, увеличаващи Вземанията, плащания, намаляващи Вземанията и т.н.), но не и документите на фактурите или салдата на клиентите по фактури. В резултат на това, след миграцията, трябва да проверите дали салдата на сметките ви за Вземания и Задължения в Beancount са равни на отворените салда на клиенти/доставчици в QuickBooks. Ако трябва да проследявате фактури, можете да използвате метаданните на Beancount (напр. да включите таг
invoiceили линк). Номерата на фактурите от QuickBooks би трябвало да са дошли в полетатаNumилиMemo– нашият скрипт запазваNumкатоnumber: "..."в метаданните на транзакцията. -
Неактивни или закрити сметки: Експортът на IIF може да включва неактивни сметки (ако сте избрали да ги включите). Добре е да ги импортирате (те просто няма да имат транзакции и нулево салдо, ако са наистина неактивни). Можете да ги маркирате като закрити в Beancount след датата на последната транзакция с директива
close. Това поддържа вашата счетоводна книга подредена. Например:2023-12-31 close Expenses:OldAccount ; закрито след миграциятаТова е по избор и е предимно за чистота.
Чрез внимателно почистване и съпоставяне на данните, както е описано по-горе, ще имате файл на счетоводна книга на Beancount, който структурно отразява вашите данни от QuickBooks. Следващата стъпка е да проверите дали той също числово отразява QuickBooks.
Етап 3: Валидиране и равнение на данни
Валидирането е критичен етап в миграцията на счетоводни данни. Трябва да се уверим, че счетоводната книга на Beancount съвпада с книгите на QuickBooks до стотинка. Могат да се използват няколко стратегии и инструменти:
3.1 Равнение на оборотна ведомост
Отчетът оборотна ведомост (trial balance) изброява крайните салда на всички сметки (с посочени дебити и кредити или положителни/отрицателни стойности) и трябва да се равнява на нула. Генерирането на оборотна ведомост в двете системи за една и съща дата е най-бързият начин да се потвърди общата точност.
-
В QuickBooks: Генерирайте отчет Оборотна ведомост (Trial Balance) за последния ден от последната година (напр. 31 декември 2023 г.). Този отчет показва салдото на всяка сметка. Експортирайте го или си запишете ключовите цифри.
-
В Beancount: Използвайте отчетите на Beancount, за да генерирате оборотна ведомост. Един лесен метод е чрез командния ред:
bean-report migrated.beancount balancesОтчетът
balancesе оборотна ведомост, която изброява всички сметки и техните салда. Можете също да отворите файла във Fava (уеб интерфейса на Beancount) и да погледнете секцията Салда (Balances) или Баланс (Balance Sheet). Всяко салдо на сметка в Beancount трябва да съвпада с оборотната ведомост на QuickBooks. Например, ако QuickBooks показва _Вземания = 5,000 (дебит). Ако*Приходи от продажби = 200,000 (кредит, което може да се покаже като -200,000, ако използвате оборотна ведомост, която представя кредитите като отрицателни).
Ако има несъответствия, локализирайте ги:
- Проверете дали цяла сметка липсва или е в повече (забравили ли сме сметка или сме включили такава, която вече е била закрита преди периода на миграция?).
- Ако салдото е грешно, разгледайте в детайли: QuickBooks може да генерира Бърз отчет по сметка (Account QuickReport) или детайлна книга за тази сметка, и можете да я сравните с регистъра на Beancount за тази сметка (
bean-report migrated.beancount register -a ИменаСметка). Понякога разликите идват от липсваща или дублирана транзакция.
Също така проверете дали сумата на всички сметки е нула в оборотната ведомост на Beancount (тя отпечатва обща сума, която трябва да бъде нула или много близо до нула). Beancount налага двойно записване, така че ако имате някакъв ненулев небаланс, това означава, че активите минус пасивите-собствен капитал не се равняват на нула, което показва проблем (който QuickBooks обикновено също не би позволил, но може да се случи, ако някои данни са били пропуснати).
3.2 Сравнение на салдата по сметки
Освен оборотната ведомост, можете да сравните конкретни финансови отчети:
-
Баланс: Генерирайте Баланс в QuickBooks за крайната дата и баланс в Beancount (
bean-report migrated.beancount balsheet). Това е подобно на оборотната ведомост, но организирано по Активи, Пасиви, Собствен капитал. Числата трябва да съвпадат по категории. За по-детайлна проверка, сравнете общите суми на основните сметки: парични средства, вземания, дълготрайни активи, задължения, собствен капитал и др. -
Отчет за приходите и разходите (ОПР): Генерирайте ОПР за петгодишния период (или година по година) в QuickBooks и в Beancount (
bean-report migrated.beancount incomeза ОПР за целия пери од). Нетната печалба от Beancount трябва да е равна на тази от QuickBooks за всеки период. Ако сте мигрирали всичките пет години, кумулативната нетна печалба трябва да съвпада. Можете също да сравните отделните общи суми на приходите и разходите, за да се уверите, че никоя категория не е пропусната или удвоена. -
Случайна извадка от транзакции: Изберете няколко случайни транзакции (особено от всяка година и всяка основна сметка) и проверете дали са мигрирали правилно. Например, намерете фактура отпреди 3 години в QuickBooks и след това потърсете нейната сума или бележка във файла на Beancount (тъй като всички транзакции са текст, можете да отворите файла
.beancountв текстов редактор или да използвате инструменти за търсене). Проверете дали датата, сумите и сметките съвпадат. Това помага да се хванат всякакви проблеми с форматирането на дати или грешно съпоставени сметки.
3.3 Автоматизирани проверки за цялостност
Възползвайте се от собствените инструменти за валидация на Beancount:
-
bean-check: Изпълнете
bean-check migrated.beancount. Това ще анализира файла и ще докладва всякакви грешки в синтаксиса или балансирането. Ако скриптът е пропуснал нещо като неоткрита сметка или небалансирана транзакция,bean-checkще го сигнализира. Чисто преминаване (без изход) означава, че файлът е поне вътрешно последователен. -
Декларации за салдо: Можете да добавите изрични декларации за салдо в счетоводната книга за ключови сметки като допълнителна проверка. Например, ако знаете салдото по банковата сметка на определена дата, добавете ред:
2023-12-31 balance Assets:Bank:Checking 10000.00 USDТогаваbean-checkще гарантира, че в счетоводната книга, към тази дата, салдото е наистина $10,000. Това е по избор, но може да бъде полезно за сметки с голямо значение. Можете да вземете крайните салда от QuickBooks (напр. края на всяка година) и да ги декларирате във файла на Beancount. Ако някоя декларация се провали, Beancount ще докладва разлик а. -
Проверка на оборотната ведомост по периоди: Ако предпочитате, можете да направите проверка период по период. За всяка година сравнете нетната промяна. Например, нетната печалба в QuickBooks за 2020 г. срещу тази в Beancount за 2020 г. и т.н., за да се уверите, че всяка година се е закрила правилно в собствен капитал (QuickBooks автоматично прехвърля нетната печалба в Неразпределена печалба всяка нова година; в Beancount просто ще видите кумулативен собствен капитал). Ако видите разлики, това може да показва проблем в данните за конкретна година.
-
Брой транзакции и дубликати: Пребройте броя на транзакциите в QuickBooks срещу Beancount. QuickBooks не показва директно броя лесно, но можете да прецените, като преброите редовете в CSV файла (всеки заглавен ред на транзакция срещу записванията). В Beancount бърз начин е да се преброят срещанията на
txnили* "във файла. Те трябва да са равни или малко повече от тези в QuickBooks (ако сте добавили транзакции за начално салдо или корекции). Значително несъответствие означава, че нещо може да е било пропуснато или дублирано. Нашето използване на у никални ID-та в метаданните може да помогне: ако подозирате дубликати, потърсете във файла на Beancount за един и същ номер на чек или фактура, който се появява два пъти, когато не би трябвало. -
Статус на равнение: Включихме метаданни
rec: "y"или"n"въз основа на статуса на изчистено/равнено в QuickBooks в нашия скрипт (катоrecв примера). Това не е стандартна функция на Beancount (Beancount не проследява изчистено/висящо по същия начин като Ledger), но може да бъде полезна метаданна. Можете да проверите дали всички транзакции, които са били равнени в QuickBooks, присъстват. В крайна сметка, новото равнение на банковите сметки в Beancount (използвайки вашите извлечения) може да бъде окончателното доказателство, че нищо не липсва.
Като извършите тези валидации, изграждате увереност, че миграцията е запазила данните. Отделете време за този етап – по-лесно е да се поправят аномалии сега, отколкото месеци по-късно, когато може да се разчита на книгите. Често срещани проблеми, ако валидацията се провали: липсващо начално салдо на сметка, транзакция с дата извън обхвата или инверсия на знака на запис. Всички те са поправими, след като бъдат идентифицирани.
Етап 4: Финализиране на счетоводната книга в Beancount
След почистване и валидиране е време да формализирате данните в структурата на вашата счетоводна книга в Beancount. „Финализиране“ тук означава както финализиране на файловете на счетоводната книга, така и потенциалното им добавяне в система за контрол на версиите за проследимост.