fix clear and copy week
This commit is contained in:
74
common/modules/event/models/copy/ClearWeekForm.php
Normal file
74
common/modules/event/models/copy/ClearWeekForm.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
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\TimeTableMonthWeek;
|
||||
use customerapi\models\available\EventInterval;
|
||||
use DateTime;
|
||||
use Throwable;
|
||||
use Yii;
|
||||
use yii\base\Model;
|
||||
|
||||
/**
|
||||
* @property string $sourceDateString
|
||||
* @property string $targetDateString
|
||||
* @property integer $timestampSource
|
||||
* @property integer $timestampTarget
|
||||
* @property EventInterval $sourceInterval
|
||||
* @property EventInterval $targetInterval
|
||||
* @property TimeTableMonth $sourceTimeTable
|
||||
* @property TimeTableMonth $targetTimeTable
|
||||
*/
|
||||
class ClearWeekForm extends Model
|
||||
{
|
||||
|
||||
public /** @noinspection PhpUnused */
|
||||
$targetDateString;
|
||||
public $timestampTarget;
|
||||
|
||||
|
||||
public $targetInterval;
|
||||
public $targetTimeTable;
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['targetDateString',], 'date', 'format' => Yii::$app->formatter->dateFormat, 'timestampAttribute' => 'timestampTarget', 'timeZone' => 'UTC'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $params
|
||||
* @throws Throwable
|
||||
*/
|
||||
public function clear($params){
|
||||
$this->load($params);
|
||||
$this->validate();
|
||||
|
||||
$targetDate = new DateTime('@'.$this->timestampTarget );
|
||||
$targetDate->modify('this week');
|
||||
|
||||
$this->targetInterval = EventInterval::createInterval($targetDate,7,7);
|
||||
|
||||
// load the time table objects for source and target interval
|
||||
$eventManager = new EventManager();
|
||||
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval);
|
||||
|
||||
/** @var TimeTableMonthWeek $targetWeek */
|
||||
$targetWeek = $this->targetTimeTable->getWeekByIndex(0);
|
||||
|
||||
$events = $targetWeek->getAllEvents();
|
||||
|
||||
$eventRegisterManager = new EventRegistrationManager();
|
||||
foreach ($events as $event){
|
||||
$eventRegisterManager->deleteEvent($event);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
132
common/modules/event/models/copy/CopyWeekForm.php
Normal file
132
common/modules/event/models/copy/CopyWeekForm.php
Normal file
@@ -0,0 +1,132 @@
|
||||
<?php
|
||||
|
||||
namespace common\modules\event\models\copy;
|
||||
|
||||
use common\models\Event;
|
||||
use common\modules\event\manager\EventManager;
|
||||
use common\modules\event\models\timetable\TimeTableMonth;
|
||||
use common\modules\event\models\timetable\TimeTableMonthDay;
|
||||
use customerapi\models\available\EventInterval;
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use Yii;
|
||||
use yii\base\Model;
|
||||
|
||||
/**
|
||||
* @property string $sourceDateString
|
||||
* @property string $targetDateString
|
||||
* @property integer $timestampSource
|
||||
* @property integer $timestampTarget
|
||||
* @property EventInterval $sourceInterval
|
||||
* @property EventInterval $targetInterval
|
||||
* @property TimeTableMonth $sourceTimeTable
|
||||
* @property TimeTableMonth $targetTimeTable
|
||||
*/
|
||||
class CopyWeekForm extends Model
|
||||
{
|
||||
|
||||
|
||||
public /** @noinspection PhpUnused */
|
||||
$sourceDateString;
|
||||
public $timestampSource;
|
||||
|
||||
public /** @noinspection PhpUnused */
|
||||
$targetDateString;
|
||||
public $timestampTarget;
|
||||
|
||||
public $sourceInterval;
|
||||
public $targetInterval;
|
||||
|
||||
public $sourceTimeTable;
|
||||
public $targetTimeTable;
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['sourceDateString',], 'date', 'format' => Yii::$app->formatter->dateFormat, 'timestampAttribute' => 'timestampSource', 'timeZone' => 'UTC'],
|
||||
[['targetDateString',], 'date', 'format' => Yii::$app->formatter->dateFormat, 'timestampAttribute' => 'timestampTarget', 'timeZone' => 'UTC'],
|
||||
[['targetDateString',], 'validateTargetWeekHasNoEvents'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function save(){
|
||||
|
||||
$sourceDate = new DateTime();
|
||||
$sourceDate->setTimestamp($this->timestampSource);
|
||||
$sourceDate->modify('this week');
|
||||
|
||||
$targetDate = new DateTime();
|
||||
$targetDate->setTimestamp($this->timestampTarget);
|
||||
$targetDate->modify('this week');
|
||||
|
||||
$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);
|
||||
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval);
|
||||
|
||||
$sourceWeek = $this->sourceTimeTable->weeks[0];
|
||||
$targetWeek = $this->targetTimeTable->weeks[0];
|
||||
|
||||
// Iterate over all the week days: monday, tuesday, ...
|
||||
foreach (EventInterval::weekdays as $weekday ){
|
||||
// this is very ugly
|
||||
// it returns eg.: $sourceWeek->monday , $sourceWeek->tuesday...
|
||||
/** @var TimeTableMonthDay $sourceDay */
|
||||
$sourceDay = $sourceWeek->$weekday;
|
||||
/** @var TimeTableMonthDay $targetDay */
|
||||
$targetDay = $targetWeek->$weekday;
|
||||
|
||||
$sourceEvents = $sourceDay->events;
|
||||
|
||||
/** @var Event $sourceEvent */
|
||||
foreach ($sourceEvents as $sourceEvent ){
|
||||
$event = new Event();
|
||||
$event->start = $sourceEvent->start;
|
||||
$event->id_room = $sourceEvent->id_room;
|
||||
$event->id_event_type = $sourceEvent->id_event_type;
|
||||
$event->id_trainer = $sourceEvent->id_trainer;
|
||||
$event->seat_count = $sourceEvent->seat_count;
|
||||
$event->active = $sourceEvent->active;
|
||||
$event->deleted_at = $sourceEvent->deleted_at;
|
||||
|
||||
$start = $this->createDateTime(new DateTime('@'.$targetDay->date),new DateTime('@'.$event->start));
|
||||
$event->start = $start->getTimestamp();
|
||||
|
||||
// end date is start date + duration
|
||||
$eventDuration = $sourceEvent->end - $sourceEvent->start;
|
||||
$event->end = $start->getTimestamp() + $eventDuration;
|
||||
|
||||
$event->save(false);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a DateTime object from 2 input DateTimes.
|
||||
* The first input will be used to set the date part.
|
||||
* The second input will be used to set the time part.
|
||||
*
|
||||
* @param DateTime $date the date part of the new date will set to the values of this object
|
||||
* @param DateTime $time the time part of the new date will set to the values of this object
|
||||
* @return DateTime
|
||||
* @throws Exception
|
||||
*/
|
||||
private function createDateTime($date,$time){
|
||||
$result = new DateTime();
|
||||
$result->setDate($date->format('Y'),$date->format('m'),$date->format('d'));
|
||||
$result->setTime($time->format('H'),$time->format('i'));
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -2,16 +2,15 @@
|
||||
|
||||
namespace common\modules\event\models\copy;
|
||||
|
||||
use common\components\DateUtil;
|
||||
use common\modules\event\manager\EventManager;
|
||||
use common\modules\event\models\timetable\TimeTableMonth;
|
||||
use common\modules\event\models\timetable\TimeTableMonthDay;
|
||||
use customerapi\models\available\EventInterval;
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use Yii;
|
||||
use common\models\Event;
|
||||
use yii\base\Model;
|
||||
use yii\data\ArrayDataProvider;
|
||||
|
||||
/**
|
||||
* @property string $sourceDateString
|
||||
@@ -39,7 +38,6 @@ class CopyWeekSearch extends Model
|
||||
public $sourceTimeTable;
|
||||
public $targetTimeTable;
|
||||
|
||||
public $tableHeaders;
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
@@ -47,6 +45,7 @@ class CopyWeekSearch extends Model
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
[['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'],
|
||||
];
|
||||
@@ -60,12 +59,9 @@ class CopyWeekSearch extends Model
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates data provider instance with search query applied
|
||||
*
|
||||
* @param array $params
|
||||
*
|
||||
* @throws Exception
|
||||
*/
|
||||
public function search($params)
|
||||
@@ -89,4 +85,84 @@ class CopyWeekSearch extends Model
|
||||
$this->sourceTimeTable = $eventManager->loadTimeTable($this->sourceInterval);
|
||||
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval);
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
public function save(){
|
||||
|
||||
$sourceDate = new DateTime();
|
||||
$sourceDate->setTimestamp($this->timestampSource);
|
||||
$sourceDate->modify('this week');
|
||||
|
||||
$targetDate = new DateTime();
|
||||
$targetDate->setTimestamp($this->timestampTarget);
|
||||
$targetDate->modify('this week');
|
||||
|
||||
$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);
|
||||
$this->targetTimeTable = $eventManager->loadTimeTable($this->targetInterval);
|
||||
|
||||
$sourceWeek = array_values( $this->sourceTimeTable->weeks)[0];
|
||||
$targetWeek = array_values($this->targetTimeTable->weeks)[0];
|
||||
|
||||
// Iterate over all the week days: monday, tuesday, ...
|
||||
foreach (EventInterval::weekdays as $weekday ){
|
||||
// this is very ugly
|
||||
// it returns eg.: $sourceWeek->monday , $sourceWeek->tuesday...
|
||||
/** @var TimeTableMonthDay $sourceDay */
|
||||
$sourceDay = $sourceWeek->$weekday;
|
||||
/** @var TimeTableMonthDay $targetDay */
|
||||
$targetDay = $targetWeek->$weekday;
|
||||
|
||||
$sourceEvents = $sourceDay->events;
|
||||
|
||||
/** @var Event $sourceEvent */
|
||||
foreach ($sourceEvents as $sourceEvent ){
|
||||
$event = new Event();
|
||||
$event->start = $sourceEvent->start;
|
||||
$event->id_room = $sourceEvent->id_room;
|
||||
$event->id_event_type = $sourceEvent->id_event_type;
|
||||
$event->id_trainer = $sourceEvent->id_trainer;
|
||||
$event->seat_count = $sourceEvent->seat_count;
|
||||
$event->active = $sourceEvent->active;
|
||||
$event->deleted_at = $sourceEvent->deleted_at;
|
||||
|
||||
$start = $this->createDateTime( clone $targetDay->date , new DateTime( '@'. $event->start ) );
|
||||
$event->start = $start->getTimestamp();
|
||||
|
||||
// end date is start date + duration
|
||||
$eventDuration = $sourceEvent->end - $sourceEvent->start;
|
||||
$event->end = $start->getTimestamp() + $eventDuration;
|
||||
|
||||
$event->save(false);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a DateTime object from 2 input DateTimes.
|
||||
* The first input will be used to set the date part.
|
||||
* The second input will be used to set the time part.
|
||||
*
|
||||
* @param DateTime $date the date part of the new date will set to the values of this object
|
||||
* @param DateTime $time the time part of the new date will set to the values of this object
|
||||
* @return DateTime
|
||||
* @throws Exception
|
||||
*/
|
||||
private function createDateTime($date,$time){
|
||||
$result = new DateTime();
|
||||
$result->setDate($date->format('Y'),$date->format('m'),$date->format('d'));
|
||||
$result->setTimezone($time->getTimezone());
|
||||
$result->setTime($time->format('H'),$time->format('i'));
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -29,4 +29,16 @@ class TimeTableMonth
|
||||
]);
|
||||
}
|
||||
|
||||
public function getAllEvents(){
|
||||
$events = [];
|
||||
foreach ($this->days as $day){
|
||||
$events = array_merge($events,$day->events);
|
||||
}
|
||||
return $events;
|
||||
}
|
||||
|
||||
public function getWeekByIndex($index) {
|
||||
return array_values($this->weeks)[$index];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ use customerapi\models\available\EventInterval;
|
||||
class TimeTableMonthWeek
|
||||
{
|
||||
|
||||
|
||||
public $monday;
|
||||
public $tuesday;
|
||||
public $wednesday;
|
||||
@@ -47,4 +46,43 @@ class TimeTableMonthWeek
|
||||
return $this->$objectAttribute;
|
||||
}
|
||||
|
||||
public function getAllDays(){
|
||||
$result = [];
|
||||
foreach (EventInterval::weekdays as $weekday ){
|
||||
$result[] = $this->$weekday;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \DateTime
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function getWeekStart()
|
||||
{
|
||||
$firstDayOfWeek = clone $this->monday->date ;
|
||||
$firstDayOfWeek->modify('this week');
|
||||
$firstDayOfWeek->setTime(0,0);
|
||||
return $firstDayOfWeek;
|
||||
}
|
||||
|
||||
public function getWeekNumber(){
|
||||
return $this->getWeekStart()->format('W');
|
||||
}
|
||||
|
||||
public function getWeekYear(){
|
||||
return $this->getWeekStart()->format('Y');
|
||||
}
|
||||
|
||||
public function getWeekString(){
|
||||
return $this->getWeekYear() . " - " . $this->getWeekNumber();
|
||||
}
|
||||
|
||||
public function getAllEvents(){
|
||||
$events = [];
|
||||
foreach ($this->getAllDays() as $day){
|
||||
$events = array_merge($events,$day->events);
|
||||
}
|
||||
return $events;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user