RequirementImport.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace App\Imports;
  3. use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
  4. use App\Models\Enums\ObjectAction;
  5. use App\Models\Plan;
  6. use App\Models\Project;
  7. use App\Models\ProjectAsset;
  8. use App\Models\ProjectRequirement;
  9. use App\Models\Requirement;
  10. use App\Repositories\ActionRepository;
  11. use Illuminate\Support\Collection;
  12. use Illuminate\Support\Facades\Auth;
  13. use Maatwebsite\Excel\Concerns\ToCollection;
  14. use Maatwebsite\Excel\Concerns\WithHeadingRow;
  15. class RequirementImport implements ToCollection, WithHeadingRow
  16. {
  17. use ImportValidatorHelper;
  18. public function collection(Collection $collection): void
  19. {
  20. $this->validator($collection);
  21. foreach ($collection as $item) {
  22. $requirement = new Requirement();
  23. $requirement->mergeFillable([
  24. 'company_id', 'created_by',
  25. ]);
  26. $requirement->fill([
  27. ...$item->toArray(),
  28. 'company_id' => Auth::user()->company_id,
  29. 'created_by' => Auth::id(),
  30. 'mailto' => [],
  31. ]);
  32. $requirement->save();
  33. $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
  34. foreach ($projectIDs as $projectID) {
  35. ProjectRequirement::query()->firstOrCreate([
  36. 'project_id' => $projectID,
  37. 'requirement_id' => $requirement->id,
  38. 'asset_id' => $item['asset_id'] ?? null,
  39. 'requirement_group_id'=> $item['requirement_group_id'] ?? null,
  40. ]);
  41. }
  42. ActionRepository::createRequirement(
  43. $requirement, ObjectAction::CREATED
  44. );
  45. }
  46. }
  47. protected function validator(Collection $collection)
  48. {
  49. $this->validatorByCollection($collection, (new CreateOrUpdateRequest())->rules(), additional: function ($item) {
  50. if (! $item['asset_id']) {
  51. return "Asset cannot be empty.";
  52. }
  53. if ($item['plan_id']) {
  54. $plan = Plan::query()->where("asset_id", $item['asset_id'])->where("id", $item['plan_id'])->first();
  55. if (! $plan) {
  56. return "Plans are not assets.";
  57. }
  58. }
  59. $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
  60. if (! $projectIDs) {
  61. return null;
  62. }
  63. $count = ProjectAsset::query()->where("asset_id", $item['asset_id'])->whereIn('id', $projectIDs)->count();
  64. if ($count != count($projectIDs)) {
  65. return sprintf('Please select the items that are assets. Asset ID:%s, Project IDs: %s', $item['asset_id'], $item['project_ids']);
  66. }
  67. return null;
  68. });
  69. }
  70. }