diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 8098c42..76de2ad 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -48,6 +48,38 @@ public class DocumentApi extends BaseHandler { users = companyService.userService(); } + @Override + public boolean doDelete(Path path, HttpExchange ex) throws IOException { + addCors(ex); + try { + Optional token = SessionToken.from(ex).map(Token::of); + var user = users.loadUser(token); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + return switch (head){ + default -> { + try { + yield deleteDocument(ex,Long.parseLong(head),user.get()); + } catch (NumberFormatException ignored) {} + yield super.doDelete(path,ex); + } + }; + } catch (UmbrellaException e) { + return send(ex,e); + } + } + + private boolean deleteDocument(HttpExchange ex, long docId, UmbrellaUser user) throws IOException, UmbrellaException { + var doc = db.loadDoc(docId); + var companyId = doc.companyId(); + var company = companies.get(companyId); + var members = companies.getMembers(companyId); + var isMember = false; + for (var member : members) isMember |= user.equals(member); + if (!isMember) return sendContent(ex,HTTP_FORBIDDEN,"You are mot a member of company "+doc.companyId()); + return sendContent(ex,db.deleteDoc(docId)); + } + @Override public boolean doGet(Path path, HttpExchange ex) throws IOException { addCors(ex); @@ -73,6 +105,11 @@ public class DocumentApi extends BaseHandler { } } + @Override + public boolean doOptions(Path path, HttpExchange ex) throws IOException { + return sendEmptyResponse(HTTP_OK,addCors(ex)); + } + @Override public boolean doPost(Path path, HttpExchange ex) throws IOException { addCors(ex); diff --git a/frontend/src/routes/document/Add.svelte b/frontend/src/routes/document/Add.svelte index 902b41f..8900a26 100644 --- a/frontend/src/routes/document/Add.svelte +++ b/frontend/src/routes/document/Add.svelte @@ -30,7 +30,7 @@ document.sender.name = ''; if (company.name) document.sender.name += company.name+"\n"; if (company.address) document.sender.name += company.address+"\n"; - if (company.tax_number) document.sender.tax_id = company.tax_number; + if (company.tax_number) document.sender.tax_id = company.tax_number; if (company.bank_account) document.sender.bank_account = company.bank_account; if (company.court) document.sender.court = company.court; } else { diff --git a/frontend/src/routes/document/List.svelte b/frontend/src/routes/document/List.svelte index 587361e..46f3ccc 100644 --- a/frontend/src/routes/document/List.svelte +++ b/frontend/src/routes/document/List.svelte @@ -44,6 +44,21 @@ router.navigate(`/document/${id}/view`); } + async function deleteDoc(ev,doc){ + if (confirm(t('document.really_delete',doc.number))){ + const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/document/${doc.id}`; + const resp = await fetch(url,{ + credentials: 'include', + method: 'DELETE' + }); + if (resp.ok){ + load(selected_company); // relaod docs + } else { + error = await resp.text(); + } + } + } + onMount(loadCompanies); @@ -77,13 +92,18 @@ {#each Object.entries(documents).reverse() as [id,document]} - show(id)}> - {document.number} - {document.date} - {document.customer.name.split('\n')[0]} - {document.sum/100 + document.currency} - {t('document.type_'+document.type)} - {t('document.state_'+document.state.name)} + + show(id)}>{document.number} + show(id)}>{document.date} + show(id)}>{document.customer.name.split('\n')[0]} + show(id)}>{document.sum/100 + document.currency} + show(id)}>{t('document.type_'+document.type)} + show(id)}>{t('document.state_'+document.state.name)} + + {#if document.state.id == 1} + + {/if} + {/each} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 1a3756e..75d5455 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -1,4 +1,7 @@ { + "contacts": { + "loading": "lade…" + }, "document": { "actions": "Aktionen", "add_new": "{0} anlegen", @@ -6,8 +9,10 @@ "court": "Amtsgericht: {0}", "create_new": "neues Dokument", "customer": "Kunde", - "customer_number": "Kundennummer: {0}", + "customer_address": "Adresse", + "customer_id": "Kundennummer", "date": "Datum", + "delete": "löschen", "email": "E-Mail: {0}", "gross_sum": "Brutto-Summe", "list": "Dokumente", @@ -16,6 +21,10 @@ "select_company" : "Wählen Sie eine ihrer Firmen:", "select_customer": "Kunde auswählen", "sender": "Absender", + "sender_bank_account": "Bankverbindung", + "sender_local_court": "Amtsgericht", + "sender_name": "Name", + "sender_tax_id": "Steuernummer", "state": "Status", "state_declined": "abgelehnt", "state_new":"neu", @@ -47,6 +56,7 @@ "company": "Firma", "contact": "Kontakte", "document": "Dokumente", + "documents": "Dokumente", "files": "Dateien", "items": "Items", "logout": "Abmelden",