ScheduleController.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Events\SendWebSocketMessageEvent;
  4. use App\Helpers\DateHelper;
  5. use App\Http\Requests\CreateScheduleFromOrderRequest;
  6. use App\Http\Requests\CreateScheduleFromReclamationRequest;
  7. use App\Http\Requests\ExportScheduleRequest;
  8. use App\Http\Requests\UpdateScheduleRequest;
  9. use App\Jobs\ExportScheduleJob;
  10. use App\Jobs\NotifyManagerNewOrderJob;
  11. use App\Jobs\NotifyOrderInScheduleJob;
  12. use App\Models\Dictionary\Area;
  13. use App\Models\Dictionary\District;
  14. use App\Models\Order;
  15. use App\Models\ProductSKU;
  16. use App\Models\Reclamation;
  17. use App\Models\Role;
  18. use App\Models\Schedule;
  19. use App\Models\User;
  20. use Illuminate\Http\Request;
  21. class ScheduleController extends Controller
  22. {
  23. protected array $data = [
  24. 'active' => 'schedule',
  25. 'title' => 'График монтажей',
  26. 'id' => 'schedule',
  27. ];
  28. public function index(Request $request)
  29. {
  30. $this->data['districts'] = District::query()->get()->pluck('name', 'id');
  31. $this->data['areas'] = Area::query()->get()->pluck('name', 'id');
  32. $this->data['brigadiers'] = User::query()->where('role', Role::BRIGADIER)->get()->pluck('name', 'id');
  33. $this->data['weekNumber'] = $request->get('week' ,date('W'));
  34. $weekDates = [
  35. 'mon' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber']),
  36. 'tue' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 2),
  37. 'wed' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 3),
  38. 'thu' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 4),
  39. 'fri' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 5),
  40. 'sat' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 6),
  41. 'sun' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 7),
  42. ];
  43. $this->data['weekDates'] = $weekDates;
  44. $schedules = [];
  45. foreach ($weekDates as $date) {
  46. $schedules[$date] = null;
  47. }
  48. $result = Schedule::query()
  49. ->whereBetween('installation_date', [$weekDates['mon'], $weekDates['sun']])
  50. ->get();
  51. foreach ($result as $schedule) {
  52. $schedules[$schedule->installation_date][] = $schedule;
  53. }
  54. $this->data['schedules'] = $schedules;
  55. return view('schedule.index', $this->data);
  56. }
  57. public function createFromOrder(CreateScheduleFromOrderRequest $request)
  58. {
  59. $validated = $request->validated();
  60. // delete all auto schedules for this order
  61. if(isset($validated['delete_old_records'])) {
  62. Schedule::query()
  63. ->where('order_id', $validated['order_id'])
  64. ->where('source', 'Площадки')
  65. ->where('manual', false)
  66. ->delete();
  67. }
  68. // create all records in schedule
  69. $order = Order::query()
  70. ->where('id', $validated['order_id'])
  71. ->first();
  72. if(empty($validated['skus'])) {
  73. foreach ($order->products_sku as $psku)
  74. $validated['skus'][] = $psku->id;
  75. }
  76. $mafs = [];
  77. foreach ($validated['skus'] as $skuId) {
  78. $sku = ProductSKU::query()->where('id', $skuId)->first();
  79. if(!isset($mafs[$sku->product->article])) {
  80. $mafs[$sku->product->article] = 1;
  81. } else {
  82. $mafs[$sku->product->article] += 1;
  83. }
  84. }
  85. $mafsText = '';
  86. $mafsCount = 0;
  87. foreach ($mafs as $article => $count) {
  88. $mafsText .= $article . ' - ' . $count . "\r\n";
  89. $mafsCount += $count;
  90. }
  91. $first = true;
  92. for ($iDays = 1; $iDays < $order->install_days + 1; $iDays++) {
  93. $instDate = date('Y-m-d', strtotime('+' . $iDays - 1 . ' days', strtotime($order->installation_date)));
  94. $schedule = Schedule::query()
  95. ->create([
  96. 'order_id' => $validated['order_id'],
  97. 'address_code' => $validated['order_id'],
  98. 'source' => 'Площадки',
  99. 'installation_date' => $instDate,
  100. 'manual' => false,
  101. 'district_id' => $order->district_id,
  102. 'area_id' => $order->area_id,
  103. 'object_address' => $order->object_address,
  104. 'object_type' => $order->objectType->name,
  105. 'mafs' => $mafsText,
  106. 'mafs_count' => $mafsCount,
  107. 'brigadier_id' => $order->brigadier_id,
  108. 'comment' => $validated['comment'],
  109. ]);
  110. if($first) {
  111. $first = false;
  112. NotifyOrderInScheduleJob::dispatch($schedule);
  113. }
  114. }
  115. return redirect()->route('schedule.index');
  116. }
  117. public function createFromReclamation(CreateScheduleFromReclamationRequest $request)
  118. {
  119. $validated = $request->validated();
  120. // delete all auto schedules for this order
  121. if(isset($validated['delete_old_records'])) {
  122. Schedule::query()
  123. ->where('address_code', 'РЕКЛ-' . $validated['reclamation_id'])
  124. ->where('source', 'Рекламации')
  125. ->where('manual', false)
  126. ->delete();
  127. }
  128. $reclamation = Reclamation::query()
  129. ->where('id', $validated['reclamation_id'])
  130. ->first();
  131. $order = $reclamation->order;
  132. $mafs = [];
  133. if(empty($validated['skus'])) {
  134. foreach ($reclamation->skus as $sku)
  135. if(!isset($mafs[$sku->product->article])) {
  136. $mafs[$sku->product->article] = 1;
  137. } else {
  138. $mafs[$sku->product->article] += 1;
  139. }
  140. }
  141. $mafsCount = 0;
  142. $mafsText = '';
  143. foreach ($mafs as $article => $count) {
  144. $mafsCount += $count;
  145. $mafsText .= $article . ' - ' . $count . "\r\n";
  146. }
  147. $first = true;
  148. for ($iDays = 1; $iDays < $reclamation->work_days + 1; $iDays++) {
  149. $instDate = date('Y-m-d', strtotime('+' . $iDays - 1 . ' days', strtotime($reclamation->start_work_date)));
  150. $schedule = Schedule::query()
  151. ->create([
  152. 'order_id' => $order->id,
  153. 'address_code' => 'РЕКЛ-' . $validated['reclamation_id'],
  154. 'source' => 'Рекламации',
  155. 'installation_date' => $instDate,
  156. 'manual' => false,
  157. 'district_id' => $order->district_id,
  158. 'area_id' => $order->area_id,
  159. 'object_address' => $order->object_address,
  160. 'object_type' => $reclamation->reason,
  161. 'mafs' => $mafsText,
  162. 'mafs_count' => $mafsCount,
  163. 'brigadier_id' => $reclamation->brigadier_id,
  164. 'comment' => $reclamation->guarantee,
  165. ]);
  166. if($first) {
  167. $first = false;
  168. NotifyOrderInScheduleJob::dispatch($schedule);
  169. }
  170. }
  171. return redirect()->route('schedule.index');
  172. }
  173. public function update(UpdateScheduleRequest $request)
  174. {
  175. $validated = $request->validated();
  176. if(isset($validated['id'])) {
  177. $schedule = Schedule::query()
  178. ->where('id', $validated['id'])
  179. ->update($validated);
  180. } else {
  181. $schedule = Schedule::query()
  182. ->create([
  183. 'address_code' => $validated['address_code'] ?? '-',
  184. 'installation_date' => $validated['installation_date'],
  185. 'manual' => true,
  186. 'district_id' => $validated['district_id'],
  187. 'area_id' => $validated['area_id'],
  188. 'object_address' => $validated['object_address'],
  189. 'object_type' => $validated['object_type'],
  190. 'mafs' => $validated['mafs'],
  191. 'mafs_count' => $validated['mafs_count'],
  192. 'brigadier_id' => $validated['brigadier_id'],
  193. 'comment' => $validated['comment'],
  194. ]);
  195. }
  196. NotifyOrderInScheduleJob::dispatch($schedule);
  197. return redirect()->back();
  198. }
  199. public function delete(Schedule $schedule)
  200. {
  201. $schedule->delete();
  202. return redirect()->back();
  203. }
  204. public function export(ExportScheduleRequest $request)
  205. {
  206. $startDate = $request->validated()['start_date'];
  207. $endDate = $request->validated()['end_date'];
  208. $schedules = Schedule::query()
  209. ->where('installation_date', '>=', $startDate)
  210. ->where('installation_date', '<=', $endDate)
  211. ->orderBy('installation_date')
  212. ->orderBy('brigadier_id')
  213. ->get();
  214. ExportScheduleJob::dispatch($schedules, $request->user()->id);
  215. return redirect()->route('schedule.index', ['week' => $request->validated()['week']])
  216. ->with(['success' => 'Задача генерации графика создана!']);
  217. }
  218. }