| name | month_end_closing |
| tier | 3 |
| task | T26 |
| description | This skill handles month-end closing tasks including accrual reversals, monthly depreciation, salary accruals, and trial balance verification. Keywords include "month-end closing", "månadsavslutning", "månedsavslutning", "clôture mensuelle", "cierre mensual", "Monatsabschluss", "accrual reversal", "periodisering", "depreciation", "avskriving", "salary accrual", "lønnspålegg", "trial balance". |
Month-End Closing
Accrual reversal + depreciation + salary accrual. 3 calls total.
Turn 1: GET accounts + GET postings (parallel, 2 calls)
Example (adjust numbers from the prompt):
GET /ledger/account?number=1700,1720,5000,2900,6010,6030,1000,1005,1080,1100,1200,1209,1210,1230,1250&fields=id,number,name
GET /ledger/posting?dateFrom=2026-03-01&dateTo=2026-04-01&fields=account(number),amount&count=500
Put ALL accounts in this ONE call: every account from the prompt + 1000,1005,1080,1100,1200,1209,1210,1230,1250 (possible contra accounts). This is the ONLY account lookup — no follow-up GETs.
From GET /ledger/posting: sum the amounts on the salary expense account (e.g. 5000) to get the salary accrual amount.
Accumulated depreciation contra account mapping (pick whichever exists from the GET results):
- 6000 (buildings) → 1080, 1100
- 6010 (transport) → 1230, 1249
- 6015 (machinery) → 1200, 1210
- 6017 (inventory) → 1250, 1270
- 6020 (intangibles) → 1000, 1005, 1080
Turn 2: POST ONE combined voucher (1 call)
Combine ALL journal entries into a SINGLE voucher with 6 posting rows. Do NOT create separate vouchers.
POST /ledger/voucher
{
"date": "<last_day_of_month>",
"description": "Månedsavslutning",
"postings": [
{"date": "<last_day>", "account": {"id": <expense_acct_id>}, "amountGross": <accrual_amount>, "amountGrossCurrency": <accrual_amount>, "description": "Periodisering - reversering", "row": 1},
{"date": "<last_day>", "account": {"id": <prepaid_acct_id>}, "amountGross": -<accrual_amount>, "amountGrossCurrency": -<accrual_amount>, "description": "Periodisering - reversering", "row": 2},
{"date": "<last_day>", "account": {"id": <depr_expense_id>}, "amountGross": <monthly_depr>, "amountGrossCurrency": <monthly_depr>, "description": "Månedsavskriving", "row": 3},
{"date": "<last_day>", "account": {"id": <accum_depr_id>}, "amountGross": -<monthly_depr>, "amountGrossCurrency": -<monthly_depr>, "description": "Månedsavskriving", "row": 4},
{"date": "<last_day>", "account": {"id": <salary_expense_id>}, "amountGross": <salary_amount>, "amountGrossCurrency": <salary_amount>, "description": "Lønnsavsetning", "row": 5},
{"date": "<last_day>", "account": {"id": <accrued_salary_id>}, "amountGross": -<salary_amount>, "amountGrossCurrency": -<salary_amount>, "description": "Lønnsavsetning", "row": 6}
]
}
monthly_depr = acquisition_cost / useful_life_years / 12 (round to 2 decimals).
3 calls, 0 errors.
STRICT RULES
- GET /ledger/account: ONE call with ALL account numbers comma-separated. NEVER make separate lookups. Include the wide net of contra accounts listed above.
- ONE single POST /ledger/voucher with ALL 6 posting rows. Do NOT create separate vouchers.
- Skip trial balance verification — it's read-only and not scored.
- All dates: last day of the month.
- No voucherType needed.
- Salary amount = sum of postings on the salary expense account from GET /ledger/posting.