Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

EstimateOverview.php 3.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Filament\Company\Resources\Sales\EstimateResource\Widgets;
  3. use App\Enums\Accounting\EstimateStatus;
  4. use App\Filament\Company\Resources\Sales\EstimateResource\Pages\ListEstimates;
  5. use App\Filament\Widgets\EnhancedStatsOverviewWidget;
  6. use App\Utilities\Currency\CurrencyAccessor;
  7. use App\Utilities\Currency\CurrencyConverter;
  8. use Filament\Widgets\Concerns\InteractsWithPageTable;
  9. use Illuminate\Support\Number;
  10. class EstimateOverview extends EnhancedStatsOverviewWidget
  11. {
  12. use InteractsWithPageTable;
  13. protected function getTablePage(): string
  14. {
  15. return ListEstimates::class;
  16. }
  17. protected function getStats(): array
  18. {
  19. // Active estimates: Draft, Unsent, Sent
  20. $activeEstimates = $this->getPageTableQuery()->active();
  21. $totalActiveCount = $activeEstimates->count();
  22. $totalActiveAmount = $activeEstimates->get()->sumMoneyInDefaultCurrency('total');
  23. // Accepted estimates
  24. $acceptedEstimates = $this->getPageTableQuery()
  25. ->where('status', EstimateStatus::Accepted);
  26. $totalAcceptedCount = $acceptedEstimates->count();
  27. $totalAcceptedAmount = $acceptedEstimates->get()->sumMoneyInDefaultCurrency('total');
  28. // Converted estimates
  29. $convertedEstimates = $this->getPageTableQuery()
  30. ->where('status', EstimateStatus::Converted);
  31. $totalConvertedCount = $convertedEstimates->count();
  32. $totalEstimatesCount = $this->getPageTableQuery()->count();
  33. // Use Number::percentage for formatted conversion rate
  34. $percentConverted = $totalEstimatesCount > 0
  35. ? Number::percentage(($totalConvertedCount / $totalEstimatesCount) * 100, maxPrecision: 1)
  36. : Number::percentage(0, maxPrecision: 1);
  37. // Average estimate total
  38. $totalEstimateAmount = $this->getPageTableQuery()
  39. ->get()
  40. ->sumMoneyInDefaultCurrency('total');
  41. $averageEstimateTotal = $totalEstimatesCount > 0
  42. ? (int) round($totalEstimateAmount / $totalEstimatesCount)
  43. : 0;
  44. return [
  45. // Stat 1: Total Active Estimates
  46. EnhancedStatsOverviewWidget\EnhancedStat::make('Active Estimates', CurrencyConverter::formatCentsToMoney($totalActiveAmount))
  47. ->suffix(CurrencyAccessor::getDefaultCurrency())
  48. ->description($totalActiveCount . ' active estimates'),
  49. // Stat 2: Total Accepted Estimates
  50. EnhancedStatsOverviewWidget\EnhancedStat::make('Accepted Estimates', CurrencyConverter::formatCentsToMoney($totalAcceptedAmount))
  51. ->suffix(CurrencyAccessor::getDefaultCurrency())
  52. ->description($totalAcceptedCount . ' accepted'),
  53. // Stat 3: Percent Converted
  54. EnhancedStatsOverviewWidget\EnhancedStat::make('Converted Estimates', $percentConverted)
  55. ->suffix('converted')
  56. ->description($totalConvertedCount . ' converted'),
  57. // Stat 4: Average Estimate Total
  58. EnhancedStatsOverviewWidget\EnhancedStat::make('Average Estimate Total', CurrencyConverter::formatCentsToMoney($averageEstimateTotal))
  59. ->suffix(CurrencyAccessor::getDefaultCurrency())
  60. ->description('Avg. value per estimate'),
  61. ];
  62. }
  63. }