322 lines
11 KiB
PHP
Executable File
322 lines
11 KiB
PHP
Executable File
<?php
|
||
|
||
namespace common\services\abiturientController\bachelor;
|
||
|
||
use common\components\AttachmentManager;
|
||
use common\components\ChangeHistoryManager;
|
||
use common\models\errors\RecordNotValid;
|
||
use common\models\User;
|
||
use common\modules\abiturient\models\bachelor\BachelorApplication;
|
||
use common\modules\abiturient\models\bachelor\BachelorSpeciality;
|
||
use common\modules\abiturient\models\bachelor\changeHistory\ChangeHistory;
|
||
use common\modules\abiturient\models\drafts\DraftsManager;
|
||
use common\modules\abiturient\models\interfaces\IDraftable;
|
||
use common\services\abiturientController\bachelor\BachelorService;
|
||
use Throwable;
|
||
use Yii;
|
||
use yii\helpers\ArrayHelper;
|
||
|
||
class ApplicationsService extends BachelorService
|
||
{
|
||
|
||
|
||
|
||
|
||
|
||
public function getApplications(User $currentUser): array
|
||
{
|
||
$currentUser->syncApplicationsAndQuestionaryWith1C();
|
||
return $currentUser->getApplications()
|
||
->andWhere(['not', [BachelorApplication::tableName() . '.draft_status' => IDraftable::DRAFT_STATUS_MODERATING]])
|
||
->all();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function archiveApplications(User $currentUser, BachelorApplication $application): void
|
||
{
|
||
$this->changeHistoryApplicationReturnDocs($currentUser, $application);
|
||
$application
|
||
->setArchiveInitiator($currentUser)
|
||
->setArchiveReason(DraftsManager::REASON_RETURN)
|
||
->archive();
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function markReturnApplication(User $currentUser, BachelorApplication $application): void
|
||
{
|
||
$application = DraftsManager::createApplicationDraftByOtherDraft($application, IDraftable::DRAFT_STATUS_SENT);
|
||
|
||
if ($this->request->isPost) {
|
||
AttachmentManager::handleAttachmentUpload([$application->getApplicationReturnAttachmentCollection()]);
|
||
}
|
||
|
||
$application->status = BachelorApplication::STATUS_WANTS_TO_RETURN_ALL;
|
||
$application->sent_at = time();
|
||
if (!$application->save()) {
|
||
throw new RecordNotValid($application);
|
||
}
|
||
|
||
$this->changeHistoryApplicationReturnDocs($currentUser, $application);
|
||
DraftsManager::clearOldSendings($application, $currentUser, DraftsManager::REASON_RETURN);
|
||
DraftsManager::clearOldModerations($application, $currentUser, DraftsManager::REASON_RETURN);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function returnApplication(BachelorApplication $application, bool $sandboxEnabled): string
|
||
{
|
||
if (!$sandboxEnabled && $this->request->isPost) {
|
||
AttachmentManager::handleAttachmentUpload([$application->getApplicationReturnAttachmentCollection()]);
|
||
}
|
||
|
||
$errorMessage = $this->returnApplicationIn1C($application);
|
||
if (!$errorMessage) {
|
||
$db = BachelorApplication::getDb();
|
||
$transaction = $db->beginTransaction();
|
||
|
||
try {
|
||
$application->markApplicationRemoved();
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
|
||
$errorMessage = $e->getMessage();
|
||
Yii::error("Ошибка отзыва заявления в ЛК: {$e->getMessage()} в:" . PHP_EOL . $e->getTraceAsString(), 'ApplicationsService.returnApplication');
|
||
}
|
||
}
|
||
|
||
return $errorMessage;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
private function changeHistoryApplicationReturnDocs(User $currentUser, BachelorApplication $application): void
|
||
{
|
||
$change = ChangeHistoryManager::persistChangeForEntity($currentUser, ChangeHistory::CHANGE_HISTORY_APPLICATION_RETURN_DOCS);
|
||
$change->application_id = $application->id;
|
||
if (!$change->save()) {
|
||
throw new RecordNotValid($change);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
private function returnApplicationIn1C(BachelorApplication $application): string
|
||
{
|
||
if (!$application->isIn1C()) {
|
||
return '';
|
||
}
|
||
|
||
$result = null;
|
||
$errorMessage = '';
|
||
|
||
$files_info = $application->getApplicationReturnFilesInfo();
|
||
$attachment = array_pop($files_info);
|
||
$returnAllApplicationsData = [
|
||
'AbiturientCode' => ArrayHelper::getValue($application, 'user.userRef.reference_id'),
|
||
'IdPK' => ArrayHelper::getValue($application, 'type.campaign.referenceType.reference_id'),
|
||
'Entrant' => $application->buildEntrantArray(),
|
||
'ReturnDocumentsScan' => AttachmentManager::buildAttachmentArrayTo1C(...$attachment)
|
||
];
|
||
try {
|
||
$result = Yii::$app->soapClientAbit->load(
|
||
'ReturnAllApplications',
|
||
$returnAllApplicationsData
|
||
);
|
||
} catch (Throwable $e) {
|
||
$errorMessage = $e->getMessage();
|
||
Yii::error("Ошибка отзыва заявления из 1С: {$e->getMessage()} в:" . PHP_EOL . $e->getTraceAsString(), 'ApplicationsService.returnApplicationIn1C');
|
||
|
||
return $errorMessage;
|
||
}
|
||
|
||
if (
|
||
!$errorMessage &&
|
||
isset(
|
||
$result->return,
|
||
$result->return->UniversalResponse,
|
||
$result->return->UniversalResponse->Complete
|
||
) &&
|
||
$result->return->UniversalResponse->Complete == '0'
|
||
) {
|
||
$log = [
|
||
'data' => $returnAllApplicationsData,
|
||
'result' => $result,
|
||
];
|
||
$errorMessage = $result->return->UniversalResponse->Description . PHP_EOL . print_r($log, true);
|
||
}
|
||
|
||
if ($errorMessage) {
|
||
Yii::error("Ошибка при выполнении метода ReturnAllApplications: {$errorMessage}", 'ApplicationsService.returnApplicationIn1C');
|
||
}
|
||
|
||
return $errorMessage;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
public function markRejectEnrollment(User $current_user, BachelorSpeciality $bachelor_spec): BachelorApplication
|
||
{
|
||
$spciality_id = $bachelor_spec->speciality_id;
|
||
$application = $bachelor_spec->application;
|
||
|
||
if ($application->draft_status == IDraftable::DRAFT_STATUS_APPROVED) {
|
||
$application = DraftsManager::createApplicationDraftByOtherDraft($bachelor_spec->application, IDraftable::DRAFT_STATUS_SENT);
|
||
}
|
||
|
||
$bachelor_spec_to_reject = $application->getSpecialities()
|
||
->joinWith('speciality speciality', false)
|
||
->andWhere(['speciality.id' => $spciality_id])
|
||
->one();
|
||
|
||
if ($this->request->isPost) {
|
||
$collection = $bachelor_spec_to_reject->getEnrollmentRejectionAttachmentCollection();
|
||
$collection->setIndex($bachelor_spec->id);
|
||
AttachmentManager::handleAttachmentUpload([$collection]);
|
||
}
|
||
|
||
$application->status = BachelorApplication::STATUS_ENROLLMENT_REJECTION_REQUESTED;
|
||
$application->sent_at = time();
|
||
if (!$application->save()) {
|
||
throw new RecordNotValid($application);
|
||
}
|
||
|
||
$this->changeHistoryApplicationReturnDocs($current_user, $application);
|
||
DraftsManager::clearOldSendings($application, $current_user, DraftsManager::REASON_RETURN);
|
||
DraftsManager::clearOldModerations($application, $current_user, DraftsManager::REASON_RETURN);
|
||
|
||
return $application;
|
||
}
|
||
|
||
public function rejectEnrollment(User $current_user, BachelorSpeciality $bachelor_spec, bool $sandboxEnabled)
|
||
{
|
||
if (!$sandboxEnabled && $this->request->isPost) {
|
||
AttachmentManager::handleAttachmentUpload([$bachelor_spec->getEnrollmentRejectionAttachmentCollection()]);
|
||
}
|
||
|
||
$application = $bachelor_spec->application;
|
||
|
||
$errorMessage = $this->rejectEnrollmentIn1C($bachelor_spec);
|
||
if (!$errorMessage) {
|
||
$db = BachelorApplication::getDb();
|
||
$transaction = $db->beginTransaction();
|
||
|
||
try {
|
||
$application->fullUpdateFrom1C();
|
||
$application->unblockApplication();
|
||
$application->status = BachelorApplication::STATUS_APPROVED;
|
||
$application->save(true, ['status']);
|
||
$application = DraftsManager::createArchivePoint(
|
||
$application,
|
||
DraftsManager::REASON_APPROVED,
|
||
IDraftable::DRAFT_STATUS_APPROVED
|
||
);
|
||
|
||
DraftsManager::clearOldSendings($application, $current_user, DraftsManager::REASON_APPROVED);
|
||
DraftsManager::clearOldModerations($application, $current_user, DraftsManager::REASON_APPROVED);
|
||
DraftsManager::removeOldApproved($application, $current_user, DraftsManager::REASON_APPROVED);
|
||
$application->type->toggleResubmitPermissions($application->user, false);
|
||
|
||
$transaction->commit();
|
||
} catch (Throwable $e) {
|
||
$transaction->rollBack();
|
||
|
||
$errorMessage = $e->getMessage();
|
||
Yii::error("Ошибка отказа от зачисления в ЛК: {$e->getMessage()} в:" . PHP_EOL . $e->getTraceAsString(), 'ApplicationsService.rejectEnrollment');
|
||
}
|
||
}
|
||
|
||
return $errorMessage;
|
||
}
|
||
|
||
public function rejectEnrollmentIn1C(BachelorSpeciality $bachelor_spec)
|
||
{
|
||
$application = $bachelor_spec->application;
|
||
|
||
if (!$application->isIn1C()) {
|
||
return '';
|
||
}
|
||
|
||
$result = null;
|
||
$errorMessage = '';
|
||
|
||
$files_info = $bachelor_spec->getEnrollmentRejectionFilesInfo();
|
||
if (empty($files_info)) {
|
||
Yii::error("Ошибка отзыва заявления", 'ApplicationsService.returnApplicationIn1C');
|
||
return Yii::t(
|
||
'abiturient/bachelor/print-application-return-form/all',
|
||
'Сообщение об ошибке при отказе от зачисления: `Не найден файл отказа от зачисления`'
|
||
);
|
||
}
|
||
|
||
$attachment = array_pop($files_info);
|
||
$request = [
|
||
'Entrant' => $application->buildEntrantArray(),
|
||
'Speciality' => $bachelor_spec->buildSpecialityArrayForEnrollmentRejection(),
|
||
'RejectEnrollmentScan' => AttachmentManager::buildAttachmentArrayTo1C(...$attachment)
|
||
];
|
||
try {
|
||
$result = Yii::$app->soapClientAbit->load(
|
||
'RejectEnrollment',
|
||
$request
|
||
);
|
||
} catch (Throwable $e) {
|
||
$errorMessage = $e->getMessage();
|
||
Yii::error("Ошибка отзыва заявления из 1С: {$e->getMessage()} в:" . PHP_EOL . $e->getTraceAsString(), 'ApplicationsService.returnApplicationIn1C');
|
||
|
||
return $errorMessage;
|
||
}
|
||
|
||
$universal_response = $result->return->UniversalResponse ?? $result->return ?? null;
|
||
$complete = $universal_response->Complete ?? 0;
|
||
$description = $universal_response->Description ?? 'Неизвестная ошибка';
|
||
|
||
if (!$errorMessage && !$complete) {
|
||
$log = [
|
||
'data' => $request,
|
||
'result' => $result,
|
||
];
|
||
$errorMessage = $description . PHP_EOL . print_r($log, true);
|
||
}
|
||
|
||
if ($errorMessage) {
|
||
Yii::error("Ошибка при выполнении метода RejectEnrollment: {$errorMessage}", 'ApplicationsService.rejectEnrollmentIn1C');
|
||
}
|
||
|
||
return $errorMessage;
|
||
}
|
||
}
|