Rev 16769 | AutorÃa | Comparar con el anterior | 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 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);
$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
$contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
$queryMapper = QueryMapper::getInstance($this->adapter);
/*
select count(*) as cant, date(added_on) as date from tbl_discovery_contacts
where 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)'),
]);
if($contact_ids) {
$select->where->notIn('id', $contact_ids);
}
$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_interactions
where interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
group by date(added_on), user_id
order 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);
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)
{
$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);
$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
$contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
$queryMapper = QueryMapper::getInstance($this->adapter);
/*
select count(*) as cant, date(added_on) as date from tbl_discovery_contacts
where 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)'),
]);
if($contact_ids) {
$select->where->notIn('id', $contact_ids);
}
$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_interactions
where interaction_type_id = 1 and date(added_on) BETWEEN '2023-05-05' AND '2023-05-31'
group by date(added_on), user_id
order 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);
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)
{
$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'
]);
}
}