123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- <?php
-
- namespace App\View\Models;
-
- use App\Enums\Setting\Font;
- use App\Enums\Setting\PaymentTerms;
- use App\Models\Setting\DocumentDefault;
- use Filament\Panel\Concerns\HasFont;
-
- class InvoiceViewModel
- {
- use HasFont;
-
- public DocumentDefault $invoice;
-
- public ?array $data = [];
-
- public function __construct(DocumentDefault $invoice, ?array $data = null)
- {
- $this->invoice = $invoice;
- $this->data = $data;
- }
-
- public function logo(): ?string
- {
- return $this->invoice->logo_url;
- }
-
- public function show_logo(): bool
- {
- return $this->data['show_logo'] ?? $this->invoice->show_logo ?? false;
- }
-
- // Company related methods
- public function company_name(): string
- {
- return $this->invoice->company->name;
- }
-
- public function company_address(): ?string
- {
- return $this->invoice->company->profile->address ?? null;
- }
-
- public function company_phone(): ?string
- {
- return $this->invoice->company->profile->phone_number ?? null;
- }
-
- public function company_city(): ?string
- {
- return $this->invoice->company->profile->city->name ?? null;
- }
-
- public function company_state(): ?string
- {
- return $this->invoice->company->profile->state->name ?? null;
- }
-
- public function company_zip(): ?string
- {
- return $this->invoice->company->profile->zip_code ?? null;
- }
-
- public function company_country(): ?string
- {
- return $this->invoice->company->profile->state->country->name ?? null;
- }
-
- // Invoice numbering related methods
- public function number_prefix(): string
- {
- return $this->data['number_prefix'] ?? $this->invoice->number_prefix ?? 'INV-';
- }
-
- public function number_digits(): int
- {
- return $this->data['number_digits'] ?? $this->invoice->number_digits ?? 5;
- }
-
- public function number_next(): string
- {
- return $this->data['number_next'] ?? $this->invoice->number_next;
- }
-
- public function invoice_number(): string
- {
- return DocumentDefault::getNumberNext(padded: true, format: true, prefix: $this->number_prefix(), digits: $this->number_digits(), next: $this->number_next());
- }
-
- // Invoice date related methods
- public function invoice_date(): string
- {
- return $this->invoice->company->locale->date_format->getLabel();
- }
-
- public function payment_terms(): string
- {
- return $this->data['payment_terms'] ?? $this->invoice->payment_terms?->value ?? PaymentTerms::DEFAULT;
- }
-
- public function invoice_due_date(): string
- {
- $dateFormat = $this->invoice->company->locale->date_format->value;
-
- return PaymentTerms::from($this->payment_terms())->getDueDate($dateFormat);
- }
-
- // Invoice header related methods
- public function header(): string
- {
- return $this->data['header'] ?? $this->invoice->header ?? 'Invoice';
- }
-
- public function subheader(): ?string
- {
- return $this->data['subheader'] ?? $this->invoice->subheader ?? null;
- }
-
- // Invoice styling
- public function accent_color(): string
- {
- return $this->data['accent_color'] ?? $this->invoice->accent_color;
- }
-
- public function fontFamily(): string
- {
- if ($this->data['font']) {
- return Font::from($this->data['font'])->getLabel();
- }
-
- if ($this->invoice->font) {
- return $this->invoice->font->getLabel();
- }
-
- return Font::from(Font::DEFAULT)->getLabel();
- }
-
- public function footer(): ?string
- {
- return $this->data['footer'] ?? $this->invoice->footer ?? null;
- }
-
- public function terms(): ?string
- {
- return $this->data['terms'] ?? $this->invoice->terms ?? null;
- }
-
- public function getItemColumnName(string $column, string $default): string
- {
- $custom = $this->data[$column]['custom'] ?? $this->invoice->{$column . '_custom'} ?? null;
-
- if ($custom) {
- return $custom;
- }
-
- $option = $this->data[$column]['option'] ?? $this->invoice->{$column . '_option'} ?? null;
-
- return $option ? $this->invoice->getLabelOptionFor($column, $option) : translate($default);
- }
-
- // Invoice column related methods
- public function item_name(): string
- {
- return $this->getItemColumnName('item_name', 'Items');
- }
-
- public function unit_name(): string
- {
- return $this->getItemColumnName('unit_name', 'Quantity');
- }
-
- public function price_name(): string
- {
- return $this->getItemColumnName('price_name', 'Price');
- }
-
- public function amount_name(): string
- {
- return $this->getItemColumnName('amount_name', 'Amount');
- }
-
- public function buildViewData(): array
- {
- return [
- 'logo' => $this->logo(),
- 'show_logo' => $this->show_logo(),
- 'company_name' => $this->company_name(),
- 'company_address' => $this->company_address(),
- 'company_phone' => $this->company_phone(),
- 'company_city' => $this->company_city(),
- 'company_state' => $this->company_state(),
- 'company_zip' => $this->company_zip(),
- 'company_country' => $this->company_country(),
- 'number_prefix' => $this->number_prefix(),
- 'number_digits' => $this->number_digits(),
- 'number_next' => $this->number_next(),
- 'invoice_number' => $this->invoice_number(),
- 'invoice_date' => $this->invoice_date(),
- 'invoice_due_date' => $this->invoice_due_date(),
- 'header' => $this->header(),
- 'subheader' => $this->subheader(),
- 'accent_color' => $this->accent_color(),
- 'font_family' => $this->fontFamily(),
- 'font_html' => $this->font($this->fontFamily())->getFontHtml(),
- 'footer' => $this->footer(),
- 'terms' => $this->terms(),
- 'item_name' => $this->item_name(),
- 'unit_name' => $this->unit_name(),
- 'price_name' => $this->price_name(),
- 'amount_name' => $this->amount_name(),
- ];
- }
- }
|