setPrimaryKey('id') ->setDefaultSort('name', 'asc') ->setSortingPillsEnabled(false) ->setAdditionalSelects([ 'companies.id as id', 'companies.apodo as apodo', 'companies.tax_id as tax_id', 'companies.phone as phone', 'companies.email as email', 'companies.logo_path as logo_path', 'companies.created_at as created_at', ]); } public function builder(): Builder { return Company::withCount('projects'); } public function columns(): array { return [ Column::make('Empresa', 'name') ->sortable() ->searchable() ->format(function ($value, $row) { $logoHtml = ''; if ($row->logo_path && Storage::disk('public')->exists($row->logo_path)) { $url = Storage::disk('public')->url($row->logo_path); $logoHtml = ''; } else { $logoHtml = '
'; } $html = '
'.$logoHtml.'
'; $html .= '

'.e($value).'

'; if ($row->apodo) $html .= '

'.e($row->apodo).'

'; if ($row->tax_id) $html .= '

NIF: '.e($row->tax_id).'

'; $html .= '
'; return $html; }) ->html(), Column::make('Tipo', 'type') ->sortable() ->format(function ($value) { $map = [ 'owner' => ['badge-success', 'Promotor'], 'constructor' => ['badge-primary', 'Constructor'], 'subcontractor' => ['badge-secondary', 'Subcontratista'], 'consultant' => ['badge-info', 'Consultor'], 'supplier' => ['badge-warning', 'Proveedor'], ]; [$cls, $label] = $map[$value] ?? ['badge-ghost', 'Otro']; return ''.$label.''; }) ->html(), Column::make('Contacto', 'phone') ->format(function ($value, $row) { $html = ''; if ($row->phone) { $html .= '
'.e($row->phone).'
'; } if ($row->email) { $html .= '
'.e($row->email).'
'; } return $html ?: ''; }) ->html(), Column::make('Estado', 'estado') ->sortable() ->format(function ($value) { $map = [ 'activo' => ['badge-success', 'Activo'], 'inactivo' => ['badge-ghost', 'Inactivo'], 'suspendido' => ['badge-error', 'Suspendido'], ]; [$cls, $label] = $map[$value ?? 'activo'] ?? ['badge-ghost', ucfirst($value ?? 'activo')]; return ''.$label.''; }) ->html(), Column::make('Proyectos') ->label(fn ($row) => ''.(int)($row->projects_count ?? 0).'' ) ->html(), Column::make('Acciones') ->label(function ($row) { $ver = route('companies.show', $row->id); $editar = route('companies.edit', $row->id); $name = addslashes($row->name); $html = '
'; $html .= ' '; $html .= ' '; $html .= ''; $html .= '
'; return $html; }) ->html(), ]; } public function filters(): array { return [ SelectFilter::make('Tipo', 'type') ->options([ '' => 'Tipo: todos', 'owner' => 'Promotor', 'constructor' => 'Constructor', 'subcontractor' => 'Subcontratista', 'consultant' => 'Consultor', 'supplier' => 'Proveedor', 'other' => 'Otro', ]) ->filter(fn (Builder $query, string $value) => $query->where('type', $value)), SelectFilter::make('Estado', 'estado') ->options([ '' => 'Estado: todos', 'activo' => 'Activo', 'inactivo' => 'Inactivo', 'suspendido' => 'Suspendido', ]) ->filter(fn (Builder $query, string $value) => $query->where('estado', $value)), ]; } public function deleteCompany(int $id): void { $company = Company::findOrFail($id); if ($company->logo_path) { Storage::disk('public')->delete($company->logo_path); } $company->delete(); } }