Rev 16975 | 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\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Mapper\QueryMapper;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use LeadersLinked\Form\DiscoveryContact\ContactDownloadForm;
use LeadersLinked\Mapper\DiscoveryContactMapper;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Library\Functions;
use Laminas\Http\Response;
use LeadersLinked\Mapper\DiscoveryContactBlackListMapper;
use LeadersLinked\Mapper\UserMapper;
use Laminas\Db\Sql\Expression;
use LeadersLinked\Mapper\DiscoveryContactInteractionMapper;
use LeadersLinked\Mapper\DiscoveryContactInteractionTypeMapper;
use LeadersLinked\Model\DiscoveryContact;
class DiscoveryContactReportUserController 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()
{
$request = $this->getRequest();
if($request->isGet()) {
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$currentCompany = $currentUserPlugin->getCompany();
$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');
}
}
}
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');
}
}
$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
if(!$discoveryContactInteractionType) {
$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
}
$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
$blacklist_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
$queryMapper = QueryMapper::getInstance($this->adapter);
$select = $queryMapper->getSql()->select();
$select->from(['a' => DiscoveryContactMapper::_TABLE]);
$select->join(['b' => DiscoveryContactInteractionMapper::_TABLE], 'a.id = b.contact_id', []);
$select->columns([
'first_name',
'last_name',
'personal_email',
'corporate_email',
'company',
'position',
'country',
'state',
'city',
'phone',
'phone_extension',
'celular',
'whatsapp',
'linkedin',
'sector',
'scholarship',
'added_on'
]);
if($blacklist_ids ) {
$select->where->notIn('a.id', $blacklist_ids );
}
$select->where->equalTo('b.interaction_type_id', $discoveryContactInteractionType ? $discoveryContactInteractionType->id : 0);
$select->where->equalTo('b.user_id', $user->id);
$select->where->between(new Expression('DATE(a.added_on)'), $startDate, $endDate);
$select->limit(100);
$select->order('added_on ASC');
$items = $queryMapper->fetchAll($select);
return new JsonModel([
'success' => true,
'data' => [
'items' => $items,
]
]);
} 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 . ')';
}
$form = new ContactDownloadForm();
$this->layout()->setTemplate('layout/layout-backend.phtml');
$viewModel = new ViewModel();
$viewModel->setTemplate('leaders-linked/discovery-contact-report-by-user/index');
$viewModel->setVariables([
'form' => $form,
'users' => $users
]);
return $viewModel ;
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);;
}
public function downloadAction()
{
$request = $this->getRequest();
if($request->isGet()) {
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$currentCompany = $currentUserPlugin->getCompany();
$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');
}
}
$discoveryContactInteractionTypeMapper = DiscoveryContactInteractionTypeMapper::getInstance($this->adapter);
$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneDefaultByCompanyId($currentCompany->id);
if(!$discoveryContactInteractionType) {
$discoveryContactInteractionType = $discoveryContactInteractionTypeMapper->fetchOneFirstActiveByCompanyId($currentCompany->id);
}
$discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
$blacklist_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
$queryMapper = QueryMapper::getInstance($this->adapter);
$select = $queryMapper->getSql()->select();
$select->from(['a' => DiscoveryContactMapper::_TABLE]);
$select->join(['b' => DiscoveryContactInteractionMapper::_TABLE], 'a.id = b.contact_id', []);
$select->columns([
'first_name',
'last_name',
'personal_email',
'corporate_email',
'company',
'position',
'country',
'state',
'city',
'phone',
'phone_extension',
'celular',
'whatsapp',
'linkedin',
'sector',
'scholarship',
'added_on'
]);
if($blacklist_ids ) {
$select->where->notIn('a.id', $blacklist_ids );
}
$select->where->equalTo('b.interaction_type_id', $discoveryContactInteractionType ? $discoveryContactInteractionType->id : 0);
$select->where->equalTo('b.user_id', $user->id);
$select->where->between(new Expression('DATE(a.added_on)'), $startDate, $endDate);
$fileName = 'reporte_relevamiento_de_contactos_por_usuario.csv';
$tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contactos_por_usuario_' . time(). '.csv');
$fp = fopen($tempFilename, 'w');
fputcsv($fp, [
$this->translator->translate('LABEL_FIRST_NAME'),
$this->translator->translate('LABEL_LAST_NAME'),
$this->translator->translate('LABEL_EMAIL'),
$this->translator->translate('LABEL_START'),
$this->translator->translate('LABEL_END'),
]);
fputcsv($fp, [
$user->first_name,
$user->last_name,
$user->email,
$startDate,
$endDate,
]);
fputcsv($fp, [
$this->translator->translate('LABEL_FIRST_NAME'),
$this->translator->translate('LABEL_LAST_NAME'),
$this->translator->translate('LABEL_PERSONAL_EMAIL'),
$this->translator->translate('LABEL_CORPORATE_EMAIL'),
$this->translator->translate('LABEL_COMPANY'),
$this->translator->translate('LABEL_POSITION'),
$this->translator->translate('LABEL_COUNTRY'),
$this->translator->translate('LABEL_STATE'),
$this->translator->translate('LABEL_CITY'),
$this->translator->translate('LABEL_PHONE'),
$this->translator->translate('LABEL_PHONE_EXTENSION'),
$this->translator->translate('LABEL_CELULAR'),
$this->translator->translate('LABEL_WHATSAPP'),
$this->translator->translate('LABEL_LINKEDIN'),
$this->translator->translate('LABEL_SECTOR'),
$this->translator->translate('LABEL_SCHOLARSHIP'),
$this->translator->translate('LABEL_ADDED_DATE')
]);
$items = $queryMapper->fetchAll($select);
foreach ( $items as $item )
{
fputcsv($fp,$item);
}
fclose($fp);
$items = null;
$zipName = 'reporte_relevamiento_de_contactos_por_usuario.zip';
$zipFilename = tempnam(sys_get_temp_dir(), $zipName);
$zip = new \ZipArchive;
if ($zip->open($zipFilename,\ZipArchive::CREATE|\ZipArchive::OVERWRITE) === TRUE) {
$zip->addFile($tempFilename, $fileName);
$zip->close();
$content = file_get_contents($zipFilename);
@unlink($tempFilename);
@unlink($zipFilename);
return new JsonModel([
'success' => true,
'data' => [
'content' => base64_encode($content),
'basename' => $zipName
]
]);
} else {
@unlink($tempFilename);
return new JsonModel([
'success' => true,
'data' => 'ERROR_ZIP_CREATE_FILE',
]);
}
}
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);;
}
}