* fix(bookkeeping): harden correction account changes * feat(tax): enhance tax deadline generation with new settings and filing methods - Added new company settings: tax_turnover_over_40m, vat_has_eu_trade, vat_filing_method, periodisk_sammanstallning_enabled, and periodisk_sammanstallning_filing_method. - Updated deadline generation logic to accommodate new settings affecting VAT and employer declaration deadlines. - Implemented tests for new functionality, ensuring that completed obligations are preserved and not replaced by new pending rows. - Introduced a cron job to backfill missing tax deadlines for companies with settings but no upcoming deadlines. - Updated API routes for generating tax deadlines and handling cron jobs. - Modified database schema to include new columns for tax filing profiles and constraints for filing methods. * fix(invoices): record credit note reconciliation guard * fix(tax): correct automatic deadline settings * fix(tax): key AGI deadline to VAT taxable base and add storforetag payment deadline The 26th filing day for the skattedeklaration (AGI and VAT together) hinges on one statutory measure, a VAT taxable base above SEK 40 million (SFL 26 kap.), not a separate employer turnover. Drop employer_turnover_over_40m and derive the AGI schedule from vat_registered plus vat_taxable_base_over_40m, so a non-VAT-reporting employer is never shown the 26th when its binding date is the 12th. Also: - add a skatteinbetalning deadline row (12th, 17 January) for storforetag, whose deducted tax and employer contributions are due before the 26th filing date - normalize legally incoherent over-40m flag combinations to the earlier small-company schedule in a follow-up migration - replace hardcoded 27 December dates with the banking-day adjustment - extend the 40m help text to cover the SKV-decided early filing election and the payment-still-on-the-12th rule - document the regeneration race repaired by the daily backfill cron Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(migrations): add AGI and VAT filing logic with employer column removal * feat(settings): implement VAT registration logic and update related flags; enhance deadline handling --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { withRouteContext } from '@/lib/api/with-route-context'
|
|
import {
|
|
DEADLINE_SETTINGS_SELECT,
|
|
regenerateTaxDeadlinesForUser,
|
|
toDeadlineSettings,
|
|
} from '@/lib/tax/deadline-generator'
|
|
|
|
/**
|
|
* POST /api/tax-deadlines/generate
|
|
* Manually trigger tax deadline generation for the current user
|
|
*/
|
|
export const POST = withRouteContext(
|
|
'tax_deadlines.generate',
|
|
async (_request, ctx) => {
|
|
const { supabase, companyId, log } = ctx
|
|
|
|
// Fetch company settings
|
|
const { data: settings, error: settingsError } = await supabase
|
|
.from('company_settings')
|
|
.select(DEADLINE_SETTINGS_SELECT)
|
|
.eq('company_id', companyId)
|
|
.single()
|
|
|
|
if (settingsError || !settings) {
|
|
return NextResponse.json(
|
|
{ error: 'Company settings not found' },
|
|
{ status: 404 }
|
|
)
|
|
}
|
|
|
|
try {
|
|
const result = await regenerateTaxDeadlinesForUser(
|
|
supabase,
|
|
companyId,
|
|
toDeadlineSettings(settings),
|
|
)
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
created: result.created,
|
|
deleted: result.deleted,
|
|
})
|
|
} catch (error) {
|
|
log.error('tax deadline generation failed', error as Error)
|
|
return NextResponse.json(
|
|
{ error: 'Failed to generate tax deadlines' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
},
|
|
{ requireWrite: true },
|
|
)
|