accounting/SKILL.md
Process receipts, track expenses in Google Sheets, reconcile records, and generate entertainment supplement tables for Field Museum procurement card accounting
npx skillsauth add brunoasm/my_claude_skills accountingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when the user wants to:
Keywords: receipt, expense, accounting, budget, fund, supplement, p-card, procurement, GL code, reconcile
references/gl_codes.md — GL code reference table with entertainment flagsreferences/supplement_guide.md — Supplement form layout and filing rulesDetect year: Determine the current year from today's date. Confirm with the user: "Working on {year} expenses — correct?"
Get spreadsheet link: Check for spreadsheet_links.yaml in the working folder (/Users/bruno/Documents/docs_macbookair2015/lab/Field Museum/accounts_and_receipts).
{year}:
spreadsheet_id: "{extracted_id}"
url: "{full_url}"
Read current expenses: Detect the environment by checking whether the working folder exists at the Mac path (use Bash to test). Then:
On cowork (local Mac — working folder exists): Open the spreadsheet in Chrome so the user can interact with it:
open -a "Google Chrome" "{full_url}"
Also fetch the expenses tab via WebFetch CSV export:
https://docs.google.com/spreadsheets/d/{SPREADSHEET_ID}/gviz/tq?tqx=out:csv&sheet=expenses
If the WebFetch CSV export fails or returns an auth/login page, note this and ask the user to manually export the sheet as CSV and provide the file path.
Not on cowork (cloud/remote — working folder absent): Fetch directly via WebFetch CSV export:
https://docs.google.com/spreadsheets/d/{SPREADSHEET_ID}/gviz/tq?tqx=out:csv&sheet=expenses
If this fails, ask the user to paste the spreadsheet data or provide a downloaded CSV file.
Parse the expenses data to understand existing records and the receipt numbers already used. Analyze patterns in existing records to learn Fund and GL code assignment conventions — e.g., which vendors consistently map to which funds and GL codes. Use these precedents when proposing values for new receipts rather than defaulting to a single fund.
Read past supplements: List and read existing supplement PDFs in {working_folder}/{year}/supplements/ to learn default patterns for entertainment supplement fields (Persons Involved, Business Purpose). For example, grocery store purchases may consistently use a standard lab group description while restaurant meals may list named attendees. Use these patterns as defaults when proposing supplement data for new entertainment expenses.
Scan receipts folder: List files in {working_folder}/{year}/receipts/. Identify:
YYXXX_...)YYXXX_ prefix pattern)Read all unnumbered files: Proactively read the contents of every unnumbered file before presenting anything to the user. Files may have misleading names (e.g., receipts_2026.pdf, Pcard Missing Receipt Form.pdf). Classify each file by inspection:
Report status:
Year: {year}
Spreadsheet: {url}
Existing expense records: {count}
Numbered receipts: {count} (highest: {number})
Unnumbered files to process: {count}
{list unnumbered filenames}
Ask the user what they'd like to do: process new receipts, reconcile, check budgets, or generate a supplement.
For each unnumbered file in the receipts folder:
The file was already read during session start (step 6). Use the extracted contents. If the file was an image too low-resolution to read, acknowledge this immediately and ask the user for: vendor name, amount, date, and description. Do not guess from unreadable images.
From the receipt contents, extract:
Generate the next receipt number continuing from the highest existing number:
YYXXX_short_description.ext (keep original file extension)26025_amazon_labsupplies.pdfFill in all 10 columns of the expenses tab:
| Field | How to determine |
|-------|-----------------|
| Expense | Brief description of what was purchased. For refunds/credits, match the original expense name from the spreadsheet followed by "(refund)" — e.g., "Claude subscription for students (refund)", not a generic description |
| Vendor | Vendor/merchant name from receipt |
| Cost | Total amount as $X.XX (negative for returns/credits) |
| date | Purchase date in D-Mon-YYYY format (e.g., 15-Mar-2026) |
| method | Default p-card unless user says otherwise |
| Fund | Propose based on patterns learned from existing spreadsheet records for the same vendor or expense type. Only ask the user if no clear precedent exists |
| GL code | Propose based on references/gl_codes.md (consult ALL codes, not just commonly used ones) AND patterns from existing spreadsheet records. Only ask the user if no clear precedent exists |
| receipt_number | The YYXXX number assigned in Step 1.2 |
| notes | Leave empty unless something notable |
| request reimbursement | Leave empty unless user specifies |
If the GL code is an entertainment code (6455, 6460, 6470, 6475), collect supplement form fields. Use patterns learned from past supplements (read during session start, step 4) to propose defaults:
Store this supplement data for Phase 4.
Present all proposed data clearly and ask for confirmation before proceeding. Show:
Only after user confirms:
mvMove to the next unnumbered file. After all files are processed, proceed to Phase 2.
After all receipts are processed:
Compile all new expense records using pipe | as separator, matching the column order:
Expense|Vendor|Cost|date|method|Fund|GL code|receipt_number|notes|request reimbursement
Print the pipe-separated rows directly (do NOT write to a file). Instruct the user:
|Remind the user to sort the sheet by date after pasting if desired.
Compare receipts folder against spreadsheet records:
{year}/receipts/ matching the YYXXX_ pattern.receipt_number in the spreadsheetreceipt_number has no matching fileGenerate the supplement table for a given month:
Ask which month to generate (default: current or most recent month with entertainment expenses).
Filter entertainment expenses (GL 6455/6460/6470/6475) for that month from the spreadsheet.
Combine with the supplement data collected during Phase 1 (if in the same session) or ask the user for missing fields.
Format as a table matching the supplement form layout:
Date | Location | Persons Involved (Name, Title, Company) | Business Purpose | Total
-----|----------|------------------------------------------|-----------------|------
{rows}
Total: ${sum}
Output the table as copyable text.
Note if any expenses involved alcohol (VP approval required).
Remind: save as supplement_BASM_{YYYY}_{MM}.pdf in {year}/supplements/.
On user request:
| as separator. Tab-separated text does not survive copy-paste from Claude, and commas conflict with values. Pipe is safe and Google Sheets supports it via custom separator.development
Place lab supply orders from member requests — route by request header to Amazon Business, the Pritzker Lab Google Form, or a direct vendor; stage the cart/form and stop for human review before any purchase. Use when the user pastes an order request or asks to order supplies, place an order, or fill the Pritzker form.
tools
Convert scanned PDFs and document images into clean Markdown using docling for layout (figures, tables, reading order) plus a vision-language OCR model. Use when a user needs high-quality OCR of scanned documents, historical literature, or photographed pages — preserving multi-column reading order, diacritics, special characters, and figures. Supports local vLLM/Ollama servers and cloud vision APIs (OpenAI, Anthropic). Assumes an OCR backend already exists.
tools
Engages structured analysis to explore multiple perspectives and context dependencies before responding. Use when users ask confirmation-seeking questions, make leading statements, request binary choices, or when feeling inclined to quickly agree or disagree without thorough consideration.
tools
Generate phylogenies from genome assemblies using BUSCO/compleasm-based single-copy orthologs with scheduler-aware workflow generation