You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ViewClient.php 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace App\Filament\Company\Resources\Sales\ClientResource\Pages;
  3. use App\Filament\Company\Resources\Sales\ClientResource;
  4. use App\Filament\Company\Resources\Sales\ClientResource\RelationManagers;
  5. use App\Models\Common\Client;
  6. use Filament\Infolists\Components\Section;
  7. use Filament\Infolists\Components\TextEntry;
  8. use Filament\Infolists\Infolist;
  9. use Filament\Resources\Pages\ViewRecord;
  10. use Illuminate\Support\Number;
  11. class ViewClient extends ViewRecord
  12. {
  13. protected static string $resource = ClientResource::class;
  14. public function getRelationManagers(): array
  15. {
  16. return [
  17. RelationManagers\InvoicesRelationManager::class,
  18. ];
  19. }
  20. public function infolist(Infolist $infolist): Infolist
  21. {
  22. return $infolist
  23. ->schema([
  24. Section::make('Financial Overview')
  25. ->columns(4)
  26. ->schema([
  27. TextEntry::make('last_12_months_paid')
  28. ->label('Last 12 Months Paid')
  29. ->getStateUsing(function (Client $record) {
  30. return $record->invoices()
  31. ->whereNotNull('paid_at')
  32. ->where('paid_at', '>=', now()->subMonths(12))
  33. ->get()
  34. ->sumMoneyInDefaultCurrency('total');
  35. })
  36. ->currency(convert: false),
  37. TextEntry::make('total_unpaid')
  38. ->label('Total Unpaid')
  39. ->getStateUsing(function (Client $record) {
  40. return $record->invoices()
  41. ->unpaid()
  42. ->get()
  43. ->sumMoneyInDefaultCurrency('amount_due');
  44. })
  45. ->currency(convert: false),
  46. TextEntry::make('total_overdue')
  47. ->label('Total Overdue')
  48. ->getStateUsing(function (Client $record) {
  49. return $record->invoices()
  50. ->overdue()
  51. ->get()
  52. ->sumMoneyInDefaultCurrency('amount_due');
  53. })
  54. ->currency(convert: false),
  55. TextEntry::make('average_payment_time')
  56. ->label('Average Payment Time')
  57. ->getStateUsing(function (Client $record) {
  58. return $record->invoices()
  59. ->whereNotNull('paid_at')
  60. ->selectRaw('AVG(TIMESTAMPDIFF(DAY, date, paid_at)) as avg_days')
  61. ->value('avg_days');
  62. })
  63. ->suffix(' days')
  64. ->formatStateUsing(function ($state) {
  65. return Number::format($state ?? 0, maxPrecision: 1);
  66. }),
  67. ]),
  68. ]);
  69. }
  70. }