156 lines
6.6 KiB
TypeScript
156 lines
6.6 KiB
TypeScript
import { api } from './api';
|
|
import type {
|
|
AusruestungArtikel,
|
|
AusruestungArtikelFormData,
|
|
AusruestungAnfrageDetailResponse,
|
|
AusruestungAnfrageFormItem,
|
|
AusruestungOverview,
|
|
AusruestungKategorie,
|
|
AusruestungEigenschaft,
|
|
AusruestungAnfrage,
|
|
AusruestungWidgetOverview,
|
|
CreateOrdersRequest,
|
|
CreateOrdersResponse,
|
|
} from '../types/ausruestungsanfrage.types';
|
|
|
|
export const ausruestungsanfrageApi = {
|
|
// ── Categories (DB-backed, hierarchical) ──
|
|
getKategorien: async (): Promise<AusruestungKategorie[]> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/kategorien');
|
|
return r.data.data;
|
|
},
|
|
createKategorie: async (name: string, parentId?: number | null): Promise<AusruestungKategorie> => {
|
|
const r = await api.post('/api/ausruestungsanfragen/kategorien', { name, parent_id: parentId ?? null });
|
|
return r.data.data;
|
|
},
|
|
updateKategorie: async (id: number, data: { name?: string; parent_id?: number | null }): Promise<AusruestungKategorie> => {
|
|
const r = await api.patch(`/api/ausruestungsanfragen/kategorien/${id}`, data);
|
|
return r.data.data;
|
|
},
|
|
deleteKategorie: async (id: number): Promise<void> => {
|
|
await api.delete(`/api/ausruestungsanfragen/kategorien/${id}`);
|
|
},
|
|
|
|
// ── Catalog Items ──
|
|
getItems: async (filters?: { kategorie?: string; kategorie_id?: number; aktiv?: boolean }): Promise<AusruestungArtikel[]> => {
|
|
const params = new URLSearchParams();
|
|
if (filters?.kategorie) params.set('kategorie', filters.kategorie);
|
|
if (filters?.kategorie_id) params.set('kategorie_id', String(filters.kategorie_id));
|
|
if (filters?.aktiv !== undefined) params.set('aktiv', String(filters.aktiv));
|
|
const r = await api.get(`/api/ausruestungsanfragen/items?${params.toString()}`);
|
|
return r.data.data;
|
|
},
|
|
getItem: async (id: number): Promise<AusruestungArtikel> => {
|
|
const r = await api.get(`/api/ausruestungsanfragen/items/${id}`);
|
|
return r.data.data;
|
|
},
|
|
createItem: async (data: AusruestungArtikelFormData): Promise<AusruestungArtikel> => {
|
|
const r = await api.post('/api/ausruestungsanfragen/items', data);
|
|
return r.data.data;
|
|
},
|
|
updateItem: async (id: number, data: Partial<AusruestungArtikelFormData>): Promise<AusruestungArtikel> => {
|
|
const r = await api.patch(`/api/ausruestungsanfragen/items/${id}`, data);
|
|
return r.data.data;
|
|
},
|
|
deleteItem: async (id: number): Promise<void> => {
|
|
await api.delete(`/api/ausruestungsanfragen/items/${id}`);
|
|
},
|
|
getCategories: async (): Promise<string[]> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/categories');
|
|
return r.data.data;
|
|
},
|
|
|
|
// ── Item Eigenschaften (characteristics) ──
|
|
getArtikelEigenschaften: async (artikelId: number): Promise<AusruestungEigenschaft[]> => {
|
|
const r = await api.get(`/api/ausruestungsanfragen/items/${artikelId}/eigenschaften`);
|
|
return r.data.data;
|
|
},
|
|
upsertArtikelEigenschaft: async (
|
|
artikelId: number,
|
|
data: { eigenschaft_id?: number; name: string; typ: string; optionen?: string[]; pflicht?: boolean; sort_order?: number },
|
|
): Promise<AusruestungEigenschaft> => {
|
|
const r = await api.post(`/api/ausruestungsanfragen/items/${artikelId}/eigenschaften`, data);
|
|
return r.data.data;
|
|
},
|
|
deleteArtikelEigenschaft: async (eigenschaftId: number): Promise<void> => {
|
|
await api.delete(`/api/ausruestungsanfragen/eigenschaften/${eigenschaftId}`);
|
|
},
|
|
|
|
// ── Requests ──
|
|
getRequests: async (filters?: { status?: string }): Promise<AusruestungAnfrage[]> => {
|
|
const params = new URLSearchParams();
|
|
if (filters?.status) params.set('status', filters.status);
|
|
const r = await api.get(`/api/ausruestungsanfragen/requests?${params.toString()}`);
|
|
return r.data.data;
|
|
},
|
|
getMyRequests: async (): Promise<AusruestungAnfrage[]> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/requests/my');
|
|
return r.data.data;
|
|
},
|
|
getRequest: async (id: number): Promise<AusruestungAnfrageDetailResponse> => {
|
|
const r = await api.get(`/api/ausruestungsanfragen/requests/${id}`);
|
|
return r.data.data;
|
|
},
|
|
createRequest: async (
|
|
items: AusruestungAnfrageFormItem[],
|
|
notizen?: string,
|
|
bezeichnung?: string,
|
|
fuer_benutzer_id?: string,
|
|
fuer_benutzer_name?: string,
|
|
): Promise<AusruestungAnfrageDetailResponse> => {
|
|
const r = await api.post('/api/ausruestungsanfragen/requests', { items, notizen, bezeichnung, fuer_benutzer_id, fuer_benutzer_name });
|
|
return r.data.data;
|
|
},
|
|
updateRequest: async (
|
|
id: number,
|
|
data: { bezeichnung?: string; notizen?: string; items?: AusruestungAnfrageFormItem[] },
|
|
): Promise<AusruestungAnfrageDetailResponse> => {
|
|
const r = await api.patch(`/api/ausruestungsanfragen/requests/${id}`, data);
|
|
return r.data.data;
|
|
},
|
|
updateRequestStatus: async (id: number, status: string, admin_notizen?: string): Promise<AusruestungAnfrage> => {
|
|
const r = await api.patch(`/api/ausruestungsanfragen/requests/${id}/status`, { status, admin_notizen });
|
|
return r.data.data;
|
|
},
|
|
deleteRequest: async (id: number): Promise<void> => {
|
|
await api.delete(`/api/ausruestungsanfragen/requests/${id}`);
|
|
},
|
|
|
|
// ── Position delivery tracking ──
|
|
updatePositionGeliefert: async (positionId: number, geliefert: boolean): Promise<void> => {
|
|
await api.patch(`/api/ausruestungsanfragen/positionen/${positionId}/geliefert`, { geliefert });
|
|
},
|
|
|
|
// ── Linking ──
|
|
linkToOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
|
|
await api.post(`/api/ausruestungsanfragen/requests/${anfrageId}/link`, { bestellung_id: bestellungId });
|
|
},
|
|
unlinkFromOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
|
|
await api.delete(`/api/ausruestungsanfragen/requests/${anfrageId}/link/${bestellungId}`);
|
|
},
|
|
|
|
// ── Create orders from request ──
|
|
createOrders: async (anfrageId: number, payload: CreateOrdersRequest): Promise<CreateOrdersResponse> => {
|
|
const r = await api.post(`/api/ausruestungsanfragen/requests/${anfrageId}/create-orders`, payload);
|
|
return r.data.data;
|
|
},
|
|
|
|
// ── Overview ──
|
|
getOverview: async (): Promise<AusruestungOverview> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/overview');
|
|
return r.data.data;
|
|
},
|
|
|
|
// ── Widget overview ──
|
|
getWidgetOverview: async (): Promise<AusruestungWidgetOverview> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/widget-overview');
|
|
return r.data.data;
|
|
},
|
|
|
|
// ── Users ──
|
|
getOrderUsers: async (): Promise<Array<{ id: string; name: string }>> => {
|
|
const r = await api.get('/api/ausruestungsanfragen/users');
|
|
return r.data.data;
|
|
},
|
|
};
|