FEAT-13: Abgabe wizard (/vertraege/neu, 4 steps, ?tiere= prefill), Vertraege list w/ download+delete, /einstellungen Zuchtprofil form, contracts/settings API clients, nav entries, detail-page entry point + replace orphaned contactInfo with email/phone/address across Kontakt pages

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-06 07:31:04 +02:00
parent 0c05a5acf1
commit 9c3bcfc9f9
16 changed files with 1063 additions and 16 deletions

View File

@@ -0,0 +1,42 @@
/** FEAT-13: Abgabeverträge (/contracts). */
import { API_BASE_URL, api, resources } from './client'
import { toQueryString, type GridifyQuery } from './gridify'
import type { DateOnlyString, Paged } from './types'
export interface SaleContract {
id: string
contactId: string
price: number
handoverDate: DateOnlyString
contractDate: DateOnlyString
fileName: string
createdAt: string
gerbilIds: string[]
/** API-relativer Download-Pfad ("/contracts/{id}/file"). */
url: string
}
export interface CreateSaleContract {
contactId: string
gerbilIds: string[]
price: number
handoverDate: DateOnlyString
contractDate?: DateOnlyString | null
}
export function listContracts(query: GridifyQuery): Promise<Paged<SaleContract>> {
return api.get<Paged<SaleContract>>(`${resources.contracts}${toQueryString(query)}`)
}
export function createContract(body: CreateSaleContract): Promise<SaleContract> {
return api.post<SaleContract>(resources.contracts, body)
}
export function deleteContract(id: string): Promise<void> {
return api.delete(`${resources.contracts}/${id}`)
}
/** Absolute Download-URL der .docx (für <a href> / window.open). */
export function contractFileUrl(contract: Pick<SaleContract, 'url'>): string {
return `${API_BASE_URL}${contract.url}`
}