Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c2fa362
validando no frontend(url valida, yt e vimeo id)
CaffeineIssues Dec 11, 2025
492512c
adicionando validação nos links
CaffeineIssues Dec 11, 2025
5aa50aa
validação dos campos de rede social
CaffeineIssues Dec 12, 2025
3a10200
Merge remote-tracking branch 'origin/develop' into feature/entity-lin…
CaffeineIssues Dec 12, 2025
9706c16
Permitindo apenas superadmin e saasadmin ver o historico
CaffeineIssues Dec 12, 2025
4ebbb8a
feat: visualizar contrarrazão (proponente)
jeff-doliveira1 Dec 15, 2025
f41629f
removendo logica desnecessaria
CaffeineIssues Dec 17, 2025
5c6c007
Merge pull request #657 from secultce/feature/counter-argument
jeff-doliveira1 Dec 29, 2025
6b50376
Merge pull request #655 from secultce/feature/admin-only-history
CaffeineIssues Dec 29, 2025
505df08
feat: editar contrarrazão
jeff-doliveira1 Dec 30, 2025
b8922e7
Merge pull request #665 from secultce/feature/counter-argument
jeff-doliveira1 Dec 30, 2025
7943470
feat: visualizar contrarrazão (admin)
jeff-doliveira1 Jan 6, 2026
ca32cfe
Merge pull request #669 from secultce/feature/counter-argument
jeff-doliveira1 Jan 6, 2026
ee5cede
refatoração das condições de validação
CaffeineIssues Jan 6, 2026
2e13d41
Merge pull request #652 from secultce/feature/entity-link-validation
CaffeineIssues Jan 6, 2026
0240db5
truncando arquivos longos e ajustando botões
CaffeineIssues Jan 9, 2026
bf794eb
feat: responder contrarrazão
jeff-doliveira1 Jan 12, 2026
4ddf691
Merge pull request #677 from secultce/feature/counter-argument
jeff-doliveira1 Jan 12, 2026
812be23
Merge pull request #675 from secultce/feature/counter-argument-view-p…
jeff-doliveira1 Jan 13, 2026
308a099
correções no front da contrarazão
CaffeineIssues Jan 13, 2026
3b1a1f9
removendo função de excluir da tela da oportunidade
CaffeineIssues Jan 14, 2026
b29730f
Merge pull request #681 from secultce/feature/counter-argument-opport…
jeff-doliveira1 Jan 15, 2026
fc55ebe
feat: enviar contrarrazão (validações)
jeff-doliveira1 Jan 16, 2026
d1f0b11
Merge pull request #686 from secultce/feature/counter-argument
jeff-doliveira1 Jan 16, 2026
262a620
feat: responder contrarrazão (validações)
jeff-doliveira1 Jan 20, 2026
505bccf
Merge pull request #689 from secultce/feature/counter-argument
jeff-doliveira1 Jan 20, 2026
c3183a2
feat: publicar respostas das contrarrazões
jeff-doliveira1 Jan 23, 2026
4a45fe7
Merge pull request #691 from secultce/feature/counter-argument
jeff-doliveira1 Jan 26, 2026
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
5 changes: 3 additions & 2 deletions src/protected/application/conf/conf-base.d/routes.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@
'agente' => 'agent',
'evento' => 'event',
'inscricao' => 'registration',
'prestacoes-de-contas' => 'accountability'
'prestacoes-de-contas' => 'accountability',
'contrarrazoes' => 'counterArguments',
],

'readableNames' => [
Expand Down Expand Up @@ -98,4 +99,4 @@
'search' => i::__('Busca')
]
]
];
];
10 changes: 10 additions & 0 deletions src/protected/application/lib/MapasCulturais/Controllers/Panel.php
Original file line number Diff line number Diff line change
Expand Up @@ -429,4 +429,14 @@ function GET_accountability()
'isFiscal' => $oppAsFiscal ? true : false,
]);
}

public function GET_counterArguments()
{
$this->requireAuthentication();

$userId = App::i()->getUser()->id;
$counterArguments = App::i()->repo('CounterArgument')->getAllByUserId($userId);

$this->render('counter-arguments', ['counterArguments' => $counterArguments]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,28 @@
namespace MapasCulturais\Entities;

use Doctrine\ORM\Mapping as ORM;
use MapasCulturais\App;
use MapasCulturais\Traits;

/**
* CounterArgument
*
* @ORM\Table(name="counter_argument")
* @ORM\Entity
* @ORM\entity(repositoryClass="MapasCulturais\Repository")
* @ORM\entity(repositoryClass="MapasCulturais\Repositories\CounterArgument")
*/
class CounterArgument extends \MapasCulturais\Entity
{
const STATUS_SEND = self::STATUS_ENABLED;
use Traits\EntityFiles;

const STATUS_WAITING = self::STATUS_ENABLED;
const STATUS_DEFERRED = 10;
const STATUS_REJECTED = 3;

const STATUSES = [
self::STATUS_WAITING => 'Aguardando resposta',
self::STATUS_DEFERRED => 'Deferida',
self::STATUS_REJECTED => 'Indeferida',
];

/**
* @var integer
Expand All @@ -38,18 +48,33 @@ class CounterArgument extends \MapasCulturais\Entity
*
* @ORM\Column(name="status", type="smallint", nullable=false)
*/
protected $status = self::STATUS_SEND;
protected $status = self::STATUS_WAITING;

/**
* @var \MapasCulturais\Entities\Registration
*
* @ORM\OneToOne(targetEntity="MapasCulturais\Entities\Registration", inversedBy="CounterArgument\Entities\CounterArgument", cascade={"persist"})
* @ORM\OneToOne(targetEntity="MapasCulturais\Entities\Registration", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="registration_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
* })
*/
protected $registration;

/**
* @var \MapasCulturais\Entities\CounterArgumentFile[] Files
*
* @ORM\OneToMany(targetEntity="MapasCulturais\Entities\CounterArgumentFile", fetch="EXTRA_LAZY", mappedBy="owner", cascade="remove", orphanRemoval=true)
* @ORM\JoinColumn(name="id", referencedColumnName="object_id", onDelete="CASCADE")
*/
protected $__files;

/**
* @var \MapasCulturais\Entities\CounterArgumentResponse|null
*
* @ORM\OneToOne(targetEntity="MapasCulturais\Entities\CounterArgumentResponse", mappedBy="counterArgument", fetch="LAZY")
*/
protected $response;

/**
* @var \DateTime
*
Expand All @@ -63,11 +88,4 @@ class CounterArgument extends \MapasCulturais\Entity
* @ORM\Column(name="update_timestamp", type="datetime", nullable=true)
*/
protected $updateTimestamp;

public function send(array $data)
{
$this->text = $data['text'];
$this->registration = App::i()->repo('Registration')->find($data['registration']);
$this->save();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

namespace MapasCulturais\Entities;

use Doctrine\ORM\Mapping as ORM;

/**
* CounterArgumentResponse
*
* @ORM\Table(name="counter_argument_response")
* @ORM\Entity
* @ORM\entity(repositoryClass="MapasCulturais\Repositories\CounterArgument")
*/
class CounterArgumentResponse extends \MapasCulturais\Entity
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="SEQUENCE")
* @ORM\SequenceGenerator(sequenceName="counter_argument_response_id_seq", allocationSize=1, initialValue=1)
*/
protected $id;

/**
* @var string
*
* @ORM\Column(name="text", type="text", nullable=false)
*/
protected $text;

/**
* @var boolean
*
* @ORM\Column(name="published", type="boolean", nullable=false)
*/
protected $published = false;

/**
* @var \MapasCulturais\Entities\Agent
*
* @ORM\ManyToOne(targetEntity="MapasCulturais\Entities\Agent", fetch="LAZY")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="agent_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
* })
*/
protected $owner;

/**
* @var \MapasCulturais\Entities\CounterArgument
*
* @ORM\OneToOne(targetEntity="MapasCulturais\Entities\CounterArgument", cascade={"persist"})
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="counter_argument_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
* })
*/
protected $counterArgument;

/**
* @var \DateTime
*
* @ORM\Column(name="create_timestamp", type="datetime", nullable=false)
*/
protected $createTimestamp;

/**
* @var \DateTime
*
* @ORM\Column(name="update_timestamp", type="datetime", nullable=true)
*/
protected $updateTimestamp;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace MapasCulturais\Repositories;

use MapasCulturais\App;
use MapasCulturais\Entities\CounterArgument as CounterArgumentEntity;

class CounterArgument extends \MapasCulturais\Repository
{
public function getAllByUserId(int $userId): array
{
$qb = App::i()->em->createQueryBuilder();
$qb->select('ca')
->from(CounterArgumentEntity::class, 'ca')
->innerJoin('ca.registration', 'r')
->innerJoin('r.owner', 'a')
->where('a.user = :userId')
->setParameter('userId', $userId);

return $qb->getQuery()->getResult();
}

public function getAllByOpportunityId($opportunityId): array
{
$qb = App::i()->em->createQueryBuilder();
$qb->select('ca')
->from(CounterArgumentEntity::class, 'ca')
->innerJoin('ca.registration', 'r')
->where('r.opportunity = :opportunityId')
->setParameter('opportunityId', $opportunityId);

return $qb->getQuery()->getResult();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,18 @@
use MapasCulturais\App;
use MapasCulturais\Entities\CounterArgument;
use MapasCulturais\Entities\CounterArgumentFile;
use MapasCulturais\Entities\CounterArgumentResponse;
use MapasCulturais\Entities\Registration;

class CounterArgumentService
{
private $counterArgumentEntity;
private $counterArgumentResponseEntity;

public function __construct()
{
$this->counterArgumentEntity = new CounterArgument();
$this->counterArgumentResponseEntity = new CounterArgumentResponse();
}

public function isCounterArgumentPeriod($opportunity)
Expand All @@ -31,22 +35,100 @@ public function isCounterArgumentPeriod($opportunity)
return false;
}

public function send(array $data)
public function isResponsePeriod($opportunity)
{
$this->counterArgumentEntity->send($data);
$finalStr = $opportunity->finalDateCounterArgument . ' ' . $opportunity->finalTimeCounterArgument;
$final = new DateTime($finalStr);
$now = new DateTime();

$appealEnabled = $opportunity->appealEnabled === 'Sim' ? true : false;

if ($appealEnabled && $now > $final) return true;

return false;
}

public function getCounterArgumentsWithoutResponse($counterArguments)
{
$counterArgumentsWithoutResponse = array_filter($counterArguments, function ($counterArgument) {
return !$counterArgument->response;
});

return $counterArgumentsWithoutResponse;
}

public function send(string $text, Registration $registration)
{
$this->counterArgumentEntity->text = $text;
$this->counterArgumentEntity->registration = $registration;
$this->counterArgumentEntity->save();

foreach ($_FILES as $file) {
$this->saveFiles($_FILES, $this->counterArgumentEntity);

App::i()->em->flush();
}

public function update(string $text, CounterArgument $counterArgument)
{
$counterArgument->text = $text;
$counterArgument->updateTimestamp = new DateTime();

$this->saveFiles($_FILES, $counterArgument);

$counterArgument->save(true);
App::i()->em->flush();
}

private function saveFiles($files, $counterArgument)
{
foreach ($files as $file) {
App::i()->disableAccessControl();

$counterArgumentFile = new CounterArgumentFile($file);
$counterArgumentFile->setGroup('counter-argument-attachment');
$counterArgumentFile->owner = $this->counterArgumentEntity;
$counterArgumentFile->owner = $counterArgument;
$counterArgumentFile->private = true;
$counterArgumentFile->save();

App::i()->enableAccessControl();
}
}

App::i()->em->flush();
public function removeFile(CounterArgumentFile $counterArgumentFile)
{
$counterArgumentFile->delete(true);
}

public function saveResponse(array $data)
{
$counterArgument = App::i()->repo('CounterArgument')->find($data['counterArgumentId']);
$counterArgumentResponse = App::i()->repo('CounterArgumentResponse')->findOneBy(['counterArgument' => $counterArgument->id]);

if ($counterArgumentResponse) {
$counterArgumentResponse->text = $data['text'];
$counterArgumentResponse->updateTimestamp = new DateTime();
$counterArgumentResponse->save(true);
} else {
$this->counterArgumentResponseEntity->text = $data['text'];
$this->counterArgumentResponseEntity->owner = App::i()->getUser()->profile;
$this->counterArgumentResponseEntity->counterArgument = $counterArgument;
$this->counterArgumentResponseEntity->save(true);
}

$counterArgument->status = (int)$data['status'];
$counterArgument->save(true);
}

public function publishResponses($counterArguments)
{
foreach ($counterArguments as $counterArgument) {
$response = $counterArgument->response;
if ($response && !$response->published) {
App::i()->disableAccessControl();
$response->published = true;
$response->save(true);
App::i()->enableAccessControl();
}
}
}
}
2 changes: 1 addition & 1 deletion src/protected/application/lib/MapasCulturais/Validator.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static function url($domain = null){
return self::call(
'parse_url',
self::arrayType()
->key('scheme', self::startsWith('http'))
->key('scheme', self::startsWith('https'))
->key('host', $domain ? self::domain()->endsWith($domain) : self::domain())
);

Expand Down
Loading
Loading