AutorÃa | 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\DiscoveryContactBlackListMapper;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 DiscoveryContactProgressUserController 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) {$user_uuid = $this->params()->fromQuery('user');if(!$user_uuid) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOneByUuid($user_uuid);if(!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_USER_NOT_FOUND']);}$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;$table = [];$dt = \DateTime::createFromFormat('Y-m-d', $startDate);do {$tempDate = $dt->format('Y-m-d');$table[ $tempDate ] = ['label' => $dt->format('d/m/Y'), 'value' => 0];$dt->add(new \DateInterval('P1D'));} while($endDate > $tempDate);$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);$contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);$queryMapper = QueryMapper::getInstance($this->adapter);$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);if(!$discoveryContactInteractionType) {$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);}$select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);$select->columns(['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->where->equalTo('user_id', $user->id);if($contact_ids) {$select->where->notIn('contact_id', $contact_ids);}$select->group([ new Expression('DATE(added_on)'), 'user_id']);$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$table[ $record['date'] ][ 'value' ] = $record['total'];}$records = array_values($table);$labels = [];$values = [];$table = [];foreach($records as $record){array_push($labels, $record['label']);array_push($values, $record['value']);array_push($table, ['total' => $record['value'],'date' => $record['label']]);}return new JsonModel(['success' => true,'data' => ['table' => $table,'graph' => ['labels' => $labels,'values' => $values]]]);} else {$discoveryContactInteractionMapper = DiscoveryContactInteractionMapper::getInstance($this->adapter);$user_ids = $discoveryContactInteractionMapper->fetchAllUserIdsForCompanyId($currentCompany->id);$users = [];$userMapper = UserMapper::getInstance($this->adapter);$records = $userMapper->fetchAllByIds($user_ids);foreach($records as $record){$users[ $record->uuid ] = trim($record->first_name . ' ' . $record->last_name) . ' (' . $record->email . ')';}$this->layout()->setTemplate('layout/layout-backend');$viewModel = new ViewModel();$viewModel->setTemplate('leaders-linked/discovery-contact-progress-user/index.phtml');$viewModel->setVariables(['users' => $users]);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()) {$user_uuid = $this->params()->fromQuery('user');if(!$user_uuid) {return new JsonModel(['success' => false,'data' => 'ERROR_PARAMETERS_ARE_INVALID']);}$userMapper = UserMapper::getInstance($this->adapter);$user = $userMapper->fetchOneByUuid($user_uuid);if(!$user) {return new JsonModel(['success' => false,'data' => 'ERROR_USER_NOT_FOUND']);}$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);$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);$contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);$queryMapper = QueryMapper::getInstance($this->adapter);$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);if(!$discoveryContactInteractionType) {$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);}$select = $queryMapper->getSql()->select(DiscoveryContactInteractionMapper::_TABLE);$select->columns(['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->where->equalTo('user_id', $user->id);if($contact_ids) {$select->where->notIn('id', $contact_ids);}$select->group([ new Expression('DATE(added_on)'), 'user_id']);$select->order('date ASC');$records = $queryMapper->fetchAll($select);foreach($records as $record){$graph[ $record['date'] ][ 'value' ] = $record['total'];}$records = array_values($graph);$spreadsheet = new Spreadsheet();$spreadsheet->getProperties()->setTitle('Relevamiento de Contacto por usuario');$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'));$spreadsheet->getActiveSheet()->SetCellValue('A2', trim($user->first_name . ' ' . $user->last_name) . ' (' . $user->email . ')');$spreadsheet->getActiveSheet()->setMergeCells(['A2', 'B2', 'C2', 'D2']);$spreadsheet->getActiveSheet()->SetCellValue('A4', 'Fecha');$spreadsheet->getActiveSheet()->SetCellValue('B4', 'Total');$row = 5;foreach($records as $record){$spreadsheet->getActiveSheet()->setCellValue('A' . $row, $record['label']);$spreadsheet->getActiveSheet()->setCellValue('B' . $row, $record['value']);$row++;}$fileName = 'reporte_relevamiento_de_contact_progreso_por_dia_por_usuario_' . date('d-m-Y-h-i-a', time()) . '.xls';$tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contact_progreso_por_dia_por_usuario_' . 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']);}}