AutorÃa | Ultima modificación | Ver Log |
<?php
declare(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'
]);
}
}