isVisitorKnown()) { return 0; } $prevSecondsSinceFirst = $visitor->getPreviousVisitColumn('visitor_seconds_since_first'); // no data for previous visit, we can't calculate for this one if ($prevSecondsSinceFirst === null || $prevSecondsSinceFirst === false || $prevSecondsSinceFirst === '' ) { return null; } $prevVisitStart = $visitor->getPreviousVisitColumn('visit_first_action_time'); $currentVisitStart = $visitor->getVisitorColumn('visit_first_action_time'); if (empty($prevVisitStart) || empty($currentVisitStart) ) { Common::printDebug("Unexpected: found empty visit first action time for either previous or current visit (previous = $prevVisitStart, current = $currentVisitStart)"); return null; } try { $timeBetweenVisitStarts = Date::factory($currentVisitStart)->getTimestamp() - Date::factory($prevVisitStart)->getTimestamp(); } catch (\Exception $ex) { Common::printDebug("Error in parsing current/previous visit start datetime values: " . $ex->getMessage()); return null; } $newVisitorSecondsSinceFirst = $prevSecondsSinceFirst + $timeBetweenVisitStarts; if ($newVisitorSecondsSinceFirst < 0) { // visit in the past return null; } return $newVisitorSecondsSinceFirst; } /** * @param Request $request * @param Visitor $visitor * @param Action|null $action * @return mixed */ public function onAnyGoalConversion(Request $request, Visitor $visitor, $action) { return $visitor->getVisitorColumn($this->columnName); } }