* feat: add bike benefit handling and optional vacation accrual - Introduced bike benefit (cykelförmån) with calculations for annual market value and monthly taxable value. - Updated schemas to include new benefit types and validation rules. - Implemented API routes for creating, updating, and deleting employee benefits. - Enhanced salary calculation logic to accommodate new vacation rule options, including a 'none' option for no accrual. - Added UI components for managing employee benefits, including input for bike benefit specifics. - Created database migrations for employee benefits and updated salary line items to support new benefit types. * chore: remove Langfuse env var checks Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat: enhance OAuth callback URL handling and update default scopes for Visma integration * feat: remove trade_name field and simplify company naming in invoices * refactor: destructure canWrite from useCanWrite for consistency across components * feat: enhance PATCH endpoint to validate existing benefits and handle bike benefit updates * feat: add missing label for bike benefit in salary line item types --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
import type { McpResource } from './types'
|
|
|
|
export const companyCurrentResource: McpResource = {
|
|
uri: 'gnubok://company/current',
|
|
name: 'Active Company',
|
|
description: 'The currently active company: identity, entity type, fiscal year config, lock date, base currency, and VAT registration. Read this first to understand the bookkeeping context.',
|
|
mimeType: 'application/json',
|
|
read: async ({ supabase, companyId }) => {
|
|
const { data: company, error: companyError } = await supabase
|
|
.from('companies')
|
|
.select('id, name, org_number, entity_type, archived_at, created_at')
|
|
.eq('id', companyId)
|
|
.single()
|
|
|
|
if (companyError || !company) {
|
|
throw new Error(`Company not found: ${companyError?.message ?? 'unknown'}`)
|
|
}
|
|
|
|
const { data: settings } = await supabase
|
|
.from('company_settings')
|
|
.select(`
|
|
company_name, address_line1, address_line2, postal_code, city, country,
|
|
phone, email, website,
|
|
pays_salaries, f_skatt, vat_registered, vat_number, moms_period,
|
|
fiscal_year_start_month,
|
|
accounting_method, default_voucher_series,
|
|
bookkeeping_locked_through, auto_lock_period_days,
|
|
invoice_prefix, next_invoice_number, invoice_default_days,
|
|
is_sandbox
|
|
`)
|
|
.eq('company_id', companyId)
|
|
.maybeSingle()
|
|
|
|
return {
|
|
company,
|
|
settings: settings ?? null,
|
|
base_currency: 'SEK',
|
|
}
|
|
},
|
|
}
|