- {{invoice.title}} ({{invoice.count}})
+ {{invoice.title}} ({{invoice.count}})
diff --git a/app/Domains/Invoice/Actions/ChangeStatus/ChangeStatusCommand.php b/app/Domains/Invoice/Actions/ChangeStatus/ChangeStatusCommand.php
index 3657845..df1a09e 100644
--- a/app/Domains/Invoice/Actions/ChangeStatus/ChangeStatusCommand.php
+++ b/app/Domains/Invoice/Actions/ChangeStatus/ChangeStatusCommand.php
@@ -36,9 +36,9 @@ class ChangeStatusCommand {
$this->request->invoice->comment = $this->request->invoice->denied_reason;
$this->request->invoice->denied_reason = null;
break;
-
-
-
+ case InvoiceStatus::INVOICE_STATUS_DELETED:
+ $this->request->invoice->status = InvoiceStatus::INVOICE_STATUS_DELETED;
+ break;
}
if ($this->request->invoice->save()) {
diff --git a/app/Domains/Invoice/Controllers/ListMyInvoicesController.php b/app/Domains/Invoice/Controllers/ListMyInvoicesController.php
new file mode 100644
index 0000000..b4742e9
--- /dev/null
+++ b/app/Domains/Invoice/Controllers/ListMyInvoicesController.php
@@ -0,0 +1,61 @@
+invoices->getMyInvoicesByStatus($invoiceStatus);
+
+ $subTabIndex = 0;
+ switch ($invoiceStatus) {
+ case InvoiceStatus::INVOICE_STATUS_NEW:
+ $subTabIndex = 0;
+ break;
+ case InvoiceStatus::INVOICE_STATUS_APPROVED:
+ $subTabIndex = 1;
+ break;
+ case InvoiceStatus::INVOICE_STATUS_DENIED:
+ $subTabIndex = 2;
+ break;
+
+ }
+
+
+ $inertiaProvider = new InertiaProvider('Invoice/ListMyInvoices', [
+ 'invoices' => $invoices,
+ 'endpoint' => $invoiceStatus,
+ 'currentStatus' => $subTabIndex,
+ ]);
+ return $inertiaProvider->render();
+ }
+
+ public function getMyInvoicesByStatus(string $invoiceStatus) : JsonResponse {
+ $invoices = $this->invoices->getMyInvoicesByStatus($invoiceStatus);
+
+ $title = '';
+ switch ($invoiceStatus) {
+ case InvoiceStatus::INVOICE_STATUS_NEW:
+ $title = 'Neue Abrechnungen';
+ break;
+ case InvoiceStatus::INVOICE_STATUS_APPROVED:
+ $title = 'Freigegebene Abrechnungen, nicht exportierte Abrechnungen';
+ break;
+ case InvoiceStatus::INVOICE_STATUS_DENIED:
+ $title = 'Abgelehnte Abrechnungen';
+ break;
+
+ }
+
+ return response()->json([
+ 'title' => $title,
+ 'endpoint' => $invoiceStatus,
+ 'invoices' => $invoices,
+ ]);
+ }
+
+}
diff --git a/app/Domains/Invoice/Routes/api.php b/app/Domains/Invoice/Routes/api.php
index 3d985d9..cc49bbc 100644
--- a/app/Domains/Invoice/Routes/api.php
+++ b/app/Domains/Invoice/Routes/api.php
@@ -4,6 +4,7 @@ use App\Domains\CostUnit\Controllers\DistanceAllowanceController;
use App\Domains\CostUnit\Controllers\ListController;
use App\Domains\Invoice\Controllers\ChangeStateController;
use App\Domains\Invoice\Controllers\EditController;
+use App\Domains\Invoice\Controllers\ListMyInvoicesController;
use App\Domains\Invoice\Controllers\NewInvoiceController;
use App\Domains\Invoice\Controllers\ShowInvoiceController;
use App\Middleware\IdentifyTenant;
@@ -19,6 +20,7 @@ Route::middleware(IdentifyTenant::class)->group(function () {
Route::post('/details/{invoiceId}/change-state/{newState}', ChangeStateController::class);
Route::post('/details/{invoiceId}/copy', [EditController::class, 'copyInvoice']);
Route::post('/details/{invoiceId}/update', [EditController::class, 'updateInvoice']);
+ Route::get('/my-invoices/{invoiceStatus}', [ListMyInvoicesController::class, 'getMyInvoicesByStatus']);
diff --git a/app/Domains/Invoice/Routes/web.php b/app/Domains/Invoice/Routes/web.php
index 4667b70..2d20b9e 100644
--- a/app/Domains/Invoice/Routes/web.php
+++ b/app/Domains/Invoice/Routes/web.php
@@ -1,7 +1,6 @@
group(function () {
Route::prefix('invoice')->group(function () {
Route::get('/new', NewInvoiceController::class);
-
-
Route::middleware(['auth'])->group(function () {
- Route::get('/create', [CreateController::class, 'showForm']);
+ Route::get('/my-invoices/{invoiceStatus}', ListMyInvoicesController::class);
+
});
diff --git a/app/Domains/Invoice/Views/ListMyInvoices.vue b/app/Domains/Invoice/Views/ListMyInvoices.vue
new file mode 100644
index 0000000..4b9f72c
--- /dev/null
+++ b/app/Domains/Invoice/Views/ListMyInvoices.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Domains/Invoice/Views/Partials/myInvoiceDetails/DistanceAllowance.vue b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/DistanceAllowance.vue
new file mode 100644
index 0000000..34fd61f
--- /dev/null
+++ b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/DistanceAllowance.vue
@@ -0,0 +1,78 @@
+
+
+
+
+ |
+ Abrechnung einer Reisekostenpauschale
+ |
+
+ | Reiseroute |
+ {{props.invoice.travelRoute}} |
+
+
+
+ | Gesamte Wegstrecke |
+ {{props.invoice.distance}} km |
+
+
+
+ | Kilometerpauschale |
+ {{props.invoice.distanceAllowance}} Euro / km |
+
+
+
+ | Gesamtbetrag |
+ {{props.invoice.amount}} |
+
+
+
+ | Marterialtransport |
+ {{props.invoice.transportation}} |
+
+
+
+ | Hat Personen mitgenommen |
+ {{props.invoice.passengers}} |
+
+
+
+
+
+
diff --git a/app/Domains/Invoice/Views/Partials/myInvoiceDetails/Header.vue b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/Header.vue
new file mode 100644
index 0000000..cf74c50
--- /dev/null
+++ b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/Header.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
diff --git a/app/Domains/Invoice/Views/Partials/myInvoiceDetails/InvoiceDetails.vue b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/InvoiceDetails.vue
new file mode 100644
index 0000000..155d9c7
--- /dev/null
+++ b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/InvoiceDetails.vue
@@ -0,0 +1,264 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Begründung:
+
+
+
+
+
+
+
diff --git a/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ListInvoices.vue b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ListInvoices.vue
new file mode 100644
index 0000000..281f5d1
--- /dev/null
+++ b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ListInvoices.vue
@@ -0,0 +1,80 @@
+
+
+
+
+ Es sind keine Abrechnungen in dieser Kategorie vorhanden.
+
+
+
+
+
+
diff --git a/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ShowInvoice.vue b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ShowInvoice.vue
new file mode 100644
index 0000000..f4976c1
--- /dev/null
+++ b/app/Domains/Invoice/Views/Partials/myInvoiceDetails/ShowInvoice.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php
index 0ccc17e..003773d 100644
--- a/app/Repositories/InvoiceRepository.php
+++ b/app/Repositories/InvoiceRepository.php
@@ -13,9 +13,9 @@ use Illuminate\Database\Eloquent\Collection;
class InvoiceRepository {
public function getMyInvoicesWidget() : array {
$invoices = [
- InvoiceStatus::INVOICE_STATUS_NEW => ['slug' => 'new', 'title' => 'Neue Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()],
- InvoiceStatus::INVOICE_STATUS_APPROVED => ['slug' => 'approved', 'title' => 'Freigegebene Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()],
- InvoiceStatus::INVOICE_STATUS_DENIED => ['slug' => 'declined', 'title' => 'Abgelehnte Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()]
+ InvoiceStatus::INVOICE_STATUS_NEW => ['slug' => InvoiceStatus::INVOICE_STATUS_NEW, 'title' => 'Neue Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()],
+ InvoiceStatus::INVOICE_STATUS_APPROVED => ['slug' => InvoiceStatus::INVOICE_STATUS_APPROVED, 'title' => 'Freigegebene Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()],
+ InvoiceStatus::INVOICE_STATUS_DENIED => ['slug' => InvoiceStatus::INVOICE_STATUS_DENIED, 'title' => 'Abgelehnte Abrechnungen', 'count' => 0, 'amount' => Amount::fromString('0')->toString()]
];
@@ -48,6 +48,21 @@ class InvoiceRepository {
return $returnData;
}
+ public function getMyInvoicesByStatus(string $status) : array {
+ $returnData = [];
+ foreach (Invoice::where(
+ [
+ 'status' => $status,
+ 'user_id' => auth()->user()->id,
+ 'tenant' => app('tenant')->slug,
+
+ ]
+ )->get() as $invoice) {
+ $returnData[] = new InvoiceResource($invoice)->toArray();
+ };
+ return $returnData;
+ }
+
public function getAsTreasurer(int $invoiceId) : ?Invoice {
$invoice = Invoice::where('id', $invoiceId)->first();
if ($invoice === null) {
diff --git a/app/Views/Components/TabbedPage.vue b/app/Views/Components/TabbedPage.vue
index ecd3d0d..2b65233 100644
--- a/app/Views/Components/TabbedPage.vue
+++ b/app/Views/Components/TabbedPage.vue
@@ -6,6 +6,11 @@ const props = defineProps({
type: Array,
required: true,
// [{ title: "Titel", component: Component, endpoint: "/wp-json/..." }]
+ },
+ subTabIndex: {
+ type: Number,
+ required: false,
+ default: 0
}
})
@@ -54,7 +59,7 @@ async function selectTab(index) {
// ersten Tab automatisch laden
onMounted(() => {
if (props.tabs.length > 0) {
- selectTab(0)
+ selectTab(props.subTabIndex)
}
})