Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

EstimateOverview.php 3.4KB

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