RequirementController.php 7.5 KB

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