questionary = $questionary; } public function attachFileToQuestionaryAttachments(IReceivedFile $receivingFile, array $attachmentTypeIds, File $file = null): ?File { $questionary_types = AttachmentType::GetCommonAttachmentTypesQuery([ PageRelationManager::RELATED_ENTITY_REGISTRATION, PageRelationManager::RELATED_ENTITY_QUESTIONARY ]); $questionary_types = $questionary_types->andWhere(['at.id' => $attachmentTypeIds])->select(['at.id'])->column(); if ($questionary_types) { foreach ($questionary_types as $questionary_type_id) { $attachment = Attachment::find() ->joinWith(['linkedFile']) ->andWhere([ 'owner_id' => $this->questionary->user->id, 'attachment_type_id' => $questionary_type_id, 'questionary_id' => $this->questionary->id, ]) ->andWhere([ File::tableName() . '.content_hash' => $receivingFile->getHash(), ]) ->one(); if (!$attachment) { $attachment = new Attachment(); $attachment->owner_id = $this->questionary->user->id; $attachment->questionary_id = $this->questionary->id; $attachment->attachment_type_id = $questionary_type_id; $attachment->scenario = Attachment::SCENARIO_RECOVER; if (!$attachment->save()) { throw new RecordNotValid($attachment); } } if (!$file) { $file = $receivingFile->getFile($attachment); } $attachment->LinkFile($file); } } return $file; } public function attachFileToQuestionaryRegulations(IReceivedFile $receivingFile, array $attachmentTypeIds, File $file = null): ?File { $userRegulations = $this->questionary ->getUserRegulations() ->joinWith([ 'regulation', 'regulation.attachmentType', ]) ->andWhere([ AttachmentType::tableName() . '.id' => $attachmentTypeIds, ]) ->andWhere([ 'or', [UserRegulation::tableName() . '.is_confirmed' => true], [Regulation::tableName() . '.confirm_required' => false], ]) ->all(); return $this->ensureFileAttachedToRegulations($userRegulations, $receivingFile, $file); } public function attachFileToUserRegulations(IReceivedFile $receivingFile, array $attachmentTypeIds, File $file = null): ?File { $userRegulations = $this->questionary->user->getCleanUserRegulations() ->joinWith([ 'regulation', 'regulation.attachmentType', ]) ->andWhere([ AttachmentType::tableName() . '.id' => $attachmentTypeIds, ]) ->andWhere([ 'or', [UserRegulation::tableName() . '.is_confirmed' => true], [Regulation::tableName() . '.confirm_required' => false], ]) ->all(); return $this->ensureFileAttachedToRegulations($userRegulations, $receivingFile, $file); } private function ensureFileAttachedToRegulations(array $userRegulations, IReceivedFile $receivingFile, ?File $file): ?File { foreach ($userRegulations as $userRegulation) { $attachment = $userRegulation ->getAttachments() ->joinWith(['linkedFile']) ->andWhere([ File::tableName() . '.content_hash' => $receivingFile->getHash(), ]) ->one(); if (!$attachment) { $attachment = new Attachment(); $attachment->owner_id = $this->questionary->user->id; $attachment->attachment_type_id = $userRegulation->regulation->attachmentType->id; $attachment->scenario = Attachment::SCENARIO_RECOVER; if (!$attachment->save()) { throw new RecordNotValid($attachment); } $userRegulation->link('rawAttachments', $attachment); } if (!$file) { $file = $receivingFile->getFile($attachment); } $attachment->LinkFile($file); } return $file; } }