Skip to content
Draft
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
4 changes: 0 additions & 4 deletions .gitmessage.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,4 @@
# BREAKING CHANGE: <describe the breaking change and migration path>
# Closes #123
# Relates-to #456
<<<<<<< HEAD
# Co-authored-by: Name <email>
=======
# Co-authored-by: Name <email>
>>>>>>> cab387aa (fix: Attendee Ticket Serializer)
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use models\exceptions\ValidationException;
use models\oauth2\IResourceServerContext;
use models\summit\IOrderConstants;
use models\summit\ISummitAttendeeRepository;
use models\summit\ISummitAttendeeTicketRepository;
use models\summit\ISummitRepository;
use models\summit\Summit;
Expand Down Expand Up @@ -71,16 +72,20 @@ public function getChildSerializer()
*/
private $service;

private $attendee_repository;

/**
* OAuth2SummitTicketApiController constructor.
* @param ISummitRepository $summit_repository
* @param ISummitAttendeeRepository $attendee_repository,
* @param ISummitAttendeeTicketRepository $repository
* @param ISummitOrderService $service
* @param IResourceServerContext $resource_server_context
*/
public function __construct
(
ISummitRepository $summit_repository,
ISummitAttendeeRepository $attendee_repository,
ISummitAttendeeTicketRepository $repository,
ISummitOrderService $service,
IResourceServerContext $resource_server_context
Expand All @@ -89,6 +94,7 @@ public function __construct
parent::__construct($resource_server_context);
$this->repository = $repository;
$this->summit_repository = $summit_repository;
$this->attendee_repository = $attendee_repository;
$this->service = $service;
}

Expand Down Expand Up @@ -274,7 +280,7 @@ public function getAllBySummitCSV($summit_id)
{
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id);
if (is_null($summit)) return $this->error404();

$questions = $summit->getOrderExtraQuestionsByUsage(SummitOrderExtraQuestionTypeConstants::TicketQuestionUsage);
return $this->_getAllCSV(
function () {
return [
Expand Down Expand Up @@ -446,8 +452,25 @@ function () use ($summit) {
sprintf('tickets-%s-', $summit_id),
[
'features_types' => $summit->getBadgeFeaturesTypes(),
'ticket_questions' => $summit->getOrderExtraQuestionsByUsage(SummitOrderExtraQuestionTypeConstants::TicketQuestionUsage)
]
'ticket_questions' => $questions
],
null,
function($data, $serializerParams) use($questions){

$owners = [];
foreach ($data->getItems() as $t){
if ($t->hasOwner()) $owners[] = $t->getOwner()->getId();
}
$questionIds = [];
foreach ($questions as $q) {
$questionIds[] = $q->getId();
}
$questionIds = array_values(array_unique($questionIds));
$owners = array_values(array_unique($owners));

$serializerParams['answers_by_owner'] = $this->attendee_repository->getExtraQuestionAnswersByOwners($owners, $questionIds);
return $serializerParams;
}
);
}

Expand Down Expand Up @@ -932,4 +955,4 @@ public function canPrintAttendeeBadge($summit_id, $ticket_id, $view_type)
);
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,8 @@ public function _getAllCSV
callable $getColumns,
string $file_prefix = 'file-',
array $serializerParams = [],
callable $queryCallable = null
callable $queryCallable = null,
callable $preProcessSerializerParams = null,
)
{

Expand All @@ -192,7 +193,8 @@ public function _getAllCSV
$getColumns,
$file_prefix,
$serializerParams,
$queryCallable
$queryCallable,
$preProcessSerializerParams
) {

$values = Request::all();
Expand Down Expand Up @@ -247,6 +249,9 @@ public function _getAllCSV

$serializerParams['filter'] = $filter;

if(!is_null($preProcessSerializerParams))
$serializerParams = call_user_func($preProcessSerializerParams, $data, $serializerParams);

$list = $data->toArray
(
SerializerUtils::getExpand(),
Expand Down
25 changes: 17 additions & 8 deletions app/Jobs/Emails/AbstractSummitEmailJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
* limitations under the License.
**/

use App\Services\Apis\IMailApi;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;
use Illuminate\Support\Facades\Log;
Expand Down Expand Up @@ -89,14 +90,22 @@ public function __construct
})->toArray();

$payload[IMailTemplatesConstants::main_venue_address] = implode(' - ', $main_venue_addresses);

$payload = array_merge($payload, self::getMarketingVariables($summit));
parent::__construct($payload, $template_identifier, $to_email, $subject, $cc_email, $bcc_email);
}

private static function getMarketingVariables(Summit $summit) {
public function handle
(
IMailApi $api
){
$summit_id = $this->payload[IMailTemplatesConstants::summit_id];
Log::debug(sprintf("AbstractSummitEmailJob::handle summit %s", $summit_id));
$this->payload = array_merge($this->payload, self::getMarketingVariables($summit_id));
parent::handle($api);
}

private static function getMarketingVariables(int $summit_id) {

Log::debug(sprintf("AbstractSummitEmailJob::getMarketingVariables summit %s", $summit->getId()));
Log::debug(sprintf("AbstractSummitEmailJob::getMarketingVariables summit %s", $summit_id));

$default_email_template_vars = collect(Config::get('marketing.default_email_template_vars'))
->mapWithKeys(function ($value, $key) {
Expand All @@ -117,7 +126,7 @@ private static function getMarketingVariables(Summit $summit) {
}

try {
$marketing_vars = $marketing_api->getConfigValues($summit->getId(), 'EMAIL_TEMPLATE_');
$marketing_vars = $marketing_api->getConfigValues($summit_id, 'EMAIL_TEMPLATE_');
} catch(\Exception $ex){
Log::error($ex);
Log::warning
Expand All @@ -138,7 +147,7 @@ private static function getMarketingVariables(Summit $summit) {
sprintf
(
"AbstractSummitEmailJob::getMarketingVariables summit %s marketing var %s not found or empty, using default value (%s).",
$summit->getId(),
$summit_id,
$key,
$value
)
Expand All @@ -153,7 +162,7 @@ private static function getMarketingVariables(Summit $summit) {
sprintf
(
"AbstractSummitEmailJob::getMarketingVariables summit %s injecting marketing_vars %s",
$summit->getId(),
$summit_id,
json_encode($marketing_vars)
)
);
Expand Down Expand Up @@ -185,4 +194,4 @@ public static function getEmailTemplateSchema(): array{

return $payload;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ public function serialize($expand = null, array $fields = [], array $relations =
$serializer_type = $params['serializer_type'];
$summit = $attendee->getSummit();

$attendee->updateStatus();
$beginVotingDate = $params['begin_attendee_voting_period_date'] ?? null;
$endVotingDate = $params['end_attendee_voting_period_date'] ?? null;
$track_group_id = $params['presentation_votes_track_group_id'] ?? null;
Expand Down Expand Up @@ -347,4 +346,4 @@ public function serialize($expand = null, array $fields = [], array $relations =
});

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ public function serialize($expand = null, array $fields = [], array $relations =
$ticket_owner = $ticket->getOwner();

if (isset($params['ticket_questions'])) {
$answersByOwner = $params['answers_by_owner'] ?? null;
foreach ($params['ticket_questions'] as $question) {
if (!$question instanceof SummitOrderExtraQuestionType) continue;

Expand All @@ -88,7 +89,7 @@ public function serialize($expand = null, array $fields = [], array $relations =
$values[$question_label] = '';

if (!is_null($ticket_owner)) {
$value = $ticket_owner->getExtraQuestionAnswerValueByQuestion($question);
$value = $answersByOwner[$ticket_owner->getId()][$question->getId()] ?? null;
if(is_null($value)) continue;

$cacheKey = $question->getId() . '|' . $value;
Expand Down Expand Up @@ -140,4 +141,4 @@ public function serialize($expand = null, array $fields = [], array $relations =

return $values;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -749,7 +749,6 @@ private function warmExtraQuestionAnswersCache():void{

$map = [];
foreach ($rows as $row) {
// QuestionID es int; Value es string (para multiselect puede ser CSV/JSON según tu modelo)
$map[(int)$row['QuestionID']] = $row['Value'];
}
$this->extraQuestionAnswersCache = $map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,11 @@ public function deleteAllBySummit(int $summit_id):bool;
*/
public function getBySummitAndFirstNameAndLastNameAndManager(Summit $summit, string $first_name, string $last_name, SummitAttendee $manager):?SummitAttendee;


/**
* @param array $owners
* @param array $questions
* @return array
*/
public function getExtraQuestionAnswersByOwners(array $owners, array $questions):array;
}
44 changes: 40 additions & 4 deletions app/Repositories/DoctrineRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\LazyCriteriaCollection;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\NativeQuery;
use Doctrine\ORM\Query;
use Doctrine\ORM\Query\ResultSetMappingBuilder;
Expand All @@ -39,6 +40,12 @@
*/
abstract class DoctrineRepository extends EntityRepository implements IBaseRepository
{
protected $fetchJoinCollection = true;

public function __construct(EntityManagerInterface $em, ClassMetadata $class)
{
parent::__construct($em, $class);
}

/**
* @var string
Expand Down Expand Up @@ -189,7 +196,7 @@ protected function getParametrizedAllByPage
Log::debug(sprintf("DoctrineRepository::getParametrizedAllByPage DQL %s", $query->getDQL()));
$start = time();

$paginator = new Paginator($query, $fetchJoinCollection = true);
$paginator = new Paginator($query, $this->fetchJoinCollection);
$total = $paginator->count();
$end = time();
$delta = $end - $start;
Expand Down Expand Up @@ -283,7 +290,7 @@ public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Ord
->setFirstResult($paging_info->getOffset())
->setMaxResults($paging_info->getPerPage());

$paginator = new Paginator($query, $fetchJoinCollection = true);
$paginator = new Paginator($query, $this->fetchJoinCollection);
$total = $paginator->count();
$data = [];

Expand All @@ -300,6 +307,35 @@ public function getAllByPage(PagingInfo $paging_info, Filter $filter = null, Ord
);
}

/**
* @param Filter|null $filter
* @param Order|null $order
* @return int
*/
public function getFastCount(Filter $filter = null, Order $order = null){
$query = $this->getEntityManager()
->createQueryBuilder()
->select('COUNT(DISTINCT e.id)')
->from($this->getBaseEntity(), "e")
->distinct(false);

$query = $this->applyExtraJoins($query, $filter, $order);

$query = $this->applyExtraSelects($query, $filter, $order);

if(!is_null($filter)){
$filter->apply2Query($query, $this->getFilterMappings($filter));
}

$query = $this->applyExtraFilters($query);

if(!is_null($order)){
$order->apply2Query($query, $this->getOrderMappings($filter));
}

return (int) $query->getQuery()->getSingleScalarResult();
}

/**
* @param PagingInfo $paging_info
* @param Filter|null $filter
Expand Down Expand Up @@ -518,7 +554,7 @@ protected function getAllAbstractByPage
->setFirstResult($paging_info->getOffset())
->setMaxResults($paging_info->getPerPage());

$paginator = new Paginator($query, $fetchJoinCollection = true);
$paginator = new Paginator($query, $this->fetchJoinCollection);
$total = $paginator->count();
$data = array();

Expand All @@ -534,4 +570,4 @@ protected function getAllAbstractByPage
$data
);
}
}
}
41 changes: 39 additions & 2 deletions app/Repositories/Summit/DoctrineSummitAttendeeRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ protected function getOrderMappings()
'member_id' => 'm.id',
'status' => 'e.status',
'email' => <<<SQL
COALESCE(LOWER(m.email), LOWER(e.email))
COALESCE(LOWER(m.email), LOWER(e.email))
SQL,
'presentation_votes_count' => 'COUNT(pv.id)',
'summit_hall_checked_in_date' => 'e.summit_hall_checked_in_date',
Expand Down Expand Up @@ -556,4 +556,41 @@ public function getBySummitAndFirstNameAndLastNameAndManager(Summit $summit, str
return $query->getQuery()->getOneOrNullResult();
}

}
/**
* @param array $owners
* @param array $questions
* @return array
* @throws \Doctrine\DBAL\Exception
*/
public function getExtraQuestionAnswersByOwners(array $owners, array $questions): array
{
$sql = <<<SQL
SELECT SOEQA.SummitAttendeeID AS owner_id, EQA.QuestionID AS question_id, EQA.Value AS value
FROM SummitOrderExtraQuestionAnswer SOEQA
JOIN ExtraQuestionAnswer EQA ON EQA.ID = SOEQA.ID
WHERE SOEQA.SummitAttendeeID IN (:owner_ids)
AND EQA.QuestionID IN (:question_ids)
SQL;

$stmt = $this->getEntityManager()->getConnection()->executeQuery
(
$sql,
[
'owner_ids' => $owners,
'question_ids' => $questions
],
[
'owner_ids' => \Doctrine\DBAL\ArrayParameterType::INTEGER,
'question_ids' => \Doctrine\DBAL\ArrayParameterType::INTEGER
]
);

$answersByOwner = [];
foreach ($stmt->fetchAllAssociative() as $r) {
$answersByOwner[(int)$r['owner_id']][(int)$r['question_id']] = (string)$r['value'];
}

return $answersByOwner;

}
}
Loading