backend/group-training : improve delete&copy week

This commit is contained in:
Roland Schneider 2021-10-10 23:01:18 +02:00
parent 5fe59ff1d3
commit 50011a4e4f
14 changed files with 226 additions and 131 deletions

View File

@ -230,11 +230,11 @@ class EventRegistrationManager extends BaseObject
}
if (isset($registration->canceled_at)) {
throw new BadRequestHttpException('The registration is already canceled', self::ALREADY_CANCELLED);
throw new BadRequestHttpException('The registration is already canceled: '.$registration->id, self::ALREADY_CANCELLED);
}
if (isset($registration->deleted_at)) {
throw new BadRequestHttpException('The reservation is already deleted', self::ALREADY_DELETED);
throw new BadRequestHttpException('The reservation is already deleted: '.$registration->id, self::ALREADY_DELETED);
}
$event = Event::findOne($registration->id_event);
@ -245,10 +245,10 @@ class EventRegistrationManager extends BaseObject
$now = strtotime("now UTC");
if ($reason != EventRegistration::CANCEL_REASON_CUSTOMER) {
if ($reason == EventRegistration::CANCEL_REASON_CUSTOMER) {
$timeUntilEventStart = $event->start - $now;
if ($timeUntilEventStart < Helper::getGroupTrainingRegistrationCancelLimitMinutes() * 60) {
throw new BadRequestHttpException('The reservation is already deleted', self::CANCEL_TIME_LIMIT_REACHED);
throw new BadRequestHttpException('The reservation can\'t be deleted', self::CANCEL_TIME_LIMIT_REACHED);
}
}
@ -302,9 +302,8 @@ class EventRegistrationManager extends BaseObject
$tx = $db->beginTransaction();
try {
$eventRegistrationManager = new EventRegistrationManager();
$allRegistrations = $eventRegistrationManager->findAllRegistrations($event->id);
$activeRegistrations = $eventRegistrationManager->findActiveRegistrations($event->id);
$allRegistrations = $this->findAllRegistrations($event->id);
$activeRegistrations = $this->findActiveRegistrations($event->id);
// ////////////////////////////////
// if event has no registrations

View File

@ -8,7 +8,6 @@ use common\models\CardEventRegistrationForm;
use common\models\EventEquipmentType;
use common\models\EventEquipmentTypeAssignment;
use common\models\EventRegistration;
use common\models\EventRegistrationEquipmentTypeAssignment;
use common\models\Trainer;
use common\modules\event\EventModule;
use common\modules\event\modelAndView\CreateEventModelAndView;
@ -20,7 +19,6 @@ use common\modules\event\models\EventPermissions;
use common\modules\event\models\timetable\TimeTableSearch;
use DateTime;
use Exception;
use Throwable;
use Yii;
use common\models\Event;
use common\modules\event\models\EventSearch;
@ -354,7 +352,7 @@ class EventController extends Controller
}
/**
* @param $id the id
* @param int $id the id
* @return string
* @throws NotFoundHttpException
*/

View File

@ -19,29 +19,6 @@ use yii\db\StaleObjectException;
class EventManager
{
/** @noinspection PhpUnused */
/**
* Delete or mark deleted an event
* @param $id
* @throws Throwable
* @throws \yii\base\Exception on any error
* @throws StaleObjectException
*/
public function deleteEvent($id)
{
$event = Event::findOne($id);
if (!isset($event)) {
throw new \yii\base\Exception("Event $id not found");
}
$registrations = $event->eventRegistrations;
if (!isset($registrations) || count($registrations) === 0) {
$event->delete();
} else {
$event->deleted_at = time();
$event->save(false);
}
}
/**
@ -91,10 +68,7 @@ class EventManager
}
// get events between active dates
$trainers = null;
if ( RoleDefinition::isTrainer() ){
$trainers = $this->getAssignedTrainerIDs(\Yii::$app->user->id);
}
$trainers = $this->getAssignedTrainerIDsForPermission();
$events = $this->getEvents($dateTimeFrom, $dateTimeTo,$trainers);
@ -236,7 +210,15 @@ class EventManager
public function getAssignedTrainerIDs($idUser){
$trainerObjects = $this->getAssignedTrainers($idUser);
return $this->mapTrainerToId($trainerObjects);
}
public function getAllTrainerIDs( ){
$trainerObjects = Trainer::find()->all();
return $this->mapTrainerToId($trainerObjects);
}
public function mapTrainerToId($trainerObjects){
$trainers = [];
foreach ($trainerObjects as $trainerObject){
$trainers[] = $trainerObject->id;
@ -244,6 +226,46 @@ class EventManager
return $trainers;
}
/**
* If the trainers are not limited by the 'trainer' role, null will be returned.
* If the user has the 'trainer' permission, but no trainer is assigned, empty array will be returned.
* Otherwise the array of assigned trainer IDs will be returned.
* @return array|null
*/
public function getAssignedTrainerIDsForPermission(){
if ( RoleDefinition::isTrainer()){
$trainers = $this->getAssignedTrainerIDs(\Yii::$app->user->id);
} else {
$trainers = $this->getAllTrainerIDs();
}
return $trainers;
}
/**
* @param $trainerIDs int[]|null the trainer IDs. Null means, all trainers are allowed
* @param $trainerId
* @return bool
*/
public function isTrainerAllowed($trainerIDs,$trainerId){
if ( !isset($trainerIDs) ){
return true;
}
return array_search($trainerId,$trainerIDs) !== false;
}
/**
* Use it with the result of getAssignedTrainerIDsForPermission().
* (
* @param $trainerIDs int[]|null the trainer IDs. Null means, all trainers are allowed
* @return bool
*/
public function hasAnyTrainerAllowed($trainerIDs ){
if ( !isset($trainerIDs)){
return true;
}
return count($trainerIDs) > 0;
}
}

View File

@ -2,13 +2,13 @@
namespace common\modules\event\models\copy;
use common\components\RoleDefinition;
use common\manager\EventRegistrationManager;
use common\modules\event\manager\EventManager;
use common\modules\event\models\timetable\TimeTableMonth;
use common\modules\event\models\timetable\TimeTableMonthWeek;
use customerapi\models\available\EventInterval;
use DateTime;
use Throwable;
use Yii;
use yii\base\Model;
@ -45,7 +45,6 @@ class ClearWeekForm extends Model
/**
* @param $params
* @throws Throwable
*/
public function clear($params){
$this->load($params);
@ -65,10 +64,17 @@ class ClearWeekForm extends Model
$events = $targetWeek->getAllEvents();
$trainers = $eventManager->getAssignedTrainerIDsForPermission();
$eventRegisterManager = new EventRegistrationManager();
if ( !$eventManager->hasAnyTrainerAllowed($trainers) ){
// no trainers assigned, can't do anything...
return;
}
foreach ($events as $event){
if ( $eventManager->isTrainerAllowed($trainers,$event->id_trainer) ){
$eventRegisterManager->deleteEvent($event);
}
}
}
}

View File

@ -0,0 +1,11 @@
<?php
namespace common\modules\event\models\copy;
use yii\base\BaseObject;
class CopyWeekContext extends BaseObject
{
public $copyWeekForm;
public $copyWeekFormModel;
}

View File

@ -2,6 +2,7 @@
namespace common\modules\event\models\copy;
use common\manager\EventRegistrationManager;
use common\modules\event\manager\EventManager;
use common\modules\event\models\timetable\TimeTableMonth;
use common\modules\event\models\timetable\TimeTableMonthDay;
@ -38,6 +39,8 @@ class CopyWeekSearch extends Model
public $sourceTimeTable;
public $targetTimeTable;
public $selectedEvents;
/**
* @inheritdoc
@ -45,7 +48,8 @@ class CopyWeekSearch extends Model
public function rules()
{
return [
[['sourceDateString','targetDateString'], 'required'],
[['selectedEvents'], 'safe'],
[['sourceDateString', 'targetDateString'], 'required'],
[['sourceDateString',], 'date', 'format' => Yii::$app->formatter->dateFormat, 'timestampAttribute' => 'timestampSource', 'timeZone' => 'UTC'],
[['targetDateString',], 'date', 'format' => Yii::$app->formatter->dateFormat, 'timestampAttribute' => 'timestampTarget', 'timeZone' => 'UTC'],
];
@ -77,18 +81,26 @@ class CopyWeekSearch extends Model
$targetDate = new DateTime();
$targetDate->setTimestamp($this->timestampTarget);
}
$this->sourceInterval = EventInterval::createInterval($sourceDate,7,7);
$this->targetInterval = EventInterval::createInterval($targetDate,7,7);
$this->sourceInterval = EventInterval::createInterval($sourceDate, 7, 7);
$this->targetInterval = EventInterval::createInterval($targetDate, 7, 7);
$eventManager = new EventManager();
$this->sourceTimeTable = $eventManager->loadTimeTable($this->sourceInterval,"display");
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval,"display");
$this->sourceTimeTable = $eventManager->loadTimeTable($this->sourceInterval, "display");
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval, "display");
// if ( !isset($_POST['command'])){
// $this->selectedEvents = [];
// $events = $this->sourceTimeTable->getAllEvents();
// foreach ($events as $event){
// $this->selectedEvents[] = $event->id;
// }
// }
}
/**
* @throws Exception
*/
public function save(){
public function save()
{
$sourceDate = new DateTime();
$sourceDate->setTimestamp($this->timestampSource);
@ -98,19 +110,20 @@ class CopyWeekSearch extends Model
$targetDate->setTimestamp($this->timestampTarget);
$targetDate->modify('this week');
$this->sourceInterval = EventInterval::createInterval($sourceDate,7,7);
$this->targetInterval = EventInterval::createInterval($targetDate,7,7);
$this->sourceInterval = EventInterval::createInterval($sourceDate, 7, 7);
$this->targetInterval = EventInterval::createInterval($targetDate, 7, 7);
// load the time table objects for source and target interval
$eventManager = new EventManager();
$this->sourceTimeTable = $eventManager->loadTimeTable($this->sourceInterval,"display");
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval,"display");
$this->sourceTimeTable = $eventManager->loadTimeTable($this->sourceInterval, "display");
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval, "display");
$sourceWeek = array_values( $this->sourceTimeTable->weeks )[0];
$targetWeek = array_values( $this->targetTimeTable->weeks )[0];
$sourceWeek = array_values($this->sourceTimeTable->weeks)[0];
$targetWeek = array_values($this->targetTimeTable->weeks)[0];
$eventRegistrationManager = new EventRegistrationManager();
// Iterate over all the week days: monday, tuesday, ...
foreach (EventInterval::weekdays as $weekday ){
foreach (EventInterval::weekdays as $weekday) {
// this is very ugly
// it returns eg.: $sourceWeek->monday , $sourceWeek->tuesday...
/** @var TimeTableMonthDay $sourceDay */
@ -121,7 +134,16 @@ class CopyWeekSearch extends Model
$sourceEvents = $sourceDay->events;
/** @var Event $sourceEvent */
foreach ($sourceEvents as $sourceEvent ){
foreach ($sourceEvents as $sourceEvent) {
$processEvent = true;
if (isset($this->selectedEvents)) {
$processEvent = in_array($sourceEvent->id, $this->selectedEvents);
}
if ($processEvent) {
if ($_POST['command' ] == 'delete') {
$eventRegistrationManager->deleteEvent($sourceEvent);
} else {
$event = new Event();
$event->start = $sourceEvent->start;
$event->id_room = $sourceEvent->id_room;
@ -131,7 +153,7 @@ class CopyWeekSearch extends Model
$event->active = $sourceEvent->active;
$event->deleted_at = $sourceEvent->deleted_at;
$start = $this->createDateTime( clone $targetDay->date , new DateTime( '@'. $event->start ) );
$start = $this->createDateTime(clone $targetDay->date, new DateTime('@' . $event->start));
$event->start = $start->getTimestamp();
// end date is start date + duration
@ -139,7 +161,8 @@ class CopyWeekSearch extends Model
$event->end = $start->getTimestamp() + $eventDuration;
$event->save(false);
}
}
}
}
@ -156,11 +179,12 @@ class CopyWeekSearch extends Model
* @return DateTime
* @throws Exception
*/
private function createDateTime($date,$time){
private function createDateTime($date, $time)
{
$result = new DateTime();
$result->setDate($date->format('Y'),$date->format('m'),$date->format('d'));
$result->setDate($date->format('Y'), $date->format('m'), $date->format('d'));
$result->setTimezone($time->getTimezone());
$result->setTime($time->format('H'),$time->format('i'));
$result->setTime($time->format('H'), $time->format('i'));
return $result;
}

View File

@ -1,33 +0,0 @@
<?php /** @noinspection PhpUnhandledExceptionInspection */
use common\modules\event\models\copy\CopyWeekSearch;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $model CopyWeekSearch */
?>
<div class="panel panel-default">
<div class="panel-heading">Másolás</div>
<div class="panel-body">
<?php $form = ActiveForm::begin(['options' =>['class' => 'form-inline' ]]); ?>
<?= $form->field($model, 'sourceDateString')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'targetDateString')->hiddenInput()->label(false) ?>
<div class="form-group">
<label for="inpSourceEvent">Forrás hét: </label>
<input type="text" id="inpSourceEvent" disabled class="form-control" value="<?=$model->sourceTimeTable->getWeekByIndex(0)->getWeekString()?>">
</div>
<div class="form-group">
<label for="inpTargetEvent">Cél hét:</label>
<input type="text" id="inpTargetEvent" disabled class="form-control" value="<?=$model->targetTimeTable->getWeekByIndex(0)->getWeekString()?>">
</div>
<?= Html::submitButton( 'Másol', ['class' => 'btn btn-success' ]) ?>
<?php ActiveForm::end(); ?>
</div>
</div>

View File

@ -1,7 +1,10 @@
<?php /** @noinspection PhpUnhandledExceptionInspection */
use common\modules\event\models\copy\CopyWeekContext;
use common\modules\event\models\copy\CopyWeekSearch;
use common\modules\event\widgets\timetable\TimeTableMonthView;
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $tableHeaders string */
@ -12,11 +15,56 @@ use common\modules\event\widgets\timetable\TimeTableMonthView;
<?php
echo $this->render('_copy_week_search', ['model' => $model]);
echo $this->render('_copy_week_form', ['model' => $model]);
?>
<?php $form = ActiveForm::begin(['options' =>['class' => 'form-inline' ]]); ?>
<div class="panel panel-default">
<div class="panel-heading">Másolás</div>
<div class="panel-body">
<?= $form->field($model, 'sourceDateString')->hiddenInput()->label(false) ?>
<?= $form->field($model, 'targetDateString')->hiddenInput()->label(false) ?>
<div class="form-group">
<label for="inpSourceEvent">Forrás hét: </label>
<input type="text" id="inpSourceEvent" disabled class="form-control" value="<?=$model->sourceTimeTable->getWeekByIndex(0)->getWeekString()?>">
</div>
<div class="form-group">
<label for="inpTargetEvent">Cél hét:</label>
<input type="text" id="inpTargetEvent" disabled class="form-control" value="<?=$model->targetTimeTable->getWeekByIndex(0)->getWeekString()?>">
</div>
<?= Html::submitButton( 'Forrás hét másolása', ['class' => 'btn btn-success', 'value' => 'copy', 'name' => 'command' ]) ?>
<?= Html::submitButton( 'Forrás hét törlése', ['class' => 'btn btn-danger', 'value' => 'delete', 'name' => 'command' ]) ?>
<p>
<small>
Ha egy esemény sincsen kiválasztva, akkor a másolás/törlés, minden eseményt érinteni fog.
(Nincs esemény kiválasztva = Minden esemény kiválasztva)
</small>
</p>
<p>
<small>Ha valamelyik esemény ki van választva, akkor a másolás/törlés, csak a kiválasztott esemény(eke)t fogja érinteni</small>
</p>
<p>
<small><strong>Esemény törlése:</strong> a már regisztrált vendégek kártyájára visszakerül az alkalom</small>
</p>
</div>
</div>
<h2>Forrás hét</h2>
<?= TimeTableMonthView::widget(['timeTable' => $model->sourceTimeTable]) ?>
<?= TimeTableMonthView::widget(
[
'timeTable' => $model->sourceTimeTable,
'copyWeekContext' =>new CopyWeekContext(
[
'copyWeekForm' => $form,
'copyWeekFormModel' => $model
]
)
]
) ?>
<?php ActiveForm::end(); ?>
<h2>Cél hét</h2>
<?= TimeTableMonthView::widget(['timeTable' => $model->targetTimeTable]) ?>

View File

@ -1,5 +1,6 @@
<?php
namespace common\modules\event\widgets\day;
use common\modules\event\models\copy\CopyWeekContext;
use common\modules\event\models\timetable\TimeTableMonthDay;
use yii\bootstrap\Widget;
@ -11,13 +12,15 @@ use yii\bootstrap\Widget;
* @package common\modules\event\widgets
*
* @property TimeTableMonthDay $day
* @property CopyWeekContext $copyWeekContext
*/
class TimeTableMonthDayView extends Widget
{
public $day;
public $copyWeekContext;
public function run(){
return $this->render('_day', [ 'day' => $this->day]);
return $this->render('_day', [ 'day' => $this->day,'copyWeekContext' => $this->copyWeekContext]);
}

View File

@ -1,5 +1,6 @@
<?php
/* @var $day TimeTableMonthDay */
/* @var $copyWeekContext \common\modules\event\models\copy\CopyWeekContext */
use common\models\Event;
use common\modules\event\models\timetable\TimeTableMonthDay;
@ -15,6 +16,6 @@ use common\modules\event\widgets\event\EventView;
} else {
/** @var Event $event */
foreach ($day->events as $event) {
echo EventView::widget(['event' => $event]);
echo EventView::widget(['event' => $event, 'copyWeekContext' => $copyWeekContext]);
}
} ?>

View File

@ -2,6 +2,7 @@
namespace common\modules\event\widgets\event;
use common\helpers\AppDateTimeHelper;
use common\models\Event;
use common\modules\event\models\copy\CopyWeekContext;
use DateTime;
use yii\bootstrap\Widget;
@ -11,6 +12,7 @@ use yii\bootstrap\Widget;
* @package common\modules\event\widgets
*
* @property Event $event
* @property CopyWeekContext $copyWeekContext
*/
class EventView extends Widget
{
@ -18,6 +20,8 @@ class EventView extends Widget
public $start;
public $end;
public $copyWeekContext;
public function init(){
parent::init();
if ( isset($this->event )){
@ -32,7 +36,8 @@ class EventView extends Widget
[
'event' => $this->event,
'start' => $this->start,
'end' => $this->end
'end' => $this->end,
'copyWeekContext' => $this->copyWeekContext
]
);
}

View File

@ -2,6 +2,8 @@
/* @var $event Event */
/* @var $start DateTime */
/* @var $end DateTime */
/* @var $copyWeekContext \common\modules\event\models\copy\CopyWeekContext */
use common\models\Event;
use common\modules\event\models\timetable\TimeTableMonthDay;
@ -14,7 +16,13 @@ if (!isset($event)) {
<?php
} else {
?>
<div class="alert alert-success">
<div class="alert alert-success" onclick=" ">
<?php if ( isset($copyWeekContext)) {?>
<div>
<?php echo Html::checkbox(Html::getInputName($copyWeekContext->copyWeekFormModel, 'selectedEvents[]') , isset($copyWeekContext->copyWeekFormModel->selectedEvents) && in_array($event->id, $copyWeekContext->copyWeekFormModel->selectedEvents), ['value' => $event->id] ); ?>
</div>
<?php }?>
<?= Html::a( $start->format('H:i') .'-' . $end->format('H:i') , Url::toRoute(['event/update', 'id' => $event->id ] ) ) ?>
<br>
<?= Html::a( $event->eventType->name ,

View File

@ -15,25 +15,27 @@ class TimeTableMonthView extends Widget
{
public $timeTable;
public $actionsColumn;
public $copyWeekContext;
public function run() {
return $this->render('_timetable', [
'timeTable' => $this->timeTable,
'actionsColumn' => ( isset($this->actionsColumn) ? $this->actionsColumn : null)
'actionsColumn' => ( isset($this->actionsColumn) ? $this->actionsColumn : null),
'copyWeekContext' => $this->copyWeekContext
]);
}
public static function renderDay($weekDay ){
public static function renderDay($weekDay , $copyWeekContext = null){
/**
* @param TimeTableMonthWeek $week
* @return string
*/
return static function ($week) use ($weekDay) {
return static function ($week) use ($weekDay, $copyWeekContext) {
return TimeTableMonthDayView::widget([
'day' => $week->getWeekDay($weekDay),
'copyWeekContext' => $copyWeekContext
]);
};

View File

@ -1,5 +1,6 @@
<?php
/* @var $timeTable TimeTableMonth */
/* @var $copyWeekContext \common\modules\event\models\copy\CopyWeekContext */
use common\models\Event;
use common\modules\event\models\timetable\TimeTableMonth;
@ -24,44 +25,44 @@ $columns = [
'attribute' => 'monday',
'label' => 'Hétfő',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('monday')
'value' => TimeTableMonthView::renderDay('monday',$copyWeekContext)
],
[
'attribute' => 'tuesday',
'label' => 'Kedd',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('tuesday')
'value' => TimeTableMonthView::renderDay('tuesday',$copyWeekContext)
],
[
'attribute' => 'wednesday',
'label' => 'Szerda',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('wednesday')
'value' => TimeTableMonthView::renderDay('wednesday',$copyWeekContext)
],
[
'attribute' => 'thursday',
'label' => 'Csütörtök',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('thursday')
'value' => TimeTableMonthView::renderDay('thursday',$copyWeekContext)
],
[
'attribute' => 'friday',
'label' => 'Péntek',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('friday')
'value' => TimeTableMonthView::renderDay('friday',$copyWeekContext)
],
[
'attribute' => 'saturday',
'format' => 'raw',
'label' => 'Szombat',
'value' => TimeTableMonthView::renderDay('saturday')
'value' => TimeTableMonthView::renderDay('saturday',$copyWeekContext)
],
[
'attribute' => 'Sunday',
'label' => 'Vasárnap',
'format' => 'raw',
'value' => TimeTableMonthView::renderDay('sunday')
'value' => TimeTableMonthView::renderDay('sunday',$copyWeekContext)
],
];