336 lines
11 KiB
PHP
336 lines
11 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace common\services\abiturientController\bachelor;
|
|||
|
|
|||
|
use common\components\ChangeHistoryManager;
|
|||
|
use common\components\configurationManager;
|
|||
|
use common\components\notifier\notifier;
|
|||
|
use common\models\errors\RecordNotValid;
|
|||
|
use common\models\User;
|
|||
|
use common\modules\abiturient\models\bachelor\ApplicationHistory;
|
|||
|
use common\modules\abiturient\models\bachelor\ApplicationType;
|
|||
|
use common\modules\abiturient\models\bachelor\BachelorApplication;
|
|||
|
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistory;
|
|||
|
use common\modules\abiturient\models\drafts\DraftsManager;
|
|||
|
use common\modules\abiturient\models\interfaces\ApplicationInterface;
|
|||
|
use common\modules\abiturient\models\interfaces\IDraftable;
|
|||
|
use common\services\abiturientController\bachelor\BachelorService;
|
|||
|
use Throwable;
|
|||
|
use Yii;
|
|||
|
use yii\helpers\Url;
|
|||
|
use yii\web\Request;
|
|||
|
|
|||
|
class Application1CProcessorService extends BachelorService
|
|||
|
{
|
|||
|
|
|||
|
protected notifier $notifier;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function __construct(
|
|||
|
Request $request,
|
|||
|
notifier $notifier,
|
|||
|
configurationManager $configurationManager
|
|||
|
)
|
|||
|
{
|
|||
|
$this->request = $request;
|
|||
|
$this->notifier = $notifier;
|
|||
|
$this->configurationManager = $configurationManager;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function updateApplication(BachelorApplication $application): BachelorApplication
|
|||
|
{
|
|||
|
$actual_app = DraftsManager::getActualApplication($application->user, $application->type, true);
|
|||
|
if ($actual_app && $application->draft_status == IDraftable::DRAFT_STATUS_APPROVED) {
|
|||
|
$application = $actual_app;
|
|||
|
}
|
|||
|
|
|||
|
if (
|
|||
|
!$actual_app ||
|
|||
|
$application->id == $actual_app->id
|
|||
|
) {
|
|||
|
return $application;
|
|||
|
}
|
|||
|
|
|||
|
$application->fullUpdateFrom1C();
|
|||
|
|
|||
|
return DraftsManager::createArchivePoint(
|
|||
|
$application,
|
|||
|
DraftsManager::REASON_UPDATED_FROM_1C,
|
|||
|
$application->draft_status
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function createApplicationCopy(User $currentUser, BachelorApplication $application): array
|
|||
|
{
|
|||
|
$new_status = IDraftable::DRAFT_STATUS_CREATED;
|
|||
|
if ($application->isArchive()) {
|
|||
|
return [
|
|||
|
'url' => Url::to(['/abiturient/applications']),
|
|||
|
'error_alert' => Yii::t('abiturient/errors', 'Сообщение поступающему при работе с архивным заявлением: `Вы работаете с неактуальной версией заявления`'),
|
|||
|
];
|
|||
|
}
|
|||
|
if (!$application->type->checkResubmitPermission($application->user) && $application->hasApprovedApplication()) {
|
|||
|
return [
|
|||
|
'url' => Url::to(['/abiturient/applications']),
|
|||
|
'error_alert' => Yii::t('abiturient/errors', 'Текст ошибки при повторной подаче заявления: `В данную приёмную капанию запрещена подача заявлений после одобрения модератором, для повторной подачи заявления необходимо обратиться в приёмную кампанию.`'),
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
if (!$application->canCreateDraft()) {
|
|||
|
return [
|
|||
|
'url' => '',
|
|||
|
'error_alert' => Yii::$app->configurationManager->getText('text_on_disable_creating_draft_if_exist_sent_application'),
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
if (!$currentUser->canMakeStep('make-application', $application)) {
|
|||
|
return [
|
|||
|
'url' => '',
|
|||
|
'error_alert' => Yii::t(
|
|||
|
'abiturient/header',
|
|||
|
'Текст алерта о необходимости заполнения анкеты на панели навигации ЛК: `Для создания заявления необходимо заполнить анкету`'
|
|||
|
),
|
|||
|
];
|
|||
|
}
|
|||
|
gc_disable();
|
|||
|
$db = BachelorApplication::getDb();
|
|||
|
$transaction = $db->beginTransaction();
|
|||
|
try {
|
|||
|
$old_app = DraftsManager::getApplicationDraft($application->user, $application->type, $new_status);
|
|||
|
$new_app = DraftsManager::createApplicationDraftByOtherDraft($application, $new_status);
|
|||
|
if ($old_app) {
|
|||
|
$old_app
|
|||
|
->setArchiveInitiator($currentUser)
|
|||
|
->archive();
|
|||
|
}
|
|||
|
$new_app->unblockApplication();
|
|||
|
|
|||
|
$transaction->commit();
|
|||
|
} catch (Throwable $e) {
|
|||
|
$transaction->rollBack();
|
|||
|
throw $e;
|
|||
|
}
|
|||
|
if ($application->draft_status == IDraftable::DRAFT_STATUS_APPROVED && $application->user) {
|
|||
|
|
|||
|
$application->user->updateUserRefDataVersion();
|
|||
|
}
|
|||
|
|
|||
|
return [
|
|||
|
'url' => Url::to(['bachelor/application', 'id' => $new_app->id]),
|
|||
|
'error_alert' => '',
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function getApplicationTypeFromPost(User $currentUser): ?ApplicationType
|
|||
|
{
|
|||
|
$typeId = $this->request->post('application_type');
|
|||
|
$existingApplication = BachelorApplication::find()
|
|||
|
->where([
|
|||
|
BachelorApplication::tableName() . '.type_id' => (int)$typeId,
|
|||
|
BachelorApplication::tableName() . '.user_id' => $currentUser->id,
|
|||
|
BachelorApplication::tableName() . '.archive' => false
|
|||
|
])
|
|||
|
->andWhere(['not', [BachelorApplication::tableName() . '.draft_status' => IDraftable::DRAFT_STATUS_MODERATING]])
|
|||
|
->one();
|
|||
|
|
|||
|
if ($existingApplication) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
return ApplicationType::findOne([
|
|||
|
'archive' => false,
|
|||
|
'id' => (int)$typeId,
|
|||
|
]);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function createBachelorApplication(User $currentUser, ApplicationType $applicationType): ?BachelorApplication
|
|||
|
{
|
|||
|
$bachelorApplication = new BachelorApplication();
|
|||
|
$bachelorApplication->user_id = $currentUser->id;
|
|||
|
$bachelorApplication->type_id = $applicationType->id;
|
|||
|
if (!$bachelorApplication->save()) {
|
|||
|
throw new RecordNotValid($bachelorApplication);
|
|||
|
}
|
|||
|
|
|||
|
$bachelorApplication->addApplicationHistory(ApplicationHistory::TYPE_QUESTIONARY_CHANGED);
|
|||
|
if (
|
|||
|
$currentUser->abiturientQuestionary != null &&
|
|||
|
$currentUser->abiturientQuestionary->addressData &&
|
|||
|
$currentUser->abiturientQuestionary->addressData->not_found
|
|||
|
) {
|
|||
|
$bachelorApplication->addApplicationHistory(ApplicationHistory::TYPE_NOT_KLADR);
|
|||
|
}
|
|||
|
|
|||
|
return $bachelorApplication;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function sendApplicationTo1C(User $currentUser, BachelorApplication $application): array
|
|||
|
{
|
|||
|
$is_first_attempt = $application->isFirstAttemptSendApp();
|
|||
|
$hasError = false;
|
|||
|
if ($application->user_id != $currentUser->id) {
|
|||
|
return [];
|
|||
|
}
|
|||
|
if (!$this->configurationManager->sandboxEnabled) {
|
|||
|
$application->getNonSandboxSendHandler()->send();
|
|||
|
} else {
|
|||
|
[
|
|||
|
'hasError' => $hasError,
|
|||
|
'application' => $application
|
|||
|
] = $this->sendApplicationToSandbox($currentUser, $application);
|
|||
|
}
|
|||
|
|
|||
|
if ($hasError) {
|
|||
|
return [];
|
|||
|
}
|
|||
|
$application->notifyAboutSendApplicationToCommission($is_first_attempt);
|
|||
|
|
|||
|
return [
|
|||
|
'category' => 'abiturient',
|
|||
|
'event' => 'application_apply',
|
|||
|
'data' => [
|
|||
|
'public_identity' => $currentUser->getPublicIdentity(),
|
|||
|
'user_id' => $currentUser->getId(),
|
|||
|
'campaign' => $application->type->campaignName,
|
|||
|
]
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private function sendApplicationToSandbox(User $currentUser, BachelorApplication $application): array
|
|||
|
{
|
|||
|
$hasError = false;
|
|||
|
$db = BachelorApplication::getDb();
|
|||
|
$transaction = $db->beginTransaction();
|
|||
|
try {
|
|||
|
|
|||
|
$oldStatus = $application->status;
|
|||
|
$new_status = $this->applicationStatusSwitcher($oldStatus, $application);
|
|||
|
|
|||
|
$application->moderator_comment = null;
|
|||
|
$application->approver_id = null;
|
|||
|
$application->approved_at = null;
|
|||
|
$application->status = $new_status;
|
|||
|
$application->sent_at = time();
|
|||
|
if (!$application->save()) {
|
|||
|
throw new RecordNotValid($application);
|
|||
|
}
|
|||
|
$change = ChangeHistoryManager::persistChangeForEntity($currentUser, ChangeHistory::CHANGE_HISTORY_APPLICATION_MODERATE);
|
|||
|
$change->application_id = $application->id;
|
|||
|
if (!$change->save()) {
|
|||
|
throw new RecordNotValid($change);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
$application = DraftsManager::createArchivePoint(
|
|||
|
$application,
|
|||
|
DraftsManager::REASON_SENT,
|
|||
|
IDraftable::DRAFT_STATUS_SENT
|
|||
|
);
|
|||
|
|
|||
|
DraftsManager::clearOldSendings($application, $currentUser, DraftsManager::REASON_SENT);
|
|||
|
DraftsManager::clearOldModerations($application, $currentUser, DraftsManager::REASON_SENT);
|
|||
|
|
|||
|
$this->notifier->notifyAboutSendApplication($currentUser->id);
|
|||
|
|
|||
|
$transaction->commit();
|
|||
|
} catch (Throwable $e) {
|
|||
|
$transaction->rollBack();
|
|||
|
|
|||
|
$hasError = true;
|
|||
|
}
|
|||
|
|
|||
|
return ['hasError' => $hasError, 'application' => $application];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
private function applicationStatusSwitcher(int $oldStatus, BachelorApplication $application): int
|
|||
|
{
|
|||
|
switch ($oldStatus) {
|
|||
|
case BachelorApplication::STATUS_CREATED:
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
$new_status = BachelorApplication::STATUS_SENT;
|
|||
|
$actual_app = DraftsManager::getActualApplication($application->user, $application->type);
|
|||
|
if ($actual_app) {
|
|||
|
return BachelorApplication::STATUS_SENT_AFTER_APPROVED;
|
|||
|
}
|
|||
|
|
|||
|
$previous_sent_draft = $application->getParentDraft();
|
|||
|
if (!$previous_sent_draft) {
|
|||
|
return $new_status;
|
|||
|
}
|
|||
|
|
|||
|
if (in_array($previous_sent_draft->status, [ApplicationInterface::STATUS_REJECTED_BY1C, ApplicationInterface::STATUS_NOT_APPROVED])) {
|
|||
|
return BachelorApplication::STATUS_SENT_AFTER_NOT_APPROVED;
|
|||
|
}
|
|||
|
|
|||
|
if (in_array($previous_sent_draft->status, [ApplicationInterface::STATUS_SENT_AFTER_APPROVED, ApplicationInterface::STATUS_SENT_AFTER_NOT_APPROVED])) {
|
|||
|
return $previous_sent_draft->status;
|
|||
|
}
|
|||
|
|
|||
|
return $new_status;
|
|||
|
|
|||
|
case BachelorApplication::STATUS_APPROVED:
|
|||
|
return BachelorApplication::STATUS_SENT_AFTER_APPROVED;
|
|||
|
|
|||
|
case BachelorApplication::STATUS_NOT_APPROVED:
|
|||
|
case BachelorApplication::STATUS_REJECTED_BY1C:
|
|||
|
return BachelorApplication::STATUS_SENT_AFTER_NOT_APPROVED;
|
|||
|
|
|||
|
case BachelorApplication::STATUS_SENT_AFTER_APPROVED:
|
|||
|
case BachelorApplication::STATUS_SENT_AFTER_NOT_APPROVED:
|
|||
|
return $oldStatus;
|
|||
|
|
|||
|
case BachelorApplication::STATUS_ENROLLMENT_REJECTION_REQUESTED:
|
|||
|
return BachelorApplication::STATUS_ENROLLMENT_REJECTION_REQUESTED;
|
|||
|
|
|||
|
default:
|
|||
|
return BachelorApplication::STATUS_SENT;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|