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