'', 'total_valuations' => '', 'num_valuations' => '', 'percentage_toTrade' => '% Deals Done:', 'total_trade' => '', //'total_recon' => '', //'total_amountOffered' => '', 'total_dealsDone' => '', 'percentage_dealsDone' => '', 'total_dealsNotDone' => '', 'percentage_dealsNotDone' => '', 'total_sendToTradeCenter' => '', 'percentage_sendToTradeCentere' => '', 'total_tradeP' => 0.0, 'total_amountOfferedP' => 0.0 ); $baseRow = array( 'company_name' => '', 'total_valuations' => '', 'num_valuations' => 0, 'percentage_toTrade' => 0, 'total_trade' => 0, //'total_recon' => 0, //'total_amountOffered' => 0, 'total_dealsDone' => 0, 'percentage_dealsDone' => 0.0, 'total_dealsNotDone' => 0, 'percentage_dealsNotDone' => 0.0, 'total_sendToTradeCenter' => 0, 'percentage_sendToTradeCenter' => 0.0, 'total_tradeP' => 0.0, 'total_amountOfferedP' => 0.0 ); $titles = array( 'company_name' => 'Dealer', 'total_valuations' => 'Total Valuations', 'num_valuations' => 'No of Valuations Send to Sales', 'percentage_toTrade' => '% To Trade', 'total_trade' => 'Total Trade Value', //'total_recon' => 'Total Recon', //'total_amountOffered' => 'Total Managers Offer', 'total_dealsDone' => 'Deals Done', 'percentage_dealsDone' => '% Deals Done', 'total_dealsNotDone' => 'Deals Not Done', 'percentage_dealsNotDone' => '% Deals Not Done', 'total_sendToTradeCenter' => 'Send to Trade Centre', 'percentage_sendToTradeCenter' => '% Send to Trade Centre', 'id' => 'h', 'excel.rowStyle' => 'Titles' ); #-> Establish list of dealerships to work with. $selection = array( 'company', 'companyGroup', 'groupDivision' ); $query = 'SELECT [SELECTION] ' . 'FROM \Company\Entity\Company company' . ' LEFT JOIN company.group companyGroup ' . ' LEFT JOIN company.groupDivision groupDivision ' . '[WHERE] ' . 'ORDER BY companyGroup.name ASC, groupDivision.name ASC, company.name ASC, company.id ASC'; if (isset($this->_input['dateFrom']) && !empty($this->_input['dateFrom'])) { $this->_queries['Date Range From'] = $this->_input['dateFrom']; } if (isset($this->_input['dateTo']) && !empty($this->_input['dateTo'])) { $this->_queries['Date Range Until'] = $this->_input['dateTo']; } if (isset($this->_input['group']) && !empty($this->_input['group']) && 'null' != $this->_input['group']) { $this->_queries['Group'] = $this->em ->find('\Company\Entity\Group', $this->_input['group']) ->name; $where[] = 'companyGroup.id = :group'; $params['group'] = $this->_input['group']; } if (isset($this->_input['groupDivision']) && !empty($this->_input['groupDivision']) && 'null' != $this->_input['groupDivision']) { error_log($this->_input['groupDivision']); $this->_queries['Division'] = $this->em ->find('\Company\Entity\GroupDivision', $this->_input['groupDivision']) ->name; $where[] = 'groupDivision.id = :division'; $params['division'] = $this->_input['groupDivision']; } if (isset($this->_input['company']) && !empty($this->_input['company']) && 'null' != $this->_input['company']) { $this->_queries['Dealership'] = $this->em ->find('\Company\Entity\Company', $this->_input['company']) ->name; $where[] = 'company.id = :company'; $params['company'] = $this->_input['company']; } #-> Finalize query. $query = str_replace(array( '[SELECTION]', '[WHERE]' ), array( implode(', ', $selection) . ' ', !empty($where) ? 'WHERE ' . implode(' AND ', $where) . ' ' : ' ' ), $query); #-> Collect data. $query = $this->em->createQuery($query); !empty($params) && $query->setParameters($params); $companies = $query->getScalarResult(); $this->em->clear(); $grp = false; $div = false; foreach ($companies as $company) { if ('' == $company['companyGroup_name']) { $company['companyGroup_name'] = 'None'; } if ('' == $company['groupDivision_name']) { $company['groupDivision_name'] = 'None'; } if ($div != $company['groupDivision_name']) { if (false != $div) { $totals = $baseRow; $totals['company_name'] = 'DIVISION TOTALS'; $totals['id'] = 'dt'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $totals = $totalRow; $totals['company_name'] = $grp . ': ' . $div; $totals['id'] = 'dn'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $this->_data[] = array(); if ($grp == $company['companyGroup_name']) { if (false != $grp) { $this->_data[] = $titles; } } } $div = $company['groupDivision_name']; } if ($grp != $company['companyGroup_name']) { if (false != $grp) { #-> Not the first group, so we have grand totals to add $totals = $baseRow; $totals['company_name'] = 'GROUP TOTALS'; $totals['id'] = 'gt'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $totals = $totalRow; $totals['company_name'] = $grp; $totals['id'] = 'gn'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $this->_data[] = array(); $this->_data[] = array(); $this->_data[] = $titles; } $grp = $company['companyGroup_name']; } $entry = $baseRow; $entry['id'] = $company['company_id']; $entry['company_name'] = $company['company_name']; $this->_data[] = $entry; } $totals = $baseRow; $totals['company_name'] = 'DIVISION TOTALS'; $totals['id'] = 'dt'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $totals = $totalRow; $totals['company_name'] = $grp . ': ' . $div; $totals['id'] = 'dn'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $this->_data[] = array(); $totals = $baseRow; $totals['company_name'] = 'GROUP TOTALS'; $totals['id'] = 'gt'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; $totals = $totalRow; $totals['company_name'] = $grp; $totals['id'] = 'gn'; $totals['excel.rowStyle'] = 'Totals'; $this->_data[] = $totals; #-> Collect stats. $selection = array( 'companyGroup.name', 'groupDivision.name', 'company.name', 'company.id', 'COUNT(valuation.id) AS total_valuations', 'SUM(CASE valuation.amountOffered WHEN 0.0 THEN 0 ELSE 1 END) AS num_valuations', 'SUM(stock.tradePrice) AS total_trade', 'SUM(stock.damageTotal) AS total_recon', 'SUM(valuation.amountOffered) AS total_amountOffered', 'SUM(CASE WHEN stock.tradePrice > 0.0 AND valuation.amountOffered > 0.0 THEN stock.tradePrice ELSE 0.0 END) AS total_tradeP', 'SUM(CASE WHEN stock.tradePrice > 0.0 AND valuation.amountOffered > 0.0 THEN valuation.amountOffered ELSE 0.0 END) AS total_amountOfferedP' ); $join = array(); $leftJion = array(); $where = array(); $params = array(); $query = 'SELECT [SELECTION] ' . 'FROM \Valuation\Entity\Valuation valuation ' . ' JOIN valuation.stock stock ' . ' JOIN stock.company company ' . ' LEFT JOIN company.group companyGroup ' . ' LEFT JOIN company.groupDivision groupDivision ' . '[WHERE] ' . 'GROUP BY companyGroup.name, groupDivision.name, company.name, company.id ' . 'ORDER BY companyGroup.name ASC, groupDivision.name ASC, company.name ASC, company.id ASC'; #-> Construct details. // $where[] = 'stock.tradePrice > 0.0'; $authData = \Utility\Registry::getAuthData(); if (isset($this->_input['dateFrom']) && !empty($this->_input['dateFrom'])) { $where[] = 'valuation.created >= :dateFrom'; $params['dateFrom'] = new \DateTime($this->_input['dateFrom']); } if (isset($this->_input['dateTo']) && !empty($this->_input['dateTo'])) { $where[] = 'valuation.created <= :dateTo'; $params['dateTo'] = new \DateTime($this->_input['dateTo'] . ' 23:59:59'); } if (isset($this->_input['group']) && !empty($this->_input['group']) && 'null' != $this->_input['group']) { $where[] = 'companyGroup.id = :group'; $params['group'] = $this->_input['group']; } if (isset($this->_input['groupDivision']) && !empty($this->_input['groupDivision']) && 'null' != $this->_input['groupDivision']) { $where[] = 'groupDivision.id = :division'; $params['division'] = $this->_input['groupDivision']; } if (isset($this->_input['company']) && !empty($this->_input['company']) && 'null' != $this->_input['company']) { $where[] = 'company.id = :company'; $params['company'] = $this->_input['company']; } #-> Finalize query. $query = str_replace(array( '[SELECTION]', '[WHERE]' ), array( implode(', ', $selection) . ' ', !empty($where) ? 'WHERE ' . implode(' AND ', $where) . ' ' : ' ' ), $query); #-> Collect data. $query = $this->em->createQuery($query); !empty($params) && $query->setParameters($params); $stats = $query->getScalarResult(); $this->em->clear(); $grp = ''; $div = ''; $divTotals = $baseRow; $grpTotal = $baseRow; $stat = array_shift($stats); foreach ($this->_data as $i => $entry) { if (empty($entry)) { continue; } switch ($entry['id']) { case 'h': break; case 'dt': // Division Totals $this->_data[$i]['total_valuations'] = $divTotals['total_valuations']; $this->_data[$i]['num_valuations'] = $divTotals['num_valuations']; $this->_data[$i]['total_dealsDone'] = 0; $this->_data[$i]['total_dealsNotDone'] = 0; $this->_data[$i]['total_sendToTradeCenter'] = 0; $this->_data[$i]['percentage_toTrade'] = ''; $this->_data[$i]['percentage_dealsDone'] = ''; $this->_data[$i]['percentage_dealsNotDone'] = ''; $this->_data[$i]['percentage_sendToTradeCenter'] = ''; break; case 'dn':// Division Ave $this->_data[$i]['percentage_toTrade'] = $divTotals['total_tradeP'] > 0 ? round((100 / $divTotals['total_tradeP']) * $divTotals['total_amountOfferedP'], 1) : 0; $this->_data[$i]['percentage_dealsDone'] = 0; $this->_data[$i]['percentage_dealsNotDone'] = 0; $this->_data[$i]['percentage_sendToTradeCenter'] = 0; $divTotals = $baseRow; break; case 'gt'://Group Totals $this->_data[$i]['total_valuations'] = $grpTotal['total_valuations']; $this->_data[$i]['num_valuations'] = $grpTotal['num_valuations']; $this->_data[$i]['total_dealsDone'] = 0; $this->_data[$i]['total_dealsNotDone'] = 0; $this->_data[$i]['total_sendToTradeCenter'] = 0; $this->_data[$i]['percentage_toTrade'] = ''; $this->_data[$i]['percentage_dealsDone'] = ''; $this->_data[$i]['percentage_dealsNotDone'] = ''; $this->_data[$i]['percentage_sendToTradeCenter'] = ''; break; case 'gn':// Group Ave $this->_data[$i]['percentage_toTrade'] = $grpTotal['total_tradeP'] > 0 ? round((100 / $grpTotal['total_tradeP']) * $grpTotal['total_amountOfferedP'], 1) : 0; $this->_data[$i]['percentage_dealsDone'] = 0; $this->_data[$i]['percentage_dealsNotDone'] = 0; $this->_data[$i]['percentage_sendToTradeCenter'] = 0; $grpTotal = $baseRow; break; default: if ($stat['id'] == $entry['id']) { #-> Update the entry. //rows $this->_data[$i]['total_valuations'] = $stat['total_valuations']; $this->_data[$i]['num_valuations'] = $stat['num_valuations']; $this->_data[$i]['total_trade'] = $stat['total_trade']; $this->_data[$i]['total_trade'] = $stat['total_trade']; $this->_data[$i]['total_recon'] = $stat['total_recon']; $this->_data[$i]['total_amountOffered'] = $stat['total_amountOffered']; $this->_data[$i]['percentage_toTrade'] = $stat['total_tradeP'] > 0 && $stat['total_amountOfferedP'] > 0 ? round((100 / $stat['total_tradeP']) * $stat['total_amountOfferedP'], 1) : 0; $this->_data[$i]['total_dealsDone'] = 0; $this->_data[$i]['percentage_dealsDone'] = 0; $this->_data[$i]['total_dealsNotDone'] = 0; $this->_data[$i]['percentage_dealsNotDone'] = 0; $this->_data[$i]['total_sendToTradeCenter'] = 0; $this->_data[$i]['percentage_sendToTradeCenter'] = 0; #-> Update the totals. $divTotals['total_tradeP'] += $stat['total_tradeP']; $divTotals['total_amountOfferedP'] += $stat['total_amountOfferedP']; $divTotals['total_valuations'] += $stat['total_valuations']; $divTotals['num_valuations'] += $stat['num_valuations']; $divTotals['total_trade'] += $stat['total_trade']; $divTotals['total_dealsDone'] += 0; $divTotals['total_dealsNotDone'] += 0; $divTotals['total_sendToTradeCenter'] += 0; $grpTotal['total_amountOfferedP'] += $stat['total_amountOfferedP']; $grpTotal['total_tradeP'] += $stat['total_tradeP']; $grpTotal['num_valuations'] += $stat['num_valuations']; $grpTotal['total_trade'] += $stat['total_trade']; $grpTotal['total_dealsDone'] += 0; $grpTotal['total_dealsNotDone'] += 0; $grpTotal['total_sendToTradeCenter'] += 0; #-> Company handled, move on to next one. $stat = array_shift($stats); } break; } } #-> Collect more stats. $selection = array( 'companyGroup.name', 'groupDivision.name', 'company.name', 'company.id', 'valuation.jobState as job_state','stock.tradePrice as trade_price', 'SUM(stat.dealdone) AS total_dealsDone', 'SUM(stat.dealnotdone) AS total_dealsNotDone', 'SUM(stat.tradecentre) AS total_sendToTradeCenter' ); $join = array(); $leftJion = array(); $where = array(); $params = array(); $query = 'SELECT [SELECTION] ' . 'FROM \Statistical\Entity\Statistical stat ' . ' JOIN stat.stock stock ' . ' LEFT JOIN stock.valuation valuation ' . ' LEFT JOIN stock.company company ' . ' LEFT JOIN company.group companyGroup ' . ' LEFT JOIN company.groupDivision groupDivision ' . '[WHERE] ' . 'GROUP BY companyGroup.name, groupDivision.name, company.name, company.id ' . 'ORDER BY companyGroup.name ASC, groupDivision.name ASC, company.name ASC, company.id ASC'; #-> Construct details. // $where[] = 'stock.tradePrice > 0.0'; $authData = \Utility\Registry::getAuthData(); if (isset($this->_input['dateFrom']) && !empty($this->_input['dateFrom'])) { $where[] = 'stat.created >= :dateFrom'; $params['dateFrom'] = new \DateTime($this->_input['dateFrom']); } if (isset($this->_input['dateTo']) && !empty($this->_input['dateTo'])) { $where[] = 'stat.created <= :dateTo'; $params['dateTo'] = new \DateTime($this->_input['dateTo'] . ' 23:59:59'); } if (isset($this->_input['group']) && !empty($this->_input['group']) && 'null' != $this->_input['group']) { $where[] = 'companyGroup.id = :group'; $params['group'] = $this->_input['group']; } if (isset($this->_input['groupDivision']) && !empty($this->_input['groupDivision']) && 'null' != $this->_input['groupDivision']) { $where[] = 'groupDivision.id = :division'; $params['division'] = $this->_input['groupDivision']; } if (isset($this->_input['company']) && !empty($this->_input['company']) && 'null' != $this->_input['company']) { $where[] = 'company.id = :company'; $params['company'] = $this->_input['company']; } #-> Finalize query. $query = str_replace(array( '[SELECTION]', '[WHERE]' ), array( implode(', ', $selection) . ' ', !empty($where) ? 'WHERE ' . implode(' AND ', $where) . ' ' : ' ' ), $query); #-> Collect data. $query = $this->em->createQuery($query); !empty($params) && $query->setParameters($params); // \Utility\Debug::errorLog('$query->getSQL()', $query->getSQL()); // \Utility\Debug::errorLog('$query->getParameters()', $query->getParameters()); $stats = $query->getScalarResult(); $this->em->clear(); $grp = ''; $div = ''; $divTotals = $baseRow; $grpTotal = $baseRow; $stat = $stats; $countStat = 0; foreach ($this->_data as $i => $entry) { if (empty($entry)) { continue; } switch ($entry['id']) { case 'h': break; case 'dt': // Division Totals $this->_data[$i]['total_dealsDone'] = $divTotals['total_dealsDone']; $this->_data[$i]['total_dealsNotDone'] = $divTotals['total_dealsNotDone']; $this->_data[$i]['total_sendToTradeCenter'] = $divTotals['total_sendToTradeCenter']; $this->_data[$i]['percentage_dealsDone'] = ''; $this->_data[$i]['percentage_dealsNotDone'] = ''; $this->_data[$i]['percentage_sendToTradeCenter'] = ''; break; case 'dn': // Division Ave $this->_data[$i]['percentage_dealsDone'] = $divTotals['total_dealsDone'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($divTotals['total_dealsDone'] / $divTotals['num_valuations']) * 100, 2) : 0; $this->_data[$i]['percentage_dealsNotDone'] = $divTotals['total_dealsNotDone'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($divTotals['total_dealsNotDone'] / $divTotals['num_valuations']) * 100, 2) : 0; $this->_data[$i]['percentage_sendToTradeCenter'] = $divTotals['total_sendToTradeCenter'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($divTotals['total_sendToTradeCenter'] / $divTotals['num_valuations']) * 100, 2) : 0; $divTotals = $baseRow; break; case 'gt': //Group Totals $this->_data[$i]['total_dealsDone'] = $grpTotal['total_dealsDone']; $this->_data[$i]['total_dealsNotDone'] = $grpTotal['total_dealsNotDone']; $this->_data[$i]['total_sendToTradeCenter'] = $grpTotal['total_sendToTradeCenter']; $this->_data[$i]['percentage_dealsDone'] = ''; $this->_data[$i]['percentage_dealsNotDone'] = ''; $this->_data[$i]['percentage_sendToTradeCenter'] = ''; break; case 'gn': // Group Ave $this->_data[$i]['percentage_dealsDone'] = $grpTotal['total_dealsDone'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($grpTotal['total_dealsDone'] / $grpTotal['num_valuations']) * 100, 2) : 0; $this->_data[$i]['percentage_dealsNotDone'] = $grpTotal['total_dealsNotDone'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($grpTotal['total_dealsNotDone'] / $grpTotal['num_valuations']) * 100, 2) : 0; $this->_data[$i]['percentage_sendToTradeCenter'] = $grpTotal['total_sendToTradeCenter'] > 0 && $grpTotal['num_valuations'] > 0 ? round(($grpTotal['total_sendToTradeCenter'] / $grpTotal['num_valuations']) * 100, 2) : 0; $grpTotal = $baseRow; break; default: $statArrayId = $this->searcharray($entry['id'], 'id', $stat); if ($stat[$statArrayId]['id'] == $entry['id']) { if('Complete Valuation' != $stat[$statArrayId]['job_state'] && 0 < $stat[$statArrayId]['trade_price']) { #-> Update the entry. $this->_data[$i]['total_dealsDone'] = $stat[$statArrayId]['total_dealsDone']; $this->_data[$i]['percentage_dealsDone'] = $stat[$statArrayId]['total_dealsDone'] > 0 && $this->_data[$i]['num_valuations'] > 0 ? round(($stat[$statArrayId]['total_dealsDone'] / $this->_data[$i]['num_valuations']) * 100, 1) : 0; $this->_data[$i]['total_dealsNotDone'] = $stat[$statArrayId]['total_dealsNotDone']; $this->_data[$i]['percentage_dealsNotDone'] = $stat[$statArrayId]['total_dealsNotDone'] > 0 && $this->_data[$i]['num_valuations'] > 0 ? round(($stat[$statArrayId]['total_dealsNotDone'] / $this->_data[$i]['num_valuations']) * 100, 1) : 0; $this->_data[$i]['total_sendToTradeCenter'] = $stat[$statArrayId]['total_sendToTradeCenter']; $this->_data[$i]['percentage_sendToTradeCenter'] = $stat[$statArrayId]['total_sendToTradeCenter'] > 0 && $this->_data[$i]['num_valuations'] > 0 ? round(($stat[$statArrayId]['total_sendToTradeCenter'] / $this->_data[$i]['num_valuations']) * 100, 1) : 0; #-> Update the totals. $divTotals['total_dealsDone'] += $stat[$statArrayId]['total_dealsDone']; $divTotals['total_dealsNotDone'] += $stat[$statArrayId]['total_dealsNotDone']; $divTotals['total_sendToTradeCenter'] += $stat[$statArrayId]['total_sendToTradeCenter']; $grpTotal['total_dealsDone'] += $stat[$statArrayId]['total_dealsDone']; $grpTotal['total_dealsNotDone'] += $stat[$statArrayId]['total_dealsNotDone']; $grpTotal['total_sendToTradeCenter'] += $stat[$statArrayId]['total_sendToTradeCenter']; #-> Company handled, move on to next one. // $stat = array_shift($stats); } } #-> Update the totals. $divTotals['num_valuations'] += $this->_data[$i]['num_valuations']; $grpTotal['num_valuations'] += $this->_data[$i]['num_valuations']; break; } // $countStat++; } } public function searcharray($value, $key, $array) { foreach ($array as $k => $val) { if ($val[$key] == $value) { return $k; } } return null; } }