ReportController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Helpers\Price;
  4. use App\Models\Dictionary\District;
  5. use App\Models\ObjectType;
  6. use App\Models\Order;
  7. use App\Models\OrderStatus;
  8. use App\Models\Product;
  9. use App\Models\ProductSKU;
  10. use App\Models\Reclamation;
  11. use App\Models\ReclamationStatus;
  12. use App\Models\User;
  13. use Illuminate\Http\Request;
  14. use Illuminate\Support\Str;
  15. class ReportController extends Controller
  16. {
  17. protected array $data = [
  18. 'active' => 'reports',
  19. 'title' => 'Отчёты',
  20. 'id' => 'reports',
  21. ];
  22. public function index()
  23. {
  24. $mountStatuses = [5, 7, 8, 9, 10];
  25. $doneStatuses = [9, 10];
  26. $objectTypes = ObjectType::query()->get()->pluck('name', 'id')->toArray();
  27. $this->data['objectTypes'] = $objectTypes;
  28. $user_ids = Order::query()->distinct()->get('user_id')->pluck('user_id')->toArray();
  29. $managers = User::query()->whereIn('id', $user_ids)->get()->pluck('name', 'id')->toArray();
  30. $this->data['managers'] = $managers ?? [];
  31. $this->data['doneMafsManager'] = $this->data['notDoneMafsManager'] = [];
  32. // всего заказов, выполнено заказов
  33. $this->data['totalOrders'] = Order::all()->count();
  34. $this->data['doneOrders'] = Order::query()->whereIn('order_status_id', $doneStatuses)->count();
  35. $this->data['mountOrders'] = Order::query()->whereIn('order_status_id', $mountStatuses)->count();
  36. // всего маф / завершено маф / установлено маф
  37. $this->data['totalMafs'] = ProductSKU::all()->count();
  38. $this->data['doneMafs'] = ProductSKU::query()->
  39. whereHas('order', function ($query) use ($doneStatuses) {
  40. $query->whereIn('order_status_id', $doneStatuses);
  41. })->count();
  42. $this->data['mountMafs'] = ProductSKU::query()->
  43. whereHas('order', function ($query) use ($mountStatuses){
  44. $query->whereIn('order_status_id', $mountStatuses);
  45. })->count();
  46. // общая сумма mount
  47. $this->data['totalMountSum'] = Price::format(
  48. ProductSKU::query()->
  49. whereHas('order', function ($query) use ($mountStatuses) {
  50. $query->whereIn('order_status_id', $mountStatuses);
  51. })
  52. ->withSum('product', 'total_price')
  53. ->get()
  54. ->sum('product_sum_total_price')
  55. );
  56. // done by managers
  57. foreach ($managers as $userId => $userName) {
  58. $this->data['totalOrderManager'] = Order::where('user_id', $userId)->count();
  59. $this->data['totalMafsManager'][$userId] = ProductSKU::query()->
  60. whereHas('order', function ($query) use ($userId) {
  61. $query->where('user_id', '=', $userId);
  62. })->count();
  63. $this->data['doneOrdersManager'][$userId] = Order::query()
  64. ->where('user_id', '=', $userId)
  65. ->whereIn('order_status_id', $doneStatuses)
  66. ->count();
  67. $this->data['doneMafsManager'][$userId] = ProductSKU::query()->
  68. whereHas('order', function ($query) use ($userId, $doneStatuses) {
  69. $query->where('user_id', '=', $userId)
  70. ->whereIn('order_status_id', $doneStatuses);
  71. })->count();
  72. $this->data['notDoneOrdersManager'][$userId] = Order::query()
  73. ->where('user_id', '=', $userId)
  74. ->whereNotIn('order_status_id', $doneStatuses)
  75. ->count();
  76. $this->data['notDoneMafsManager'][$userId] = ProductSKU::query()->
  77. whereHas('order', function ($query) use ($userId, $doneStatuses) {
  78. $query->where('user_id', '=', $userId)
  79. ->whereNotIn('order_status_id', $doneStatuses);
  80. })->count();
  81. }
  82. // total mount by types
  83. foreach ($objectTypes as $objectTypeId => $objectType) {
  84. // total by types
  85. $this->data['totalOrdersType'][$objectTypeId] = Order::where('object_type_id', '=', $objectTypeId)->count();
  86. $this->data['totalMafsType'][$objectTypeId] = ProductSKU::query()->
  87. whereHas('order', function ($query) use ($objectTypeId) {
  88. $query->where('object_type_id', '=', $objectTypeId);
  89. })->count();
  90. // со статусами: в монтаже, готова к сдаче, не сдана замечания, сдана замечания, сдана - зеленый цвет
  91. $this->data['mountOrdersType'][$objectTypeId] = Order::query()
  92. ->where('object_type_id', '=', $objectTypeId)
  93. ->whereIn('order_status_id', $mountStatuses)
  94. ->count();
  95. $this->data['mountMafsType'][$objectTypeId] = ProductSKU::query()->
  96. whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
  97. $query->where('object_type_id', '=', $objectTypeId)
  98. ->whereIn('order_status_id', $mountStatuses);
  99. })->count();
  100. // остальные - не готовы
  101. $this->data['notMountOrdersType'][$objectTypeId] = Order::query()
  102. ->where('object_type_id', '=', $objectTypeId)
  103. ->whereNotIn('order_status_id', $mountStatuses)
  104. ->count();
  105. $this->data['notMountMafsType'][$objectTypeId] = ProductSKU::query()->
  106. whereHas('order', function ($query) use ($objectTypeId, $mountStatuses) {
  107. $query->where('object_type_id', '=', $objectTypeId)
  108. ->whereNotIn('order_status_id', $mountStatuses);
  109. })->count();
  110. }
  111. // рекламации
  112. $this->data['totalReclamations'] = Reclamation::query()->count();
  113. $this->data['reclamationStatuses'] = ReclamationStatus::query()->get()->pluck('name', 'id')->toArray();
  114. foreach ($this->data['reclamationStatuses'] as $reclamationStatusId => $reclamationStatus) {
  115. $this->data['reclamations'][$reclamationStatus] = Reclamation::query()->where('status_id', '=', $reclamationStatusId)->count();
  116. }
  117. $this->data['reclamationMafs'] = $this->data['reclamationDetails'] = [];
  118. foreach (Reclamation::all() as $reclamation) {
  119. foreach ($reclamation->skus as $sku) {
  120. $a = $sku->product->article;
  121. if(isset($this->data['reclamationMafs'][$a])){
  122. $this->data['reclamationMafs'][$a]++;
  123. } else {
  124. $this->data['reclamationMafs'][$a] = 1;
  125. }
  126. }
  127. foreach ($reclamation->details as $detail) {
  128. $a = $detail->name;
  129. if(isset($this->data['reclamationDetails'][$a])){
  130. $this->data['reclamationDetails'][$a] += $detail->quantity;
  131. } else {
  132. $this->data['reclamationDetails'][$a] = $detail->quantity;
  133. }
  134. }
  135. }
  136. // svod
  137. $orderStatuses = OrderStatus::query()->get()->pluck('name', 'id')->toArray();
  138. foreach ($orderStatuses as $orderStatusId => $orderStatus) {
  139. $this->data['orderStatuses'][$orderStatus] = Order::query()->where('order_status_id', '=', $orderStatusId)->count();
  140. $this->data['orderMafStatuses'][$orderStatus] = ProductSKU::query()->
  141. whereHas('order', function ($query) use ($orderStatusId) {
  142. $query->where('order_status_id', $orderStatusId);
  143. })->count();
  144. }
  145. // общая сумма
  146. $this->data['totalSum'] = Price::format(
  147. ProductSKU::query()
  148. ->withSum('product', 'total_price')
  149. ->get()
  150. ->sum('product_sum_total_price') / 10
  151. );
  152. // общая сумма done
  153. $this->data['totalDoneSum'] = Price::format(
  154. ProductSKU::query()->
  155. whereHas('order', function ($query) use ($doneStatuses) {
  156. $query->whereIn('order_status_id', $doneStatuses);
  157. })
  158. ->withSum('product', 'total_price')
  159. ->get()
  160. ->sum('product_sum_total_price') / 10
  161. );
  162. $districts = District::query()->get()->pluck('shortname', 'id')->toArray();
  163. foreach ($districts as $districtId => $district) {
  164. $totalOrders = $this->getOrderCount($districtId);
  165. $totalMafs = $this->getMafCount($districtId);
  166. $readyOrders = $this->getOrderCount($districtId, 4);
  167. $readyMafs = $this->getMafCount($districtId, 4);
  168. $mountOrders = $this->getOrderCount($districtId, 5);
  169. $mountMafs = $this->getMafCount($districtId, 5);
  170. $readyDoneOrders = $this->getOrderCount($districtId, 7);
  171. $readyDoneMafs = $this->getMafCount($districtId, 7);
  172. $doneOrders = $this->getOrderCount($districtId, $doneStatuses);
  173. $doneMafs = $this->getMafCount($districtId, $doneStatuses);
  174. $statusOstOrders = $totalOrders - $mountOrders - $readyDoneOrders - $doneOrders;
  175. $statusOstMafs = $totalMafs - $mountMafs - $readyDoneMafs - $doneMafs;
  176. $totalYardOrders = $this->getOrderCount($districtId, null, 1);
  177. $totalYardMafs = $this->getMafCount($districtId, null, 1);
  178. $mountYardOrders = $this->getOrderCount($districtId, $mountStatuses, 1);
  179. $mountYardMafs = $this->getMafCount($districtId, $mountStatuses, 1);
  180. $ostYardOrders = $totalYardOrders - $mountYardOrders;
  181. $ostYardMafs = $totalYardMafs - $mountYardMafs;
  182. $totalEduOrders = $this->getOrderCount($districtId, null, 2);
  183. $totalEduMafs = $this->getMafCount($districtId, null, 2);
  184. $mountEduOrders = $this->getOrderCount($districtId, $mountStatuses, 2);
  185. $mountEduMafs = $this->getMafCount($districtId, $mountStatuses, 2);
  186. $ostEduOrders = $totalYardOrders - $mountYardOrders;
  187. $ostEduMafs = $totalYardMafs - $mountYardMafs;
  188. $totalZnakOrders = $this->getOrderCount($districtId, null, 3);
  189. $totalZnakMafs = $this->getMafCount($districtId, null, 3);
  190. $mountZnakOrders = $this->getOrderCount($districtId, $mountStatuses, 3);
  191. $mountZnakMafs = $this->getMafCount($districtId, $mountStatuses, 3);
  192. $ostZnakOrders = $totalYardOrders - $mountYardOrders;
  193. $ostZnakMafs = $totalYardMafs - $mountYardMafs;
  194. $this->data['byDistrict'][$district] = [
  195. 'name' => $district,
  196. 'totalSum' => $this->getDistrictSum($districtId),
  197. 'doneSum' => $this->getDistrictSum($districtId, $doneStatuses),
  198. 'totalOrders' => $totalOrders,
  199. 'totalMafs' => $totalMafs,
  200. 'readyOrders' => $readyOrders,
  201. 'readyMafs' => $readyMafs,
  202. 'mountOrders' => $mountOrders,
  203. 'mountMafs' => $mountMafs,
  204. 'readyDoneOrders' => $readyDoneOrders,
  205. 'readyDoneMafs' => $readyDoneMafs,
  206. 'doneOrders' => $doneOrders,
  207. 'doneMafs' => $doneMafs,
  208. 'statusOstOrders' => $statusOstOrders,
  209. 'statusOstMafs' => $statusOstMafs,
  210. 'totalYardOrders' => $totalYardOrders,
  211. 'totalYardMafs' => $totalYardMafs,
  212. 'mountYardOrders' => $mountYardOrders,
  213. 'mountYardMafs' => $mountYardMafs,
  214. 'ostYardOrders' => $ostYardOrders,
  215. 'ostYardMafs' => $ostYardMafs,
  216. 'totalEduOrders' => $totalEduOrders,
  217. 'totalEduMafs' => $totalEduMafs,
  218. 'mountEduOrders' => $mountEduOrders,
  219. 'mountEduMafs' => $mountEduMafs,
  220. 'ostEduOrders' => $ostEduOrders,
  221. 'ostEduMafs' => $ostEduMafs,
  222. 'totalZnakOrders' => $totalZnakOrders,
  223. 'totalZnakMafs' => $totalZnakMafs,
  224. 'mountZnakOrders' => $mountZnakOrders,
  225. 'mountZnakMafs' => $mountZnakMafs,
  226. 'ostZnakOrders' => $ostZnakOrders,
  227. 'ostZnakMafs' => $ostZnakMafs,
  228. ];
  229. }
  230. return view('reports.index', $this->data);
  231. }
  232. private function getOrderCount($districtId, $status = null, $type = null)
  233. {
  234. $q = Order::query()->where('district_id', '=', $districtId);
  235. if($status) {
  236. if(!is_array($status)) $status = [$status];
  237. $q->whereIn('order_status_id', $status);
  238. }
  239. if($type) {
  240. if(!is_array($type)) $type = [$type];
  241. $q->whereIn('object_type_id', $type);
  242. }
  243. return $q->count();
  244. }
  245. private function getMafCount($districtId, $status = null, $type = null)
  246. {
  247. return ProductSKU::query()->
  248. whereHas('order', function ($query) use ($districtId, $status, $type) {
  249. $query->where('district_id', '=', $districtId);
  250. if($status) {
  251. if(!is_array($status)) $status = [$status];
  252. $query->whereIn('order_status_id', $status);
  253. }
  254. if($type) {
  255. if(!is_array($type)) $type = [$type];
  256. $query->whereIn('object_type_id', $type);
  257. }
  258. })->count();
  259. }
  260. private function getDistrictSum($districtId, $done = false)
  261. {
  262. return Price::format(
  263. ProductSKU::query()->
  264. whereHas('order', function ($query) use ($done, $districtId) {
  265. $query->where('district_id', $districtId);
  266. if($done){
  267. $query->whereIn('order_status_id', $done);
  268. }
  269. })
  270. ->withSum('product', 'total_price')
  271. ->get()
  272. ->sum('product_sum_total_price') / 10
  273. );
  274. }
  275. }