CertificationsController.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Championship;
  4. use App\Member;
  5. use App\Module;
  6. use App\Result;
  7. use PhpParser\Node\Expr\Cast\Object_;
  8. use Validator;
  9. use PDF;
  10. use Illuminate\Http\Request;
  11. class CertificationsController extends Controller
  12. {
  13. public function search(Request $request)
  14. {
  15. /*
  16. * Валидация полей
  17. */
  18. $validator = Validator::make(
  19. $request->all(),
  20. [
  21. "q" => ['required'],
  22. ]
  23. );
  24. /*
  25. * Проверяем результаты валидации
  26. */
  27. if ($validator->fails())
  28. return response()
  29. ->json(["status" => false, "errors" => $validator->messages()])
  30. ->setStatusCode(400, "Error fields");
  31. $members = Member::where('name', 'like', "%$request->q%")->get();
  32. $certifications = [];
  33. foreach ($members as $member) {
  34. $champ = Championship::find($member->championship);
  35. if ($champ->status !== 3) continue;
  36. $certifications[] = [
  37. "champ_id" => $member->championship,
  38. "member_id" => $member->id,
  39. "title" => $champ->title,
  40. "type" => "certificate",
  41. "name" => $member->name
  42. ];
  43. $results = $this->getMemberResult($member->championship);
  44. $position = 1;
  45. foreach ($results as $result) {
  46. if ($position > 3) break;
  47. if ($result['member_id'] === $member->id) {
  48. $certifications[] = [
  49. "champ_id" => $member->championship,
  50. "member_id" => $member->id,
  51. "title" => $champ->title,
  52. "type" => "diploma",
  53. "name" => $member->name,
  54. "position" => $position
  55. ];
  56. }
  57. $position = $position + 1;
  58. }
  59. }
  60. return $certifications;
  61. }
  62. public function downloadDiploma(Request $request)
  63. {
  64. $member = Member::find($request->member);
  65. $champ = Championship::find($member->championship);
  66. $results = $this->getMemberResult($member->championship);
  67. $position = 1;
  68. $certificate = NULL;
  69. foreach ($results as $result) {
  70. if ($position > 3) break;
  71. if ($result['member_id'] === $member->id) {
  72. $certificate = [
  73. "champ_id" => $member->championship,
  74. "member_id" => $member->id,
  75. "title" => $champ->title,
  76. "city" => $champ->cities->title,
  77. "before_date" => $champ->from_date,
  78. "after_date" => $champ->to_date,
  79. "month" => $champ->months->title,
  80. "year" => $champ->year,
  81. "competence" => $champ->competences->title,
  82. "type" => "diploma",
  83. "name" => $member->name,
  84. "position" => $position
  85. ];
  86. }
  87. $position = $position + 1;
  88. }
  89. $certificate = (object)$certificate;
  90. //return $certificate;
  91. $pdf = PDF::loadView('diploma', compact('certificate'));
  92. return $pdf->download('С' . $champ->id . 'M' . $member->id . 'D' . '.pdf');
  93. }
  94. public function downloadCertificate(Request $request)
  95. {
  96. $member = Member::find($request->member);
  97. $champ = Championship::find($member->championship);
  98. $certificate = NULL;
  99. $certificate = [
  100. "champ_id" => $member->championship,
  101. "member_id" => $member->id,
  102. "title" => $champ->title,
  103. "city" => $champ->cities->title,
  104. "before_date" => $champ->from_date,
  105. "after_date" => $champ->to_date,
  106. "month" => $champ->months->title,
  107. "year" => $champ->year,
  108. "competence" => $champ->competences->title,
  109. "name" => $member->name
  110. ];
  111. $certificate = (object)$certificate;
  112. $pdf = PDF::loadView('certificate', compact('certificate'));
  113. return $pdf->download('С' . $champ->id . 'M' . $member->id . 'С' . '.pdf');
  114. }
  115. private function getMemberResult($champ_id)
  116. {
  117. $i = 0;
  118. /*
  119. * Список участников с результатами
  120. */
  121. $membersResults = [];
  122. $members = Member::where('championship', $champ_id)->get();
  123. /*
  124. * Загрузка всех модулей чемпионата
  125. */
  126. $modules = Module::where('championship', $champ_id)->get();
  127. /*
  128. * Перебираем всех участников и подсчитываем
  129. * баллы
  130. */
  131. foreach ($members as $member) {
  132. /*
  133. * Массив для хранения результатов
  134. * каждого модуля для участника
  135. */
  136. $modulesResults = [];
  137. /*
  138. * Переменная для подсчета общего кол-ва
  139. * очков участника
  140. */
  141. $allScore = 0;
  142. /*
  143. * Перебираем все модули
  144. */
  145. foreach ($modules as $module) {
  146. /*
  147. * Загружаем все критерии модуля
  148. */
  149. $criteria = Result::where('module_id', $module->id)
  150. ->where('member_id', $member->id)
  151. ->get();
  152. /*
  153. * Перемнная для хранения очков набранных
  154. * в данном модуле
  155. */
  156. $modulePoints = 0;
  157. /*
  158. * Перебираем критерии и складываем баллы
  159. */
  160. foreach ($criteria as $criterion) {
  161. /*
  162. * Складываем баллы в переменную $modulePoints
  163. */
  164. $modulePoints = $modulePoints + $criterion->points * 1;
  165. }
  166. /*
  167. * Складываем баллы в переменную с общим кол-вом
  168. * очков за все модули
  169. */
  170. $allScore = $allScore + $modulePoints;
  171. /*
  172. * Добавляем результаты и название модуля в массив $modulesResults
  173. */
  174. $modulesResults[] = [
  175. "title" => $module->title,
  176. "points" => round($modulePoints, 2)
  177. ];
  178. }
  179. /*
  180. * Добавляем пользователя в массив с результати
  181. * участников
  182. */
  183. $membersResults[] = [
  184. "member_id" => $member->id,
  185. "name" => $member->name,
  186. "university" => $member->university,
  187. "modules" => $modulesResults,
  188. "all_score" => round($allScore, 2)
  189. ];
  190. $i = $i + 1;
  191. }
  192. /*
  193. * Сортируем массив по ключу all_score (от лучшего результата к худшему)
  194. */
  195. $membersResults = collect($membersResults)
  196. ->sortBy('all_score')
  197. ->reverse()
  198. ->toArray();
  199. /*
  200. * Возвращаем массив с результатами
  201. */
  202. return $membersResults;
  203. }
  204. }