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 3.7KB

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