RequirementController.php 7.8 KB

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