new features

This commit is contained in:
Matthias Hochmeister
2026-03-23 13:08:19 +01:00
parent 83b84664ce
commit 5032e1593b
41 changed files with 5157 additions and 40 deletions

View File

@@ -0,0 +1,117 @@
import { api } from './api';
import type {
Lieferant,
LieferantFormData,
Bestellung,
BestellungFormData,
BestellungDetailResponse,
Bestellposition,
BestellpositionFormData,
BestellungDatei,
BestellungErinnerung,
ErinnerungFormData,
BestellungHistorie,
} from '../types/bestellung.types';
export const bestellungApi = {
// ── Vendors ──
getVendors: async (): Promise<Lieferant[]> => {
const r = await api.get('/api/bestellungen/vendors');
return r.data.data;
},
getVendor: async (id: number): Promise<Lieferant> => {
const r = await api.get(`/api/bestellungen/vendors/${id}`);
return r.data.data;
},
createVendor: async (data: LieferantFormData): Promise<Lieferant> => {
const r = await api.post('/api/bestellungen/vendors', data);
return r.data.data;
},
updateVendor: async (id: number, data: LieferantFormData): Promise<Lieferant> => {
const r = await api.patch(`/api/bestellungen/vendors/${id}`, data);
return r.data.data;
},
deleteVendor: async (id: number): Promise<void> => {
await api.delete(`/api/bestellungen/vendors/${id}`);
},
// ── Orders ──
getOrders: async (filters?: { status?: string; lieferant_id?: number }): Promise<Bestellung[]> => {
const params = new URLSearchParams();
if (filters?.status) params.set('status', filters.status);
if (filters?.lieferant_id) params.set('lieferant_id', String(filters.lieferant_id));
const r = await api.get(`/api/bestellungen?${params.toString()}`);
return r.data.data;
},
getOrder: async (id: number): Promise<BestellungDetailResponse> => {
const r = await api.get(`/api/bestellungen/${id}`);
return r.data.data;
},
createOrder: async (data: BestellungFormData): Promise<Bestellung> => {
const r = await api.post('/api/bestellungen', data);
return r.data.data;
},
updateOrder: async (id: number, data: Partial<BestellungFormData>): Promise<Bestellung> => {
const r = await api.patch(`/api/bestellungen/${id}`, data);
return r.data.data;
},
deleteOrder: async (id: number): Promise<void> => {
await api.delete(`/api/bestellungen/${id}`);
},
updateStatus: async (id: number, status: string): Promise<Bestellung> => {
const r = await api.patch(`/api/bestellungen/${id}/status`, { status });
return r.data.data;
},
// ── Line Items ──
addLineItem: async (orderId: number, data: BestellpositionFormData): Promise<Bestellposition> => {
const r = await api.post(`/api/bestellungen/${orderId}/items`, data);
return r.data.data;
},
updateLineItem: async (itemId: number, data: Partial<BestellpositionFormData>): Promise<Bestellposition> => {
const r = await api.patch(`/api/bestellungen/items/${itemId}`, data);
return r.data.data;
},
deleteLineItem: async (itemId: number): Promise<void> => {
await api.delete(`/api/bestellungen/items/${itemId}`);
},
updateReceivedQty: async (itemId: number, menge: number): Promise<Bestellposition> => {
const r = await api.patch(`/api/bestellungen/items/${itemId}/received`, { erhalten_menge: menge });
return r.data.data;
},
// ── Files ──
uploadFile: async (orderId: number, file: File): Promise<BestellungDatei> => {
const formData = new FormData();
formData.append('datei', file);
const r = await api.post(`/api/bestellungen/${orderId}/files`, formData, {
headers: { 'Content-Type': 'multipart/form-data' },
});
return r.data.data;
},
deleteFile: async (fileId: number): Promise<void> => {
await api.delete(`/api/bestellungen/files/${fileId}`);
},
getFiles: async (orderId: number): Promise<BestellungDatei[]> => {
const r = await api.get(`/api/bestellungen/${orderId}/files`);
return r.data.data;
},
// ── Reminders ──
addReminder: async (orderId: number, data: ErinnerungFormData): Promise<BestellungErinnerung> => {
const r = await api.post(`/api/bestellungen/${orderId}/reminders`, data);
return r.data.data;
},
markReminderDone: async (reminderId: number): Promise<void> => {
await api.patch(`/api/bestellungen/reminders/${reminderId}`, { erledigt: true });
},
deleteReminder: async (reminderId: number): Promise<void> => {
await api.delete(`/api/bestellungen/reminders/${reminderId}`);
},
// ── History ──
getHistory: async (orderId: number): Promise<BestellungHistorie[]> => {
const r = await api.get(`/api/bestellungen/${orderId}/history`);
return r.data.data;
},
};

View File

@@ -0,0 +1,73 @@
import { api } from './api';
import type {
ShopArtikel,
ShopArtikelFormData,
ShopAnfrage,
ShopAnfrageDetailResponse,
ShopAnfrageFormItem,
} from '../types/shop.types';
export const shopApi = {
// ── Catalog Items ──
getItems: async (filters?: { kategorie?: string; aktiv?: boolean }): Promise<ShopArtikel[]> => {
const params = new URLSearchParams();
if (filters?.kategorie) params.set('kategorie', filters.kategorie);
if (filters?.aktiv !== undefined) params.set('aktiv', String(filters.aktiv));
const r = await api.get(`/api/shop/items?${params.toString()}`);
return r.data.data;
},
getItem: async (id: number): Promise<ShopArtikel> => {
const r = await api.get(`/api/shop/items/${id}`);
return r.data.data;
},
createItem: async (data: ShopArtikelFormData): Promise<ShopArtikel> => {
const r = await api.post('/api/shop/items', data);
return r.data.data;
},
updateItem: async (id: number, data: Partial<ShopArtikelFormData>): Promise<ShopArtikel> => {
const r = await api.patch(`/api/shop/items/${id}`, data);
return r.data.data;
},
deleteItem: async (id: number): Promise<void> => {
await api.delete(`/api/shop/items/${id}`);
},
getCategories: async (): Promise<string[]> => {
const r = await api.get('/api/shop/categories');
return r.data.data;
},
// ── Requests ──
getRequests: async (filters?: { status?: string }): Promise<ShopAnfrage[]> => {
const params = new URLSearchParams();
if (filters?.status) params.set('status', filters.status);
const r = await api.get(`/api/shop/requests?${params.toString()}`);
return r.data.data;
},
getMyRequests: async (): Promise<ShopAnfrage[]> => {
const r = await api.get('/api/shop/requests/my');
return r.data.data;
},
getRequest: async (id: number): Promise<ShopAnfrageDetailResponse> => {
const r = await api.get(`/api/shop/requests/${id}`);
return r.data.data;
},
createRequest: async (items: ShopAnfrageFormItem[], notizen?: string): Promise<ShopAnfrage> => {
const r = await api.post('/api/shop/requests', { items, notizen });
return r.data.data;
},
updateRequestStatus: async (id: number, status: string, admin_notizen?: string): Promise<ShopAnfrage> => {
const r = await api.patch(`/api/shop/requests/${id}/status`, { status, admin_notizen });
return r.data.data;
},
deleteRequest: async (id: number): Promise<void> => {
await api.delete(`/api/shop/requests/${id}`);
},
// ── Linking ──
linkToOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
await api.post(`/api/shop/requests/${anfrageId}/link`, { bestellung_id: bestellungId });
},
unlinkFromOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
await api.delete(`/api/shop/requests/${anfrageId}/link/${bestellungId}`);
},
};