Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion config/logs.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,20 @@
'app.log.assets' => env('LOG_ASSETS', false),
'app.log.auth' => env('LOG_AUTH', false),

'app.log.evaluations' => env('LOG_EVALUATIONS', false),
'app.log.summary' => env('LOG_SUMMARY', false),

'app.log.lockfile' => env('LOG_LOCKFILE', false),

'app.log.components' => env('LOG_COMPONENTS', false),
'app.log.assetManager' => env('LOG_ASSETMANAGER', false),

'app.log.jobs' => env('LOG_JOBS', false),
'app.log.pcache' => env('LOG_PCACHE', false),
'app.log.pcache.users' => env('LOG_PCACHE_USERS', false),

'app.queryLogger' => env('LOG_QUERYLOG_CLASS', null)
'app.queryLogger' => env('LOG_QUERYLOG_CLASS', null),



];
9 changes: 7 additions & 2 deletions src/core/ApiQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,7 @@ protected function generateWhere() {
$where = $where_dqls;
}

if($this->usesStatus && (!isset($this->apiParams['status']) || !$this->_permission)){
if($app->isAccessControlEnabled() && $this->usesStatus && (!isset($this->apiParams['status']) || !$this->_permission)){
$params = $this->apiParams;

if($this->rootEntityClassName === Opportunity::class && (isset($params['id']) || isset($params['status']) || isset($params['parent']))) {
Expand Down Expand Up @@ -1319,7 +1319,7 @@ protected function processEntities(array &$entities) {
$entity['originSiteUrl'] = $main_site_url;
}
if($this->_selectingType && isset($entity['_type'])){
$entity['type'] = $types[$entity['_type']];
$entity['type'] = $types[$entity['_type']] ?? null;
unset($entity['_type']);
}

Expand Down Expand Up @@ -3156,6 +3156,11 @@ protected function _setPermissionsUser($value) {

protected function _addFilterByPermissions($value) {
$app = App::i();

if(!$app->isAccessControlEnabled()) {
return;
}

$user = $this->_permissionsUser ?
$app->repo('User')->find($this->_permissionsUser) :
$app->user;
Expand Down
14 changes: 13 additions & 1 deletion src/core/App.php
Original file line number Diff line number Diff line change
Expand Up @@ -1799,8 +1799,20 @@ public function enqueueJob(string $type_slug, array $data, string $start_string
$conn->delete('job', ['id' => $id]);
}

/** @var Entities\Job $job */
if ($job = $this->repo('Job')->find($id)) {
return $job;
$job_create_timestamp = $job->createTimestamp;

// o job tem mais que 5 minutos?
$is_old = $job_create_timestamp->getTimestamp() < (time() - 5 * MINUTE_IN_SECONDS);

// remove o job se ele estiver com status de processamento e for mais velho que 5 minutos
if($job->status == Job::STATUS_PROCESSING && $iterations == 1 && $is_old) {
$conn = $this->em->getConnection();
$conn->delete('job', ['id' => $id]);
} else {
return $job;
}
}

$job = new Job($type);
Expand Down
18 changes: 18 additions & 0 deletions src/core/Controllers/EvaluationMethodConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use MapasCulturais\Controller;
use MapasCulturais\Entities\EvaluationMethodConfiguration as EvaluationMethodConfigurationEntity;
use MapasCulturais\Traits;
use Opportunities\Jobs\RedistributeCommitteeRegistrations;

// use MapasCulturais\Entities\EvaluationMethodConfiguration;

Expand Down Expand Up @@ -187,4 +188,21 @@ protected function _setPermissionCacheUsers(){

$entity->__skipQueuingPCacheRecreation = true;
}

function POST_registributeEvaluations() {
$app = App::i();

$this->requireAuthentication();

$emc = $this->requestedEntity;

if(!$emc) {
$app->pass();
}
$emc->checkPermission('manageEvaluationCommittee');

$app->enqueueOrReplaceJob(RedistributeCommitteeRegistrations::SLUG, ['evaluationMethodConfiguration' => $emc], 'now');

$this->json(true);
}
}
37 changes: 33 additions & 4 deletions src/core/Controllers/Opportunity.php
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,8 @@ function apiFindRegistrations($opportunity, $query_data) {
}
}


$opportunity->registerRegistrationMetadata();

return (object) ['count' => $current_phase_query->count(), 'registrations' => $current_phase_result,];
}

Expand Down Expand Up @@ -942,8 +943,8 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = [])
$rdata = [
'@select' => 'id',
'opportunity' => "EQ({$opportunity->id})",
'@permissions' => 'viewUserEvaluation',
'@order' => 'id ASC'
'@order' => 'id ASC',
'status' => API::GT(0)
];

foreach($query_data as $k => $v){
Expand All @@ -960,9 +961,10 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = [])
}
}

$app->disableAccessControl();
$registrations_query = new ApiQuery('MapasCulturais\Entities\Registration', $rdata);

$registration_ids = implode(",", $registrations_query->findIds() ?: [-1]);
$app->enableAccessControl();

$query = "
SELECT
Expand Down Expand Up @@ -1035,13 +1037,16 @@ function apiFindEvaluations(int $opportunity_id = null, array $query_data = [])

$evaluations = $conn->fetchAll($query, $params);

$app->disableAccessControl();

$registration_numbers = array_filter(array_unique(array_map(function($r) { return $r['registration_number']; }, $evaluations)));
$evaluations_ids = array_filter(array_unique(array_map(function($r) { return $r['evaluation_id']; }, $evaluations)));

$_registrations = $this->_getOpportunityRegistrations($opportunity, $registration_numbers, $query_data);
$_evaluations = $this->_getOpportunityEvaluations($opportunity, $evaluations_ids);

$app->disableAccessControl();

$_result = [];

foreach($evaluations as $eval) {
Expand Down Expand Up @@ -1473,5 +1478,29 @@ public function ALL_fixNextPhaseRegistrationIds():void
$opportunity->fixNextPhaseRegistrationIds();

}

public function API_findEvaluable(): void {
$this->requireAuthentication();

$app = App::i();

$user_id = $this->data['@user'] ?? $app->user->id;
$user = $app->repo('User')->find($user_id);

$user->profile->checkPermission('@control');

$opportunity_ids = $app->repo('Opportunity')->findValuerOpportunities($user->id, only_ids: true);

$query_params = $this->data;
$query_params['id'] = API::IN($opportunity_ids);

unset($query_params['@user']);

$query = new ApiQuery(EntitiesOpportunity::class, $query_params);
$result = $query->find();

$this->apiAddHeaderMetadata($query_params, $result, $query->count());
$this->apiResponse($result);
}

}
71 changes: 65 additions & 6 deletions src/core/Entities/EvaluationMethodConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,11 @@ public function getSummary($skip_cache = false): array {
return $app->mscache->fetch($cache_key);
}
}

if ($app->config['app.log.summary']) {
$app->log->debug("SUMMARY: Atualizando o resumo de avaliações da fase {$this->name} ($this->id)");
}

$em = $this->evaluationMethod;
$conn = $app->em->getConnection();
$opportunity = $this->owner;
Expand Down Expand Up @@ -402,7 +407,65 @@ public function getSummary($skip_cache = false): array {
return $data;
}

public function enqueueUpdateSummary($start_string = '10 seconds') {


public function getValuerSummary(?User $user = null): array {
$app = App::i();

/** @var \MapasCulturais\Connection $conn */
$conn = $app->em->getConnection();
$opportunity = $this->opportunity;
$data = [];
if($user) {
$user_ids = [$user->id];
} else {
$agent_relations = $this->getAgentRelations();

$user_ids = array_map(fn($agent_relation) => $agent_relation->agent->user->id, $agent_relations);
}

$user_ids = implode(',', $user_ids);
/**
* Constrói a query para contar as avaliações com base no status.
*
* @param int|null $status Status da avaliação (0 = iniciada, 1 = concluída, 2 = enviada).
* @return int Retorna a contagem de avaliações.
*/
$buildQuery = function ($status = null) use ($user_ids, $opportunity, $conn): int {
$statusCondition = is_null($status) ? "e.status IS NULL" : "e.status = {$status} AND e.registration_id IN (SELECT r.id FROM registration r WHERE r.opportunity_id = {$opportunity->id})";


$query = "
SELECT DISTINCT count(e.registration_id)
FROM registration_evaluation e
WHERE {$statusCondition} AND user_id IN($user_ids)
";

return $conn->fetchScalar($query);
};

// Avaliações pendentes
$query = "
SELECT DISTINCT count(e.registration_id)
FROM evaluations e
WHERE opportunity_id = {$opportunity->id} AND e.evaluation_status IS NULL AND valuer_user_id IN ($user_ids)
";

$data['pending'] = $conn->fetchScalar($query);

// Avaliações iniciadas
$data['started'] = $buildQuery(0);

// Avaliações concluídas
$data['completed'] = $buildQuery(1);

// Avaliações enviadas
$data['sent'] = $buildQuery(2);

return $data;
}

public function enqueueUpdateSummary(string $start_string = 'now') {
$app = App::i();
$app->enqueueOrReplaceJob(UpdateSummaryCaches::SLUG, [
'evaluationMethodConfiguration' => $this
Expand Down Expand Up @@ -488,11 +551,7 @@ protected function canUserRemove($user){
}

protected function canUserManageEvaluationCommittee($user){
if(!$this->canUser('@controll', $user)){
return false;
}

return true;
return $this->opportunity->canUser('@control', $user);
}

protected function canUserCreateAgentRelationWithControl($user){
Expand Down
Loading