Skip to content

Commit

Permalink
Merge pull request #377 from FeliciLab/develop
Browse files Browse the repository at this point in the history
Develop to main
  • Loading branch information
jeff-doliveira1 authored Jan 17, 2023
2 parents 294fd55 + 0d9161e commit e9d1a04
Show file tree
Hide file tree
Showing 10 changed files with 688 additions and 59 deletions.
67 changes: 67 additions & 0 deletions Controllers/EvaluationDocumental.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php
namespace Saude\Controllers;

use Exception;
use \MapasCulturais\App;
use MapasCulturais\Entities\Registration;

class EvaluationDocumental extends \MapasCulturais\Controller {
public function GET_sendMailRegistrationEvaluation()
{
$app = App::i();

if ((int) $this->data['id']) {
$registrationId = $this->data['id'];

$registration = $app->repo("Registration")->find($registrationId);
if ($registration) {
$evaluation = null;
if(isset($this->data['uid'])){
$evaluation = $app->repo('RegistrationEvaluation')->findOneBy([
'registration' => $registration,
'user' => $this->data['uid']
]);
if($evaluation && !$evaluation->registration->equals($registration)){
$evaluation = null;
}
}

$app->em->remove($evaluation);
$app->em->flush();

$registration->setStatusToDraft();

$fieldInvalids = '';
$fieldInvalids .= '<ul>';
foreach ($evaluation->evaluationData as $evaluationData) {
if ($evaluationData && $evaluationData['evaluation'] == 'invalid') {
$observacao = !empty($evaluationData['obs']) ? '<br /> Observação: ' . $evaluationData['obs'] : '';
$fieldInvalids .= '<li style="color:red !important;"><b>' . $evaluationData['label'] . '</b>' . $observacao . '</li><br>';
}
}
$fieldInvalids .= '</ul>';

$urlOpportunity = $app->getBaseUrl() . 'oportunidade/' . $registration->opportunity->id;

$dataValue = [
'urlOpportunity' => $urlOpportunity,
'registrationId' => $registration->id,
'opportunity' => $registration->opportunity->name,
'name' => $registration->owner->name,
'fieldInvalids' => $fieldInvalids,
];

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

$app->createAndSendMailMessage([
'from' => $app->config['mailer.from'],
'to' => $registration->owner->user->email,
'subject' => 'MAPA DA SAÚDE - ALERTA DE DOCUMENTAÇÃO INVÁLIDA.',
'body' => $message['body']
]);

return $this->json(['message' => 'Envio do e-mail realizado com sucesso.', 'type' => 'success', 'status' => 200], 200);
}
}
}
}
26 changes: 26 additions & 0 deletions Repositories/Agent.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace Saude\Repositories;

use MapasCulturais\App;
use MapasCulturais\Entities\User;

class Agent extends \MapasCulturais\Repository
{
public static function checkCpfLinkedAnotherAgent($typed_cpf, $agent_id)
{
$app = App::i();

$query = $app->em->createQuery(
"SELECT IDENTITY(am.owner) AS agent_id FROM MapasCulturais\Entities\AgentMeta am
INNER JOIN MapasCulturais\Entities\User u WITH am.owner = u.profile
WHERE am.key = 'documento' AND am.value = :cpf AND am.owner != :agentId AND u.status = :userStatus"
);

$query->setParameter('cpf', $typed_cpf);
$query->setParameter('agentId', $agent_id);
$query->setParameter('userStatus', User::STATUS_ENABLED);

return $query->getResult();
}
}
169 changes: 111 additions & 58 deletions Theme.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@

namespace Saude;

use MapasCulturais\Themes\BaseV1;
use MapasCulturais\App;
use MapasCulturais\Entities\Project;
use MapasCulturais\Entities\User;
use MapasCulturais\i;
use MapasCulturais\Themes\BaseV1;
use Saude\Repositories\Agent;
use Saude\Utils\Validation;

class Theme extends BaseV1\Theme{

Expand Down Expand Up @@ -109,10 +112,10 @@ function _init() {

/* INSCRIÇÕES */
// modifica mensagem de ajuda no form de upload
$app->hook('view.partial(singles/registration-edit--upload-form).params', function (&$__data) {
/* $app->hook('view.partial(singles/registration-edit--upload-form).params', function (&$__data) {
$__data['form_help'] = i::__('Consulte o edital desta oportunidade para entender as limitações de tamanho e formato dos arquivos solicitados.');
});
}); */

/* PROJETOS */
// muda o nome da aba Principal para Detalhes
$app->hook('view.partial(tab).params', function(&$__data, &$__template) {
Expand Down Expand Up @@ -558,14 +561,6 @@ function _init() {
}
});

/**
* Adiciona máscara de CPF/CNPJ na criação e edição de um agente
*/
$app->hook('entity(Agent).get(site)', function() use ($app) {
$app->view->enqueueScript('app', 'agent', 'js/agent.js');
});


/**
* Adiciona novos menus no painel
*/
Expand All @@ -585,57 +580,135 @@ function _init() {
$app->hook('template(space.<<*>>.tab-about-extra-info):before', function(){
$entity = $this->controller->requestedEntity;
$this->part('singles/space-services', ['entity' => $entity]);
});
});

/**
* Não permite que CPF seja salvo no agente responsável pela inscrição se este já estiver vinculado a outro agente
*/
$app->hook('PATCH(registration.single):data', function(&$data) use ($app) {
$app->hook('PATCH(registration.single):data', function ($data) use ($app) {
$registration = $app->repo('Registration')->find(intval($data['id']));
$query = $app->em->createQuery("SELECT rfc.id FROM MapasCulturais\Entities\RegistrationFieldConfiguration rfc WHERE rfc.owner = :opportunityId AND rfc.config LIKE '%documento%'");

$query = $app->em->createQuery(
"SELECT rfc.id FROM MapasCulturais\Entities\RegistrationFieldConfiguration rfc
WHERE rfc.owner = :opportunityId AND rfc.config LIKE '%documento%'"
);

$query->setParameter('opportunityId', $registration->opportunity->id);

if (count($query->getResult())) {
if ($query->getResult()) {
$result = $query->getSingleResult();
$field_id = $result['id'];
$cpf = $data["field_{$field_id}"];
$query = $app->em->createQuery("SELECT IDENTITY(am.owner) FROM MapasCulturais\Entities\AgentMeta am WHERE am.value = :cpf AND am.owner != :agentId");
$query->setParameter('cpf', $cpf);
$query->setParameter('agentId', $registration->owner->id);

$result = $query->getResult();
$result = Agent::checkCpfLinkedAnotherAgent($cpf, $registration->owner->id);

$msgEmailVinculado = '';
if (!empty($result) && $result[0][1]) {
$agent = $app->repo('Agent')->find($result[0][1]);
if ($result) {
$agent = $app->repo('Agent')->find($result[0]["agent_id"]);

$emailVinculado = $agent->getMetadata('emailPrivado');

$emailVinculadoPart = explode('@', $emailVinculado);
$user = substr($emailVinculadoPart[0], 0, -3);
$dominio = $emailVinculadoPart[1];

$email = $user . '***@' . $dominio;

$msgEmailVinculado = 'CPF vinculado ao e-mail: ' . $email;
}


if (checkValidDocument($cpf) && $cpf && count($result)) {
$this->errorJson(json_decode('{"field_'.$field_id.'": ["Já existe um cadastro vinculado a este CPF. ' . $msgEmailVinculado . '. Verifique se você possui outra conta no Mapa da Saúde."]}'), 400);
} elseif (!checkValidDocument($cpf) && $cpf) {
$this->errorJson(json_decode('{"field_'.$field_id.'": ["O número de documento informado é inválido."]}'), 400);
if (Validation::checkValidDocument($cpf) && $cpf) {
$this->errorJson(
json_decode(
'{"field_' . $field_id . '": ["Já existe um cadastro vinculado a este CPF. ' . $msgEmailVinculado . '. Verifique se você possui outra conta no Mapa da Saúde."]}'
),
400
);
} elseif (!Validation::checkValidDocument($cpf) && $cpf) {
$this->errorJson(
json_decode('{"field_' . $field_id . '": ["O número de documento informado é inválido."]}'),
400
);
}
}
}
});

$app->hook('template(registration.view.form):begin', function() use($app) {
/**
* Adiciona máscara de CPF/CNPJ na criação e edição de um agente
*/
$app->hook('entity(Agent).get(site)', function () use ($app) {
$app->view->enqueueScript('app', 'agent', 'js/agent.js');
});

$app->hook('template(registration.view.form):begin', function () {
$entity = $this->controller->requestedEntity;

$current_registration = $entity;
$this->jsObject['entity']['object']->category = $current_registration->category;
});

// adiciona o botão de enviar o email na avaliação documental
$app->hook('template(registration.view.documentary-evaluation-view):after', function() use($app) {
$registration = $this->controller->requestedEntity;
if ($registration->opportunity->canUser('@control') && $registration->consolidatedResult == -1) {
$userId = $registration->controller->urlData['uid'];
$this->part('singles/button/evaluation-documental-sendmail--button', ['registration' => $registration, 'userId' => $userId]);
}
});
/**
* Faz validação de CPF vinculado a outro agente somente se este estiver com status ativo (edição do agente)
*/
$app->hook('PUT(agent.single):data', function ($data) use ($app) {
$typed_cpf = $data["documento"];
$agent = $app->repo('Agent')->find(intval($this->data["id"]));

$result = Agent::checkCpfLinkedAnotherAgent($typed_cpf, $agent->id);

if ($result && Validation::checkValidDocument($typed_cpf)) {
$this->json(
json_decode('{
"data": {
"documento": ["Já existe um cadastro vinculado a este CPF/CNPJ. Verifique se você possui outra conta no Mapa da Saúde."]
},
"error": true
}'),
200
);
} else {
if (Validation::checkValidDocument($typed_cpf)) {
$agent->documento = $typed_cpf;

$agent->save(true);
}

return;
}
});

$app->hook('POST(agent.index):data', function ($data) use ($app) {
$typed_cpf = $data["documento"];

$query = $app->em->createQuery(
"SELECT IDENTITY(am.owner) AS agent_id FROM MapasCulturais\Entities\AgentMeta am
INNER JOIN MapasCulturais\Entities\Agent a WITH am.owner = a.id
WHERE am.key = 'documento' AND am.value = :cpf AND a.status = :agentStatus"
);

$query->setParameter('cpf', $typed_cpf);
$query->setParameter('agentStatus', User::STATUS_ENABLED);

$result = $query->getResult();

if ($result && Validation::checkValidDocument($typed_cpf)) {
$this->json(
json_decode('{
"data": {
"documento": ["Este CPF/CNPJ já está vinculado a outro agente"]
},
"error": true
}'),
200
);
} else {
return;
}
});
}

private function validateRegistrationLimitPerOwnerProject()
Expand Down Expand Up @@ -724,6 +797,9 @@ protected function _publishAssets() {

// Alerts
$app->view->enqueueScript('app', 'sweetalert2', 'js/sweetalert2.all.min.js');


$app->view->enqueueScript('app', 'sendMailRegistrationEvaluation', 'js/sendMailRegistrationEvaluation.js');

}

Expand Down Expand Up @@ -804,6 +880,8 @@ function register() {
// $app->registerController('panel', 'Saude\Controllers\Panel');
$app->registerController('categoria-profissional', 'Saude\Controllers\ProfessionalCategory');
$app->registerController('indicadores', 'Saude\Controllers\Indicadores');
$app->registerController('EvaluationDocumental', 'Saude\Controllers\EvaluationDocumental');


$this->registerRegistrationMetadata('preliminaryResult', [
'label' => i::__('Resultado Preliminar'),
Expand Down Expand Up @@ -929,28 +1007,3 @@ public function getLoginLinkAttributes() {
}

}

function checkValidDocument($document)
{
// Extrai somente os números
$document = preg_replace('/[^0-9]/is', '', $document);

// Verifica se o documento está completo
if (strlen($document) !== 11) return false;

// Verifica se o documento é uma sequência de números iguais
if (preg_match('/(\d)\1{10}/', $document)) return false;

// Faz o calculo para validar o CPF
for ($digits = 9; $digits < 11; $digits++) {
for ($sum_digits = 0, $digit_index = 0; $digit_index < $digits; $digit_index++) {
$sum_digits += $document[$digit_index] * (($digits + 1) - $digit_index);
}

$sum_digits = ((10 * $sum_digits) % 11) % 10;

if ($document[$digit_index] != $sum_digits) return false;
}

return true;
}
31 changes: 31 additions & 0 deletions Utils/Validation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

namespace Saude\Utils;

class Validation
{
public static function checkValidDocument($document)
{
// Extrai somente os números
$document = preg_replace('/[^0-9]/is', '', $document);

// Verifica se o documento está completo
if (strlen($document) !== 11) return false;

// Verifica se o documento é uma sequência de números iguais
if (preg_match('/(\d)\1{10}/', $document)) return false;

// Faz o calculo para validar o CPF
for ($digits = 9; $digits < 11; $digits++) {
for ($sum_digits = 0, $digit_index = 0; $digit_index < $digits; $digit_index++) {
$sum_digits += $document[$digit_index] * (($digits + 1) - $digit_index);
}

$sum_digits = ((10 * $sum_digits) % 11) % 10;

if ($document[$digit_index] != $sum_digits) return false;
}

return true;
}
}
2 changes: 1 addition & 1 deletion agent-types.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
'label' => \MapasCulturais\i::__('CPF ou CNPJ'),
'validations' => array(
'required' => \MapasCulturais\i::__('Seu documento deve ser informado.'),
'unique' => \MapasCulturais\i::__('Já existe um cadastro vinculado a este CPF/CNPJ. Verifique se você possui outra conta no Mapa da Saúde.'),
// 'unique' => \MapasCulturais\i::__('Já existe um cadastro vinculado a este CPF/CNPJ. Verifique se você possui outra conta no Mapa da Saúde.'),
'v::oneOf(v::cpf(),v::cnpj())' => \MapasCulturais\i::__('O número de documento informado é inválido.')
),
'available_for_opportunities' => true
Expand Down
4 changes: 4 additions & 0 deletions assets/css/alert_changes.css
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,8 @@
top: 25px;
bottom: 25px;
font-size: 20px;
}

.swal2-confirm {
margin-left: 20px;
}
Loading

0 comments on commit e9d1a04

Please sign in to comment.