Rev 16768 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?phpdeclare(strict_types=1);namespace LeadersLinked\Controller;use Laminas\Db\Adapter\AdapterInterface;use Laminas\Mvc\Controller\AbstractActionController;use Laminas\Log\LoggerInterface;use Laminas\Mvc\I18n\Translator;use Laminas\View\Model\JsonModel;use Laminas\View\Model\ViewModel;use LeadersLinked\Mapper\UserMapper;use LeadersLinked\Mapper\QueryMapper;use LeadersLinked\Mapper\DiscoveryContactMapper;use Laminas\Db\Sql\Expression;use LeadersLinked\Mapper\DiscoveryContactInteractionMapper;use LeadersLinked\Mapper\DiscoveryContactInteractionTypeMapper;use PhpOffice\PhpSpreadsheet\IOFactory;use PhpOffice\PhpSpreadsheet\Spreadsheet;// Create an action controller.class DiscoveryContactProgressController extends AbstractActionController{/**** @var \Laminas\Db\Adapter\AdapterInterface*/private $adapter;/**** @var \LeadersLinked\Cache\CacheInterface*/private $cache;/**** @var \Laminas\Log\LoggerInterface*/private $logger;/**** @var array*/private $config;/**** @var \Laminas\Mvc\I18n\Translator*/private $translator;/**** @param \Laminas\Db\Adapter\AdapterInterface $adapter* @param \LeadersLinked\Cache\CacheInterface $cache* @param \Laminas\Log\LoggerInterface LoggerInterface $logger* @param array $config* @param \Laminas\Mvc\I18n\Translator $translator*/public function __construct($adapter, $cache, $logger, $config, $translator){$this->adapter = $adapter;$this->cache = $cache;$this->logger = $logger;$this->config = $config;$this->translator = $translator;}public function indexAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();if ($request->isGet()) {$headers = $request->getHeaders();$isJson = false;if ($headers->has('Accept')) {$accept = $headers->get('Accept');$prioritized = $accept->getPrioritized();foreach ($prioritized as $key => $value) {$raw = trim($value->getRaw());if (!$isJson) {$isJson = strpos($raw, 'json');}}}//$isJson = true;if ($isJson) {$startDate = $this->params()->fromQuery('startDate');if (empty($startDate)) {$startDate = date('Y-m-d');}$endDate = $this->params()->fromQuery('endDate');if (empty($endDate)) {$endDate = date('Y-m-d');}$dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);$dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);if (!$dtStartDate || !$dtEndDate) {$startDate = date('Y-m-d');$endDate = date('Y-m-d');} else {if ($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {$startDate = date('Y-m-d');$endDate = date('Y-m-d');}}//echo ' $startDate = ' . $startDate . ' $endDate = ' . $endDate; exit;$graph = [];$dt = \DateTime::createFromFormat('Y-m-d', $startDate);do {$tempDate = $dt->format('Y-m-d');$graph[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];$dt->add(new \DateInterval('P1D'));} while($endDate > $tempDate);$queryMapper = QueryMapper::getInstance($this->adapter);/*select count(*) as cant, date(added_on) as date from tbl_discovery_contactswhere date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'group by date(added_on)order by date ASC*/$select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);$select->columns(['total' => new Expression('COUNT(*)'),'date' => new Expression('DATE(added_on)'),]);$select->where->between( new Expression('DATE(added_on)') , $startDate, $endDate);$select->group(new Expression('DATE(added_on)'));$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$graph[ $record['date'] ][ 'value' ] = $record['total'];}$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);if(!$discoveryContactInteractionType) {$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);}/*select count(*), user_id, date(added_on) as date from tbl_discovery_contact_interactionswhere interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'group by date(added_on), user_idorder by date*/$table = [];$select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);$select->columns(['user_id','total' => new Expression('COUNT(*)'),'date' => new Expression('DATE(added_on)'),]);$select->where->equalTo('interaction_type_id', $discoveryContactInteractionType->id);$select->where->between( new Expression('DATE(added_on)') , $startDate, $endDate);$select->group([ new Expression('DATE(added_on)'), 'user_id']);$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$user_id = $record['user_id'];if(!isset( $table[ $user_id ])) {$items = [];$dt = \DateTime::createFromFormat('Y-m-d', $startDate);do {$tempDate = $dt->format('Y-m-d');$items[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];$dt->add(new \DateInterval('P1D'));} while($endDate > $tempDate);$table[ $user_id ] = $items;}$table[ $user_id ][ $record['date'] ]['value'] = $record['total'];}$records = array_values($graph);$labels = [];$values = [];foreach($records as $record){array_push($labels, $record['label']);array_push($values, $record['value']);}$graph = ['labels' => $labels,'values' => $values];$userMapper = UserMapper::getInstance($this->adapter);$first = true;$labels = [];$users = [];$records = $table;foreach($records as $user_id => $items){$user = $userMapper->fetchOne($user_id);if(!$user) {continue;}$values = [];foreach($items as $item){if($first) {array_push($labels,['date' => $item['label'] ]);}array_push($values,['value' => $item['value'] ]);}array_push($users, ['first_name' => $user->first_name,'last_name' => $user->last_name,'email' => $user->email,'values' => $values,]);$first = false;}usort($users, function($a, $b) {$result = $a['first_name'] <=> $b['last_name'];if($result === 0) {$a['last_name'] <=> $b['last_name'];}return $result;});$table = ['labels' => $labels,'users' => $users,];return new JsonModel(['success' => true,'data' => ['graph' => $graph,'table' => $table,],]);} else {$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/discovery-contact-progress/index.phtml');return $viewModel;}}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}public function downloadAction(){$currentUserPlugin = $this->plugin('currentUserPlugin');$currentCompany = $currentUserPlugin->getCompany();$request = $this->getRequest();if ($request->isGet()) {$startDate = $this->params()->fromQuery('startDate');if (empty($startDate)) {$startDate = date('Y-m-d');}$endDate = $this->params()->fromQuery('endDate');if (empty($endDate)) {$endDate = date('Y-m-d');}$dtStartDate = \DateTime::createFromFormat('Y-n-d', $startDate);$dtEndDate = \DateTime::createFromFormat('Y-n-d', $endDate);if (!$dtStartDate || !$dtEndDate) {$startDate = date('Y-m-d');$endDate = date('Y-m-d');} else {if ($dtStartDate->getTimestamp() > $dtEndDate->getTimestamp()) {$startDate = date('Y-m-d');$endDate = date('Y-m-d');}}//echo ' $startDate = ' . $startDate . ' $endDate = ' . $endDate; exit;$graph = [];$dt = \DateTime::createFromFormat('Y-m-d', $startDate);do {$tempDate = $dt->format('Y-m-d');$graph[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];$dt->add(new \DateInterval('P1D'));} while($endDate > $tempDate);$queryMapper = QueryMapper::getInstance($this->adapter);/*select count(*) as cant, date(added_on) as date from tbl_discovery_contactswhere date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'group by date(added_on)order by date ASC*/$select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);$select->columns(['total' => new Expression('COUNT(*)'),'date' => new Expression('DATE(added_on)'),]);$select->where->between( new Expression('DATE(added_on)') , $startDate, $endDate);$select->group(new Expression('DATE(added_on)'));$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$graph[ $record['date'] ][ 'value' ] = $record['total'];}$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);if(!$discoveryContactInteractionType) {$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);}/*select count(*), user_id, date(added_on) as date from tbl_discovery_contact_interactionswhere interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'group by date(added_on), user_idorder by date*/$table = [];$select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);$select->columns(['user_id','total' => new Expression('COUNT(*)'),'date' => new Expression('DATE(added_on)'),]);$select->where->equalTo('interaction_type_id', $discoveryContactInteractionType->id);$select->where->between( new Expression('DATE(added_on)') , $startDate, $endDate);$select->group([ new Expression('DATE(added_on)'), 'user_id']);$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$user_id = $record['user_id'];if(!isset( $table[ $user_id ])) {$items = [];$dt = \DateTime::createFromFormat('Y-m-d', $startDate);do {$tempDate = $dt->format('Y-m-d');$items[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];$dt->add(new \DateInterval('P1D'));} while($endDate > $tempDate);$table[ $user_id ] = $items;}$table[ $user_id ][ $record['date'] ]['value'] = $record['total'];}$records = array_values($graph);$spreadsheet = new Spreadsheet();$spreadsheet->getProperties()->setTitle('Relevamiento de Contacto');$spreadsheet->setActiveSheetIndex(0);$dt = \DateTime::createFromFormat('Y-m-d', $startDate);$spreadsheet->getActiveSheet()->SetCellValue('A1', 'Desde:');$spreadsheet->getActiveSheet()->SetCellValue('B1', $dt->format('d/m/Y'));$dt = \DateTime::createFromFormat('Y-m-d', $startDate);$spreadsheet->getActiveSheet()->SetCellValue('C1', 'Hasta:');$spreadsheet->getActiveSheet()->SetCellValue('D1', $dt->format('d/m/Y'));$col = 1;foreach($records as $record){$spreadsheet->getActiveSheet()->setCellValue([$col, 3], $record['label']);$spreadsheet->getActiveSheet()->setCellValue([$col, 4], $record['value']);$col++;}$spreadsheet->getActiveSheet()->SetCellValue('A6', $this->translator->translate('LABEL_FIRST_NAME'));$spreadsheet->getActiveSheet()->SetCellValue('B6', $this->translator->translate('LABEL_LAST_NAME'));$spreadsheet->getActiveSheet()->SetCellValue('C6', $this->translator->translate('LABEL_EMAIL'));$col = 4;foreach($records as $record){$spreadsheet->getActiveSheet()->setCellValue([$col, 6], $record['label']);$col++;}$userMapper = UserMapper::getInstance($this->adapter);$row = 7;$records = $table;foreach($records as $user_id => $items){$user = $userMapper->fetchOne($user_id);if(!$user) {continue;}$spreadsheet->getActiveSheet()->SetCellValue([1, $row], $user->first_name);$spreadsheet->getActiveSheet()->SetCellValue([2, $row], $user->last_name);$spreadsheet->getActiveSheet()->SetCellValue([3, $row], $user->email);$col = 4;foreach($items as $item){$spreadsheet->getActiveSheet()->SetCellValue([$col, $row], $item['value']);$col++;}$row++;}$fileName = 'reporte_relevamiento_de_contact_progreso_por_dia_' . date('d-m-Y-h-i-a', time()) . '.xls';$tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contact_progreso_por_dia_' . time());$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');$writer->save($tempFilename);$content = file_get_contents($tempFilename);@unlink($tempFilename);return new JsonModel(['success' => true,'data' => ['content' => base64_encode($content),'basename' => $fileName]]);}return new JsonModel(['success' => false,'data' => 'ERROR_METHOD_NOT_ALLOWED']);}}