File size: 4,370 Bytes
82161b8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | <?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\Ecommerce\Columns;
use Piwik\Columns\DimensionSegmentFactory;
use Piwik\Columns\Discriminator;
use Piwik\Common;
use Piwik\Piwik;
use Piwik\Plugin\Segment;
use Piwik\Segment\SegmentExpression;
use Piwik\Segment\SegmentsList;
use Piwik\Tracker\Action;
use Piwik\Tracker\GoalManager;
use Piwik\Tracker\Request;
use Piwik\Tracker\Visitor;
class Revenue extends BaseConversion
{
protected $columnName = 'revenue';
protected $columnType = 'float default NULL';
protected $type = self::TYPE_MONEY;
protected $category = 'Goals_Ecommerce';
protected $nameSingular = 'Ecommerce_OrderValue';
public function getDbDiscriminator()
{
return new Discriminator($this->dbTableName, 'idgoal', GoalManager::IDGOAL_ORDER);
}
public function configureSegments(SegmentsList $segmentsList, DimensionSegmentFactory $dimensionSegmentFactory)
{
//new Segment revenue on order
$segment = new Segment();
$segment->setCategory($this->category);
$segment->setName(Piwik::translate('Ecommerce_OrderRevenue'));
$segment->setSegment('revenueOrder');
$segment->setSqlSegment('log_conversion.idvisit');
$segment->setSqlFilter(function ($valueToMatch, $sqlField, $matchType) {
return $this->getRevenueQuery($valueToMatch, $sqlField, $matchType, 0);
});
$segmentsList->addSegment($dimensionSegmentFactory->createSegment($segment));
//new Segment revenue left in cart
$segment = new Segment();
$segment->setCategory($this->category);
$segment->setName(Piwik::translate('Ecommerce_RevenueLeftInCart'));
$segment->setSegment('revenueAbandonedCart');
$segment->setSqlSegment('log_conversion.idvisit');
$segment->setSqlFilter(function ($valueToMatch, $sqlField, $matchType) {
return $this->getRevenueQuery($valueToMatch, $sqlField, $matchType, -1);
});
$segmentsList->addSegment($dimensionSegmentFactory->createSegment($segment));
}
/**
* revenue sql filter
* @param $valueToMatch
* @param $sqlField
* @param $matchType
* @return array
*/
private function getRevenueQuery($valueToMatch, $sqlField, $matchType, $idGoal)
{
//supported operator type
$supportType = [
SegmentExpression::MATCH_EQUAL,
SegmentExpression::MATCH_GREATER_OR_EQUAL,
SegmentExpression::MATCH_LESS_OR_EQUAL,
SegmentExpression::MATCH_GREATER,
SegmentExpression::MATCH_LESS,
];
if (!in_array($matchType, $supportType)) {
throw new \Exception("This match type $matchType is not available for action-segments.");
}
//to fit mysql operator
if ($matchType === SegmentExpression::MATCH_EQUAL) {
$matchType = "=";
}
$table = Common::prefixTable($this->dbTableName);
$sql = " SELECT idvisit from {$table} WHERE (idgoal = {$idGoal} and revenue {$matchType} ?) ";
return [
'SQL' => $sql,
'bind' => (float)$valueToMatch,
];
}
/**
* @param Action|null $action
*
* @return mixed|false
*/
public function onGoalConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager)
{
$defaultRevenue = $goalManager->getGoalColumn('revenue');
$revenue = $request->getGoalRevenue($defaultRevenue);
return $this->roundRevenueIfNeeded($revenue);
}
/**
* @param Action|null $action
*
* @return mixed|false
*/
public function onEcommerceOrderConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager)
{
$defaultRevenue = 0;
$revenue = $request->getGoalRevenue($defaultRevenue);
return $this->roundRevenueIfNeeded($revenue);
}
/**
* @param Action|null $action
*
* @return mixed|false
*/
public function onEcommerceCartUpdateConversion(Request $request, Visitor $visitor, $action, GoalManager $goalManager)
{
return $this->onEcommerceOrderConversion($request, $visitor, $action, $goalManager);
}
}
|