Prepare parameters. $selection = array( 'stock', 'type', 'model', 'make', 'valuation', 'sales' ); $join = array(); $leftJion = array(); $where = array(); $params = array(); $query = 'SELECT [SELECTION] ' . 'FROM \Stock\Entity\Stock stock ' . ' JOIN stock.type type ' . ' JOIN type.model model ' . ' JOIN model.make make ' . ' [JOIN] ' . ' LEFT JOIN stock.valuation valuation ' . ' LEFT JOIN valuation.salesProfile sales ' . ' [LEFT-JOIN] ' . '[WHERE] ' . 'ORDER BY stock.created'; #-> Construct details. $authData = \Utility\Registry::getAuthData(); switch (\Utility\Registry::getUserType()) { case 'B4C User': $groupFilter = \Utility\Registry::getSudo('Group', false); if ($groupFilter) { $this->_queries['Group'] = \Utility\Registry::getSudo('GroupName'); $join[] = 'JOIN stock.company company'; $where[] = 'IDENTITY(company.group) = :group'; $params['group'] = $groupFilter; } $divisionFilter = \Utility\Registry::getSudo('Division', false); if ($divisionFilter) { $this->_queries['Division'] = \Utility\Registry::getSudo('DivisionName'); $join[] = 'JOIN stock.company company'; $where[] = 'IDENTITY(company.groupDivision) = :groupDivision'; $params['groupDivision'] = $divisionFilter; } $companyFilter = \Utility\Registry::getSudo('Company', false); if ($companyFilter) { $this->_queries['Company'] = \Utility\Registry::getSudo('CompanyName'); $where[] = 'IDENTITY(stock.company) = :company'; $params['company'] = $companyFilter; } break; case 'Group User': $join[] = 'JOIN stock.company company'; $where[] = 'IDENTITY(company.group) = :group'; $params['group'] = $authData['company']['group']['id']; $divisionFilter = \Utility\Registry::getSudo('Division', false); if ($divisionFilter) { $this->_queries['Division'] = \Utility\Registry::getSudo('DivisionName'); $join[] = 'JOIN stock.company company'; $where[] = 'IDENTITY(company.groupDivision) = :groupDivision'; $params['groupDivision'] = $divisionFilter; } $companyFilter = \Utility\Registry::getSudo('Company', false); if ($companyFilter) { $this->_queries['Company'] = \Utility\Registry::getSudo('CompanyName'); $where[] = 'IDENTITY(stock.company) = :company'; $params['company'] = $companyFilter; } break; case 'Dealer Principle': $join[] = 'JOIN stock.company company'; $where[] = 'IDENTITY(company.groupDivision) = :groupDivision'; $params['groupDivision'] = $authData['company']['groupDivision']['id']; $companyFilter = \Utility\Registry::getSudo('Company', false); if ($companyFilter) { $this->_queries['Company'] = \Utility\Registry::getSudo('CompanyName'); $where[] = 'IDENTITY(stock.company) = :company'; $params['company'] = $companyFilter; } break; default: $where[] = 'IDENTITY(stock.company) = :company'; $params['company'] = $authData['company']['id']; break; } if (isset($this->_input['jobState'])) { $this->_queries['Status'] = $this->_input['jobState']; $where[] = 'stock.jobState >= :jobState'; $params['jobState'] = $this->_input['jobState']; } if (isset($this->_input['dateFrom'])) { $this->_queries['Date Range From'] = $this->_input['dateFrom']; $where[] = 'stock.created >= :dateFrom'; $params['dateFrom'] = new \DateTime($this->_input['dateFrom']); } if (isset($this->_input['dateTo'])) { $this->_queries['Date Range Until'] = $this->_input['dateTo']; $where[] = 'stock.created <= :dateTo'; $params['dateTo'] = new \DateTime($this->_input['dateTo']); } #-> Finalize query. $query = str_replace(array( '[SELECTION]', '[JOIN]', '[LEFT-JOIN]', '[WHERE]' ), array( implode(', ', $selection) . ' ', implode(' ', $join) . ' ', implode(' ', $leftJion) . ' ', !empty($where) ? 'WHERE ' . implode(' AND ', $where) . ' ' : ' ' ), $query); #-> Collect data. $query = $this->em->createQuery($query); !empty($params) && $query->setParameters($params); $this->_data = $query->getScalarResult(); } }