feat(core): add system settings, currency, tax, sequence API hooks

This commit is contained in:
2026-07-04 00:27:20 +00:00
parent d17615fa45
commit e59bbc7a11
+172
View File
@@ -553,3 +553,175 @@ export function useDeleteRole() {
}, },
}); });
} }
// ═══════════════════════════════════════════════════════════════
// System Settings, Currency, Tax, Sequence hooks
// ═══════════════════════════════════════════════════════════════
export interface Currency {
id: string;
code: string;
name: string;
symbol: string;
is_default: boolean;
created_at?: string;
updated_at?: string;
}
export interface TaxRate {
id: string;
name: string;
rate: number;
is_default: boolean;
country?: string | null;
created_at?: string;
updated_at?: string;
}
export interface Sequence {
id: string;
name: string;
prefix: string;
next_number: number;
padding: number;
created_at?: string;
updated_at?: string;
}
export interface SystemSettings {
id?: string;
company_name: string;
company_legal_form?: string | null;
company_street: string;
company_city: string;
company_zip: string;
company_country: string;
tax_number?: string | null;
vat_id?: string | null;
iban?: string | null;
bic?: string | null;
bank_name?: string | null;
ceo?: string | null;
trade_register?: string | null;
default_currency_id?: string | null;
default_tax_id?: string | null;
invoice_prefix: string;
quote_prefix: string;
payment_terms_days: number;
created_at?: string;
updated_at?: string;
}
// System Settings
export function useSystemSettings() {
return useQuery({
queryKey: ['systemSettings'],
queryFn: () => apiGet<SystemSettings>('/system-settings'),
});
}
export function useUpdateSystemSettings() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: Partial<SystemSettings>) => apiClient.put('/system-settings', data).then(r => r.data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['systemSettings'] });
},
});
}
// Currencies
export function useCurrencies() {
return useQuery({
queryKey: ['currencies'],
queryFn: () => apiGet<{ items: Currency[]; total: number }>('/currencies'),
});
}
export function useCreateCurrency() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: Partial<Currency>) => apiPost('/currencies', data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['currencies'] });
},
});
}
export function useUpdateCurrency() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: Partial<Currency> }) =>
apiPatch(`/currencies/${id}`, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['currencies'] });
},
});
}
export function useDeleteCurrency() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => apiDelete(`/currencies/${id}`),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['currencies'] });
},
});
}
// Taxes
export function useTaxes() {
return useQuery({
queryKey: ['taxes'],
queryFn: () => apiGet<{ items: TaxRate[]; total: number }>('/taxes'),
});
}
export function useCreateTax() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: Partial<TaxRate>) => apiPost('/taxes', data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['taxes'] });
},
});
}
export function useUpdateTax() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({ id, data }: { id: string; data: Partial<TaxRate> }) =>
apiPatch(`/taxes/${id}`, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['taxes'] });
},
});
}
export function useDeleteTax() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (id: string) => apiDelete(`/taxes/${id}`),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['taxes'] });
},
});
}
// Sequences
export function useSequences() {
return useQuery({
queryKey: ['sequences'],
queryFn: () => apiGet<{ items: Sequence[]; total: number }>('/sequences'),
});
}
export function useCreateSequence() {
const queryClient = useQueryClient();
return useMutation({
mutationFn: (data: Partial<Sequence>) => apiPost('/sequences', data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['sequences'] });
},
});
}