ReportController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Helpers\Price;
  4. use App\Models\ObjectType;
  5. use App\Models\Order;
  6. use App\Models\OrderStatus;
  7. use App\Models\Product;
  8. use App\Models\ProductSKU;
  9. use App\Models\User;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Str;
  12. class ReportController extends Controller
  13. {
  14. protected array $data = [
  15. 'active' => 'reports',
  16. 'title' => 'Отчёты',
  17. 'id' => 'reports',
  18. ];
  19. public function index()
  20. {
  21. $mountStatuses = [5, 7, 8, 9, 10];
  22. $doneStatuses = [9, 10];
  23. $objectTypes = ObjectType::query()->get()->pluck('name', 'id')->toArray();
  24. $this->data['objectTypes'] = $objectTypes;
  25. $user_ids = Order::query()->distinct()->get('user_id')->pluck('user_id')->toArray();
  26. $managers = User::query()->whereIn('id', $user_ids)->get()->pluck('name', 'id')->toArray();
  27. $this->data['managers'] = $managers;
  28. // всего заказов, выполнено заказов
  29. $this->data['totalOrders'] = Order::all()->count();
  30. $this->data['doneOrders'] = Order::query()->whereIn('order_status_id', $doneStatuses)->count();
  31. $this->data['mountOrders'] = Order::query()->whereIn('order_status_id', $mountStatuses)->count();
  32. // всего маф / завершено маф / установлено маф
  33. $this->data['totalMafs'] = ProductSKU::all()->count();
  34. $this->data['doneMafs'] = ProductSKU::query()->
  35. whereHas('order', function ($query) use ($doneStatuses) {
  36. $query->whereIn('order_status_id', $doneStatuses);
  37. })->count();
  38. $this->data['mountMafs'] = ProductSKU::query()->
  39. whereHas('order', function ($query) use ($mountStatuses){
  40. $query->whereIn('order_status_id', $mountStatuses);
  41. })->count();
  42. // общая сумма
  43. $this->data['totalSum'] = Price::format(
  44. ProductSKU::query()->
  45. whereHas('order', function ($query) use ($mountStatuses) {
  46. $query->whereIn('order_status_id', $mountStatuses);
  47. })
  48. ->withSum('product', 'total_price')
  49. ->get()
  50. ->sum('product_sum_total_price')
  51. );
  52. // done by managers
  53. foreach ($managers as $userId => $userName) {
  54. $this->data['totalOrderManager'] = Order::where('user_id', $userId)->count();
  55. $this->data['totalMafsManager'][$userId] = ProductSKU::query()->
  56. whereHas('order', function ($query) use ($userId) {
  57. $query->where('user_id', '=', $userId);
  58. })->count();
  59. $this->data['doneOrdersManager'][$userId] = Order::query()
  60. ->where('user_id', '=', $userId)
  61. ->whereIn('order_status_id', $doneStatuses)
  62. ->count();
  63. $this->data['doneMafsManager'][$userId] = ProductSKU::query()->
  64. whereHas('order', function ($query) use ($userId, $doneStatuses) {
  65. $query->where('user_id', '=', $userId)
  66. ->whereIn('order_status_id', $doneStatuses);
  67. })->count();
  68. $this->data['notDoneOrdersManager'][$userId] = Order::query()
  69. ->where('user_id', '=', $userId)
  70. ->whereNotIn('order_status_id', $doneStatuses)
  71. ->count();
  72. $this->data['notDoneMafsManager'][$userId] = ProductSKU::query()->
  73. whereHas('order', function ($query) use ($userId, $doneStatuses) {
  74. $query->where('user_id', '=', $userId)
  75. ->whereNotIn('order_status_id', $doneStatuses);
  76. })->count();
  77. }
  78. // total mount by types
  79. foreach ($objectTypes as $objectTypeId => $objectType) {
  80. // total by types
  81. $this->data['totalOrdersType'][$objectTypeId] = Order::where('object_type_id', '=', $objectTypeId)->count();
  82. $this->data['totalMafsType'][$objectTypeId] = ProductSKU::query()->
  83. whereHas('order', function ($query) use ($objectTypeId) {
  84. $query->where('object_type_id', '=', $objectTypeId);
  85. })->count();
  86. // со статусами: в монтаже, готова к сдаче, не сдана замечания, сдана замечания, сдана - зеленый цвет
  87. $this->data['mountOrdersType'][$objectTypeId] = Order::query()
  88. ->where('object_type_id', '=', $objectTypeId)
  89. ->whereIn('order_status_id', $mountStatuses)
  90. ->count();
  91. $this->data['mountMafsType'][$objectTypeId] = ProductSKU::query()->
  92. whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
  93. $query->where('object_type_id', '=', $objectTypeId)
  94. ->whereIn('order_status_id', $mountStatuses);
  95. })->count();
  96. // остальные - не готовы
  97. $this->data['notMountOrdersType'][$objectTypeId] = Order::query()
  98. ->where('object_type_id', '=', $objectTypeId)
  99. ->whereNotIn('order_status_id', $mountStatuses)
  100. ->count();
  101. $this->data['notMountMafsType'][$objectTypeId] = ProductSKU::query()->
  102. whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
  103. $query->where('object_type_id', '=', $objectTypeId)
  104. ->whereNotIn('order_status_id', $mountStatuses);
  105. })->count();
  106. }
  107. return view('reports.index', $this->data);
  108. }
  109. }