*/ class MotionCloneController extends Controller { public function actionCopyToOtherConsultation(int $motionId, string $siteSubdomain, string $newConsultationUrl, int $newMotionTypeId): int { /** @var Motion|null $motion */ $motion = Motion::findOne($motionId); if (!$motion) { $this->stderr('Motion not found' . "\n"); return ExitCode::UNSPECIFIED_ERROR; } $newConsultation = $this->getConsultation($siteSubdomain, $newConsultationUrl); if ($newConsultation->siteId !== $motion->getMyConsultation()->siteId) { $this->stderr('Motion does not belong to the same site as consultation' . "\n"); return ExitCode::UNSPECIFIED_ERROR; } if ($newConsultation->id === $motion->consultationId) { $this->stderr('This command is meant to copy a motion to a different consultation' . "\n"); return ExitCode::UNSPECIFIED_ERROR; } $newMotionType = $newConsultation->getMotionType($newMotionTypeId); if (!$newMotionType->isCompatibleTo($motion->getMyMotionType(), [])) { $this->stderr('The new motion type is not compatible' . "\n"); return ExitCode::UNSPECIFIED_ERROR; } MotionDeepCopy::copyMotion($motion, $newMotionType, null, $motion->titlePrefix, $motion->version, false); $this->stdout('Successfully moved'); return 0; } private function getConsultation(string $siteSubdomain, string $consultationUrl): ?Consultation { /** @var Site|null $site */ $site = Site::findOne(['subdomain' => $siteSubdomain]); if (!$site) { $this->stderr('Site not found' . "\n"); return null; } $con = null; foreach ($site->consultations as $cons) { if ($cons->urlPath == $consultationUrl) { $con = $cons; } } if (!$con) { $this->stderr('Consultation not found' . "\n"); return null; } return $con; } }