static function CancelRatingVote($arParam)
{
global $DB, $CACHE_MANAGER;
$connection = BitrixMainApplication::getConnection();
$helper = $connection->getSqlHelper();
$err_mess = (CRatings::err_mess())."
Function: CancelRatingVote
Line: ";
$sqlStr = "
SELECT
RVG.ID,
RV.ID AS VOTE_ID,
RV.REACTION AS REACTION,
RV.VALUE AS VOTE_VALUE,
RVG.TOTAL_POSITIVE_VOTES
FROM
b_rating_voting RVG,
b_rating_vote RV
WHERE
RVG.ENTITY_TYPE_ID = '".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."'
and RVG.ENTITY_ID = ".(int)$arParam['ENTITY_ID']."
and RVG.ID = RV.RATING_VOTING_ID
and RV.USER_ID = ".(int)$arParam['USER_ID'];
$res = $DB->Query($sqlStr, false, $err_mess.__LINE__);
if ($arVote = $res->Fetch())
{
$votePlus = $arVote['VOTE_VALUE'] >= 0 ? true : false;
$arVote['REACTION'] = ($arVote['REACTION'] <> '' ? $arVote['REACTION'] : self::REACTION_DEFAULT);
if ($votePlus)
{
$rsRVR = $DB->Query("SELECT TOTAL_VOTES FROM b_rating_voting_reaction WHERE ENTITY_TYPE_ID='".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."' AND ENTITY_ID='".(int)$arParam['ENTITY_ID']."'", false, $err_mess.__LINE__);
if (!($arRVR = $rsRVR->fetch())) // reactions not initialized
{
$merge = $helper->prepareMerge('b_rating_voting_reaction', ['ENTITY_TYPE_ID', 'ENTITY_ID', 'REACTION'], [
'ENTITY_TYPE_ID' => $arParam['ENTITY_TYPE_ID'],
'ENTITY_ID' => $arParam['ENTITY_ID'],
'REACTION' => self::REACTION_DEFAULT,
'TOTAL_VOTES' => $arVote['TOTAL_POSITIVE_VOTES'],
], [
'TOTAL_VOTES' => $arVote['TOTAL_POSITIVE_VOTES'],
]);
if ($merge[0])
{
$DB->query($merge[0]);
}
}
}
$arFields = array(
'TOTAL_VOTES' => "TOTAL_VOTES-1",
'TOTAL_VALUE' => "TOTAL_VALUE".($votePlus ? '-'.(float)$arVote['VOTE_VALUE'] : '+'.(float)(-1 * $arVote['VOTE_VALUE'])),
'LAST_CALCULATED' => $DB->GetNowFunction(),
);
$arFields[($votePlus ? 'TOTAL_POSITIVE_VOTES' : 'TOTAL_NEGATIVE_VOTES')] = ($votePlus ? 'TOTAL_POSITIVE_VOTES-1' : 'TOTAL_NEGATIVE_VOTES-1');
$DB->Update("b_rating_voting", $arFields, "WHERE ID=".(int)$arVote['ID'], $err_mess.__LINE__);
if ($votePlus)
{
$merge = $helper->prepareMerge('b_rating_voting_reaction', ['ENTITY_TYPE_ID', 'ENTITY_ID', 'REACTION'], [
'ENTITY_TYPE_ID' => $arParam['ENTITY_TYPE_ID'],
'ENTITY_ID' => $arParam['ENTITY_ID'],
'REACTION' => $arVote['REACTION'],
'TOTAL_VOTES' => 0,
], [
'TOTAL_VOTES' => new BitrixMainDBSqlExpression('b_rating_voting_reaction.TOTAL_VOTES - 1'),
]);
if ($merge[0])
{
$DB->query($merge[0]);
}
}
$DB->Query("DELETE FROM b_rating_vote WHERE ID=".(int)$arVote['VOTE_ID'], false, $err_mess.__LINE__);
$arParam['REACTIONS_LIST'] = array();
$rsRVR = $DB->Query("SELECT REACTION, TOTAL_VOTES FROM b_rating_voting_reaction WHERE ENTITY_TYPE_ID='".$DB->ForSql($arParam['ENTITY_TYPE_ID'])."' AND ENTITY_ID='".(int)$arParam['ENTITY_ID']."'", false, $err_mess.__LINE__);
while($arRVR = $rsRVR->fetch())
{
$arParam['REACTIONS_LIST'][$arRVR['REACTION']] = $arRVR['TOTAL_VOTES'];
}
foreach(GetModuleEvents("main", "OnCancelRatingVote", true) as $arEvent)
ExecuteModuleEventEx($arEvent, array((int)$arVote['VOTE_ID'], $arParam));
$userData = CAllRatings::getUserData((int)$arParam['USER_ID'], (float)$arVote['VOTE_VALUE']);
if (CModule::IncludeModule('pull'))
{
CPullStack::AddShared(Array(
'module_id' => 'main',
'command' => 'rating_vote',
'params' => Array(
"TYPE" => "CANCEL",
"USER_ID" => (int)$arParam['USER_ID'],
"ENTITY_TYPE_ID" => $arParam["ENTITY_TYPE_ID"],
"ENTITY_ID" => (int)$arParam['ENTITY_ID'],
"TOTAL_POSITIVE_VOTES" => (int)($arVote['TOTAL_POSITIVE_VOTES'] + ($votePlus ? -1 : 1)),
"RESULT" => $votePlus? 'PLUS': 'MINUS',
"USER_DATA" => $userData,
"REACTION" => $arVote['REACTION'],
"REACTIONS_LIST" => $arParam['REACTIONS_LIST']
)
));
}
if (CACHED_b_rating_vote!==false)
{
$bucket_size = (int)CACHED_b_rating_bucket_size;
if($bucket_size <= 0)
$bucket_size = 100;
$bucket = (int)((int)$arParam['ENTITY_ID'] / $bucket_size);
$CACHE_MANAGER->Clean("b_rvg_".$DB->ForSql($arParam["ENTITY_TYPE_ID"]).$bucket, "b_rating_voting");
}
return $userData;
}
return false;
}