| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 | <?php
namespace App\Http\Livewire;
use App\Models\Setting\DocumentDefault;
use Filament\Forms\ComponentContainer;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Notifications\Notification;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Filament\Forms\Contracts\HasForms;
/**
 * @property ComponentContainer $form
 */
class Invoice extends Component implements HasForms
{
    use InteractsWithForms;
    public DocumentDefault $invoice;
    public $data;
    public $record;
    public function mount(): void
    {
        $this->invoice = DocumentDefault::where('type', 'invoice')->firstOrNew();
        $this->form->fill([
            'document_number_prefix' => $this->invoice->document_number_prefix,
            'document_number_digits' => $this->invoice->document_number_digits,
            'document_number_next' => $this->invoice->document_number_next,
            'payment_terms' => $this->invoice->payment_terms,
            'template' => $this->invoice->template,
            'title' => $this->invoice->title,
            'subheading' => $this->invoice->subheading,
            'notes' => $this->invoice->notes,
            'footer' => $this->invoice->footer,
            'terms' => $this->invoice->terms,
        ]);
    }
    protected function getFormSchema(): array
    {
        return [
            Section::make('General')
                ->schema([
                    TextInput::make('document_number_prefix')
                        ->label('Number Prefix')
                        ->default('INV-')
                        ->required(),
                    Select::make('document_number_digits')
                        ->label('Number Digits')
                        ->options(DocumentDefault::getDocumentNumberDigits())
                        ->default(DocumentDefault::getDefaultDocumentNumberDigits())
                        ->reactive()
                        ->afterStateUpdated(static function (callable $set, $state) {
                            $numDigits = $state;
                            $nextNumber = DocumentDefault::getDefaultDocumentNumberNext($numDigits);
                            return $set('document_number_next', $nextNumber);
                        })
                        ->searchable()
                        ->required(),
                    TextInput::make('document_number_next')
                        ->label('Next Number')
                        ->default(DocumentDefault::getDefaultDocumentNumberNext(DocumentDefault::getDefaultDocumentNumberDigits()))
                        ->required(),
                    Select::make('payment_terms')
                        ->label('Payment Terms')
                        ->options(DocumentDefault::getPaymentTerms())
                        ->default(DocumentDefault::getDefaultPaymentTerms())
                        ->searchable()
                        ->required(),
                ])->columns(),
            Section::make('Template')
                ->schema([
                    Select::make('template')
                        ->label('Template')
                        ->options([
                            'default' => 'Default',
                            'simple' => 'Simple',
                            'modern' => 'Modern',
                        ])
                        ->default('default')
                        ->searchable()
                        ->required(),
                ])->columns(),
            Section::make('Content')
                ->schema([
                    TextInput::make('title')
                        ->label('Title')
                        ->default('Invoice')
                        ->nullable(),
                    TextInput::make('subheading')
                        ->label('Subheading')
                        ->nullable(),
                    Textarea::make('notes')
                        ->label('Notes')
                        ->nullable(),
                    Textarea::make('footer')
                        ->label('Footer')
                        ->nullable(),
                    Textarea::make('terms')
                        ->label('Terms')
                        ->nullable()
                        ->columnSpanFull(),
                ])->columns(),
        ];
    }
    public function save(): void
    {
        $data = $this->form->getState();
        $data = $this->mutateFormDataBeforeSave($data);
        $this->record = $this->invoice->update($data);
        $this->form->model($this->record)->saveRelationships();
        $this->getSavedNotification()?->send();
    }
    protected function mutateFormDataBeforeSave(array $data): array
    {
        $data['company_id'] = Auth::user()->currentCompany->id;
        $data['type'] = 'invoice';
        return $data;
    }
    protected function getSavedNotification():?Notification
    {
        $title = $this->getSavedNotificationTitle();
        if (blank($title)) {
            return null;
        }
        return Notification::make()
            ->success()
            ->title($title);
    }
    protected function getSavedNotificationTitle(): ?string
    {
        return __('filament::resources/pages/edit-record.messages.saved');
    }
    public function render(): View
    {
        return view('livewire.invoice');
    }
}
 |