PaymentStatusTrait

Metody

Trait: /src/Model/Entity/Trait/PaymentStatusTrait.php

<?php 
declare(strict_types=1); 
namespace App\Model\Entity\Trait; 
/** * Payment Status Trait 
 *
 * Mapowanie statusów płatności z angielskiego na polski
 * Użycie: w Invoice.php i PurchaseInvoice.php 
*/ 
trait PaymentStatusTrait { 
    /** 
     * Mapowanie statusów płatności EN -> PL
     * 
     * @var array<string, string>
     */
    protected static array $paymentStatusMap = [
        'unpaid'  => 'Nieopłacona',
        'partial' => 'Częściowo opłacona',
        'paid'    => 'Opłacona',
        'overdue' => 'Przeterminowana',
    ];

    /**
     * Mapowanie odwrotne PL -> EN
     * 
     * @var array<string, string>
     */
    protected static array $paymentStatusMapReverse = [
        'Nieopłacona'          => 'unpaid',
        'Częściowo opłacona'   => 'partial',
        'Opłacona'             => 'paid',
        'Przeterminowana'      => 'overdue',
    ];

    /**
     * Virtual field: Polska nazwa statusu płatności
     * 
     * @return string
     */
    protected function _getPaymentStatusLabel(): string
    {
        return self::$paymentStatusMap[$this->payment_status] ?? $this->payment_status;
    }

    /**
     * Pobiera polską nazwę statusu
     * 
     * @param string|null $status Status w języku angielskim (opcjonalnie)
     * @return string
     */
    public function getPaymentStatusLabel(?string $status = null): string
    {
        $status = $status ?? $this->payment_status;
        return self::$paymentStatusMap[$status] ?? $status;
    }

    /**
     * Pobiera angielską nazwę ze statusu polskiego
     * 
     * @param string $polishStatus Status w języku polskim
     * @return string|null
     */
    public static function getPaymentStatusFromPolish(string $polishStatus): ?string
    {
        return self::$paymentStatusMapReverse[$polishStatus] ?? null;
    }

    /**
     * Zwraca wszystkie dostępne statusy płatności
     * 
     * @param bool $polish Zwróć w języku polskim?
     * @return array<string, string>
     */
    public static function getPaymentStatuses(bool $polish = false): array
    {
        if ($polish) {
            return self::$paymentStatusMap;
        }
        
        return array_keys(self::$paymentStatusMap);
    }

    /**
     * Zwraca opcje dla selecta (dla formularzy)
     * 
     * @return array<string, string> ['unpaid' => 'Nieopłacona', ...]
     */
    public static function getPaymentStatusOptions(): array
    {
        return self::$paymentStatusMap;
    }

    /**
     * Sprawdza czy faktura jest opłacona
     * 
     * @return bool
     */
    public function isPaid(): bool
    {
        return $this->payment_status === 'paid';
    }

    /**
     * Sprawdza czy faktura jest nieopłacona
     * 
     * @return bool
     */
    public function isUnpaid(): bool
    {
        return $this->payment_status === 'unpaid';
    }

    /**
     * Sprawdza czy faktura jest częściowo opłacona
     * 
     * @return bool
     */
    public function isPartiallyPaid(): bool
    {
        return $this->payment_status === 'partial';
    }

    /**
     * Sprawdza czy faktura jest przeterminowana
     * 
     * @return bool
     */
    public function isOverdue(): bool
    {
        return $this->payment_status === 'overdue';
    }

    /**
     * Pobiera klasę CSS dla badge'a statusu
     * 
     * @return string
     */
    public function getPaymentStatusBadgeClass(): string
    {
        $classes = [
            'unpaid'  => 'bg-warning text-dark',
            'partial' => 'bg-light text-info',
            'paid'    => 'bg-light text-success',
            'overdue' => 'bg-danger',
        ];
        
        return $classes[$this->payment_status] ?? 'bg-secondary';
    }

    /**
     * Pobiera ikonę Font Awesome dla statusu
     * 
     * @return string
     */
    public function getPaymentStatusIcon(): string
    {
        $icons = [
            'unpaid'  => 'fas fa-clock',
            'partial' => 'fas fa-circle-half-stroke',
            'paid'    => 'fas fa-check-circle',
            'overdue' => 'fas fa-exclamation-triangle',
        ];
        
        return $icons[$this->payment_status] ?? 'fas fa-question-circle';
    }
}

Używanie: Lista select

<?= $this->Form->control('payment_status', [
   'label' => 'Status płatności',
   'class' => 'form-select mb-2',
   'options' => $invoice::getPaymentStatusOptions(),
]) ?>

widok:

<td><strong>Status płatności:</strong></td>
<td>
  <spanclass="badge <?= $invoice->getPaymentStatusBadgeClass() ?>">
    <i class="<?= $invoice->getPaymentStatusIcon() ?>"></i>
    <?= h($invoice->payment_status_label) ?>
  </span>
</td>

Model/Entity: PurchaseInvoice.php, Invoice.php

use App\Model\Entity\Trait\PaymentStatusTrait;

class Invoice extends Entity
{
    use PaymentStatusTrait;
    ..... 
}