RequirementController.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?php
  2. namespace App\Http\Controllers\API;
  3. use App\Exports\DownloadHelper;
  4. use App\Exports\RequirementExport;
  5. use App\Http\Controllers\Controller;
  6. use App\Http\Requests\API\Requirement\ClosedRequest;
  7. use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
  8. use App\Http\Requests\API\Requirement\LinkPlanRequest;
  9. use App\Http\Requests\API\Requirement\BatchCreateRequest;
  10. use App\Http\Resources\API\AssetRequirementResource;
  11. use App\Http\Resources\API\RequirementResource;
  12. use App\Imports\RequirementImport;
  13. use App\Models\Asset;
  14. use App\Models\Enums\ActionObjectType;
  15. use App\Models\Enums\FileObjectType;
  16. use App\Models\Enums\RequirementStatus;
  17. use App\Models\Enums\ObjectAction;
  18. use App\Models\Plan;
  19. use App\Models\Requirement;
  20. use App\Repositories\ActionRepository;
  21. use App\Services\File\FileAssociationService;
  22. use App\Services\History\ModelChangeDetector;
  23. use Illuminate\Http\Request;
  24. use Illuminate\Support\Facades\Auth;
  25. use Illuminate\Support\Facades\DB;
  26. use Maatwebsite\Excel\Facades\Excel;
  27. class RequirementController extends Controller
  28. {
  29. use DownloadHelper;
  30. /**
  31. * Display a listing of the resource.
  32. */
  33. public function index(Request $request)
  34. {
  35. $requirements = Requirement::filter($request->all())
  36. ->where('company_id',Auth::user()->company_id)
  37. ->orderBy('created_at', $request->input('sort','desc'))
  38. ->with(['createdBy', 'plan','group','asset.parent'])
  39. ->paginate($request->get('page_size') ?? 10);
  40. return AssetRequirementResource::collection($requirements);
  41. }
  42. // public function byAsset(Request $request,string $assetId)
  43. // {
  44. // $requirements=Requirement::filter($request->all())->with(['createdBy', 'plan','group']) ->where('asset_id', $assetId)->simplePaginate();
  45. //
  46. // return AssetRequirementResource::collection($requirements);
  47. // }
  48. public function export(Request $request)
  49. {
  50. return $this->downloadExcelHelper(
  51. new RequirementExport(),
  52. "requirement",
  53. $request->get("extension"),
  54. );
  55. }
  56. /**
  57. * Store a newly created resource in storage.
  58. */
  59. public function store(FileAssociationService $service, CreateOrUpdateRequest $request)
  60. {
  61. $requirement = new Requirement();
  62. $requirement->mergeFillable([
  63. 'company_id', 'created_by',
  64. ]);
  65. $service->check(
  66. $request->get("file_ids", []),
  67. FileObjectType::REQUIREMENT,
  68. $request->get("file_uuid"),
  69. );
  70. $requirement->fill([
  71. ...$request->all(),
  72. 'company_id' => Auth::user()->company_id,
  73. 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
  74. 'created_by' => Auth::id(),
  75. ]);
  76. $requirement->save();
  77. ActionRepository::createRequirement(
  78. $requirement, ObjectAction::CREATED
  79. );
  80. $service->association($requirement->id);
  81. return $this->created();
  82. }
  83. /**
  84. * Display the specified resource.
  85. */
  86. public function show(string $id)
  87. {
  88. $requirement = Requirement::query()->findOrFail($id);
  89. return new RequirementResource($requirement);
  90. }
  91. /**
  92. * Update the specified resource in storage.
  93. */
  94. public function update(CreateOrUpdateRequest $request, string $id)
  95. {
  96. $requirement = Requirement::findOrFail($id);
  97. $requirement->fill([
  98. ...$request->all(),
  99. 'description' => $request->description? (new \App\Services\File\ImageUrlService)->interceptImageUrl($request->description) : null,
  100. ]);
  101. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  102. $requirement->save();
  103. ActionRepository::createRequirement(
  104. $requirement, ObjectAction::EDITED,objectChanges: $changes
  105. );
  106. return $this->noContent();
  107. }
  108. /**
  109. * Remove the specified resource from storage.
  110. */
  111. public function destroy(string $id)
  112. {
  113. $requirement = Requirement::findOrFail($id);
  114. $requirement->delete();
  115. ActionRepository::createRequirement(
  116. $requirement, ObjectAction::DELETED
  117. );
  118. return $this->noContent();
  119. }
  120. public function close(Request $request,string $id){
  121. $requirement = Requirement::findOrFail($id);
  122. $requirement->status = RequirementStatus::CLOSED->value;
  123. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  124. $requirement->save();
  125. ActionRepository::createRequirement(
  126. $requirement,
  127. ObjectAction::CLOSED,
  128. $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
  129. objectChanges: $changes
  130. );
  131. return $this->noContent();
  132. }
  133. public function start(Request $request, string $id)
  134. {
  135. $requirement = Requirement::findOrFail($id);
  136. $requirement->status = RequirementStatus::ACTIVE->value;
  137. $changes = ModelChangeDetector::detector(ActionObjectType::REQUIREMENT, $requirement);
  138. $requirement->save();
  139. ActionRepository::createRequirement(
  140. $requirement,
  141. ObjectAction::STARTED,
  142. $request->comment?(new \App\Services\File\ImageUrlService)->interceptImageUrl($request->comment) : null,
  143. objectChanges: $changes
  144. );
  145. return $this->noContent();
  146. }
  147. public function linkPlan(LinkPlanRequest $request, string $planId)
  148. {
  149. $plan = Plan::query()->findOrFail($planId);
  150. Requirement::query()->where("asset_id", $plan->asset_id)
  151. ->whereIn('id', $request->get("requirement_ids"))
  152. ->update([
  153. 'plan_id' => $plan->id,
  154. ]);
  155. return $this->noContent();
  156. }
  157. public function unlinkPlan(LinkPlanRequest $request)
  158. {
  159. Requirement::query()->whereIn('id', $request->get("requirement_ids"))
  160. ->update([
  161. 'plan_id' => null,
  162. ]);
  163. return $this->noContent();
  164. }
  165. public function batchStore(BatchCreateRequest $request)
  166. {
  167. $requirementsData = $request->all();
  168. $companyId = Auth::user()->company_id;
  169. $created_by = Auth::id();
  170. DB::transaction(function () use ($requirementsData,$companyId,$created_by) {
  171. foreach ($requirementsData as $k => $data) {
  172. $requirement = new Requirement();
  173. $requirement->mergeFillable([
  174. 'company_id', 'created_by',
  175. ]);
  176. if($k != 0){
  177. $requirementsData[$k]["requirement_group_id"] = $requirementsData[$k]["requirement_group_id"] == 'ditto'?$requirementsData[$k-1]["requirement_group_id"]:$requirementsData[$k]["requirement_group_id"];
  178. $requirementsData[$k]["priority"] = $requirementsData[$k]["priority"] == 'ditto'? $requirementsData[$k-1]["priority"]: $requirementsData[$k]["priority"];
  179. }
  180. $requirement->fill([
  181. ...$requirementsData[$k],
  182. 'company_id' => $companyId,
  183. 'created_by' => $created_by,
  184. 'status' => RequirementStatus::ACTIVE,
  185. 'mailto' => [],
  186. ]);
  187. $requirement->save();
  188. ActionRepository::createRequirement(
  189. $requirement, ObjectAction::CREATED
  190. );
  191. }
  192. });
  193. return $this->created();
  194. }
  195. public function import(Request $request)
  196. {
  197. Excel::import(new RequirementImport(), $request->file("file"));
  198. return $this->created();
  199. }
  200. }