123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <?php
-
- namespace App\Models\Setting;
-
- use App\Concerns\Blamable;
- use App\Concerns\CompanyOwned;
- use App\Enums\Accounting\DocumentDiscountMethod;
- use App\Enums\Accounting\DocumentType;
- use App\Enums\Setting\Font;
- use App\Enums\Setting\PaymentTerms;
- use App\Enums\Setting\Template;
- use Database\Factories\Setting\DocumentDefaultFactory;
- use Illuminate\Database\Eloquent\Attributes\Scope;
- use Illuminate\Database\Eloquent\Builder;
- use Illuminate\Database\Eloquent\Casts\AsArrayObject;
- use Illuminate\Database\Eloquent\Casts\Attribute;
- use Illuminate\Database\Eloquent\Factories\Factory;
- use Illuminate\Database\Eloquent\Factories\HasFactory;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Support\Facades\Storage;
-
- class DocumentDefault extends Model
- {
- use Blamable;
- use CompanyOwned;
- use HasFactory;
-
- protected $table = 'document_defaults';
-
- protected $fillable = [
- 'company_id',
- 'type',
- 'logo',
- 'show_logo',
- 'number_prefix',
- 'payment_terms',
- 'discount_method',
- 'header',
- 'subheader',
- 'terms',
- 'footer',
- 'accent_color',
- 'font',
- 'template',
- 'item_name',
- 'unit_name',
- 'price_name',
- 'amount_name',
- 'created_by',
- 'updated_by',
- ];
-
- protected $casts = [
- 'type' => DocumentType::class,
- 'show_logo' => 'boolean',
- 'payment_terms' => PaymentTerms::class,
- 'discount_method' => DocumentDiscountMethod::class,
- 'font' => Font::class,
- 'template' => Template::class,
- 'item_name' => AsArrayObject::class,
- 'unit_name' => AsArrayObject::class,
- 'price_name' => AsArrayObject::class,
- 'amount_name' => AsArrayObject::class,
- ];
-
- protected $appends = [
- 'logo_url',
- ];
-
- protected function logoUrl(): Attribute
- {
- return Attribute::get(static function (mixed $value, array $attributes): ?string {
- return $attributes['logo'] ? Storage::disk('public')->url($attributes['logo']) : null;
- });
- }
-
- #[Scope]
- protected function type(Builder $query, string | DocumentType $type): Builder
- {
- return $query->where('type', $type);
- }
-
- #[Scope]
- protected function invoice(Builder $query): Builder
- {
- return $query->type(DocumentType::Invoice);
- }
-
- #[Scope]
- protected function recurringInvoice(Builder $query): Builder
- {
- return $query->type(DocumentType::RecurringInvoice);
- }
-
- #[Scope]
- protected function bill(Builder $query): Builder
- {
- return $query->type(DocumentType::Bill);
- }
-
- #[Scope]
- protected function estimate(Builder $query): Builder
- {
- return $query->type(DocumentType::Estimate);
- }
-
- public function getNumberNext(?string $prefix = null, int | string | null $next = null): string
- {
- $numberPrefix = $prefix ?? $this->number_prefix ?? '';
- $numberNext = (string) ($next ?? (static::getBaseNumber() + 1));
-
- return $numberPrefix . $numberNext;
- }
-
- public static function getBaseNumber(): int
- {
- return 1000;
- }
-
- public static function getAvailableItemNameOptions(): array
- {
- $options = [
- 'items' => 'Items',
- 'products' => 'Products',
- 'services' => 'Services',
- 'other' => 'Other',
- ];
-
- return array_map(translate(...), $options);
- }
-
- public static function getAvailableUnitNameOptions(): array
- {
- $options = [
- 'quantity' => 'Quantity',
- 'hours' => 'Hours',
- 'other' => 'Other',
- ];
-
- return array_map(translate(...), $options);
- }
-
- public static function getAvailablePriceNameOptions(): array
- {
- $options = [
- 'price' => 'Price',
- 'rate' => 'Rate',
- 'other' => 'Other',
- ];
-
- return array_map(translate(...), $options);
- }
-
- public static function getAvailableAmountNameOptions(): array
- {
- $options = [
- 'amount' => 'Amount',
- 'total' => 'Total',
- 'other' => 'Other',
- ];
-
- return array_map(translate(...), $options);
- }
-
- public function getLabelOptionFor(string $optionType, ?string $optionValue)
- {
- $optionValue = $optionValue ?? $this->{$optionType}['option'];
-
- if (! $optionValue) {
- return null;
- }
-
- $options = match ($optionType) {
- 'item_name' => static::getAvailableItemNameOptions(),
- 'unit_name' => static::getAvailableUnitNameOptions(),
- 'price_name' => static::getAvailablePriceNameOptions(),
- 'amount_name' => static::getAvailableAmountNameOptions(),
- default => [],
- };
-
- return $options[$optionValue] ?? null;
- }
-
- public function resolveColumnLabel(string $column, string $default, ?array $data = null): string
- {
- if ($data) {
- $custom = $data[$column]['custom'] ?? null;
- $option = $data[$column]['option'] ?? null;
- } else {
- $custom = $this->{$column}['custom'] ?? null;
- $option = $this->{$column}['option'] ?? null;
- }
-
- if ($custom) {
- return $custom;
- }
-
- return $this->getLabelOptionFor($column, $option) ?? $default;
- }
-
- protected static function newFactory(): Factory
- {
- return DocumentDefaultFactory::new();
- }
- }
|