ScheduleController.php 8.7 KB

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