ReclamationController.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\CreateReclamationRequest;
  4. use App\Http\Requests\StoreReclamationRequest;
  5. use App\Models\File;
  6. use App\Models\Order;
  7. use App\Models\Reclamation;
  8. use App\Models\ReclamationStatus;
  9. use App\Models\Role;
  10. use App\Models\User;
  11. use App\Services\FileService;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Support\Carbon;
  14. use Illuminate\Support\Facades\Storage;
  15. class ReclamationController extends Controller
  16. {
  17. protected array $data = [
  18. 'active' => 'reclamations',
  19. 'title' => 'Рекламации',
  20. 'id' => 'reclamations',
  21. 'header' => [
  22. 'id' => 'ID',
  23. 'user_id' => 'Менеджер',
  24. 'status_id' => 'Статус',
  25. 'order-district_id' => 'Округ',
  26. 'order-area_id' => 'Район',
  27. 'order-object_address' => 'Адрес объекта',
  28. 'create_date' => 'Дата создания',
  29. 'finish_date' => 'Дата завершения',
  30. 'reason' => 'Причина',
  31. 'guarantee' => 'Гарантии',
  32. 'whats_done' => 'Что сделано',
  33. ],
  34. 'searchFields' => [
  35. 'reason',
  36. 'guarantee',
  37. 'whats_done',
  38. ],
  39. 'ranges' => [],
  40. ];
  41. public function __construct()
  42. {
  43. $this->data['users'] = User::query()->whereIn('role', [Role::MANAGER, Role::ADMIN])->get()->pluck('name', 'id');
  44. $this->data['statuses'] = ReclamationStatus::query()->get()->pluck('name', 'id');
  45. }
  46. public function index(Request $request)
  47. {
  48. $model = new Reclamation();
  49. // fill filters
  50. $this->createFilters($model, 'user_id', 'status_id');
  51. $this->createDateFilters($model, 'create_date', 'finish_date');
  52. $q = $model::query();
  53. $this->acceptFilters($q, $request);
  54. $this->acceptSearch($q, $request);
  55. $this->setSortAndOrderBy($model, $request);
  56. $q->orderBy($this->data['sortBy'], $this->data['orderBy']);
  57. $this->data['reclamations'] = $q->paginate(session('per_page', config('pagination.per_page')))->withQueryString();
  58. return view('reclamations.index', $this->data);
  59. }
  60. public function create(CreateReclamationRequest $request, Order $order)
  61. {
  62. $reclamation = Reclamation::query()->create([
  63. 'order_id' => $order->id,
  64. 'user_id' => $request->user()->id,
  65. 'status_id' => Reclamation::STATUS_NEW,
  66. 'create_date' => Carbon::now(),
  67. 'finish_date' => Carbon::now()->addDays(30),
  68. ]);
  69. $skus = $request->validated('skus');
  70. $reclamation->skus()->attach($skus);
  71. return redirect()->route('reclamations.show', $reclamation);
  72. }
  73. public function show(Reclamation $reclamation)
  74. {
  75. $this->data['reclamation'] = $reclamation;
  76. return view('reclamations.edit', $this->data);
  77. }
  78. public function update(StoreReclamationRequest $request, Reclamation $reclamation)
  79. {
  80. $data = $request->validated();
  81. $reclamation->update($data);
  82. return redirect()->route('reclamations.show', $reclamation);
  83. }
  84. public function uploadPhotoBefore(Request $request, Reclamation $reclamation, FileService $fileService)
  85. {
  86. $data = $request->validate([
  87. 'photo.*' => 'mimes:jpeg,jpg,png|max:8192',
  88. ]);
  89. $f = [];
  90. foreach ($data['photo'] as $photo) {
  91. $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/photo_before', $photo);
  92. }
  93. $reclamation->photos_before()->syncWithoutDetaching($f);
  94. return redirect()->route('reclamations.show', $reclamation);
  95. }
  96. public function uploadPhotoAfter(Request $request, Reclamation $reclamation, FileService $fileService)
  97. {
  98. $data = $request->validate([
  99. 'photo.*' => 'mimes:jpeg,jpg,png|max:8192',
  100. ]);
  101. $f = [];
  102. foreach ($data['photo'] as $photo) {
  103. $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/photo_after', $photo);
  104. }
  105. $reclamation->photos_after()->syncWithoutDetaching($f);
  106. return redirect()->route('reclamations.show', $reclamation);
  107. }
  108. public function deletePhotoBefore(Reclamation $reclamation, File $file, FileService $fileService)
  109. {
  110. $reclamation->photos_before()->detach($file);
  111. Storage::disk('public')->delete($file->path);
  112. $file->delete();
  113. return redirect()->route('reclamations.show', $reclamation);
  114. }
  115. public function deletePhotoAfter(Reclamation $reclamation, File $file, FileService $fileService)
  116. {
  117. $reclamation->photos_after()->detach($file);
  118. Storage::disk('public')->delete($file->path);
  119. $file->delete();
  120. return redirect()->route('reclamations.show', $reclamation);
  121. }
  122. public function uploadDocument(Request $request, Reclamation $reclamation, FileService $fileService)
  123. {
  124. $data = $request->validate([
  125. 'document.*' => 'file',
  126. ]);
  127. $f = [];
  128. foreach ($data['document'] as $document) {
  129. $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/document', $document);
  130. }
  131. $reclamation->documents()->syncWithoutDetaching($f);
  132. return redirect()->route('reclamations.show', $reclamation);
  133. }
  134. public function deleteDocument(Reclamation $reclamation, File $file)
  135. {
  136. $reclamation->documents()->detach($file);
  137. Storage::disk('public')->delete($file->path);
  138. $file->delete();
  139. return redirect()->route('reclamations.show', $reclamation);
  140. }
  141. public function uploadAct(Request $request, Reclamation $reclamation, FileService $fileService)
  142. {
  143. $data = $request->validate([
  144. 'acts.*' => 'file',
  145. ]);
  146. $f = [];
  147. foreach ($data['acts'] as $document) {
  148. $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/act', $document);
  149. }
  150. $reclamation->acts()->syncWithoutDetaching($f);
  151. return redirect()->route('reclamations.show', $reclamation);
  152. }
  153. public function deleteAct(Reclamation $reclamation, File $file)
  154. {
  155. $reclamation->acts()->detach($file);
  156. Storage::disk('public')->delete($file->path);
  157. $file->delete();
  158. return redirect()->route('reclamations.show', $reclamation);
  159. }
  160. }