user()->company; if (! $company) { return; } $this->verificationRequest = $company->verificationRequest() ->latest() ->first(); $this->company = $company; $this->form->fill($company->toArray()); $documents = [ 'director_nik', 'deed_incorporation', 'trade_license', 'tax_id_number', 'taxable_enterprise', 'annual_tax_return', 'domicile_certificate', 'profile', ]; $mediaItems = $company->getMedia('companies'); foreach ($documents as $docType) { $media = $mediaItems ->where('custom_properties.doc_type', str($docType)->replace('_docs', '')->slug('-')) ->sortByDesc('created_at') ->first(); if ($media) { $this->data["{$docType}_docs"] = [$media->getPathRelativeToRoot()]; } } } public static function form(Schema $schema): Schema { $documents = [ [ 'title' => 'Akta Pendirian', 'text_name' => 'deed_incorporation', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'deed_incorporation_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/deed-incorporation/', ], [ 'title' => 'SIUP / NIB', 'text_name' => 'trade_license', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'trade_license_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/trade-license/', ], [ 'title' => 'NPWP', 'text_name' => 'tax_id_number', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'tax_id_number_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/tax-id-number/', ], [ 'title' => 'PKP', 'text_name' => 'taxable_enterprise', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'taxable_enterprise_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/taxable-enterprise/', ], [ 'title' => 'SPT Tahunan', 'text_name' => 'annual_tax_return', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'annual_tax_return_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/annual-tax-return/', ], [ 'title' => 'Suket Domisili', 'text_name' => 'domicile_certificate', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'domicile_certificate_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/domicile-certificate/', ], [ 'title' => 'Profil Perusahaan', 'text_name' => 'profile', 'placeholder' => '*****', 'max' => 100, 'max_size' => 1024 * 10, 'file_name' => 'profile_docs', 'accept' => ['application/pdf'], 'folder' => 'companies/profile/', ], ]; return $schema ->components([ Section::make('Informasi') ->schema([ TextInput::make('name') ->label('Nama') ->placeholder('PT ABC Indonesia Abadi') ->autocomplete(false) ->autofocus() ->required() ->maxLength(100), TextInput::make('email') ->label('Alamat Surel') ->placeholder('johndoe@gmail.com') ->autocomplete(false) ->required() ->maxLength(254), Textarea::make('address') ->label('Alamat') ->placeholder('Jl. Kebontoro, Jakarta Pusat') ->autocomplete(false) ->required() ->columnSpanFull(), TextInput::make('director_name') ->label('Nama Direktur') ->placeholder('John Doe') ->autocomplete(false) ->required() ->maxLength(100) ->columnSpanFull(), ]) ->columns(2) ->columnSpan(2), Group::make() ->schema( array_merge( [ Section::make('NIK Direktur') ->schema([ TextInput::make('director_nik') ->hiddenLabel() ->placeholder('32***') ->autocomplete(false) ->required() ->maxLength(16) ->rule('digits:16') ->inputMode('numeric') ->regex('/^[0-9]+$/'), AdvancedFileUpload::make('director_nik_docs') ->hiddenLabel() ->disk(config('filesystems.default')) ->acceptedFileTypes(['image/*']) ->maxSize(1024 * 3) ->directory('companies/director-nik/'.now()->toDateString()) ->required(), ]), ], collect($documents) ->map(function (array $doc): Section { return Section::make($doc['title']) ->schema([ TextInput::make($doc['text_name']) ->hiddenLabel() ->placeholder($doc['placeholder']) ->autocomplete(false) ->required() ->maxLength($doc['max']), AdvancedFileUpload::make($doc['file_name']) ->hiddenLabel() ->disk(config('filesystems.default')) ->acceptedFileTypes($doc['accept']) ->maxSize($doc['max_size']) ->directory($doc['folder'].now()->toDateString()) ->required(), ]); })->toArray() ) ) ->columns(2), ]) ->statePath('data'); } public function save() { $data = $this->form->getState(); $company = CompanyModel::updateOrCreate([ 'id' => $this->company?->id, ], [ 'user_id' => auth()->id(), 'name' => $data['name'], 'email' => $data['email'], 'address' => $data['address'], 'director_name' => $data['director_name'], 'director_nik' => $data['director_nik'], 'deed_incorporation' => $data['deed_incorporation'], 'trade_license' => $data['trade_license'], 'tax_id_number' => $data['tax_id_number'], 'taxable_enterprise' => $data['taxable_enterprise'], 'annual_tax_return' => $data['annual_tax_return'], 'domicile_certificate' => $data['domicile_certificate'], 'profile' => $data['profile'], ]); $this->company = $company; $documents = [ 'director_nik_docs', 'deed_incorporation_docs', 'trade_license_docs', 'tax_id_number_docs', 'taxable_enterprise_docs', 'annual_tax_return_docs', 'domicile_certificate_docs', 'profile_docs', ]; foreach ($documents as $field) { if (empty($this->data[$field])) { continue; } foreach ((array) $this->data[$field] as $filePath) { $fullPath = Storage::disk(config('filesystems.default'))->path($filePath); if (! file_exists($fullPath)) { continue; } $company ->addMediaFromDisk($filePath, config('filesystems.default')) ->preservingOriginal() ->withCustomProperties([ 'feature' => 'companies', 'date' => now()->toDateString(), 'doc_type' => str($field) ->replace('_docs', '') ->slug('-'), ]) ->toMediaCollection('companies'); } } CheerfulNotification::update()->send(); } }