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.

EstimateOverview.php 2.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. $activeEstimates = $this->getPageTableQuery()->active();
  20. $totalActiveCount = $activeEstimates->count();
  21. $totalActiveAmount = $activeEstimates->get()->sumMoneyInDefaultCurrency('total');
  22. $acceptedEstimates = $this->getPageTableQuery()
  23. ->where('status', EstimateStatus::Accepted);
  24. $totalAcceptedCount = $acceptedEstimates->count();
  25. $totalAcceptedAmount = $acceptedEstimates->get()->sumMoneyInDefaultCurrency('total');
  26. $convertedEstimates = $this->getPageTableQuery()
  27. ->where('status', EstimateStatus::Converted);
  28. $totalConvertedCount = $convertedEstimates->count();
  29. $totalEstimatesCount = $this->getPageTableQuery()->count();
  30. $percentConverted = $totalEstimatesCount > 0
  31. ? Number::percentage(($totalConvertedCount / $totalEstimatesCount) * 100, maxPrecision: 1)
  32. : Number::percentage(0, maxPrecision: 1);
  33. $totalEstimateAmount = $this->getPageTableQuery()
  34. ->get()
  35. ->sumMoneyInDefaultCurrency('total');
  36. $averageEstimateTotal = $totalEstimatesCount > 0
  37. ? (int) round($totalEstimateAmount / $totalEstimatesCount)
  38. : 0;
  39. return [
  40. EnhancedStatsOverviewWidget\EnhancedStat::make('Active Estimates', CurrencyConverter::formatCentsToMoney($totalActiveAmount))
  41. ->suffix(CurrencyAccessor::getDefaultCurrency())
  42. ->description($totalActiveCount . ' active estimates'),
  43. EnhancedStatsOverviewWidget\EnhancedStat::make('Accepted Estimates', CurrencyConverter::formatCentsToMoney($totalAcceptedAmount))
  44. ->suffix(CurrencyAccessor::getDefaultCurrency())
  45. ->description($totalAcceptedCount . ' accepted'),
  46. EnhancedStatsOverviewWidget\EnhancedStat::make('Converted Estimates', $percentConverted)
  47. ->suffix('converted')
  48. ->description($totalConvertedCount . ' converted'),
  49. EnhancedStatsOverviewWidget\EnhancedStat::make('Average Estimate Total', CurrencyConverter::formatCentsToMoney($averageEstimateTotal))
  50. ->suffix(CurrencyAccessor::getDefaultCurrency()),
  51. ];
  52. }
  53. }