ContatosAssociadosExport.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace App\Exports;
  3. use App\Enums\UserTypeEnum;
  4. use App\Models\User;
  5. use Maatwebsite\Excel\Concerns\FromCollection;
  6. use Maatwebsite\Excel\Concerns\WithHeadings;
  7. use Maatwebsite\Excel\Concerns\WithStyles;
  8. use Maatwebsite\Excel\Concerns\WithColumnWidths;
  9. use Maatwebsite\Excel\Concerns\WithTitle;
  10. use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  11. use PhpOffice\PhpSpreadsheet\Style\Fill;
  12. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  13. use Illuminate\Support\Collection;
  14. class ContatosAssociadosExport implements FromCollection, WithHeadings, WithStyles, WithColumnWidths, WithTitle
  15. {
  16. public function __construct(private readonly ?string $search = null) {}
  17. public function collection(): Collection
  18. {
  19. $query = User::where('type', UserTypeEnum::ASSOCIADO)->orderBy('name', 'asc');
  20. if ($this->search) {
  21. $term = '%' . mb_strtolower($this->search) . '%';
  22. $query->where(function ($q) use ($term) {
  23. $q->whereRaw('UNACCENT(LOWER(name)) LIKE UNACCENT(?)', [$term])
  24. ->orWhereRaw('UNACCENT(LOWER(email)) LIKE UNACCENT(?)', [$term])
  25. ->orWhereRaw('UNACCENT(LOWER(COALESCE(phone, \'\'))) LIKE UNACCENT(?)', [$term]);
  26. });
  27. }
  28. return $query->get()->map(fn($u) => [
  29. $u->name,
  30. $u->phone ?? '',
  31. $u->email ?? '',
  32. ]);
  33. }
  34. public function headings(): array
  35. {
  36. return ['Nome', 'Telefone', 'E-mail'];
  37. }
  38. public function title(): string
  39. {
  40. return 'Contatos';
  41. }
  42. public function columnWidths(): array
  43. {
  44. return ['A' => 40, 'B' => 22, 'C' => 35];
  45. }
  46. public function styles(Worksheet $sheet): array
  47. {
  48. return [
  49. 1 => [
  50. 'font' => ['bold' => true, 'color' => ['argb' => 'FFFFFFFF']],
  51. 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['argb' => 'FF661D75']],
  52. 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER],
  53. ],
  54. ];
  55. }
  56. }