/** * This first parameter is to be updated be parameter two */ protected function updateSchedule(\Club\TeamBundle\Entity\Schedule $schedule, \Club\TeamBundle\Entity\Schedule $original) { if ($schedule == $original) { return; } $t1_first = clone $original->getFirstDate(); $t1_first->setDate(1970, 1, 1); $t2_first = clone $schedule->getFirstDate(); $t2_first->setDate(1970, 1, 1); $t1_end = clone $original->getEndDate(); $t1_end->setDate(1970, 1, 1); $t2_end = clone $schedule->getEndDate(); $t2_end->setDate(1970, 1, 1); $diff_first = $t1_first->diff($t2_first); $diff_end = $t1_end->diff($t2_end); $em = $this->getDoctrine()->getManager(); $schedule->resetInstructors(); $schedule->resetFields(); $schedule->setDescription($original->getDescription()); $schedule->setFirstDate(new \DateTime($schedule->getFirstDate()->sub($diff_first)->format('Y-m-d H:i:s'))); $schedule->setEndDate(new \DateTime($schedule->getEndDate()->sub($diff_end)->format('Y-m-d H:i:s'))); $schedule->setLevel($original->getLevel()); $schedule->setLocation($original->getLocation()); $schedule->setMaxAttend($original->getMaxAttend()); $schedule->setPenalty($original->getPenalty()); foreach ($original->getInstructors() as $instructor) { $schedule->addInstructor($instructor); } foreach ($original->getFields() as $field) { $schedule->addField($field); } $em->persist($schedule); }
public function generateSchedules(\Club\TeamBundle\Entity\Schedule $schedule, \DateTime $start) { // set end time if ($schedule->getRepetition()->getLastDate() != '') { $end = $schedule->getRepetition()->getLastDate(); } else { $end = new \DateTime(); $end->add(new \DateInterval('P10Y')); } // get diff interval $diff = $schedule->getFirstDate()->diff($schedule->getEndDate()); while ($start->getTimestamp() <= $end->getTimestamp()) { switch ($schedule->getRepetition()->getType()) { case 'daily': $this->addSchedule($start, $diff, $schedule); for ($i = 1; $i < $schedule->getRepetition()->getRepeatEvery(); $i++) { $start->add(new \DateInterval('P1D')); $this->deleteSchedule($start, $schedule); } $start->add(new \DateInterval('P1D')); break; case 'weekly': $curr_day = $start->format('N'); while ($curr_day < 8) { if (in_array($start->format('N'), $schedule->getRepetition()->getDaysInWeek())) { $this->addSchedule($start, $diff, $schedule); } else { $this->deleteSchedule($start, $schedule); } $curr_day++; $start->add(new \DateInterval('P1D')); } for ($i = 0; $i < ($schedule->getRepetition()->getRepeatEvery() - 1) * 7; $i++) { $start->add(new \DateInterval('P1D')); $this->deleteSchedule($start, $schedule); } break; case 'monthly': if ($schedule->getRepetition()->getDayOfMonth()) { $this->addSchedule($start, $diff, $schedule); $t1 = clone $start; $start->add(new \DateInterval('P' . $schedule->getRepetition()->getRepeatEvery() . 'M')); $t2 = clone $start; } else { if (!isset($init_time)) { $init_time = $start->getTimestamp(); $temp = new \DateTime($schedule->getRepetition()->getWeek() . ' ' . $schedule->getFirstDate()->format('D') . ' of ' . $start->format('F Y')); $start = new \DateTime($temp->format('Y-m-d') . ' ' . $start->format('H:i:s')); if ($init_time > $start->getTimestamp()) { $start->add(new \DateInterval('P1M')); $temp = new \DateTime($schedule->getRepetition()->getWeek() . ' ' . $schedule->getFirstDate()->format('D') . ' of ' . $start->format('F Y')); $start = new \DateTime($temp->format('Y-m-d') . ' ' . $start->format('H:i:s')); } } else { $temp = new \DateTime($schedule->getRepetition()->getWeek() . ' ' . $schedule->getFirstDate()->format('D') . ' of ' . $start->format('F Y')); $start = new \DateTime($temp->format('Y-m-d') . ' ' . $start->format('H:i:s')); } $this->addSchedule($start, $diff, $schedule); $t1 = clone $start; $start->add(new \DateInterval('P' . $schedule->getRepetition()->getRepeatEvery() . 'M')); $temp = new \DateTime($schedule->getRepetition()->getWeek() . ' ' . $schedule->getFirstDate()->format('D') . ' of ' . $start->format('F Y')); $start = new \DateTime($temp->format('Y-m-d') . ' ' . $start->format('H:i:s')); $t2 = clone $start; } $this->deleteBetween($t1, $schedule, $t2); break; case 'yearly': $this->addSchedule($start, $diff, $schedule); $t1 = clone $start; $start->add(new \DateInterval('P' . $schedule->getRepetition()->getRepeatEvery() . 'Y')); $t2 = clone $start; $this->deleteBetween($t1, $schedule, $t2); break; } if ($this->future_occur >= $this->future_occurs) { break; } if ($schedule->getRepetition()->getEndOccurrences() > 0 & $this->occur >= $schedule->getRepetition()->getEndOccurrences()) { break; } } $this->deleteBetween($start, $schedule); $this->em->flush(); }