Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16971 | 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;

class DiscoveryContactReportController 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) {
                
                $discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
                $contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
                
                
                
                $first_name      = Functions::sanitizeFilterString($this->params()->fromQuery('first_name', ''));
                $last_name           = Functions::sanitizeFilterString($this->params()->fromQuery('last_name', ''));
                $corporate_email = Functions::sanitizeFilterString($this->params()->fromQuery('corporate_email', ''));
                $company         = Functions::sanitizeFilterString($this->params()->fromQuery('company', ''));
                $position        = Functions::sanitizeFilterString($this->params()->fromQuery('position', ''));
                $country             = Functions::sanitizeFilterString($this->params()->fromQuery('country', ''));
                $state           = Functions::sanitizeFilterString($this->params()->fromQuery('state', ''));
                $city            = Functions::sanitizeFilterString($this->params()->fromQuery('city', ''));
                $personal_email  = Functions::sanitizeFilterString($this->params()->fromQuery('personal_email', ''));
                $phone           = Functions::sanitizeFilterString($this->params()->fromQuery('phone', ''));
                $phone_extension = Functions::sanitizeFilterString($this->params()->fromQuery('phone_extension', ''));
                $celular             = Functions::sanitizeFilterString($this->params()->fromQuery('celular', ''));
                $whatsapp        = Functions::sanitizeFilterString($this->params()->fromQuery('whatsapp', ''));
                $linkedin            = Functions::sanitizeFilterString($this->params()->fromQuery('linkedin', ''));
                
                $queryMapper = QueryMapper::getInstance($this->adapter);
                $select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);
                
                if($contact_ids ) {
                    $select->where->notIn('id', $contact_ids );
                }
                
                if($first_name) {
                    $select->where->like('first_name', '%'.$first_name.'%');
                }
                if($last_name) {
                    $select->where->like('last_name', '%'.$last_name.'%');
                }
                if($corporate_email) {
                    $select->where->like('corporate_email', '%'.$corporate_email.'%');
                }
                if($company) {
                    $select->where->like('company', '%'.$company.'%');
                }
                if($position) {
                    $select->where->like('position', '%'.$position.'%');
                }
                if($country) {
                    $select->where->like('country', '%'.$country.'%');
                }
                if($state) {
                    $select->where->like('state', '%'.$state.'%');
                }
                if($city) {
                    $select->where->like('city', '%'.$city.'%');
                }
                if($personal_email) {
                    $select->where->like('personal_email', '%'.$personal_email.'%');
                }
                if($phone) {
                    $select->where->like('phone', '%'.$phone.'%');
                }
                if($phone_extension) {
                    $select->where->like('phone_extension', '%'.$phone_extension.'%');
                }
                if($celular) {
                    $select->where->like('celular', '%'.$celular.'%');
                }
                if($whatsapp) {
                    $select->where->like('whatsapp', '%'.$whatsapp.'%');
                }
                if($linkedin) {
                    $select->where->like('linkedin', '%'.$linkedin.'%');
                }
                $select->limit(100);
                $select->order('added_on ASC');
                
                $items = $queryMapper->fetchAll($select);
                
                return new JsonModel([
                    'success' => true, 
                    'data' => [
                        'items' => $items,
                    ]
                ]); 
                
                
            } else {
                $form = new ContactDownloadForm();
                
                $this->layout()->setTemplate('layout/layout-backend.phtml');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/discovery-contact-report/index');
                $viewModel->setVariables([
                   'form' => $form 
                ]);
                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();
            
            $first_name      = Functions::sanitizeFilterString($this->params()->fromQuery('first_name', ''));
            $last_name       = Functions::sanitizeFilterString($this->params()->fromQuery('last_name', ''));
            $corporate_email = Functions::sanitizeFilterString($this->params()->fromQuery('corporate_email', ''));
            $company         = Functions::sanitizeFilterString($this->params()->fromQuery('company', ''));
            $position        = Functions::sanitizeFilterString($this->params()->fromQuery('position', ''));
            $country         = Functions::sanitizeFilterString($this->params()->fromQuery('country', ''));
            $state               = Functions::sanitizeFilterString($this->params()->fromQuery('state', ''));
            $city                = Functions::sanitizeFilterString($this->params()->fromQuery('city', ''));
            $personal_email  = Functions::sanitizeFilterString($this->params()->fromQuery('personal_email', ''));
            $phone               = Functions::sanitizeFilterString($this->params()->fromQuery('phone', ''));
            $phone_extension = Functions::sanitizeFilterString($this->params()->fromQuery('phone_extension', ''));
            $celular         = Functions::sanitizeFilterString($this->params()->fromQuery('celular', ''));
            $whatsapp        = Functions::sanitizeFilterString($this->params()->fromQuery('whatsapp', ''));
            $linkedin        = Functions::sanitizeFilterString($this->params()->fromQuery('linkedin', ''));
            $scholarship         = Functions::sanitizeFilterString($this->params()->fromQuery('scholarship', ''));
                
            $discoveryContactBlackListMapper = DiscoveryContactBlackListMapper::getInstance($this->adapter);
            $contact_ids = $discoveryContactBlackListMapper->fetchAllContactIdsByCompanyId($currentCompany->id);
            
            
            
            $queryMapper = QueryMapper::getInstance($this->adapter);
            $select = $queryMapper->getSql()->select(DiscoveryContactMapper::_TABLE);
            $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($contact_ids ) {
                $select->where->notIn('id', $contact_ids );
            }
                
            if($first_name) {
                $select->where->like('first_name', '%'.$first_name.'%');
            }
            if($last_name) {
                $select->where->like('last_name', '%'.$last_name.'%');
            }
            if($corporate_email) {
                $select->where->like('corporate_email', '%'.$corporate_email.'%');
            }
            if($company) {
                $select->where->like('company', '%'.$company.'%');
            }
            if($position) {
                $select->where->like('position', '%'.$position.'%');
            }
            if($country) {
                $select->where->like('country', '%'.$country.'%');
            }
            if($state) {
                $select->where->like('state', '%'.$state.'%');
            }
            if($city) {
                $select->where->like('city', '%'.$city.'%');
            }
            if($personal_email) {
                $select->where->like('personal_email', '%'.$personal_email.'%');
            }
            if($phone) {
                $select->where->like('phone', '%'.$phone.'%');
            }
            if($phone_extension) {
                $select->where->like('phone_extension', '%'.$phone_extension.'%');
            }
            if($celular) {
                $select->where->like('celular', '%'.$celular.'%');
            }
            if($whatsapp) {
                $select->where->like('whatsapp', '%'.$whatsapp.'%');
            }
            if($linkedin) {
                $select->where->like('linkedin', '%'.$linkedin.'%');
            }
            if($scholarship) {
               // scholarship
            }

            $fileName = 'reporte_relevamiento_de_contactos.csv';
            $tempFilename = tempnam(sys_get_temp_dir(), 'reporte_relevamiento_de_contactos_' . time(). '.csv');
            
            $fp = fopen($tempFilename, 'w');
            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.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'
        ]);;
    }
}