* feat: add transaction deduplication with side-by-side comparison modal
* feat: implement three-way duplicate resolution logic
- Add Row-Level check (Merchant/Total/Currency/Date) to Transaction model.
- Implement side-by-side comparison modal with Older/Newer/Both options.
- Update AI and CSV workflows to intercept duplicates.
Closes#92
* fix: include currency code and fallback in transaction deduplication check
Closes#92
* refactor(transactions): separate deduplication logic from creation model
- Extracted duplicate checking into a dedicated `findDuplicateTransaction` method in `models/transactions.ts`
- Restored `createTransaction` to a pure, atomic database insertion to remove unexpected side effects
- Updated all server actions (createTransactionAction, saveInvoice, saveFile, saveTransactions) to orchestrate the duplication check before calling the creation model
Addresses reviewer feedback to separate concerns and maintain clean model methods.
Support Ollama, LM Studio, vLLM, and any OpenAI-compatible API
via a configurable base URL. Reuses ChatOpenAI with custom baseURL,
no new dependencies. Local models use direct JSON parsing instead
of withStructuredOutput since many don't support function calling.
Co-authored-by: FasterOP <7832832+mmplisskin@useres.noreply.github.com>
- Add calcNetTotalPerCurrency function to calculate signed totals (income positive, expenses negative)
- Update transaction list footer to display both net total and turnover
- Use semantic HTML markup (<dl>, <dt>, <dd>) for better accessibility
- Add color coding: green for positive net, red for negative net
- Maintain turnover calculation for total transaction volume
Fixes issue where transaction totals did not respect transaction type (income/expense)
* fix: add IDs and ARIA labels to custom field forms
- Add id propagation to FormInput/FormTextarea based on name prop for proper label association
- Enhance FormSelect with hidden input for form submission, aria-labelledby for labeling, and controlled/uncontrolled state management
- Add aria-label attributes to inline inputs/selects/checkboxes in CrudTable settings editor
These changes improve accessibility for screen readers and ensure custom field forms are fully navigable via keyboard. Also critical for AI browsers like Comet that rely on semantic HTML/ARIA for form parsing and automation.
* fix: add aria-labels to CRUD table action buttons
- Add aria-label to edit buttons: 'Edit [item name]'
- Add aria-label to delete buttons: 'Delete [item name]'
- Add aria-label to save/cancel buttons in edit/add modes
- Add aria-label to 'Add New' button
Fixes unlabeled icon buttons that were inaccessible to screen readers and AI browsers.
* feat: add google provider
* fix: default for google model
* feat: multiple providers
* fix: defaults from env for login form
* fix: add mistral to env files
* chore: delete unused code
* chore: revert database url to original
* fix: render default value for api key from env on server
* fix: type errors during compilation
---------
Co-authored-by: Vasily Zubarev <me@vas3k.ru>