53 lines
2.9 KiB
JavaScript
53 lines
2.9 KiB
JavaScript
// 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: { <worksheetId>: '<Rechnungsnummer>' | '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' }),
|
|
}
|
|
}
|