ScheduleController.php 7.9 KB

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