// Pfade und Methoden der neuen Portal-Aufrufe für Projektkonten, Auftragsbestätigungen (AB) und die Rechnungsvorschau // (V5/V8 des Vorhabens „Aufträge und Rechnungen“). Rein (ohne Appwrite-Import): `request` kommt aus createFinanceRequest // (financeRequest.js) und wird injiziert, damit Pfade, Methoden und Körper unter Node mit einer Fetch-Attrappe testbar sind. // financeApi.js verdrahtet die Funktionen mit dem Appwrite-JWT. Alle Pfade gelten relativ zu /api/admin/finanzen. const enc = encodeURIComponent /** * Pfad der abgerechneten Arbeitsblätter eines Tickets, relativ zu /api/team (teamApi.js: getAbgerechnet). * Antwort: { abgerechnet: { : '' | 'Entwurf' } } */ export const abgerechnetPfad = (ticketId) => `/arbeitsblaetter/abgerechnet?ticketId=${enc(ticketId)}` /** createAuftraegeEndpoints(request) -> die 14 Funktionen von V8 (jede Kennung wird URL-kodiert). */ export function createAuftraegeEndpoints(request) { const post = (path, body) => request(path, { method: 'POST', ...(body === undefined ? {} : { body }) }) return { // --- Projektkonten --- /** { auftraegeAktiv, kunde, konten, ohneProjekt, stripeOk } */ getProjektkonten: (kundeId) => request(`/projektkonten?kunde=${enc(kundeId)}`), /** { konto, auftraege, rechnungen, offeneArbeitsblaetter, stripeOk } */ getProjektkonto: (projektId) => request(`/projektkonten/${enc(projektId)}`), // --- Rechnungsvorschau (ohne Schreibzugriff, ohne Schlüssel) --- /** { positionen, summeCents, leistungszeitraum, customFields } */ previewInvoice: (body) => post('/rechnungen/vorschau', body), // --- Auftragsbestätigungen --- /** { auftraege } (404, wenn der Schalter AUFTRAEGE_ENABLED für den Kunden aus ist) */ listAuftraege: (kundeId) => request(`/auftraege?kunde=${enc(kundeId)}`), getAuftrag: (id) => request(`/auftraege/${enc(id)}`), /** { auftrag } */ createAuftrag: (body) => post('/auftraege', body), /** { auftrag } */ patchAuftrag: (id, body) => request(`/auftraege/${enc(id)}`, { method: 'PATCH', body }), /** { ok: true } */ deleteAuftrag: (id) => request(`/auftraege/${enc(id)}`, { method: 'DELETE' }), /** { auftrag, mailFehler } */ sendAuftrag: (id) => post(`/auftraege/${enc(id)}/senden`), /** { auftrag, mailFehler } */ erinnereAuftrag: (id) => post(`/auftraege/${enc(id)}/erinnern`), /** { auftrag } (neuer Entwurf) */ neueFassungAuftrag: (id) => post(`/auftraege/${enc(id)}/neue-fassung`), /** { auftrag } */ storniereAuftrag: (id) => post(`/auftraege/${enc(id)}/stornieren`), /** { auftrag }; 409, wenn die AB schon ein Projekt hat oder storniert, ersetzt oder widerrufen ist */ ordneAuftragProjektZu: (id, projektId) => post(`/auftraege/${enc(id)}/projekt`, { projektId }), /** PDF der AB (gesendet: gespeicherte Datei, Entwurf: Vorschau) als Blob */ getAuftragPdf: (id) => request(`/auftraege/${enc(id)}/pdf`, { as: 'blob' }), } }