From 0cf9602958d82eb0c5afa718ff7fd35640c903bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20G=C3=BCnther?= Date: Tue, 12 May 2026 16:04:15 +0200 Subject: [PATCH] Direct payments for invoices Events can be moved to archive and moved back Fixed validation --- .../CostUnit/Views/Partials/ListInvoices.vue | 56 +++++- .../ArchiveEvent/ArchiveEventCommand.php | 22 +++ .../ArchiveEvent/ArchiveEventRequest.php | 13 ++ .../ArchiveEvent/ArchiveEventResponse.php | 11 ++ .../UnarchiveEvent/UnarchiveEventCommand.php | 22 +++ .../UnarchiveEvent/UnarchiveEventRequest.php | 13 ++ .../UnarchiveEvent/UnarchiveEventResponse.php | 11 ++ .../Controllers/ArchivedEventsController.php | 27 +++ .../Controllers/EventArchiveController.php | 25 +++ .../Controllers/EventUnarchiveController.php | 22 +++ app/Domains/Event/Routes/api.php | 7 +- app/Domains/Event/Routes/web.php | 2 + app/Domains/Event/Views/ArchivedEvents.vue | 76 +++++++++ app/Domains/Event/Views/Partials/Overview.vue | 11 ++ .../CreateInvoice/CreateInvoiceCommand.php | 1 + .../CreateInvoice/CreateInvoiceRequest.php | 3 + .../Controllers/NewInvoiceController.php | 98 ----------- .../Controllers/SaveInvoiceController.php | 128 ++++++++++++++ app/Domains/Invoice/Routes/api.php | 3 +- app/Domains/Invoice/Views/NewInvoice.vue | 21 ++- .../Views/Partials/invoiceDetails/Header.vue | 2 +- .../Partials/myInvoiceDetails/Header.vue | 2 +- .../myInvoiceDetails/ListInvoices.vue | 2 +- .../Partials/newInvoice/direct-payment.vue | 126 ++++++++++++++ .../Partials/newInvoice/payment-data.vue | 161 ++++++++++++++++++ .../Views/Partials/newInvoice/refund-data.vue | 9 +- app/Enumerations/InvoiceType.php | 5 + app/Models/Invoice.php | 1 + app/Providers/GlobalDataProvider.php | 14 +- app/Providers/InvoiceCsvFileProvider.php | 4 +- app/Providers/PainFileProvider.php | 6 +- .../EventParticipantRepository.php | 4 +- app/Repositories/EventRepository.php | 2 +- app/Resources/CostUnitResource.php | 2 +- app/Resources/EventResource.php | 3 +- app/Resources/InvoiceResource.php | 5 +- config/app.php | 1 + ...2026_05_12_140001_update_invoice_types.php | 21 +++ .../2026_05_12_140002_update_invoices.php | 21 +++ public/css/invoices.css | 4 +- resources/js/layouts/AppLayout.vue | 14 +- version | 2 +- 42 files changed, 851 insertions(+), 132 deletions(-) create mode 100644 app/Domains/Event/Actions/ArchiveEvent/ArchiveEventCommand.php create mode 100644 app/Domains/Event/Actions/ArchiveEvent/ArchiveEventRequest.php create mode 100644 app/Domains/Event/Actions/ArchiveEvent/ArchiveEventResponse.php create mode 100644 app/Domains/Event/Actions/UnarchiveEvent/UnarchiveEventCommand.php create mode 100644 app/Domains/Event/Actions/UnarchiveEvent/UnarchiveEventRequest.php create mode 100644 app/Domains/Event/Actions/UnarchiveEvent/UnarchiveEventResponse.php create mode 100644 app/Domains/Event/Controllers/ArchivedEventsController.php create mode 100644 app/Domains/Event/Controllers/EventArchiveController.php create mode 100644 app/Domains/Event/Controllers/EventUnarchiveController.php create mode 100644 app/Domains/Event/Views/ArchivedEvents.vue create mode 100644 app/Domains/Invoice/Controllers/SaveInvoiceController.php create mode 100644 app/Domains/Invoice/Views/Partials/newInvoice/direct-payment.vue create mode 100644 app/Domains/Invoice/Views/Partials/newInvoice/payment-data.vue create mode 100644 database/migrations/2026_05_12_140001_update_invoice_types.php create mode 100644 database/migrations/2026_05_12_140002_update_invoices.php diff --git a/app/Domains/CostUnit/Views/Partials/ListInvoices.vue b/app/Domains/CostUnit/Views/Partials/ListInvoices.vue index 00bc03a..efc647e 100644 --- a/app/Domains/CostUnit/Views/Partials/ListInvoices.vue +++ b/app/Domains/CostUnit/Views/Partials/ListInvoices.vue @@ -3,6 +3,7 @@ import InvoiceDetails from "../../../Invoice/Views/Partials/invoiceDetails/InvoiceDetails.vue"; import { useAjax } from "../../../../../resources/js/components/ajaxHandler.js"; import {ref} from "vue"; + import {toast} from "vue3-toastify"; const props = defineProps({ data: Object @@ -12,7 +13,7 @@ const invoice = ref(null) const show_invoice = ref(false) const localData = ref(props.data) - +console.log(props.data) async function openInvoiceDetails(invoiceId) { const url = '/api/v1/invoice/details/' + invoiceId @@ -40,6 +41,50 @@ } } + async function exportPayouts() { + toast.info('Der Export wird nun gestartet. Bitte verlasse diese Seite nicht, bis der Export abgeschlossen ist.') + + const response = await fetch('/api/v1/core/retrieve-global-data'); + const data = await response.json(); + const exportUrl = '/api/v1/cost-unit/' + props.data.costUnit.id + '/export-payouts'; + + try { + if (data.tenant.download_exports) { + const response = await fetch(exportUrl, { + headers: { "Content-Type": "application/json" }, + }); + + if (!response.ok) throw new Error('Fehler beim Export (ZIP)'); + + const blob = await response.blob(); + const downloadUrl = window.URL.createObjectURL(blob); + const a = document.createElement("a"); + a.style.display = "none"; + a.href = downloadUrl; + a.download = "Abrechnungen-Sippenstunden.zip"; + + document.body.appendChild(a); + a.click(); + + setTimeout(() => { + window.URL.revokeObjectURL(downloadUrl); + document.body.removeChild(a); + }, 100); + } else { + const response = await request(exportUrl, { + method: "GET", + }); + + toast.success(response.message); + } + + reload() + + } catch (err) { + toast.error('Beim Export der Abrechnungen ist ein Fehler aufgetreten.'); + } + } +