123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- <?php
- namespace App\Imports;
- use App\Http\Requests\API\Requirement\CreateOrUpdateRequest;
- use App\Models\Enums\ObjectAction;
- use App\Models\Plan;
- use App\Models\Project;
- use App\Models\ProjectAsset;
- use App\Models\ProjectRequirement;
- use App\Models\Requirement;
- use App\Repositories\ActionRepository;
- use Illuminate\Support\Collection;
- use Illuminate\Support\Facades\Auth;
- use Maatwebsite\Excel\Concerns\ToCollection;
- use Maatwebsite\Excel\Concerns\WithHeadingRow;
- class RequirementImport implements ToCollection, WithHeadingRow
- {
- use ImportValidatorHelper;
- public function collection(Collection $collection): void
- {
- $this->validator($collection);
- foreach ($collection as $item) {
- $requirement = new Requirement();
- $requirement->mergeFillable([
- 'company_id', 'created_by',
- ]);
- $requirement->fill([
- ...$item->toArray(),
- 'company_id' => Auth::user()->company_id,
- 'created_by' => Auth::id(),
- 'mailto' => [],
- ]);
- $requirement->save();
- $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
- foreach ($projectIDs as $projectID) {
- ProjectRequirement::query()->firstOrCreate([
- 'project_id' => $projectID,
- 'requirement_id' => $requirement->id,
- 'asset_id' => $item['asset_id'] ?? null,
- 'requirement_group_id'=> $item['requirement_group_id'] ?? null,
- ]);
- }
- ActionRepository::createRequirement(
- $requirement, ObjectAction::CREATED
- );
- }
- }
- protected function validator(Collection $collection)
- {
- $this->validatorByCollection($collection, (new CreateOrUpdateRequest())->rules(), additional: function ($item) {
- if (! $item['asset_id']) {
- return "Asset cannot be empty.";
- }
- if ($item['plan_id']) {
- $plan = Plan::query()->where("asset_id", $item['asset_id'])->where("id", $item['plan_id'])->first();
- if (! $plan) {
- return "Plans are not assets.";
- }
- }
- $projectIDs = array_filter(array_unique(explode(',', $item['project_ids'])));
- if (! $projectIDs) {
- return null;
- }
- $count = ProjectAsset::query()->where("asset_id", $item['asset_id'])->whereIn('id', $projectIDs)->count();
- if ($count != count($projectIDs)) {
- return sprintf('Please select the items that are assets. Asset ID:%s, Project IDs: %s', $item['asset_id'], $item['project_ids']);
- }
- return null;
- });
- }
- }
|