審閱流程
一家公司如何從一個存放活頁簿的資料夾,走到完成結帳並已鎖定的月份:公司提供什麼、您只需決定一次的事項,以及之後每個月會發生什麼。
什麼是審閱
一次審閱就是一次結帳:針對一家公司的一個月份,執行一次處理流程。Haruno 會讀取該公司的活頁簿,據以建立一本標準化分類帳,執行完整性檢核,並寫出財務報表包、調節底稿與投資組合儀表板。接著,它會鎖定已報告的月份,讓已報告的數字日後無法在沒有紀錄的情況下變更。
審閱目前在 macOS 應用程式中執行。儀表板與任何一份報告都可以匯出為 PDF。
結帳的各個階段
| 階段 | 讀取 | 寫入 |
|---|---|---|
| 讀取 | workbooks/<client>/ 中的每個活頁簿或 CSV 檔 | 從每個檔案讀出的資料表,存放於 ledger/staging/。隱藏工作表會被擱置一旁,不予讀取。 |
| 建立分類帳 | 上述資料表,以及該公司已核准的對應設定檔(spec,每家公司一份 YAML 檔) | 標準化分類帳 ledger/ledger.sqlite |
| 檢核 | 分類帳 | 發現事項與待確認問題,列於結帳報告中 |
| 財務報表 | 分類帳,以及對應設定檔中的報表版面配置 | 財務報表包 |
| 調節 | 分類帳中的調節明細表 | 調節底稿 |
| 鎖定 | 本次結帳所報告的月份,以及未解決的發現事項 | 每個月份一筆結帳紀錄:「fully reconciled」(全部調節相符)或「reported with exception」(附例外事項報告) |
| 儀表板 | 分類帳;在本次執行的每家公司都完成結帳後讀取一次,涵蓋每一家有對應設定檔的公司 | 投資組合儀表板 |
檢核會在寫出任何報告之前執行,而它們正是重點所在。發現事項不會中止結帳:它就是您原本要到第三週才會發現的事情。
同一次執行也會寫出投資人報告與調整紀錄,並保留每個來源活頁簿的副本。請參閱「結帳寫入的內容」。
公司提供的檔案
公司只需提供其記帳人員原本就會產出的檔案。有財務資料包與調節底稿,就足以完成一個月的結帳,而單純的 QuickBooks 報表匯出檔也可以代替財務資料包。其他所有輸入都是選用的,每多一項,就多一個面板或一項檢核。
| 輸入 | 用於 |
|---|---|
| 每月財務資料包:貼上的匯出資料、手動填寫的科目對應欄,以及報表表達工作表,全部在同一個活頁簿中 | 分類帳與財務報表包。科目對應與小計是從活頁簿本身的公式讀取。 |
| QuickBooks 報表匯出檔:資產負債表、損益表、現金流量表 | 同上,科目對應則從每個匯出檔的區段推斷。請三份都提供:現金流量表會依其本身主張的分類保存,因此檢核可以與它不一致。 |
| 試算表(選用) | 一項檢核,確認沒有任何帶有餘額的科目未被表達。若單獨提供試算表,則會被拒絕,因為它本身並未表達任何內容。 |
| 調節底稿 | 調節底稿及其檢核。每份明細表都會依其本身的項目重新加總,並與總分類帳核對。 |
| 預算(選用) | 預算與實際比較面板。差異不等於發現事項。 |
| 營運輸入工作表(選用):各月員工人數與新顧客數 | 員工人數、每名員工營業費用與每名員工營收等指標卡,以及新顧客數;任何財務報表都不包含這些數量 |
| 帳單匯出檔,例如 Stripe 發票(CSV)(選用) | 各顧客營收,以及每月經常性收入(MRR)、年度經常性收入(ARR)與流失率 |
| CRM 匯出檔,例如 HubSpot 交易(CSV)(選用) | 簽約金額(bookings)與新顧客數,兩者都不是營收 |
| 各顧客營收活頁簿(選用) | 同樣的 MRR、ARR 與流失率,但讀取的是已認列的營收,而非已開立的發票 |
| 「Profit and Loss by Class」(依部門列示的損益表)匯出檔,每月一個檔案(選用) | 各部門營業費用面板,以及一項檢核,確認每個月的類別拆分加總等於該月的發生數(class_total_disagrees)。沒有檔案的月份會顯示「—」,而不是零。 |
| 「A/R Aging Detail」(應收帳款帳齡明細)與「Transaction List by Vendor」(依廠商列示的交易清單)(QuickBooks 選用報表) | 可據以判斷某個異常高峰月份是否為預付款的發票;並且在您指定應收帳款科目後,將未結清發票與應收帳款餘額核對 |
匯出檔必須符合的條件
- 以權責發生制編製。現金收付制的匯出檔會被拒絕。
- 按月編製。以季為欄位的損益表會被指名拒絕;請改索取按月列示的報表。
- 以公司的表達貨幣編製。每家公司只使用一種貨幣,從不換算,因此聲明為其他貨幣的匯出檔會被拒絕。
- 已列入對應設定檔。對應設定檔中沒有任何區段列入的檔案,會以檔名回報並略過,該公司仍會以其餘檔案照常結帳。
隱藏工作表會被隔離,不予讀取
隱藏工作表只會以名稱記錄,從不匯入;實務上,隱藏工作表常含有其他公司遺留的資料。只有在您要求時,Haruno 才會向您顯示其中的內容;也只有在您確認該工作表屬於某家公司之後,才會將其納入該公司的分類帳。請參閱「隱藏工作表會被擱置」。
新增一家公司
沒有對應設定檔的公司無法結帳。新增公司的程序會產出這份對應設定檔,且只需進行一次。
- 在 macOS 應用程式中,透過「檔案 ▸ 打開資料夾…」(File ▸ Open Folder…,⌘O)開啟審閱工作區:也就是含有 .haruno 的資料夾。請選擇這個資料夾本身,而不是它的上一層。
- 將該公司的活頁簿放入 workbooks/<client>/,例如 workbooks/acme/:每月財務資料包、調節底稿,以及預算(如有)。
- 請 Haruno 為該公司完成設定。text
Acme 剛簽約,他們的檔案在 workbooks 裡,請幫他們完成設定。 - Haruno 會根據活頁簿草擬對應設定檔,接著停下來向您展示,最前面是 REVIEW 清單:也就是活頁簿無法回答的問題。此時尚未套用任何內容。
- 閱讀 REVIEW 清單,並以白話回答。Haruno 會記錄每個回答,並向您顯示變更內容(diff)。
- 核准後,結帳即會執行。
對財務資料包而言,草稿並非猜測:報表本身載明了其計算方式,因此每一項科目對應,都是從將某個科目歸入某個報表項目的 SUMIF 讀出,每個小計則是從其上方的 SUM 讀出。單純的 QuickBooks 報表匯出檔不含科目對應。對這類檔案,草稿會從每個匯出檔的區段推斷出科目對應,而將 QuickBooks 的項目名稱改為您向投資人呈現的名稱,則是主要的 REVIEW 項目。
什麼是對應設定檔
對應設定檔是每家公司一份的 YAML 檔,位於 .haruno/skills/QuickBooksCFO/specs/<client>.yaml。它完整記錄了該公司的帳簿如何對應至財務報表:哪些科目歸入哪個報表項目、每個小計如何組成、哪些項目以與正常餘額方向相反之正負號表達,此外還有公司名稱、報表金額單位、表達貨幣、重大性,以及在您說明之後的會計政策。它是純文字檔,方便人員閱讀;只要有對應設定檔與活頁簿,就能重現一次結帳。
REVIEW 清單
活頁簿無法告訴您的,是需要判斷的事項。這些問題會以一份標題為 # REVIEW: 的清單,出現在草稿最上方。請閱讀這份清單:它就是科目對應對話,而且每家公司只會進行一次。常見項目包括:
- 多少金額算是重大:以元為單位,而不是財務報表表達時所用的千元;
- 哪些科目缺少調節屬於預期情況:從調節底稿中沒有明細表的科目清單中挑選;
- 資本化政策:門檻、折舊方法、耐用年限;
- 哪些報表項目預期為空白,以及科目編號如何分類;
- 需要確認的解讀:從封面頁讀出的公司名稱、報表金額單位,以及資產負債表底部一個沒有標籤的列被解讀為 CHECK 列,也就是理應為零的核對列。
同意某項解讀不會寫入任何內容;更正則會被寫入。請檢查金額單位:若把過時的「('000)」標示當成正確而接受,所有交付文件中的每個數字都會相差一千倍。回答用白話即可:
重大性是一千美元,現金在 QuickBooks 裡調節。Haruno 會記錄這兩個回答,並顯示變更內容。「現金在 QuickBooks 裡調節」是一項豁免:也就是對缺少調節之檢核所接受的例外,而不是科目對應。當該公司已有完成結帳的月份時,Haruno 會列出這項豁免涵蓋哪些科目;在第一次結帳之前,沒有可供比對的對象。未涵蓋任何科目的豁免,會在下一次結帳時回報為 unused_exemption。
從不替您決定的事項
有些數字是對一家企業的書面判斷,只有該公司能夠提出。若草稿寫入了帳簿中沒有載明的值(例如重大性、直線法,或匯出檔未聲明貨幣時的 USD),請把它視為有待確認或更正的預設值。對於您尚未說明的資本化門檻或耐用年限,Haruno 從不記錄。它會對照您說明的內容檢核公司的明細表,而助理從不代您回答這些問題。
| 政策 | Haruno 的做法 |
|---|---|
| 重大性 | 草稿中會填入一個明示的預設值,並在 REVIEW 清單中標示為需要更正的數字,而不是讀取而得的數字。 |
| 資本化門檻 | 不草擬。在您寫下門檻之前,不會依門檻回報任何事項。 |
| 耐用年限 | 不草擬。折舊明細表本身所列的年限是該明細表自己的選擇;把它們當成政策引用回去,等於用明細表檢驗它自己。 |
| 折舊方法 | 直線法是唯一會計算的方法,因此草稿會寫入直線法並加以標示。其他方法會被拒絕,而不是以錯誤的算式進行檢核。 |
| 貨幣 | 從匯出檔所聲明的內容讀取,未聲明時為 USD,從不換算。 |
在沒有說明任何政策的情況下,schedule_drift 仍會執行不需要判斷的那一半:將折舊明細表所推得的明細與總分類帳比對。另有三項判斷也由您決定:某個異常高峰月份是否為預付款、某筆餘額是否在其他地方調節,以及重新開啟已鎖定月份的理由。
科目對應對話
新科目會出現,科目對應也會逐漸偏移。對於沒有歸入任何報表項目的科目,若帶有餘額,結帳會回報為 unmapped_active_account(高);若到目前為止一直為零,則回報為 unmapped_empty_account(低)。接下來的流程一律相同:Haruno 提出建議,由您確認。
- Haruno 會將該發現事項與核對結果對照判讀。若 CHECK 列的差額恰好等於該科目的餘額,未對應科目就是原因,只要一項科目對應,就能同時解決未對應科目的發現事項與核對的發現事項。
- 它會依據科目名稱、科目代號範圍與相鄰科目,提出一個報表項目,並附上理由。
- 您確認後,它會記錄這項科目對應,並重新為該公司結帳。若該公司先前已結帳過,這次結帳會被拒絕,直到您提供理由為止:請參閱下方的「結帳遭拒時」。
改變決定
1450 Deposits Receivable 應歸入 Other assets。Haruno 會以可供審閱的 YAML 形式提出這項變更,而不是直接修改您的活頁簿:
mappings:
"1450": "Other assets"即使重新匯入的活頁簿本身的對應欄仍是空白或仍然錯誤,已核准的科目對應也會保留下來。Haruno 會回報兩者的不一致,而不是恢復檔案中的答案,也從不刪除您已核准的科目對應。
豁免不是科目對應
一項豁免只會消除一個疑問:這筆餘額在哪裡調節、這個項目為什麼是空白,或這個異常高峰是否為預付款。調節豁免不會把該科目放上任何報表,因此它所帶的餘額在各處仍然缺漏,unmapped_active_account 也仍會回報它。此外,與總分類帳核對不符的明細表,無法靠任何科目對應修正;那個例外是真實存在的。
完成一個月的結帳
新增公司之後,每個月都是同樣的處理流程,不需要再進行對應設定檔的對話。
- 將該月的活頁簿加入 workbooks/<client>/。
- 請 Haruno 為該月結帳。text
請為 Acme 完成本月結帳,新的活頁簿已經放進去了。 - Haruno 會以一個指令執行結帳:讀取活頁簿、套用已核准的對應設定檔、執行檢核、寫出財務報表包與調節底稿、鎖定月份,並更新儀表板。
- 在任何內容傳閱之前,它會先向您說明發現事項。無論如何,財務報表包與調節底稿都會寫出;發現事項告訴您,在它們送出之前需要處理什麼。
結帳報告
結帳會為每家公司輸出一份報告:
| 輸出行 | 告訴您的內容 |
|---|---|
| 第一行 | 公司名稱、是否完成結帳、讀取的活頁簿,以及發現事項與待確認問題的數量 |
| read but not applied | 每個未列入任何對應設定檔區段的檔案,以檔名列出 |
| RESTATED 及其他附註 | 重新提供的活頁簿所產生的重編數字,以及檔案與對應設定檔不一致的科目對應 |
| [high], [medium], [low] | 每行一個發現事項:嚴重程度、檢核、對象與細節 |
| ? | 每行一個待確認問題,例如 prepaid_candidate:只會提問,從不計入發現事項 |
| re-opened | 依您提供的理由重新開啟的月份 |
| locked | 已鎖定的月份與結帳狀態,並列出未解決的檢核名稱 |
| restated | 有多少數字變動;每個變動都是調整紀錄中的一列 |
| wrote | 寫出的每個檔案:財務報表、調節底稿、投資人報告、調整紀錄、儀表板 |
鎖定行的內容如下(合成示範資料):
locked 2023-02-28 … 2026-06-30 (41 periods) — reported with exception: 3 unresolved finding(s) (presentation_tieout, recon_exceptions, unmapped_active_account); re-opening one needs a reason (`ingest.py reopen`)有發現事項的結帳,仍是一次成功的結帳。「clean」表示沒有嚴重程度為高或中的發現事項。請參閱「嚴重程度」。
結帳遭拒時
月份一經報告即會鎖定。若某次匯入會變更、刪除或新增已鎖定月份中的任何數字,該公司的結帳就會停止:不會寫入其分類帳,也不會更新該公司的任何報告。同一次執行中結帳的其他公司則照常進行。會使結帳停止的匯入,包括已核准的科目對應,以及報表項目加總方式的變更(兩者都會讓財務報表變動,即使活頁簿中的數字並未改變),也包括針對已鎖定月份的更正版匯出檔。拒絕訊息會列出將會變動的月份與數字,並附上前後兩個值:前十二筆完整列出,其餘只列出筆數。訊息也會列出可重新開啟這些月份的指令。若匯入的數字相同,則不會出現任何訊息,因此重新執行未變更的結帳不受影響。
2023-02-28 … 2026-06-30 are CLOSED, and this import would change what have
been reported for them. Nothing was written.
2023-02-28 presentation BS line 'CHECK': -6,600.00 -> 0.00
2023-02-28 presentation BS line 'Other assets': 19,500.00 -> 26,100.00
2023-02-28 presentation BS line 'TOTAL ASSETS': 5,394,868.29 -> 5,401,468.29以上節錄自一次以合成資料進行的示範結帳:某家公司已鎖定 41 個月,並已核准上述 1450 的科目對應。
提供理由
Haruno 會轉達拒絕訊息並停下來。它不會自行重新開啟月份,也不會替您撰寫理由:理由會永久保存在因其而變更的數字旁邊,所以必須是您自己寫的句子。若要繼續,請說明原因:
1450 原本未對應,已核准歸入 Other assets。這會恰好重新開啟拒絕訊息所列的月份,在每個月份保存理由,然後重新結帳。預留位置文字(例如拒絕訊息所列出、以角括號包住的範例)會被拒絕。不提供理由,就不會有任何變更。若有數字變動,之後的每一份財務報表包都會附上「Restated periods」(經重編期間)表格,而每個變動的數字都是調整紀錄中的一列。請參閱「結帳鎖定」。
核對不符的月份仍會鎖定
財務報表核對不符的月份不會被拒絕。它會像任何已報告的月份一樣被鎖定,而結帳鎖定會將其記錄為「reported with exception」而非「fully reconciled」,並列出未解決的檢核名稱。鎖定不是對帳簿的定論。請參閱「結帳狀態」。
其他拒絕會轉為提問
對於不靠猜測就無法讀取的輸入,結帳也會拒絕並說明原因,例如目錄頁上載有兩個不同月份日期的調節底稿。Haruno 會詢問您,並將回答記錄在對應設定檔中。它從不為了讓錯誤消失而編輯公司的活頁簿。
多家公司
一個工作區可容納您審閱的每一家公司:每家公司在 workbooks/ 下各有一個資料夾與一份對應設定檔,投資組合儀表板則涵蓋所有公司。若要一次新增多家公司:
這些是我客戶的 Excel 檔。請匯入 workbooks/ 裡的全部內容,每個資料夾一家公司。每一家都要:讀取他們的活頁簿,提出科目對應建議,並在套用任何內容之前先讓我看 REVIEW 註記,然後完成本月結帳並更新儀表板。- 所有對應設定檔都會先草擬,並一併呈現給您。各草稿共同的 REVIEW 項目只會詢問一次。
- 共同的回答會寫入每一份對應設定檔;針對單一公司的例外,只屬於該公司。
- 所有公司在同一次執行中各自獨立結帳,因此某個活頁簿格式有誤時,只有該公司的結帳會失敗。
- 儀表板會在最後更新一次。為一家公司結帳,也會更新整個投資組合。
- 在儀表板上,每家公司只採用一份對應設定檔:若有兩份對應設定檔指名同一家公司,儀表板會以其中一份建立,而結帳會說明保留了哪個檔案、原因,以及略過了哪一個。
各公司之間不做任何換算,投資組合合計也不會把以不同貨幣報導的公司加總在一起。請參閱「投資組合總覽」。
自行執行
處理流程是您工作區中的純 Python 程式,由您自行掌握。在工作區資料夾中執行:
# 讀取活頁簿但不匯入
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py inspect "workbooks/acme/financial-package.xlsx"
# 根據該公司自己的活頁簿草擬對應設定檔,然後閱讀 REVIEW 區塊
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py propose-spec "workbooks/acme/financial-package.xlsx" --spec-name acme --out .haruno/skills/QuickBooksCFO/specs/acme.yaml
# 以 answer 指令回答 REVIEW 項目,而不是編輯檔案
python3 .haruno/skills/QuickBooksCFO/scripts/ingest.py answer --spec .haruno/skills/QuickBooksCFO/specs/acme.yaml --materiality 1000
# 結帳:暫存、分類帳、檢核、財務報表、調節底稿、儀表板
python3 .haruno/skills/QuickBooksCFO/scripts/close.py --workspace . --client acme它只需要標準的 Python 3,不需要其他任何東西:不需安裝、不需帳戶、不需網路。它讀取與寫入的一切都留在工作區資料夾中。請為每個檔案路徑加上引號,因為實際的匯出檔名稱含有空格與括號。若結帳因鎖定而遭拒,而您要繼續進行,請在結帳指令中加上 --reopen-reason,並附上您的理由;若要為所有公司結帳,請以 --all 取代 --client。
為什麼您可能會想這樣做:結帳本身在您的電腦上執行,且無論助理是否在執行,都不會傳輸任何客戶資料。對話會傳送您送出的內容:您輸入的內容,以及工具回傳的結果(科目名稱、項目名稱、數字、發現事項),會經由 Inferara 的託管服務傳送至回答您的模型供應商。將 Haruno 用於實際帳簿之前,請先對照您客戶的保密條款確認這一點。若您想保有 Haruno 的效益,又不想涉及對話傳送資料這一部分,請自行執行這些指令,只在不含客戶資料的部分使用助理。請參閱「您的資料流向何處」。