Displaying estimates

This commit is contained in:
2026-05-26 11:07:33 +02:00
parent 551b592b3b
commit fe3429cd4e
8 changed files with 64 additions and 11 deletions
@@ -112,8 +112,8 @@
<div class="event-flexbox" v-else>
<div class="event-flexbox-row top">
<div class="left"><ParticipationSummary v-if="dynamicProps.event" :event="dynamicProps.event" /></div>
<div class="right">
<div class="actions-left"><ParticipationSummary v-if="dynamicProps.event" :event="dynamicProps.event" /></div>
<div class="actions-right">
<a :href="'/event/details/' + props.data.event.identifier + '/pdf/first-aid-list'">
<input type="button" value="Erste-Hilfe-Liste (PDF)" />
</a><br/>
@@ -186,6 +186,7 @@
<label style="font-size: 9pt;" class="link" @click="showCommonSettings">Allgemeine Einstellungen</label> &nbsp;
<label style="font-size: 9pt;" class="link" @click="showEventManagement">Veranstaltungsleitung</label> &nbsp;
<label style="font-size: 9pt;" class="link" @click="showParticipationFees">Teilnahmegebühren</label>
<a style="font-size: 9pt;" class="link" :href="'/budget/' + props.data.event.costUnit.id">Budget bearbeiten</a>
<a style="font-size: 9pt;" class="link" :href="'/cost-unit/' + props.data.event.costUnit.id">Ausgabenübersicht</a>
<a v-if="!dynamicProps.event.registrationAllowed && !dynamicProps.event.archived" style="color: #ff0000; font-size: 9pt;" class="link" @click="archiveEvent">Archivieren</a>
</div>
@@ -248,13 +249,13 @@
gap: 10px; /* Abstand zwischen den Spalten */
}
.event-flexbox-row.top .left {
.event-flexbox-row.top .actions-left {
flex: 0 0 calc(100% - 300px);
padding: 10px;
}
.event-flexbox-row.top .right {
flex: 0 0 250px;
.event-flexbox-row.top .actions-right {
flex: 0 0 200px;
padding: 10px;
}
@@ -263,7 +264,7 @@
padding: 10px;
}
.event-flexbox-row.top .right input[type="button"] {
.event-flexbox-row.top .actions-right input[type="button"] {
width: 100% !important;
margin-bottom: 10px;
}
@@ -96,19 +96,31 @@ const props = defineProps({
</td>
</tr>
<tr>
<th style="padding-top: 20px; font-size: 12pt !important;" colspan="2">Budget</th>
<td v-if="props.event.totalBalance.expected.value >= 0" style="color: #4caf50; font-weight: bold; padding-top: 20px; font-size: 12pt !important;">
{{ props.event.totalBalance.estimated.readable }}
</td>
<td v-else style="color: #f44336; font-weight: bold; padding-top: 20px; font-size: 12pt !important;">
{{props.event.totalBalance.estimated.readable}}
</td>
</tr>
</table>
</div>
<div class="right">
<h3>Ausgaben</h3>
<table class="event-payment-table" style="font-size: 10pt;">
<table class="event-payment-table" style="font-size: 10pt; width:100%">
<tr v-for="amount in props.event.costUnit.amounts">
<th>{{amount.name}}</th>
<td>{{amount.string}}</td>
<td>({{ amount.estimatedString }}) </td>
</tr>
<tr>
<th style="color:#f44336; border-width: 1px; border-top-style: solid; ">Gesamt</th>
<td style="color:#f44336; border-width: 1px; border-top-style: solid; font-weight: bold">{{props.event.costUnit.overAllAmount.text}}</td>
<td style="color:#f44336; border-width: 1px; border-top-style: solid; font-weight: bold; padding-right: 20px;">{{props.event.costUnit.overAllAmount.text}}</td>
<td style="color:#f44336; border-width: 1px; border-top-style: solid; font-weight: bold">({{props.event.costUnit.overAllEstimatedAmount.text}}))</td>
</tr>
</table>
</div>
@@ -121,7 +133,7 @@ const props = defineProps({
.participant-flexbox {
display: flex;
flex-direction: column;
gap: 10px;
gap: 20px;
width: 95%;
margin: 20px auto 0;
}
@@ -135,7 +147,7 @@ const props = defineProps({
.participant-flexbox-row.top .left,
.participant-flexbox-row.top .right {
padding: 10px;
padding: 20px;
min-width: 0;
}
+9
View File
@@ -6,6 +6,7 @@ use App\Scopes\InstancedModel;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
/**
* @property string $name
@@ -44,7 +45,15 @@ class CostUnit extends InstancedModel
return $this->hasMany(Invoice::class);
}
public function estimates() : hasMany {
return $this->hasMany(CostUnitEstimate::class);
}
public function tenant() : BelongsTo {
return $this->belongsTo(Tenant::class, 'tenant', 'slug');
}
public function event() : HasOne {
return $this->hasOne(Event::class);
}
}
+12
View File
@@ -178,6 +178,18 @@ class CostUnitRepository {
return $amount;
}
public function sumupEstimatedByInvoiceType(CostUnit $costUnit, InvoiceType $invoiceType) : Amount {
$amount = new Amount(0, 'Euro');
foreach ($costUnit->estimates()->get() as $estimate) {
if ($estimate->type !== $invoiceType->slug) {
continue;
}
$amount->addAmount($estimate->calculateAmount());
}
return $amount;
}
public function sumupUnhandledAmounts(CostUnit $costUnit, bool $donatedAmount = false) : Amount {
$amount = new Amount(0, '');
+6
View File
@@ -31,10 +31,15 @@ class CostUnitResource {
$amounts = [];
$overAllAmount = new Amount(0, 'Euro');
$overAllEstimatedAmount = new Amount(0, 'Euro');
foreach (InvoiceType::orderBy('sort_order')->get() as $invoiceType) {
$overAllAmount->addAmount($costUnitRepository->sumupByInvoiceType($this->costUnit, $invoiceType));
$overAllEstimatedAmount->addAmount($costUnitRepository->sumupEstimatedByInvoiceType($this->costUnit, $invoiceType));
$amounts[$invoiceType->slug]['string'] = $costUnitRepository->sumupByInvoiceType($this->costUnit, $invoiceType)->toString();
$amounts[$invoiceType->slug]['name'] = $invoiceType->name;
$amounts[$invoiceType->slug]['estimated'] = $costUnitRepository->sumupEstimatedByInvoiceType($this->costUnit, $invoiceType);
$amounts[$invoiceType->slug]['estimatedString'] = $costUnitRepository->sumupEstimatedByInvoiceType($this->costUnit, $invoiceType)->toString();
}
@@ -52,6 +57,7 @@ class CostUnitResource {
'treasurers' => $this->costUnit->treasurers()->get()->map(fn($user) => new UserResource($user))->toArray(),
'amounts' => $amounts,
'overAllAmount' => ['text' => $overAllAmount->toString(), 'value' => $overAllAmount],
'overAllEstimatedAmount' => ['text' => $overAllEstimatedAmount->toString(), 'value' => $overAllEstimatedAmount],
]);
+9 -1
View File
@@ -86,6 +86,7 @@ class EventResource extends JsonResource{
$returnArray['eventEnd'] = $this->event->end_date->format('d.m.Y');
$returnArray['eventEndInternal'] = $this->event->end_date;
$returnArray['duration'] = $duration;
$returnArray['totalParticipantCount'] = $this->event->participants()->count();
$returnArray['supportPersonIndex'] = $this->event->support_per_person->toString();
$returnArray['supportPerson'] = $this->calculateSupportPerPerson($returnArray['participants']);
@@ -95,12 +96,15 @@ class EventResource extends JsonResource{
$totalBalanceReal = new Amount(0, 'Euro');
$totalBalanceExpected = new Amount(0, 'Euro');
$totalBalanceEstimated = new Amount(0, 'Euro');
$totalBalanceReal->addAmount($returnArray['income']['real']['amount']);
$totalBalanceExpected->addAmount($returnArray['income']['expected']['amount']);
$totalBalanceEstimated->addAmount($returnArray['income']['expected']['amount']);
$totalBalanceReal->subtractAmount($returnArray['costUnit']['overAllAmount']['value']);
$totalBalanceExpected->subtractAmount($returnArray['costUnit']['overAllAmount']['value']);
$totalBalanceEstimated->subtractAmount($returnArray['costUnit']['overAllEstimatedAmount']['value']);
$returnArray['totalBalance'] = [
'real' => [
'value' => $totalBalanceReal->getAmount(),
@@ -108,7 +112,11 @@ class EventResource extends JsonResource{
], 'expected' => [
'value' => $totalBalanceExpected->getAmount(),
'readable' => $totalBalanceExpected->toString(),
]
],
'estimated' => [
'value' => $totalBalanceEstimated->getAmount(),
'readable' => $totalBalanceEstimated->toString(),
]
];
$returnArray['flatSupport'] = $this->event->support_flat->toString();
+3
View File
@@ -5,6 +5,7 @@ namespace App\Scopes;
use App\Models\Tenant;
use App\Providers\AuthCheckProvider;
use App\Repositories\CostUnitRepository;
use App\Repositories\EstimatesRepository;
use App\Repositories\EventParticipantRepository;
use App\Repositories\EventRepository;
use App\Repositories\InvoiceRepository;
@@ -21,6 +22,7 @@ abstract class CommonController {
protected InvoiceRepository $invoices;
protected EventRepository $events;
protected EventParticipantRepository $eventParticipants;
protected EstimatesRepository $estimates;
public function __construct() {
$this->tenant = app('tenant');
@@ -30,6 +32,7 @@ abstract class CommonController {
$this->invoices = new InvoiceRepository();
$this->events = new EventRepository();
$this->eventParticipants = new EventParticipantRepository();
$this->estimates = new EstimatesRepository();
}
protected function checkAuth() {