public function afterRequestProcessed(VisitProperties $visitProperties, Request $request)
{
$goalsConverted = $request->getMetadata('Goals', 'goalsConverted');
/** @var Action $action */
$action = $request->getMetadata('Actions', 'action');
// if the visit hasn't already been converted another way (ie, manual goal conversion or ecommerce conversion,
// try to convert based on the action)
if (empty($goalsConverted) && $action) {
$goalsConverted = $this->goalManager->detectGoalsMatchingUrl($request->getIdSite(), $action);
$existingGoalsConverted = $request->getMetadata('Goals', 'goalsConverted') ?: array();
$request->setMetadata('Goals', 'goalsConverted', array_merge($existingGoalsConverted, $goalsConverted));
if (!empty($goalsConverted)) {
$request->setMetadata('Goals', 'visitIsConverted', true);
}
}
// There is an edge case when:
// - two manual goal conversions happen in the same second
// - which result in handleExistingVisit throwing the exception
// because the UPDATE didn't affect any rows (one row was found, but not updated since no field changed)
// - the exception is caught here and will result in a new visit incorrectly
// In this case, we cancel the current conversion to be recorded:
$isManualGoalConversion = $this->isManualGoalConversion($request);
$requestIsEcommerce = $request->getMetadata('Goals', 'isRequestEcommerce');
$visitorNotFoundInDb = $request->getMetadata('CoreHome', 'visitorNotFoundInDb');
if ($visitorNotFoundInDb && ($isManualGoalConversion || $requestIsEcommerce)) {
$request->setMetadata('Goals', 'goalsConverted', array());
$request->setMetadata('Goals', 'visitIsConverted', false);
}
}