<commit_before><?php

namespace CompliantSuggestion;

use MapasCulturais\App,
    MapasCulturais\i,
    MapasCulturais\Entities,
    MapasCulturais\Definitions,
    MapasCulturais\Exceptions,
    Respect\Validation\Rules\Email;

class Module extends \MapasCulturais\Module {

    public function __construct(array $config = array()) {
        $config = $config + ['compliant' => true, 'suggestion' => true];

        parent::__construct($config);
    }

    private function setRecipients($_app, $_entity, $onlyAdmins = false) {

        if ($_app instanceof \MapasCulturais\App && $_entity instanceof \MapasCulturais\Entity) {
            $_subsite_admins = $_app->repo('User')->getAdmins($_entity->subsiteId);
            $destinatarios = array();

            if ($onlyAdmins) {
                $dest = 'to';
            } else {
                $dest = 'bcc';
            }

            foreach($_subsite_admins as $user) {
                $destinatarios[$dest][] = $user->email;
            }

            // Usado para enviar para entidades do contato, e e-mails do responsavel tambem
            if (!$onlyAdmins) {
                $_responsible = $_app->repo('Agent')->find($_entity->owner->id);
                $_app->disableAccessControl();
                $_other_recipients = [
                    'entity_public'       => $_entity->emailPublico,
                    'entity_private'      => $_entity->emailPrivado,
                    'responsible_public'  => $_responsible->emailPublico,
                    'responsible_private' => $_responsible->emailPrivado
                ];
                $_app->enableAccessControl();

                $first_valid_mail = array_shift($_other_recipients);
                $destinatarios['to'][] = $first_valid_mail;

                $mail_validator = new Email();
                foreach ($_other_recipients as $_recipient) {
                    if ($mail_validator->validate($_recipient) && !in_array($_recipient, $destinatarios)) {
                        $destinatarios['bcc'][] = $_recipient;
                    }
                }
            }   

            return $destinatarios;
        }

        return array();
    }

    public function _init() {
        $app = App::i();

        $plugin = $this;

        $params = [];

        if(array_key_exists('compliant',$this->_config)) {
            $params['compliant'] = $this->_config['compliant'];
        }

        if(array_key_exists('suggestion',$this->_config)) {
            $params['suggestion'] = $this->_config['suggestion'];
        }

        $app->hook('template(<<agent|space|event|project>>.<<single>>.main-content):end', function() use ($app, $plugin, $params) {
            $this->part('compliant_suggestion.php',$params);
        });

        $app->hook('mapasculturais.head', function() use($app, $plugin){
            $entity = $app->view->controller->requestedEntity;

            if($entity){
                $app->view->jsObject['angularAppDependencies'][] = 'module.compliantSuggestion';

                $app->view->enqueueScript('app', 'module-compliantSuggestion', 'js/ng.modules.compliantSuggestion.js');
                $app->view->localizeScript('compliantSuggestion', [
                    'compliantEmailRequired' => i::__('O preenchimento do e-mail é obrigatório.'),
                    'compliantTypeRequired' => i::__('O preenchimento do tipo de denúncia é obrigatório.'),
                    'compliantMessageRequired' => i::__('O preenchimento da mensagem da denúncia é obrigatório.'),
                    'compliantSent' => i::__('A denúncia foi enviada.'),

                    'suggestionEmailRequired' => i::__('O preenchimento do e-mail é obrigatório.'),
                    'suggestionTypeRequired' => i::__('O preenchimento do tipo de sugestão é obrigatório.'),
                    'suggestionMessageRequired' => i::__('O preenchimento da mensagem é obrigatório.'),
                    'suggestionSent' => i::__('A sugestão foi enviada.'),

                    'error' => i::__('Erro inesperado ao o enviar a mensagem')
                ]);
            }
        });


        $app->hook('POST(<<agent|space|event|project>>.sendCompliantMessage)', function() use ($plugin) {
            $app = App::i();
            $entity = $app->repo($this->entityClassName)->find($this->data['entityId']);
            if(array_key_exists('anonimous',$this->data) && $this->data['anonimous']) {
                $person = \MapasCulturais\i::__("Anônimo");
                $anonimous = \MapasCulturais\i::__("Anônima");
                $person_email = \MapasCulturais\i::__("Anônimo");
            } else {
                $person = $this->data['name'];
                $anonimous = "";
                $person_email = $this->data['email'];
            }

            $dataValue = [
                'name'          => $app->user->is('guest') ? \MapasCulturais\i::__("Usuário Guest") : $app->user->profile->name,
                'entityType'    => $entity->getEntityTypeLabel(),
                'entityName'    => $entity->name,
                'person'        => $person,
                'email'         => $person_email,
                'url'           => $entity->singleUrl,
                'type'          => $this->data['type'],
                'date'          => date('d/m/Y H:i:s',$_SERVER['REQUEST_TIME']),
                'message'       => $this->data['message']
            ];

            $message = $app->renderMailerTemplate('compliant',$dataValue);

            if(array_key_exists('mailer.from',$app->config) && !empty(trim($app->config['mailer.from']))) {
                $tos = $plugin->setRecipients($app, $entity, true);
                
                /**
                * @hook {ALL} 'mapasculturais.complaintMessage.destination' Destinátarios e-mail de denúncia 
                * @hookDescription permitir alterar os destinatários do email enviado pelo formulário de denúncia.
                * @hookGroup HookEmail
                * 
                * Envia e-mail para o administrador para instalação Mapas
                */
                $app->applyHook('mapasculturais.complaintMessage.destination', [&$tos]);
                $app->createAndSendMailMessage([
                    'from' => $app->config['mailer.from'],
                    'to' => $tos,
                    'subject' => $message['title'],
                    'body' => $message['body']
                ]);
            }
            if(array_key_exists('copy',$this->data) && $this->data['copy']) {
                if(array_key_exists('email',$this->data) && !empty(trim($this->data['email']))) {
                    $email = $this->data['email'];
                } else {<commit_msg>Fix erro no envio de e-mails de contato/denuncia (ref #174)<commit_after><?php

namespace CompliantSuggestion;

use MapasCulturais\App,
    MapasCulturais\i,
    MapasCulturais\Entities,
    MapasCulturais\Definitions,
    MapasCulturais\Exceptions,
    Respect\Validation\Rules\Email;

class Module extends \MapasCulturais\Module {

    public function __construct(array $config = array()) {
        $config = $config + ['compliant' => true, 'suggestion' => true];

        parent::__construct($config);
    }

    private function setRecipients($_app, $_entity, $onlyAdmins = false) {

        if ($_app instanceof \MapasCulturais\App && $_entity instanceof \MapasCulturais\Entity) {
            $_subsite_admins = $_app->repo('User')->getAdmins($_entity->subsiteId);
            $destinatarios = array();

            if ($onlyAdmins) {
                $dest = 'to';
            } else {
                $dest = 'bcc';
            }

            foreach($_subsite_admins as $user) {
                $destinatarios[$dest][] = $user->email;
            }

            // Usado para enviar para entidades do contato, e e-mails do responsavel tambem
            if (!$onlyAdmins) {
                $_responsible = $_app->repo('Agent')->find($_entity->owner->id);
                $_app->disableAccessControl();
                $_other_recipients = [
                    'entity_public'       => $_entity->emailPublico,
                    'entity_private'      => $_entity->emailPrivado,
                    'responsible_public'  => $_responsible->emailPublico,
                    'responsible_private' => $_responsible->emailPrivado
                ];
                $_app->enableAccessControl();

                $first_valid_mail = array_shift($_other_recipients);
                $mail_validator = new Email();

                if (!is_null($first_valid_mail) && $mail_validator->validate($first_valid_mail)) {
                    $destinatarios['to'][] = $first_valid_mail;
                } else {
                    $destinatarios['to'][] = array_shift($destinatarios[$dest]);
                }

                foreach ($_other_recipients as $_recipient) {
                    if ($mail_validator->validate($_recipient) && !in_array($_recipient, $destinatarios)) {
                        $destinatarios['bcc'][] = $_recipient;
                    }
                }
            }   

            return $destinatarios;
        }

        return array();
    }

    public function _init() {
        $app = App::i();

        $plugin = $this;

        $params = [];

        if(array_key_exists('compliant',$this->_config)) {
            $params['compliant'] = $this->_config['compliant'];
        }

        if(array_key_exists('suggestion',$this->_config)) {
            $params['suggestion'] = $this->_config['suggestion'];
        }

        $app->hook('template(<<agent|space|event|project>>.<<single>>.main-content):end', function() use ($app, $plugin, $params) {
            $this->part('compliant_suggestion.php',$params);
        });

        $app->hook('mapasculturais.head', function() use($app, $plugin){
            $entity = $app->view->controller->requestedEntity;

            if($entity){
                $app->view->jsObject['angularAppDependencies'][] = 'module.compliantSuggestion';

                $app->view->enqueueScript('app', 'module-compliantSuggestion', 'js/ng.modules.compliantSuggestion.js');
                $app->view->localizeScript('compliantSuggestion', [
                    'compliantEmailRequired' => i::__('O preenchimento do e-mail é obrigatório.'),
                    'compliantTypeRequired' => i::__('O preenchimento do tipo de denúncia é obrigatório.'),
                    'compliantMessageRequired' => i::__('O preenchimento da mensagem da denúncia é obrigatório.'),
                    'compliantSent' => i::__('A denúncia foi enviada.'),

                    'suggestionEmailRequired' => i::__('O preenchimento do e-mail é obrigatório.'),
                    'suggestionTypeRequired' => i::__('O preenchimento do tipo de sugestão é obrigatório.'),
                    'suggestionMessageRequired' => i::__('O preenchimento da mensagem é obrigatório.'),
                    'suggestionSent' => i::__('A sugestão foi enviada.'),

                    'error' => i::__('Erro inesperado ao o enviar a mensagem')
                ]);
            }
        });


        $app->hook('POST(<<agent|space|event|project>>.sendCompliantMessage)', function() use ($plugin) {
            $app = App::i();
            $entity = $app->repo($this->entityClassName)->find($this->data['entityId']);
            if(array_key_exists('anonimous',$this->data) && $this->data['anonimous']) {
                $person = \MapasCulturais\i::__("Anônimo");
                $anonimous = \MapasCulturais\i::__("Anônima");
                $person_email = \MapasCulturais\i::__("Anônimo");
            } else {
                $person = $this->data['name'];
                $anonimous = "";
                $person_email = $this->data['email'];
            }

            $dataValue = [
                'name'          => $app->user->is('guest') ? \MapasCulturais\i::__("Usuário Guest") : $app->user->profile->name,
                'entityType'    => $entity->getEntityTypeLabel(),
                'entityName'    => $entity->name,
                'person'        => $person,
                'email'         => $person_email,
                'url'           => $entity->singleUrl,
                'type'          => $this->data['type'],
                'date'          => date('d/m/Y H:i:s',$_SERVER['REQUEST_TIME']),
                'message'       => $this->data['message']
            ];

            $message = $app->renderMailerTemplate('compliant',$dataValue);

            if(array_key_exists('mailer.from',$app->config) && !empty(trim($app->config['mailer.from']))) {
                $destinatarios = $plugin->setRecipients($app, $entity, true);
                $tos = $destinatarios['to'];
                
                /**
                * @hook {ALL} 'mapasculturais.complaintMessage.destination' Destinátarios e-mail de denúncia 
                * @hookDescription permitir alterar os destinatários do email enviado pelo formulário de denúncia.
                * @hookGroup HookEmail
                * 
                * Envia e-mail para o administrador para instalação Mapas
                */
                $app->applyHook('mapasculturais.complaintMessage.destination', [&$tos]);
                $app->createAndSendMailMessage([
                    'from' => $app->config['mailer.from'],
                    'to' => $tos,
                    'subject' => $message['title'],
                    'body' => $message['body']
                ]);
            }
            if(array_key_exists('copy',$this->data) && $this->data['copy']) {
                if(array_key_exists('email',$this->data) && !empty(trim($this->data['email']))) {
                    $email = $this->data['email'];
                } else {
{'fraction_non_alphanumeric': 0.1514557467508894, 'fraction_numerical': 0.00021781746896101068, 'mean_word_length': 1.8773762272822228, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 196, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7250578', 'n_tokens_mistral': 4087, 'n_tokens_neox': 3827, 'n_words': 623}