From 5b9b345bf873bcfe671af519a3ade85124c8d335 Mon Sep 17 00:00:00 2001 From: yuri Date: Thu, 3 Jan 2019 13:12:17 +0200 Subject: [PATCH] fix opp reports left join duplicates --- .../Espo/Modules/Crm/Services/Opportunity.php | 117 ++++++++++++------ 1 file changed, 76 insertions(+), 41 deletions(-) diff --git a/application/Espo/Modules/Crm/Services/Opportunity.php b/application/Espo/Modules/Crm/Services/Opportunity.php index bf055ab987..0734d8e15d 100644 --- a/application/Espo/Modules/Crm/Services/Opportunity.php +++ b/application/Espo/Modules/Crm/Services/Opportunity.php @@ -64,25 +64,29 @@ class Opportunity extends \Espo\Services\Record $stageField = 'lastStage'; } - $selectParams = [ - 'select' => [$stageField, ['SUM:amountConverted', 'amount']], - 'whereClause' => [ - [$stageField . '!=' => $lostStageList], - [$stageField . '!=' => null] - ], - 'orderBy' => 'LIST:'.$stageField.':' . implode(',', $options), - 'groupBy' => [$stageField] + $whereClause = [ + [$stageField . '!=' => $lostStageList], + [$stageField . '!=' => null] ]; if ($dateFilter !== 'ever') { - $selectParams['whereClause'][] = [ + $whereClause[] = [ 'closeDate>=' => $dateFrom, 'closeDate<' => $dateTo ]; } + $selectParams = [ + 'select' => [$stageField, ['SUM:amountConverted', 'amount']], + 'whereClause' => $whereClause, + 'orderBy' => 'LIST:'.$stageField.':' . implode(',', $options), + 'groupBy' => [$stageField] + ]; + $selectManager->applyAccess($selectParams); + $this->handleDistinctReportSelectParams($selectParams, $whereClause); + $this->getEntityManager()->getRepository('Opportunity')->handleSelectParams($selectParams); $sql = $this->getEntityManager()->getQuery()->createSelectQuery('Opportunity', $selectParams); @@ -136,26 +140,30 @@ class Opportunity extends \Espo\Services\Record $selectManager = $this->getSelectManagerFactory()->create('Opportunity'); - $selectParams = [ - 'select' => ['leadSource', ['SUM:amountWeightedConverted', 'amount']], - 'whereClause' => [ - 'stage!=' => $this->getLostStageList(), - ['leadSource!=' => ''], - ['leadSource!=' => null] - ], - 'orderBy' => 'LIST:leadSource:' . implode(',', $options), - 'groupBy' => ['leadSource'] + $whereClause = [ + ['stage!=' => $this->getLostStageList()], + ['leadSource!=' => ''], + ['leadSource!=' => null] ]; if ($dateFilter !== 'ever') { - $selectParams['whereClause'][] = [ + $whereClause[] = [ 'closeDate>=' => $dateFrom, 'closeDate<' => $dateTo ]; } + $selectParams = [ + 'select' => ['leadSource', ['SUM:amountWeightedConverted', 'amount']], + 'whereClause' => $whereClause, + 'orderBy' => 'LIST:leadSource:' . implode(',', $options), + 'groupBy' => ['leadSource'] + ]; + $selectManager->applyAccess($selectParams); + $this->handleDistinctReportSelectParams($selectParams, $whereClause); + $this->getEntityManager()->getRepository('Opportunity')->handleSelectParams($selectParams); $sql = $this->getEntityManager()->getQuery()->createSelectQuery('Opportunity', $selectParams); @@ -189,31 +197,31 @@ class Opportunity extends \Espo\Services\Record $selectManager = $this->getSelectManagerFactory()->create('Opportunity'); - $selectParams = [ - 'select' => ['stage', ['SUM:amountConverted', 'amount']], - 'whereClause' => [ - [ - 'stage!=' => $this->getLostStageList() - ], - [ - 'stage!=' => $this->getWonStageList() - ] - ], - 'orderBy' => 'LIST:stage:' . implode(',', $options), - 'groupBy' => ['stage'] + $whereClause = [ + ['stage!=' => $this->getLostStageList()], + ['stage!=' => $this->getWonStageList()] ]; if ($dateFilter !== 'ever') { - $selectParams['whereClause'][] = [ + $whereClause[] = [ 'closeDate>=' => $dateFrom, 'closeDate<' => $dateTo ]; } + $selectParams = [ + 'select' => ['stage', ['SUM:amountConverted', 'amount']], + 'whereClause' => $whereClause, + 'orderBy' => 'LIST:stage:' . implode(',', $options), + 'groupBy' => ['stage'] + ]; + $stageIgnoreList = array_merge($this->getLostStageList(), $this->getWonStageList()); $selectManager->applyAccess($selectParams); + $this->handleDistinctReportSelectParams($selectParams, $whereClause); + $this->getEntityManager()->getRepository('Opportunity')->handleSelectParams($selectParams); $sql = $this->getEntityManager()->getQuery()->createSelectQuery('Opportunity', $selectParams); @@ -252,29 +260,32 @@ class Opportunity extends \Espo\Services\Record $selectManager = $this->getSelectManagerFactory()->create('Opportunity'); - $selectParams = [ - 'select' => [['MONTH:closeDate', 'month'], ['SUM:amountConverted', 'amount']], - 'whereClause' => [ - 'stage' => $this->getWonStageList() - ], - 'orderBy' => 1, - 'groupBy' => ['MONTH:closeDate'] + $whereClause = [ + ['stage' => $this->getWonStageList()] ]; if ($dateFilter !== 'ever') { - $selectParams['whereClause'][] = [ + $whereClause[] = [ 'closeDate>=' => $dateFrom, 'closeDate<' => $dateTo ]; } + $selectParams = [ + 'select' => [['MONTH:closeDate', 'month'], ['SUM:amountConverted', 'amount']], + 'whereClause' => $whereClause, + 'orderBy' => 1, + 'groupBy' => ['MONTH:closeDate'] + ]; + $selectManager->applyAccess($selectParams); + $this->handleDistinctReportSelectParams($selectParams, $whereClause); + $this->getEntityManager()->getRepository('Opportunity')->handleSelectParams($selectParams); $sql = $this->getEntityManager()->getQuery()->createSelectQuery('Opportunity', $selectParams); - $sth = $pdo->prepare($sql); $sth->execute(); @@ -334,6 +345,30 @@ class Opportunity extends \Espo\Services\Record ]; } + protected function handleDistinctReportSelectParams(&$selectParams, $whereClause) + { + if (!empty($selectParams['distinct'])) { + $selectParamsSubQuery = $selectParams; + + unset($selectParams['distinct']); + $selectParams['leftJoins'] = []; + $selectParams['joins'] = []; + $selectParams['whereClause'] = $whereClause; + + $selectParamsSubQuery['select'] = ['id']; + unset($selectParamsSubQuery['groupBy']); + unset($selectParamsSubQuery['orderBy']); + unset($selectParamsSubQuery['order']); + + $selectParams['whereClause'][] = [ + 'id=s' => [ + 'entityType' => 'Opportunity', + 'selectParams' => $selectParamsSubQuery + ] + ]; + } + } + protected function getDateRangeByFilter($dateFilter) { switch ($dateFilter) {