123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- <?php
-
- namespace App\Enums\Accounting;
-
- use Filament\Support\Contracts\HasLabel;
-
- enum AccountCategory: string implements HasLabel
- {
- case Asset = 'asset';
- case Liability = 'liability';
- case Equity = 'equity';
- case Revenue = 'revenue';
- case Expense = 'expense';
-
- public function getLabel(): ?string
- {
- return $this->name;
- }
-
- public function getPluralLabel(): ?string
- {
- return match ($this) {
- self::Asset => 'Assets',
- self::Liability => 'Liabilities',
- self::Equity => 'Equity',
- self::Revenue => 'Revenue',
- self::Expense => 'Expenses',
- };
- }
-
- public static function fromPluralLabel(string $label): ?self
- {
- foreach (self::cases() as $case) {
- if ($case->getPluralLabel() === $label) {
- return $case;
- }
- }
-
- return null;
- }
-
- /**
- * Determines if the account typically has a normal debit balance.
- *
- * In accounting, assets and expenses typically have a normal debit balance.
- * A debit increases the balance of these accounts, while a credit decreases it.
- */
- public function isNormalDebitBalance(): bool
- {
- return in_array($this, [self::Asset, self::Expense], true);
- }
-
- /**
- * Determines if the account typically has a normal credit balance.
- *
- * In accounting, liabilities, equity, and revenue typically have a normal credit balance.
- * A credit increases the balance of these accounts, while a debit decreases it.
- */
- public function isNormalCreditBalance(): bool
- {
- return ! $this->isNormalDebitBalance();
- }
-
- /**
- * Determines if the account is a nominal account.
- *
- * In accounting, nominal accounts are temporary accounts that are closed at the end of each accounting period,
- * with their net balances transferred to Retained Earnings (a real account).
- */
- public function isNominal(): bool
- {
- return in_array($this, [self::Revenue, self::Expense], true);
- }
-
- /**
- * Determines if the account is a real account.
- *
- * In accounting, real accounts are permanent accounts that retain their balances across accounting periods.
- * They are not closed at the end of each accounting period.
- */
- public function isReal(): bool
- {
- return ! $this->isNominal();
- }
-
- public function getRelevantBalanceFields(): array
- {
- $commonFields = ['debit_balance', 'credit_balance', 'net_movement'];
-
- return match ($this->isReal()) {
- true => [...$commonFields, 'starting_balance', 'ending_balance'],
- false => $commonFields,
- };
- }
-
- public static function getOrderedCategories(): array
- {
- return [
- self::Asset,
- self::Liability,
- self::Equity,
- self::Revenue,
- self::Expense,
- ];
- }
- }
|