ScheduleController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Helpers\DateHelper;
  4. use App\Http\Requests\CreateScheduleFromOrderRequest;
  5. use App\Http\Requests\UpdateScheduleRequest;
  6. use App\Models\Dictionary\Area;
  7. use App\Models\Dictionary\District;
  8. use App\Models\Order;
  9. use App\Models\ProductSKU;
  10. use App\Models\Role;
  11. use App\Models\Schedule;
  12. use App\Models\User;
  13. use Illuminate\Http\Request;
  14. class ScheduleController extends Controller
  15. {
  16. protected array $data = [
  17. 'active' => 'schedule',
  18. 'title' => 'График монтажей',
  19. 'id' => 'schedule',
  20. ];
  21. public function index(Request $request)
  22. {
  23. $this->data['districts'] = District::query()->get()->pluck('name', 'id');
  24. $this->data['areas'] = Area::query()->get()->pluck('name', 'id');
  25. $this->data['brigadiers'] = User::query()->where('role', Role::BRIGADIER)->get()->pluck('name', 'id');
  26. $this->data['weekNumber'] = $request->get('week' ,date('W'));
  27. $weekDates = [
  28. 'mon' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber']),
  29. 'tue' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 2),
  30. 'wed' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 3),
  31. 'thu' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 4),
  32. 'fri' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 5),
  33. 'sat' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 6),
  34. 'sun' => DateHelper::getDateOfWeek(year(), $this->data['weekNumber'], 7),
  35. ];
  36. $this->data['weekDates'] = $weekDates;
  37. $schedules = [];
  38. foreach ($weekDates as $date) {
  39. $schedules[$date] = null;
  40. }
  41. $result = Schedule::query()
  42. ->whereBetween('installation_date', [$weekDates['mon'], $weekDates['sun']])
  43. ->get();
  44. foreach ($result as $schedule) {
  45. $schedules[$schedule->installation_date][] = $schedule;
  46. }
  47. $this->data['schedules'] = $schedules;
  48. return view('schedule.index', $this->data);
  49. }
  50. public function createFromOrder(CreateScheduleFromOrderRequest $request)
  51. {
  52. $validated = $request->validated();
  53. // delete all auto schedules for this order
  54. if(isset($validated['delete_old_records'])) {
  55. Schedule::query()
  56. ->where('order_id', $validated['order_id'])
  57. ->where('manual', false)
  58. ->delete();
  59. }
  60. // create all records in schedule
  61. $order = Order::query()
  62. ->where('id', $validated['order_id'])
  63. ->first();
  64. if(empty($validated['skus'])) {
  65. foreach ($order->products_sku as $psku)
  66. $validated['skus'][] = $psku->id;
  67. }
  68. $mafs = [];
  69. foreach ($validated['skus'] as $skuId) {
  70. $sku = ProductSKU::query()->where('id', $skuId)->first();
  71. if(!isset($mafs[$sku->product->article])) {
  72. $mafs[$sku->product->article] = 1;
  73. } else {
  74. $mafs[$sku->product->article] += 1;
  75. }
  76. }
  77. $mafsText = '';
  78. $mafsCount = 0;
  79. foreach ($mafs as $article => $count) {
  80. $mafsText .= $article . ' - ' . $count . "\r\n";
  81. $mafsCount += $count;
  82. }
  83. for ($iDays = 1; $iDays < $order->install_days + 1; $iDays++) {
  84. $instDate = date('Y-m-d', strtotime('+' . $iDays - 1 . ' days', strtotime($order->installation_date)));
  85. Schedule::query()
  86. ->create([
  87. 'order_id' => $validated['order_id'],
  88. 'address_code' => $validated['order_id'],
  89. 'source' => 'Площадки',
  90. 'installation_date' => $instDate,
  91. 'manual' => false,
  92. 'district_id' => $order->district_id,
  93. 'area_id' => $order->area_id,
  94. 'object_address' => $order->object_address,
  95. 'object_type' => $order->objectType->name,
  96. 'mafs' => $mafsText,
  97. 'mafs_count' => $mafsCount,
  98. 'brigadier_id' => $order->brigadier_id,
  99. 'comment' => $validated['comment'],
  100. ]);
  101. }
  102. return redirect()->route('schedule.index');
  103. }
  104. public function update(UpdateScheduleRequest $request)
  105. {
  106. $validated = $request->validated();
  107. if(isset($validated['id'])) {
  108. Schedule::query()
  109. ->where('id', $validated['id'])
  110. ->update($validated);
  111. } else {
  112. Schedule::query()
  113. ->create([
  114. 'address_code' => $validated['address_code'] ?? '-',
  115. 'installation_date' => $validated['installation_date'],
  116. 'manual' => true,
  117. 'district_id' => $validated['district_id'],
  118. 'area_id' => $validated['area_id'],
  119. 'object_address' => $validated['object_address'],
  120. 'object_type' => $validated['object_type'],
  121. 'mafs' => $validated['mafs'],
  122. 'mafs_count' => $validated['mafs_count'],
  123. 'brigadier_id' => $validated['brigadier_id'],
  124. 'comment' => $validated['comment'],
  125. ]);
  126. }
  127. return redirect()->back();
  128. }
  129. public function delete(Schedule $schedule)
  130. {
  131. $schedule->delete();
  132. return redirect()->back();
  133. }
  134. }