| Kostenstelle | +Neu | +Ang | +Betrag | +
| {{costUnit.name}} | +{{costUnit.new_invoices_count}} | +{{costUnit.approved_invoices_count}} | +{{costUnit.totalAmount}} | +
Es existieren im Moment keine Abrechnugnen, um die du dich kümmern musst.
+ + + + diff --git a/app/Domains/Invoice/Actions/CreateInvoice/CreateInvoiceCommand.php b/app/Domains/Invoice/Actions/CreateInvoice/CreateInvoiceCommand.php index 4d527e8..73b4fea 100644 --- a/app/Domains/Invoice/Actions/CreateInvoice/CreateInvoiceCommand.php +++ b/app/Domains/Invoice/Actions/CreateInvoice/CreateInvoiceCommand.php @@ -27,7 +27,7 @@ class CreateInvoiceCommand { 'type' => $this->request->invoiceType, 'type_other' => $this->request->invoiceTypeExtended, 'donation' => $this->request->isDonation, - 'userId' => $this->request->userId, + 'user_id' => $this->request->userId, 'contact_name' => $this->request->contactName, 'contact_email' => $this->request->contactEmail, 'contact_phone' => $this->request->contactPhone, diff --git a/app/Models/CostUnit.php b/app/Models/CostUnit.php index d54bfd7..6337cf3 100644 --- a/app/Models/CostUnit.php +++ b/app/Models/CostUnit.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Scopes\InstancedModel; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; /** * @property string $name @@ -37,4 +38,8 @@ class CostUnit extends InstancedModel $this->tresurers()->detach(); $this->save(); } + + public function invoices() : hasMany { + return $this->hasMany(Invoice::class); + } } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 4356ebf..d34bd89 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -2,7 +2,9 @@ namespace App\Models; +use App\Enumerations\InvoiceStatus; use App\Scopes\InstancedModel; +use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * @property string $tenant @@ -65,4 +67,12 @@ class Invoice extends InstancedModel 'denied_at', 'denied_reason', ]; + + public function costUnit() : BelongsTo{ + return $this->belongsTo(CostUnit::class); + } + + public function status() : BelongsTo { + return $this->belongsTo(InvoiceStatus::class, 'status')->first(); + } } diff --git a/app/Repositories/CostUnitRepository.php b/app/Repositories/CostUnitRepository.php index 90b6de8..23a46a7 100644 --- a/app/Repositories/CostUnitRepository.php +++ b/app/Repositories/CostUnitRepository.php @@ -3,9 +3,12 @@ namespace App\Repositories; use App\Enumerations\CostUnitType; +use App\Enumerations\InvoiceStatus; use App\Enumerations\UserRole; use App\Models\CostUnit; use App\Resources\CostUnitResource; +use App\ValueObjects\Amount; +use Illuminate\Database\Capsule\Manager as Capsule; class CostUnitRepository { public function getCostUnitsForNewInvoice(string $type) : array { @@ -95,4 +98,53 @@ class CostUnitRepository { return $visibleCostUnits; } + + public function listForSummary(int $maxCountCostUnits) : array { + $costUnits = $this->getCostUnitsByCriteria([ + 'archived' => false, + 'tenant' => app('tenant')->slug, + ],false); + + foreach ($costUnits as &$cu) { + $cu->new_invoices_count = $cu->invoices()->where('status', 'new')->count(); + $cu->approved_invoices_count = $cu->invoices()->where('status', 'approved')->count(); + } + + $costUnits = collect($costUnits) + ->sortByDesc('approved_invoices_count') + ->sortByDesc('new_invoices_count') + ->take($maxCountCostUnits) + ->values() + ->all(); + + $returnData = []; + + foreach ($costUnits as $costUnit) { + if($costUnit->approved_invoices_count === 0 && $costUnit->new_invoices_count === 0) { + continue; + } + + if (strlen($costUnit->name) > 15) { + $costUnit->name = substr($costUnit->name, 8, 13) . '...'; + } + $costUnit->totalAmount = $this->sumupAmounts($costUnit)->toString(); + $returnData[] = $costUnit; + } + + return $returnData; + } + + public function sumupAmounts(CostUnit $costUnit) : Amount { + $amount = new Amount(0, ''); + + foreach ($costUnit->invoices()->get() as $invoice) { + if ($invoice->status === InvoiceStatus::INVOICE_STATUS_DENIED) { + continue; + } + + $amount->addAmount(Amount::fromString($invoice->amount)); + } + return $amount; + } + } diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php new file mode 100644 index 0000000..2725f4b --- /dev/null +++ b/app/Repositories/InvoiceRepository.php @@ -0,0 +1,37 @@ + ['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()] + ]; + + + $user = auth()->user(); + if (null === $user) { + return $invoices; + } + + foreach ([InvoiceStatus::INVOICE_STATUS_NEW, InvoiceStatus::INVOICE_STATUS_APPROVED, InvoiceStatus::INVOICE_STATUS_DENIED] as $status) { + $amount = 0; + $count = 0; + foreach (Invoice::where(['user_id' => $user->id, 'status' => $status])->get() as $stack) { + $count++; + $amount += $stack->amount; + } + + $invoices[$status]['count'] = $count; + $invoices[$status]['amount'] = Amount::fromString($amount)->toString(); + } + + return $invoices; + } +} diff --git a/app/Scopes/CommonController.php b/app/Scopes/CommonController.php index cf04fc5..ad1dd20 100644 --- a/app/Scopes/CommonController.php +++ b/app/Scopes/CommonController.php @@ -4,6 +4,7 @@ namespace App\Scopes; use App\Providers\AuthCheckProvider; use App\Repositories\CostUnitRepository; +use App\Repositories\InvoiceRepository; use App\Repositories\PageTextRepository; use App\Repositories\UserRepository; @@ -13,10 +14,13 @@ abstract class CommonController { protected PageTextRepository $pageTexts; + protected InvoiceRepository $invoices; + public function __construct() { $this->users = new UserRepository(); $this->costUnits = new CostUnitRepository(); $this->pageTexts = new PageTextRepository(); + $this->invoices = new InvoiceRepository(); } protected function checkAuth() { diff --git a/app/ValueObjects/Amount.php b/app/ValueObjects/Amount.php index 411f91d..cfeb9cd 100644 --- a/app/ValueObjects/Amount.php +++ b/app/ValueObjects/Amount.php @@ -36,4 +36,8 @@ class Amount { |> trim(...) |> function (string $value) : string { return str_replace('.', ',', $value); }; } + + public function addAmount(Amount $amount) : void { + $this->amount += $amount->getAmount(); + } } diff --git a/app/Views/Partials/GlobalWidgets/GlobalWidgets.vue b/app/Views/Partials/GlobalWidgets/GlobalWidgets.vue index 268200f..8a4dee2 100644 --- a/app/Views/Partials/GlobalWidgets/GlobalWidgets.vue +++ b/app/Views/Partials/GlobalWidgets/GlobalWidgets.vue @@ -1,6 +1,8 @@ @@ -10,13 +12,13 @@ import ShadowedBox from "../../Components/ShadowedBox.vue";