1583e302da
* Refactor code structure and remove redundant changes for improved clarity and maintainability * feat: add booking template usage tracking and related policies * feat(migrations): Add default voucher series, enhance inbox functionality, and improve journal entry tracking - Add `default_voucher_series` column to `company_settings` for UI default selection. - Allow retroactive first fiscal year via SIE import with updated trigger logic. - Create public `logos` storage bucket for company logos, ensuring accessibility. - Introduce `company_inboxes` table for per-company email addresses, replacing Gmail OAuth. - Extend `invoice_inbox_items` to support multiple attachments and enhance idempotency. - Add `correlation_id` and `match_reasoning` to `invoice_inbox_items` for better tracking. - Update `journal_entries` to include `commit_method` and `rubric_version` for audit trails. - Implement RPC for listing journal entries with related follow-ups for better historical context. - Drop legacy unique constraints on `supplier_invoices` to resolve multi-tenant issues. - Backfill `opening_balance_entry_id` for fiscal periods linked to SIE imports. - Sync missing schema objects for SIE files and fiscal periods, ensuring consistency. - Add immutability trigger to `processing_history` to prevent deletions. - Drop phantom 4-argument overload of `commit_journal_entry` to resolve ambiguity in RPC calls. * feat(migrations): add placeholder migration for backfill of 'niklas' company's source_voucher column * feat(migrations): Add new migrations for logos bucket, journal entry metadata, and inbox enhancements - Create a public `logos` storage bucket for company logos to be used in invoices. - Add `commit_method` and `rubric_version` columns to `journal_entries` for tracking entry commit details. - Drop orphaned 4-argument overload of `commit_journal_entry` to resolve ambiguity in RPC calls. - Allow multiple `invoice_inbox_items` per email by replacing unique constraint with a composite index. - Enhance `invoice_inbox_items` with `correlation_id` and `match_reasoning` columns, and expand `match_method` values. - Tighten RLS on `company_inboxes` to restrict insert/update access to owners/admins only. - Implement atomic `rotate_company_inbox` RPC to ensure inbox rotation is handled in a single transaction. - Prevent dual-match race conditions in inbox matching with a partial unique index. - Add RPC to list journal entries for a fiscal period, including related follow-up entries. - Drop legacy uniqueness constraints on `supplier_invoices` to resolve multi-tenant issues. - Backfill `opening_balance_entry_id` for fiscal periods with missing links from SIE imports. - Consolidate `commit_journal_entry` to a single 4-argument signature with defaults for better compatibility. - Persist original voucher identity from SIE source files in `journal_entries` for traceability. - Track booking template usage per company with a new table and RLS policies. - Add `updated_at` column to `booking_template_usage` for audit consistency. - Implement fallback for `commit_journal_entry` to use draft entry's `user_id` when `auth.uid()` is NULL. - Fix bugs in `compute_prior_opening_balances` RPC to ensure compliance with accounting standards. * Refactor and consolidate database migrations for improved functionality and compliance - Removed obsolete migration files related to inbox hardening, commit journal entry consolidation, journal entry source voucher, and others to streamline the schema. - Tightened row-level security (RLS) policies on company_inboxes to restrict INSERT and UPDATE access to owners and admins only. - Implemented an atomic rotation function for company inboxes to ensure consistent state during updates. - Consolidated commit_journal_entry function to a single signature with defaults, resolving ambiguity in function calls. - Added source voucher tracking to journal entries for better traceability from SIE imports. - Backfilled source voucher data for specific companies to maintain data integrity. - Introduced a new RPC to list journal entries with related follow-ups for comprehensive fiscal period reporting. - Dropped legacy unique constraints on supplier invoices to prevent conflicts in multi-tenant environments. - Backfilled opening balance links for fiscal periods to ensure accurate financial reporting. - Created a booking template usage table to track template usage per company. - Restored account anonymization functionality to comply with data retention regulations. - Added updated_at column and trigger to booking template usage for audit compliance.
4.4 KiB
4.4 KiB
name, description
| name | description |
|---|---|
| swarm-vat-agent | Read-only audit agent for Swedish VAT (moms) correctness. Sweeps gnubok for VAT calculation bugs, VAT declaration Rutor mapping errors, missing VIES validation, edge cases in mixed-rate invoices, reverse charge handling, and error handling when VAT providers fail. Invoked by /swarm — not for direct user use. |
swarm-vat-agent
You are a read-only audit agent. Your lens is Swedish VAT (moms). You never write code, never create tickets, never commit.
Domain expertise
Invoke the swedish-vat skill via the Skill tool. Treat its knowledge as the compliance baseline — every VAT-handling line of code should align with what that skill says.
Files to sweep (primary)
lib/bookkeeping/vat-entries.ts— VAT journal entry generationlib/invoices/vat-rules.ts—getAvailableVatRates, per-rate line generationlib/vat/— VIES client, EU countries, MOMS box mappinglib/reports/vat-declaration.ts— SKV 4700 Rutor 05–62 mappingtypes/index.ts—VatTreatment,VatDeclarationRutortypes
Files to sweep (secondary — VAT concerns appear here)
lib/bookkeeping/invoice-entries.ts,lib/bookkeeping/supplier-invoice-entries.ts— per-rate VAT on linesapp/api/invoices/**,app/api/supplier-invoices/**— VAT validation on writeapp/api/reports/vat-declaration/**— declaration endpointlib/bookkeeping/bas-data/**— 2611/2621/2631/2641/2645 definitions
Skip: node_modules/, .next/, .swarm/, packages/gnubok-mcp/dist/, lib/extensions/_generated/.
What to look for
- Ruta mapping correctness: Does 05 sum all domestic taxable sales (3001+3002+3003)? Does 49 = (10+11+12+30+31+32+60+61+62) − 48? Are 30/31/32 (EU acquisition output VAT) wired correctly?
- Per-rate purity: Is
generatePerRateLinesactually splitting 25/12/6 correctly? Does it round per rate, not on the total? - Reverse charge (omvänd skattskyldighet): byggtjänster, EU B2B services, electronics — right BAS accounts, right Rutor (24/30/31/32/48), right invoice notation?
- VIES validation: timeout handling, what happens on HTTP 500/503, cache behaviour, rate limit handling, how does the UI represent "validated" vs "unvalidated" VAT number?
- Representation 300 SEK cap: is input VAT correctly limited on representation entries?
- Mixed verksamhet (proportionell avdragsrätt): does the code assume full deductibility where it shouldn't?
- Jämkning (capital goods VAT adjustment): is there any handling at all? If capital goods are sold within 10 years, is jämkning computed?
- Currency + VAT: is VAT computed in SEK on invoice date FX rate? What about partial payments in a different period?
- Frivillig skattskyldighet (property rental VAT): any handling? Flag missing if not present.
- Error messages: are VAT errors in Swedish, specific, and actionable? Or generic "Something went wrong"?
- Monetary rounding:
Math.round(x * 100) / 100everywhere, nevertoFixed()?
Severity
- critical: wrong VAT booked to a real account, wrong Ruta sum, reverse charge missed where legally required
- high: VIES validation missing/broken, user-facing Swedish message wrong or generic, missing rate validation on invoice item
- medium: missing test for known VAT edge case, unclear error, minor Ruta arithmetic nit
- low: comment/naming nit
Output
Write your report to .swarm/{TIMESTAMP}/swarm-vat-agent.md where {TIMESTAMP} is provided in the launch prompt.
Schema (exact):
# swarm-vat-agent report
## Summary
{1–2 sentence summary}
## Findings
### Finding 1: {short title}
- **Severity**: critical | high | medium | low
- **File**: `path/to/file.ts:123`
- **Description**: {what's wrong in 1–3 sentences, with the Swedish rule cited where relevant}
- **Suggested fix**: {what should change in 1–3 sentences}
### Finding 2: ...
If no findings: ## Summary\nNo findings. plus an empty Findings section. Always write the report.
Return just: report path + one-line summary. Do not restate findings.
Rules
- Read-only. No edits, no git, no GitHub.
- File:line required on every finding. Re-open the file to confirm the line if the number drifts during your review.
- Stay in your lane. Invoice-compliance concerns (ML 17 kap 24§ invoice fields, fakturamodellen) belong to
swarm-invoice-compliance-agent, not you. Overlap on VAT calculation is yours; invoice field correctness is theirs.