RequirementController.php 7.2 KB

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