* Enhance booking template functionality and add sandbox extraction checks
* Implement Recapt integration for feedback submission and user identification
* Add Recapt identification component and bank sync status chip; update crontab entries
* Update .gitignore to ignore the entire scripts directory
* Refactor Recapt integration: add loader component, update privacy policy, and enhance bank sync status messages
* Fix .gitignore to correctly ignore the scripts directory
* refactor: update VAT handling logic for non-registered sellers and improve related comments
* chore: gate automated email flows behind 503 responses
Disables user-facing access to invoice payment reminders and salary
payslip email sending. Underlying lib code (reminder-processor,
PDF templates, notification_settings) is preserved for easy re-enable.
- Invoice reminders cron route returns 503; settings UI section removed.
- Payslip send route returns 503; original implementation kept as
_sendPayslipsImpl for future re-enable.
- Push notifications were already extension-disabled, no change needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* chore: remove Recapt feedback widget
Strips the third-party Recapt SDK and its floating feedback bubble from
the app. The in-app contact form keeps working via the existing email
channel (/api/support/contact). Drops the Recapt entries from the CSP
and the subprocessor list in the privacy policy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: reject meaningless rättelser in correctEntry
Guard against zero-economic-effect corrections in the storno engine:
- Reject when proposed lines net to zero on every account (e.g. 1930
debit 100 / 1930 credit 100), which would erase the original posting
without representing any affärshändelse (BFL 5 kap. 5 §).
- Reject when proposed lines are an exact multiset match of the original
entry — a rättelse must actually change something.
New MeaninglessCorrectionError wired through bookkeepingErrorResponse
(HTTP 400) and the Swedish error translator.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: add date-range picker to resultat- and balansrapport
Adds optional from/to date filtering to the four operational financial
reports (resultatrapport, balansrapport, income-statement, balance-sheet)
so users can view a month, quarter, or custom range inside a fiscal year
without leaving the report. Defaults to YTD; "Hela året" preserves the
prior full-period behaviour (URL-identical, cache-stable).
- trial-balance engine accepts optional fromDate/toDate, rolling prior
in-period activity into IB and clamping period activity to the window
- 12 API routes accept and validate from_date/to_date query params
- ReportDateRange chip picker persists preset per company, only renders
on the four relevant tabs
- FiscalYearSelector now emits the period object so the range picker
has bounds without an extra fetch
- PDF/XLSX filenames reflect the chosen range
- Resultatrapport drops the prior-year column when narrowed (full-year
vs partial-year would mislead)
- 11 new tests (engine + parser); all existing report tests pass
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat: add support for marking journal entries as "no document required"
- Introduced a new sidecar table `journal_entry_no_doc_required` to track entries that do not require separate documentation (e.g., bank fees, interest).
- Implemented API routes for creating and deleting exemptions, including validation and authorization checks.
- Added a toggle component in the UI to allow users to mark entries as exempt, with an optional reason.
- Updated relevant tests to cover the new functionality, including RLS checks and cascading deletes.
- Enhanced existing schemas and types to accommodate the new `vat_amount` field for supplier invoice items.
* fix: address PR review findings on no-doc-required + VAT changes
- pg-real cascade test wraps DELETE in gnubok.allow_delete='true' txn so the
immutability trigger bypass fires (mirrors delete_last_voucher RPC).
- Clamp supplier-invoice item vat_amount to <= line_total * vat_rate via Zod
refinement (with 1-öre rounding tolerance) so the manual override can't
inflate the 2641 debit beyond the statutory ceiling.
- groupVatByRate falls back to line_total * rate when stored vat_amount is 0
with a positive rate, so legacy/import paths leaving the column at its
NOT NULL DEFAULT 0 don't silently understate ruta 48.
- ReportDateRange todayIso() and preset endpoints use local date components
instead of toISOString() (UTC) — fixes the midnight-to-02:00 off-by-one
that truncated a day from YTD / this-month / this-quarter for Swedish
users.
- NoDocRequiredToggle restores the previous reason on failed POST/DELETE so
the rolled-back toggle state stays consistent with the rendered reason.
- Document the company-scoped (not user-scoped) DELETE authorization policy
on the no-document-required route.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(import): add customer and supplier parsing functionality
- Implemented customer file parsing in `lib/import/customers/parser.ts` with support for Excel and CSV formats.
- Created types for detected customer columns and parsed customer rows in `lib/import/customers/types.ts`.
- Added tests for customer classification logic in `lib/import/shared/__tests__/classify.test.ts`.
- Developed classification functions for customers and suppliers in `lib/import/shared/classify.ts`.
- Introduced shared column utility functions in `lib/import/shared/column-utils.ts`.
- Implemented supplier file parsing in `lib/import/suppliers/parser.ts` with validation for various fields.
- Created types for detected supplier columns and parsed supplier rows in `lib/import/suppliers/types.ts`.
- Added tests for supplier column detection and parsing in `lib/import/suppliers/__tests__/column-detector.test.ts` and `lib/import/suppliers/__tests__/parser.test.ts`.
* fix(labels): update 'Svenskt företag' to 'Svenskt företag eller organisation' for clarity
* feat(import): refactor encoding handling for Swedish files and add tests for character preservation
* feat(recapt): implement clearRecaptIdentity function and integrate into logout flow
* feat(bookkeeping): implement copy functionality and next voucher sequence retrieval
* feat(import): enhance customer and supplier import functionality with normalization and event handling
* feat(accounting): update accounting method validation and messaging for aktiebolag and enskild firma
* Remove AI subsystem and related code
- Deleted AI proposals and requests persistence logic from `lib/ai/proposals/persist.ts`.
- Removed re-validation logic for proposals in `lib/ai/proposals/re-validate.ts`.
- Cleaned up schemas related to AI flows in `lib/api/schemas.ts`.
- Removed AI-related fields from bookkeeping engine in `lib/bookkeeping/engine.ts`.
- Eliminated AI event types from `lib/events/types.ts`.
- Updated tests to reflect the removal of AI-related functionality in `lib/extensions/__tests__/sectors.test.ts`.
- Adjusted initialization logic in `lib/init.ts` to exclude AI proposal handler registration.
- Cleaned up transaction ingestion logic in `lib/transactions/ingest.ts` to remove AI flow checks.
- Updated helper functions in `tests/helpers.ts` to remove AI-related settings.
- Removed AI-related types and interfaces from `types/index.ts`.
- Added migration script to drop AI-related tables and settings from the database.
* fix(migrations): ensure foreign key constraint is dropped before removing AI tables
* feat(invoice-inbox): implement deterministic invoice field extraction and inbox provisioning
- Added `extract-invoice-fields.ts` for extracting fields from PDF invoices using regex and pdfjs-dist, replacing the previous AI classifier.
- Introduced `inbox-provisioning.ts` to manage company inbox addresses and rotation of inboxes using Supabase RPCs.
- Created `resend-inbound.ts` for handling inbound email events and attachments via the Resend API.
- Defined the extension manifest for the invoice inbox, specifying required environment variables and descriptions.
- Migrated database schema to remove AI-related columns and tighten the status enum in `invoice_inbox_items`.
* feat(invoice-inbox): remove AI-specific columns and tighten status enum
* fix(skattekonto): remove manual entry creation reference from transaction input
* fix(schemas): remove accounting method validation for aktiebolag in UpdateSettingsSchema
- Integrate Recapt session tracking with user identity in dashboard layout
- Remove push-notifications extension from settings, panel registry, and toggle list
- Fix journal entry preview overflow on narrow viewports
- Update transaction manual booking button label
- Clarify invoice email error message to reference env vars
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>