/** * Validates the timeevent against the given timesheet. * * @param TimeEvent $timeEvent Time event to validate * @param Timesheet $timesheet Time sheet * @return mixed true if validate success, error string if not. */ public function validateTimeEvent($timeEvent, $timesheet) { $eventStartTime = $timeEvent->getStartTime(); $eventEndTime = $timeEvent->getEndTime(); $eventStart = strtotime($eventStartTime); $eventEnd = strtotime($eventEndTime); $periodStartDate = $timesheet->getStartDate(); $periodEndDate = $timesheet->getEndDate(); $periodStart = strtotime($periodStartDate); $periodEnd = strtotime($periodEndDate); $periodEnd = strtotime("+1 day", $periodEnd); // strtotime returns false (-1 before php 5.1.0) on error if (!($periodStart > 0) || !($periodEnd > 0) || $periodStart >= $periodEnd) { return self::INVALID_TIMESHEET_PERIOD_ERROR; } $reportedDate = $timeEvent->getReportedDate(); $reported = strtotime($reportedDate); $eventId = $timeEvent->getTimeEventId(); $newEvent = empty($eventId); if (!CommonFunctions::IsValidId($timeEvent->getProjectId())) { return self::ProjectNotSpecified_ERROR; } if (!CommonFunctions::IsValidId($timeEvent->getActivityId())) { return self::ActivityNotSpecified_ERROR; } if (!empty($eventStartTime) && !($eventStart > 0)) { return self::InvalidStartTime_ERROR; } if (!empty($eventEndTime) && !($eventEnd > 0)) { return self::InvalidEndTime_ERROR; } if (empty($reportedDate)) { return self::ReportedDateNotSpecified_ERROR; } else { if (!($reported > 0)) { return self::InvalidReportedDate_ERROR; } } $duration = $timeEvent->getDuration(); $duration = $duration === "" ? null : $duration; // 0 not allowed for duration in last row. if (!is_null($duration) && ($duration < 0 || $newEvent && $duration == 0)) { return self::InvalidDuration_ERROR; } // Validate period/interval if (empty($eventStartTime) && empty($eventEndTime) && !empty($duration)) { // reported date + duration if ($reported < $periodStart || $reported + $duration > $periodEnd) { return self::EVENT_OUTSIDE_PERIOD_FAILURE; } } else { if (!empty($eventStartTime) && empty($eventEndTime) && is_null($duration)) { // start time only if ($eventStart < $periodStart || $eventStart > $periodEnd) { return self::EVENT_OUTSIDE_PERIOD_FAILURE; } } else { if (!empty($eventStartTime) && !empty($eventEndTime)) { if (!empty($duration) && $newEvent) { return self::NotAllowedToSpecifyDurationAndInterval_ERROR; } // start and end time if ($eventStart >= $eventEnd) { return self::ZeroOrNegativeIntervalSpecified_ERROR; } if ($eventStart < $periodStart || $eventEnd > $periodEnd) { return self::EVENT_OUTSIDE_PERIOD_FAILURE; } $timeEvent->setDuration($eventEnd - $eventStart); } else { if (!empty($eventStartTime) && !empty($duration) && empty($eventEndTime)) { // start time and duration if ($eventStart < $periodStart || $eventStart + $duration > $periodEnd) { return self::EVENT_OUTSIDE_PERIOD_FAILURE; } $timeEvent->setEndTime(date("Y-m-d H:i", $eventStart + $duration)); } else { return self::NoValidDurationOrInterval_ERROR; } } } } return true; }