Преминете към основното съдържание

from-quickbooks-to-plain-text-a-migration-playbook

· 33 минути четене

title: "Ръководство за миграция от QuickBooks към Beancount" tags: [миграция, QuickBooks, Beancount, счетоводство, експорт на данни] keywords: [миграция от QuickBooks, настройка на Beancount, преход към счетоводен софтуер, методи за експорт на данни] description: "Научете как ефективно да мигрирате счетоводните си данни от QuickBooks към Beancount, като започнете с основните опции за експорт за QuickBooks Desktop и Online." image: "https://opengraph-image.blockeden.xyz/api/og-beancount-io?title=QuickBooks%20to%20Beancount%20Migration%20Playbook" authors: [mike]

Ръководство за миграция от 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 не включва един файл с Главна книга, можете ръчно да генерирате подробен отчет:

  1. Отидете на Отчети (Reports) и намерете Детайли на транзакциите по сметка (Transaction Detail by Account) (или Главна книга (General Ledger) в някои версии на QBO).
  2. Задайте Период на отчета (Report period) за целия петгодишен период.
  3. Под опциите на отчета задайте Групиране по = Няма (Group by = None) (за да се изброят отделните транзакции без междинни суми).
  4. Персонализирайте колоните, за да включват поне: Дата, Тип на транзакцията, Номер, Име (Получател/Клиент), Бележка/Описание, Сметка, Дебит, Кредит (или една колона Сума) и Салдо. Включете клас или местоположение, ако се използват.
  5. Генерирайте отчета и след това Експортирайте в 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 USD 2018-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 включват няколко валути, включете кода на валутата при всяко записване (както е показано по-горе). Уверете се, че сметките, които са в чуждестранни валути, са открити с тази валута. Например, ако имате банкова сметка в 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, тогава сметката Assets:Accounts Receivable в Beancount трябва да е общо $5,000 (дебит). Ако Приходи от продажби = $200,000, тогава Income:Sales в Beancount трябва да показва $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. „Финализиране“ тук означава както финализиране на файловете на счетоводната книга, така и потенциалното им добавяне в система за контрол на версиите за проследимост.

4.1 Организиране на файловете на счетоводната книга и конфигурация

Решете как да структурирате файловете на счетоводната книга на Beancount. За данни от пет години можете да държите всичко в един файл или да го разделите по години или категории. Често срещана, ясна структура е:

  • Основен файл на счетоводната книга: напр. ledger.beancount – Това е входната точка, която може да include други файлове. Тя може да съдържа глобални опции и след това да включва годишните файлове.
  • Файл със сметки: Дефинирайте сметкоплана и началните салда. Например, accounts.beancount с всички директиви open (както са генерирани от скрипта). Можете също да изброите стоките (валутите) тук.
  • Файлове с транзакции: По един за всяка година, напр. 2019.beancount, 2020.beancount и т.н., съдържащи транзакциите за тази година. Това поддържа всеки файл с управляем размер и ви позволява да се съсредоточите върху дадена година, ако е необходимо. Алтернативно, можете да разделите по субект или сметка, но разделянето по време е лесно за финансови данни.

Примерен основен файл:

option "title" "Моята бизнес счетоводна книга"
option "operating_currency" "USD"

include "accounts.beancount"
include "2019.beancount"
include "2020.beancount"
...
include "2023.beancount"

По този начин всички данни се агрегират, когато генерирате отчети, но поддържате ред.

Beancount не изисква множество файлове – можете да имате един голям файл – но горната структура подобрява яснотата и контрола на версиите. Според най-добрите практики на Beancount, е добре да се използват ясни заглавия на секции и да се групират логически свързани записи.


4.2 Задаване на начални салда и собствен капитал

Ако миграцията ви не е от абсолютна нула, ще трябва да се справите с началните салда. Два сценария:

  • Книги, започващи от нулата: Ако петгодишният период започва със създаването на бизнеса (напр. сте започнали да използвате QuickBooks през януари 2019 г. с всички сметки на нула, с изключение на първоначалния капитал), тогава може да не се нуждаете от отделна транзакция за начално салдо. Първите транзакции през 2019 г. (като първоначално финансиране към банкова сметка) естествено ще установят начални салда. Просто се уверете, че всеки първоначален капитал или предишна неразпределена печалба са отчетени чрез транзакции със собствен капитал.

  • Книги в средата на периода (частична история): Ако сте започнали с QuickBooks по-рано и 2019 г. е средна точка, тогава към 1 януари 2019 г. всяка сметка е имала пренесено салдо. QuickBooks би ги имал като начални салда или неразпределена печалба. В Beancount е типично да се създаде запис за начални салда в деня преди началната ви дата:

    • Използвайте сметка от собствен капитал, наречена Equity:Opening-Balances (или подобна), за да компенсирате сумата на всички начални суми.
    • Пример: ако на 31.12.2018 г. паричните средства са били $10,000, вземанията $5,000, а задълженията $3,000 (кредит), ще напишете транзакция: 2018-12-31 * "Начални салда" Assets:Cash 10000.00 USD Assets:Accounts Receivable 5000.00 USD Liabilities:Accounts Payable -3000.00 USD Equity:Opening-Balances -12000.00 USD Това оставя Opening-Balances с отрицателната сума (–$12k), която балансира записа. Сега всички сметки за активи/пасиви започват 2019 г. с правилни салда. Това трябва да отразява всякакви „Неразпределена печалба“ или пренесени салда от QuickBooks.
    • Алтернативно, използвайте директивите pad и balance на Beancount: За всяка сметка можете да я pad-нете от Opening-Balances и да декларирате салдото. Това е по-автоматизиран начин. Например: 2018-12-31 pad Assets:Cash Equity:Opening-Balances 2018-12-31 balance Assets:Cash 10000.00 USD Това казва на Beancount да вмъкне какъвто и да е необходим запис (към Opening-Balances), така че паричните средства да са равни на 10000 USD към тази дата. Направете това за всяка сметка. Резултатът е подобен, но писането на изрична транзакция, както в първия метод, също е лесно.
  • Неразпределена печалба: QuickBooks не експортира изрично транзакция „Неразпределена печалба“ – той просто я изчислява. След миграцията може да забележите, че Equity:Retained Earnings е нула, ако не сте я създали. В Beancount неразпределената печалба е просто печалбата от предходни години. Можете да изберете да създадете сметка за Неразпределена печалба и да прехвърлите предходните печалби в нея в първия ден на всяка нова година, или просто да оставите собствения капитал да бъде сумата от всички приходи/разходи (която се появява под секцията Собствен капитал в отчетите). За прозрачност някои потребители записват приключвателни статии годишно. Това е по избор и е предимно за представяне. Тъй като мигрирахме всички транзакции, печалбата за всяка година естествено ще се натрупа, ако генерирате отчет за всяка година.

  • Сравнителни проверки: След като зададете началните салда, генерирайте баланс на началната дата, за да се уверите, че всичко е правилно (той трябва да показва тези начални салда срещу Начален капитал, които се равняват на нула).


4.3 Финализиране и контрол на версиите

Сега, когато данните са във формат на Beancount и са структурирани, е разумно да добавите файловете в хранилище за контрол на версиите (напр. git). Всяка промяна в счетоводната книга може да бъде проследена и имате одитна следа на всички модификации. Това е голямо предимство на текстовото счетоводство. Например, в QuickBooks промените може да не са лесно сравними, но в Beancount можете да видите разликите ред по ред. Както отбелязват някои потребители, с Beancount получавате прозрачност и възможност да връщате промени, ако е необходимо – всеки запис може да бъде свързан с история на промените.

Помислете за тагване на commit-а на тази първоначална миграция като v1.0 или подобно, за да знаете, че тя представлява състоянието на книгите, както са импортирани от QuickBooks. В бъдеще ще въвеждате нови транзакции директно в Beancount (или ще ги импортирате от банкови извлечения и др.), и можете да използвате нормални практики за разработка на софтуер (commit-ване месечно или ежедневно, използване на клонове за експерименти и др.).

Настройка на Fava или други инструменти: Fava е уеб интерфейс за Beancount, който улеснява преглеждането на отчети. След като commit-нете, изпълнете fava ledger.beancount, за да разгледате финансовите отчети и да ги сравните с отчетите си от QuickBooks за последен път. Може да забележите малки разлики по-лесно в потребителски интерфейс (например, сметка, която трябва да е нула, но показва малко салдо, показва липсващ приключвателен запис или случайна транзакция).

Конвенции за именуване и последователност: Сега имате пълен контрол, така че осигурете последователност:

  • Всички сметки трябва да имат ясни имена, започващи с главни букви на категориите (Assets, Liabilities и др.). Ако някои изглеждат странно (напр. Assets:assets:SomeAccount поради несъответствие в регистъра от QuickBooks), преименувайте ги във файла със сметки и актуализирайте транзакциите (бързо търсене/замяна във файла може да свърши работа, или използвайте bean-format на Beancount или мулти-курсор на редактора).
  • Символите на стоките (валутните кодове) трябва да са последователни. За USD, използвайте USD навсякъде (не $ или US$). За други, използвайте стандартни кодове (EUR, GBP, BGN и др.). Тази последователност е важна за търсенето на цени и отчетите в Beancount.
  • Премахнете всякакви временни или фиктивни сметки, които може да са били създадени (например, ако сте използвали Expenses:Miscellaneous за неизвестни сметки в скрипта като универсално решение, опитайте се да ги елиминирате, като съпоставите правилно всички сметки).

Закриване на QuickBooks: На този етап трябва да имате паралелни книги в Beancount, които съответстват на QuickBooks. Някои избират да поддържат двете системи паралелно за кратък период, за да се уверят, че нищо не е пропуснато. Но ако валидацията е солидна, можете да „закриете“ книгите на QuickBooks:

  • Ако това е корпоративна среда, помислете за експортиране на всички изходни документи от QuickBooks (фактури, сметки, касови бележки) за архив, тъй като те няма да съществуват в Beancount, освен ако не ги прикачите ръчно.
  • Съхранявайте резервно копие на данните от QuickBooks (както файла на компанията, така и експортираните файлове).
  • В бъдеще поддържайте счетоводната книга на Beancount като основна система за запис.

Като финализирате данните в счетоводната книга на Beancount, сте завършили процеса на миграция. Последната стъпка е да извършите одит и да демонстрирате последователността на финансовите отчети, за да се уверите (вие и всякакви заинтересовани страни или одитори), че миграцията е била успешна.

Етап 5: Одит след миграцията и примери

За да илюстрирате успеха на миграцията, подгответе сравнение „преди и след“ на финансовите отчети и евентуално разлика (diff) на транзакциите. Това предоставя доказателства, че книгите са последователни.

5.1 Проверка на финансовите отчети

Генерирайте ключови финансови отчети както от QuickBooks, така и от Beancount за едни и същи дати и ги сравнете:

  • Баланс към 31 декември 2023 г.: Сравнете общите суми на Активи, Пасиви и Собствен капитал ред по ред. Те трябва да съвпадат. Например, ако QuickBooks е показал Общо активи = $150,000 и Общо пасиви + собствен капитал = $150,000, балансът на Beancount трябва да показва същите общи суми. Ако сте структурирали сметките малко по-различно (да речем, че сте обединили някои подсметки), коригирайте това в сравнението или разбийте на следващо ниво, за да се уверите, че сумите са равни.

  • Отчет за приходите и разходите 2019–2023 г.: Уверете се, че общите приходи, общите разходи и нетната печалба за всяка година (или за целия период) са идентични. Могат да възникнат незначителни разлики, ако QuickBooks е направил някакво закръгляване в отчетите, но транзакциите обикновено носят стотинки точно, така че нетната печалба трябва да е точна. Ако печалбата за някоя година се различава, разгледайте данните за тази година – това често е индикатор за липсващ или дублиран запис в този период.

  • Разлики в оборотната ведомост: Ако е възможно, създайте електронна таблица, в която да изброите всяка сметка и салдото от QuickBooks срещу Beancount. Тъй като очакваме те да съвпадат, това може да бъде колона с изцяло нулеви разлики. Това по същество е кръстосаната проверка на оборотната ведомост, която обсъдихме, но изписването й помага да се документира.


5.2 Примерно сравнение (Преди и след)

По-долу е даден примерен фрагмент, демонстриращ последователността на данните. Да кажем, че нашата оборотна ведомост от QuickBooks за 31 декември 2023 г. е била:

СметкаСалдо в QuickBooks (31 дек 2023)
Активи
  Assets:Bank:Checking$12,500.00 (дебит)
  Assets:Accounts Receivable$3,200.00 (дебит)
Пасиви
  Liabilities:Credit Card$-1,200.00 (кредит)
  Liabilities:Loans Payable$-5,000.00 (кредит)
Собствен капитал
  Equity:Opening-Balances$-7,500.00 (кредит)
  Equity:Retained Earnings$-2,000.00 (кредит)
  Equity:Current Year Profit$0.00

В Beancount, след импортиране и осчетоводяване на всички транзакции до 2023 г., bean-report balances (оборотна ведомост) извежда:

СметкаСалдо в Beancount (31 дек 2023)
Активи
  Assets:Bank:Checking12,500.00 USD (дебит)
  Assets:Accounts Receivable3,200.00 USD (дебит)
Пасиви
  Liabilities:Credit Card-1,200.00 USD (кредит)
  Liabilities:Loans Payable-5,000.00 USD (кредит)
Собствен капитал
  Equity:Opening-Balances-7,500.00 USD (кредит)
  Equity:Retained Earnings-2,000.00 USD (кредит)
  Equity:Profit (2019-2023)0.00 USD

(Забележка: Секциите на собствения капитал може да са структурирани по различен начин; ключът е общите суми да съвпадат. Тук „Печалба (2019-2023)“ в Beancount играе ролята на комбинирана печалба за текущата година/неразпределена печалба, показвайки нула, защото печалбата е била приключена в Неразпределена печалба.)

Както е показано, всяка сметка съвпада до стотинка. Сумата на дебитите е равна на сумата на кредитите и от двете страни.

Освен това, ако генерираме ОПР за 2023 г.:

  • QuickBooks: Приходи $50,000, Разходи $48,000, Нетна печалба $2,000.
  • Beancount: Приходи $50,000, Разходи $48,000, Нетна печалба $2,000 (която след това е приключена в Неразпределена печалба или се появява под Собствен капитал в годишния баланс).

Можете да създадете разлика на транзакциите, ако е необходимо, но тъй като данните от QuickBooks не са в счетоводна форма, е по-ефективно да се разчита на отчети. Можете да сортирате както CSV файла от QuickBooks, така и транзакциите в Beancount по дата и да сравните ключови полета като последна проверка (това може да се направи в Excel или със скрипт). Въпреки това, като се има предвид, че се доверяваме на нашата по-ранна валидация, проверката на финансовите отчети обикновено е достатъчна.


5.3 Съвети за одит

  • Ако одитор или заинтересована страна се нуждае от уверение, представете финансовите отчети преди и след един до друг. Прозрачността на Beancount всъщност може да опрости одитите, защото можете да проследите всяко число от отчет обратно до изходния запис бързо (особено като използвате функционалността за детайлизиране на Fava).
  • Съхранявайте резервното копие на QuickBooks и експортираните CSV файлове като част от вашата одитна следа. Документирайте всички корекции, направени по време на миграцията (например, „Преименувана сметка X на Y за последователност“ или „Разделена транзакция Z на два записа за яснота“, ако сте правили такива промени).
  • В бъдеще въведете редовни проверки в Beancount. Например, месечното равнение на банковите сметки и декларация на тяхното крайно салдо помага за улавяне на всякакви проблеми с данните или грешки при въвеждане. Миграцията дава добра основа; поддържането на дисциплина в новата система ще гарантира продължителна точност.

Накрая, отпразнувайте завършването на миграцията: успешно сте прехвърлили счетоводни данни за пет години от QuickBooks към Beancount. Данните вече са в лек, текстови формат с контрол на версиите и пълна цялост на двойното записване. Вие сте експортирали данните, трансформирали сте ги с Python скриптове, валидирали сте целостта чрез оборотни ведомости и отчети, и сте ги финализирали в добре организирана счетоводна книга на Beancount. Този цялостен процес гарантира, че счетоводната книга на Beancount е точна, вярна реплика на вашите книги в QuickBooks за петгодишния период, подготвяйки ви за оптимизирано счетоводство в бъдеще.