|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11144
|
|
PhpStormFileFV faVsco.jsProject vEditViewNavigateC PhpStormFileFV faVsco.jsProject vEditViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositon)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php©RoleChangeEventRepositol© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> C AjReportsD AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (5 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(0 TrackProviderinstalled-vent.onv© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V4 ^ V 395859114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) m 43* @param string $sortColumnThe column to44* @param string $sortDirection The sort dire 45* @return Collection<AutomatedReport>12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created A* Oodrdll usernusenIne user Ynos* @param string $sortColumnThe column toi* Oparam string $sortDirection The sort dire* @return Collection<AutomatedReport>*/—6214 usagespublic function getAskJiminnyReportsByUser(- 64User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor]— 68-71/*** Get all active and enabled reports with al* @param string $frequency— 76* dreturn coccectron<aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(s= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNG© OnDemandV2Controller.php© HistoryService.phpAskJiminnykeportAcuivilyservice.ong xActiviysearch.php© Criteria.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no dace conscraint is applled - macching che denavaour of geccontexchoraskanychingbyralce* Oreturn string[] Activity IDs14 usagespublic function getActivityIdsForSavedSearch(Search $savedSearch,User $user,): array {Cascade & TICommand 9l$requestParams = Sthis->buildRequestParamsFromSearch($savedSearch, Suser);ocrurerta = urluerta.:creocerronkequestAcceptmagee ($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, Suser);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger->info('lAskviminnxReport] Fetchedactivity IDs for saved search', ["saveo scalrcin 10=nsaveosearci-poetlo'user id' => Suser->getido'activity_count' => count($activityIds),1):return $activityIds;Extract Surround I/ Eonivate tuncrion outuoreduestrarans-ronsearchsearch savedsearch. user "user): arrav$params = 1:$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO;$valve = $filter->getFilterValve();if (in_array($key,continue;haystack: self::DATE_FILTER_KEYS,strict: true)) &X Reject File 0* €halSupport Daily • in 2h 46 mAU AskJiminnyReportActivityServiceT..Defaults100% [2Tue 14 Apr 12:14:54CascadeFixing ReportControllerAutomated Report M: XC Fixing Ask Jiminny R+D ...pected and why do I need to work with that. How is it used inConkSiminyCeporo/tavtyS ervite, hto tetch t shotiftie saseased on savedSearch. THe ids in on demand and inExploring.Itlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> CodeClaude Sonnet 4.6Reject allView allAccept allW Windsurf Teamsb6:6895 chars, 22 line breaksuir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11145
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 46 m100% <47Tue 14 Apr 12:14:568Today ~...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11146
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 46 m100% <47Tue 14 Apr 12:14:598Today ~...
|
NULL
|
NULL
|
NULL
|
11147
|
|
PhpStormFileFV faVsco.jsProjectvEditViewNavigateCo PhpStormFileFV faVsco.jsProjectvEditViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> C AjReports(J AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (5 minutes ago)© ReportController.phpC AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e) TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V4 ^ v 3958114115116117118119120/*** Retrieve all standard (non-Ask Liminny) ai 43* @param string $sortColumnThe column te 44* Cparam string $sortDirection The sort dire45*orerurn cocuecclonsauromareoredore12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}53/*** Retrieve all Ask Liminny reports created 55* Oodrdll usernusenThe User Who: 57* @param string $sortColumnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(_64User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§g0= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNG© OnDemandV2Controller.php© HistoryService.phpAskJiminnykeporAcuivilyservice.ong xActiviysearch.php© Criteria.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the behaviour of getContextForAskAnythingByFilte* @return string[] Activity IDs*/14 usagespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = Sthis->buildRequestParamsFromSearch($savedSearch, Suser);ocrurerta = urluerta.:creocerronkequestAccept mergeet$requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge (SrequestParams, '"Limit' => seLf::DEFAULT_TOP_ACTIVITIES_COUNT, 'page"$user->getTimezone()D:1$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, Suser);$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filtel$this->logger->info('lAskviminnxReport] Fetchedactivity IDs for saved search', ['saved search_id' => $savedSearch-›getido.'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser): array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,naystack: seLT.:DAIE_FILIER_KEYS,strict: true)){X Reject File 0* €halSupport Daily • in 2h 46 mAAskJiminnyReportActivityServiceT...Defaults v100% [8Tue 14 Apr 12:14:59CascadeFixing ReportControllerAutomated Report Mai• Fixing Ask Jiminny R+D..again. Why is there issue with that? Where is it exected and why do I need to work with that. How is it used inased on savedSearch. THe ids in on demand and [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:wItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Reject allView allAccept allwinasun leams53:1189s chars, 2z line breaksuir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11148
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 45 m100% <47Tue 14 Apr 12:15:008Today ~...
|
NULL
|
NULL
|
NULL
|
11149
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> D AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (5 minutes ago)© ReportController.php© AutomatedReportsCommand.php© JiminnyDebugCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.php< console LUlconsole SlAGiNGAskJiminnykeporAcuivilyservice.ong xActiviysearch.php© OnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php© Criteria.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3class Automacedkeportskepo ofA15 V4 ^ v 3959114115116117118119120/*** Retrieve all standard (non-Ask Liminny) an43* @param string $sortColumnThe column te 44* Oparam string $sortDirection The sort dire45*orerurn cocuecclonsauromareoredore12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created 55* OodrdllusernusenThe User Who: 57*oparam scrine osorclocunnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(_64User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§g0/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no dateconstraint is applied - matching the behaviour of getContextForAskAnythingByFilte* @return string[] Activity IDs14 usaeespublic function getActivityIdsForSavedSearch(Search $savedSearch,User $user,): array &SrequestParams = Sthis->buiLdRequestflaramsFromSearch($savedSearch, $user);Scriteria = Criteria::createFromRequest(Accept maryeet$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge ($requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()):$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskviminnyReport] Fetched activity IDs for saved search', [saved_search_id => $savedSearch->getid),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser): array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,naystack: selT.:DAIE_FILIER_KEYS,strict: true)){X Reject File 0* €halSupport Daily - in 2h 45 mAAskJiminnyReportActivityServiceT...Defaults v100% [Tue 14 Apr 12:15:01CascadeFixing ReportControllerAutomated Report Mai• Fixing Ask Jiminny Ragain. Why is there issue with that? Where is it exected and why do I need to work with that. How is it used inased on savedSearch. THe ids in on demand and [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemandV2Controller.phpSurfing…+D..wItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6View allReject allAccept allW Windsur leams48:4uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11150
|
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.js#11894 on JY-18909-automated-reports-ask-iminny K vProjectvToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> C AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (5 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php< console LUlconsole SlAGiNGASkJIminnykeportAcuivilyservice.ono xActiviysearch.php© OnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php© Criteria.phpclass AskJiminnyReportActivityService(e) TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V4 ^ v 3959114115116117118119120/*** Retrieve all standard (non-Ask Liminny) ai 43* @param string $sortColumnThe column te 44* Oparam string $sortDirection The sort dire45*orerurn coccectlonsauromcreoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created 55* OodrdllusernusenThe User Who: 57*oparam scrine osorclocunnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§g0public function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,xno dueconstraint is applied - matching the behaviourn of getContextForAskAnythingByFilte* @return string[] Activity IDs*/14 usaeespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);Scriteria = Criteria::createFromRequest(marze t$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge ($requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()):$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskviminnyReport] Fetched activity IDs for saved search', [saved_search_id => $savedSearch->getid),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser: array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,naystack: SeLT::DAIE_FILIER_KEYS,strict: true)){X Reject File 0* €, 0halSupport Daily - in 2h 45 mAU AskJiminnyReportActivityServiceT….Defaults v100% CS•CascadeFixing ReportControllerAutomated Report Mar• Fixing Ask Jiminny Ragain. Why is there issue with that? Where is it exected and why do I need to work with that. How is it used ined on savedSearch. THe ids in on demand and [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OndeNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\OnDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount,pace → L1,suser->geclimezoneit passes Srequest→>all() - wnich Includes sequence_number trom the URL (e.g. sequence_number=4 Trom your stagingTue 14 Apr 12:15:07+D..wItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6View allReject allAccept allW Windsur leams48:4uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11151
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11152
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11153
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11154
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11155
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11156
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11157
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11158
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11159
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> C AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (7 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGASkJIminnykeportAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3class Automacedkeportskepo ofA15 V4 ^ v 3959114115116117118119120/*** Retrieve all standard (non-Ask Liminny) an43* @param string $sortColumnThe column te 44* Oparam string $sortDirection The sort dire45* @return Collection<AutomatedReport>12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created 55* OodrdllusernusenThe User Who: 57*oparam scrine osorclocunnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(§g0/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,xno dueconstraint is applied - matching the behaviour of getContextForAskAnythingByFilte* @return string[] Activity IDs*/14 usaeespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);ocrlrerta = unlrerta.:credcerronkeqvestmargee €$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge ($requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()):$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskviminnyReport] Fetched activity IDs for saved search', [saved_search_id => $savedSearch->getid),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser: array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,haystack: self::DATE_FILTER_KEYS,strict: true)){X Reject File 0* €, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:11CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D ...again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDerwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 1]).suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest) in Criteriareturns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifOrganiserGroupInDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuivitlesRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + durationz1 together matchednothing.Why sequence_number-1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Apate filters are already intentionally stripped (that's existing logic in DATE_FILTER_KEYS)3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getondemandPagerilterset, same ondemandSearchidson ly — so theresults will now match.0 dl •Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams48:4uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11160
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:148Today ~...
|
NULL
|
NULL
|
NULL
|
11161
|
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.js#11894 on JY-18909-automated-reports-ask-iminny K vProjectvToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> D AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGAskJIminnykeporiAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3class Automacedkeportskepo ofA15 V4 ^ v 3959114115116117118119120/*** Retrieve all standard (non-Ask Liminny) an43* @param string $sortColumnThe column te 44* Oparam string $sortDirection The sort dire45*orerurn coccecclonsauromceoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created 55* OodrdllusernusenThe User Who: 57*oparam scrine osorclocunnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§g0/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,xno dueconstraint is applied - matching the behaviour of getContextForAskAnythingByFilte* @return string[] Activity IDs*/14 usaeespublic function getActivityIdsForSavedSearch(Search $savedSearch,User $user,): array {$requestParams = Sthis->buildRequestParamsFromSearch($savedSearch, Suser);ocrlrerta = unlrerta.:credcerronkeqvestmargee €$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge ($requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()):$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskviminnyReport] Fetched activity IDs for saved search', [saved_search_id => $savedSearch->getid),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser): array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,haystack: self::DATE_FILTER_KEYS,strict: true)){X Reject File 0* €, 0lablSupport Daily - in 2h 43 mAU AskJiminnyReportActivityServiceT..Defaults100% C•Tue 14 Apr 12:17:14CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D ...again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 11)suser->geclimezoneit passes Srequest→>all() - wnich Includes sequence_number trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest in Criteria returns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuivitlesActuvltvkecordecOrganiserGroupInRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic_id[]=..&sequence_number=4 → sequence_number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + duration≥1 together matchednothing.Why sequence_number-1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)n DATE_FILTER_ KEYS lAdding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdenticalvao nowa ne controleroulasne samer uo derehadreaterconkequest samer oeitonDemandPaderultenset same onDemandsearchidsunilv - sonneresults will now match.Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams48:4uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11162
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11163
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Repositories;
use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSort;
use Jiminny\Services\Kiosk\AutomatedReports\ReportSortDirection;
class AutomatedReportsRepository
{
/**
* Create a new automated report
*
* @param array $data
*
* @return AutomatedReport
*/
public function create(array $data): AutomatedReport
{
return AutomatedReport::create($data);
}
/**
* Find an automated report by UUID
*
* @param string $uuid
*
* @return AutomatedReport|null
*/
public function findByUuid(string $uuid): ?AutomatedReport
{
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();
}
public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport
{
if (is_numeric($idOrUuid)) {
return AutomatedReport::find((int) $idOrUuid);
}
return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();
}
/**
* Retrieve all standard (non-Ask Jiminny) automated reports.
*
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAllStandardReports(
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->get();
}
/**
* Retrieve all Ask Jiminny reports created by the given user.
*
* @param User $user The user whose reports to retrieve.
* @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.
* @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.
*
* @return Collection<AutomatedReport>
*/
public function getAskJiminnyReportsByUser(
User $user,
string $sortColumn = 'created_at',
string $sortDirection = 'desc'
): Collection {
return $this->buildSortedQuery($sortColumn, $sortDirection)
->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)
->where('created_by', $user->getId())
->get();
}
private function buildSortedQuery(string $sortColumn, string $sortDirection): \Illuminate\Database\Eloquent\Builder
{
$allowedColumns = ['created_by', 'created_at'];
if (! in_array($sortColumn, $allowedColumns)) {
$sortColumn = 'created_at';
}
$sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';
$query = AutomatedReport::query()->with(['creator', 'team']);
if ($sortColumn === 'created_by') {
$query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')
->orderByRaw("users.name COLLATE utf8mb4_unicode_ci {$sortDirection}")
->select('automated_reports.*');
} else {
$query->orderBy($sortColumn, $sortDirection);
}
return $query;
}
/**
* Get all active and enabled reports with active teams for the specified frequency.
*
* @param string $frequency
*
* @return Collection<AutomatedReport>
*/
public function getActiveReportsByFrequency(string $frequency): Collection
{
return AutomatedReport::where('automated_reports.status', true)
->where('automated_reports.frequency', $frequency)
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->where('teams.status', Team::STATUS_ACTIVE)
->where(function ($query) {
$query->whereNull('automated_reports.expires_at')
->orWhere('automated_reports.expires_at', '>=', now()->toDateString());
})
->select('automated_reports.*')
->get();
}
/**
* Update an automated report
*
* @param AutomatedReport $report
* @param array $data
*
* @return AutomatedReport
*/
public function update(AutomatedReport $report, array $data): AutomatedReport
{
$report->update($data);
return $report;
}
/**
* Create a new automated report result.
*
* @param array $data The data to create the automated report result with.
*
* @return AutomatedReportResult The newly created automated report result.
*/
public function createResult(array $data): AutomatedReportResult
{
return AutomatedReportResult::create($data);
}
/**
* Find an automated report result by UUID.
*
* @param string $uuid The UUID to find the automated report result with.
*
* @return AutomatedReportResult|null The automated report result if found, otherwise null.
*/
public function findResultByUuid(string $uuid): ?AutomatedReportResult
{
return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();
}
public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('uuid', AutomatedReportResult::toOptimized($uuid))
->whereHas('report', static function ($query) use ($user): void {
$query->where('team_id', $user->getTeamId())
->where('created_by', $user->getId());
})
->first();
}
public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult
{
return AutomatedReportResult::query()
->where('parent_id', $result->getId())
->where('media_type', $type)
->first();
}
public function getGeneratedNotSentResults(): Collection
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNull('sent_at')
->where('status', AutomatedReportResult::STATUS_GENERATED)
->whereHas('report')
->with('report')
->get();
}
public function getPaginatedUserReports(
User $user,
ReportSort $sort,
ReportSortDirection $sortDirection,
int $resultsPerPage,
int $page,
?Carbon $fromDate,
?Carbon $toDate,
array $teamIds,
array $reportTypes,
?string $name,
): LengthAwarePaginator {
$query = AutomatedReportResult::query()
->whereNotNull('automated_report_results.generated_at')
->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')
->where('automated_reports.team_id', $user->getTeamId())
->whereJsonContains('automated_reports.recipients->users', $user->getId())
->orderByRaw("$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}")
->select('automated_report_results.*')
->with('report.team');
if ($fromDate !== null && $toDate !== null) {
$query->whereBetween('generated_at', [$fromDate, $toDate]);
}
if (! empty($teamIds)) {
$query->where(function ($q) use ($teamIds) {
foreach ($teamIds as $id) {
$q->orWhereJsonContains('automated_reports.groups', $id);
}
});
}
if (! empty($reportTypes)) {
$query->whereIn('automated_reports.type', $reportTypes);
}
if (! empty($name)) {
$query->whereLike('name', "%$name%");
}
return $query->paginate($resultsPerPage, ['*'], 'page', $page);
}
public function countUserReports(User $user): int
{
return AutomatedReportResult::query()
->whereNotNull('generated_at')
->whereNotNull('sent_at')
->whereHas('report', function ($q) use ($user) {
$q->where('team_id', $user->getTeamId())
->whereJsonContains('recipients->users', $user->getId());
})
->count();
}
/**
* Get report IDs for a specific team
*
* @param Team $team
*
* @return \Illuminate\Support\Collection
*/
public function getReportIdsByTeam(Team $team): \Illuminate\Support\Collection
{
return AutomatedReport::where('team_id', $team->getId())->pluck('id');
}
/**
* Get all reports for a specific team
*
* @param Team $team
*
* @return Collection
*/
public function getReportsByTeam(Team $team): Collection
{
return AutomatedReport::where('team_id', $team->getId())->get();
}
/**
* Get all report results for a specific report
*
* @param AutomatedReport $report
*
* @return Collection
*/
public function getResultsByReport(AutomatedReport $report): Collection
{
return $this->getResultsByReportQuery($report)->get();
}
public function getResultsByReportQuery(AutomatedReport $report): Builder
{
return AutomatedReportResult::where('report_id', $report->getId());
}
public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder
{
$reportIds = $this->getReportIdsByTeam($team);
return AutomatedReportResult::query()->whereIn('report_id', $reportIds)
->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);
}
/**
* @param int|null $teamId Optional team ID to filter results
*
* @return \Illuminate\Support\Collection<int, int> Collection of team IDs
*/
public function getTeamIdsWithReportsResults(?int $teamId = null): \Illuminate\Support\Collection
{
$query = DB::table('automated_reports')
->join('teams', 'automated_reports.team_id', '=', 'teams.id')
->select('teams.id')
->distinct();
if ($teamId !== null) {
$query->where('teams.id', $teamId);
}
return $query->pluck('teams.id');
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11164
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:298Today ~...
|
NULL
|
NULL
|
NULL
|
11165
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:308Today ~...
|
NULL
|
NULL
|
NULL
|
11166
|
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.js#11894 on JY-18909-automated-reports-ask-iminny K vProjectvToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositon)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> C AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGAskJIminnykeporiAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e) TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.php© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityService1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,Df...3class Automacedkeportskepo ofA15 V4 ^ v 3959114115116117118119120/*** Retrieve all standard (non-Ask Liminny) ai 43* @param string $sortColumnThe column te 44* Oparam string $sortDirection The sort dire45*orerurn coccecclonsauromceoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created 55* OodrdllusernusenThe User Who: 57*oparam scrine osorclocunnThe coLomn t958* Oparam string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/—6214 usages63public function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor_68-71/*** Get all active and enabled reports with al73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§g0/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,xno dueconstraint is applied - matching the behaviour of getContextForAskAnythingByFilte* @return string[] Activity IDs*/14 usaeespublic function getActivityIdsForSavedSearch(Search $savedSearch,User $user,): array {$requestParams = Sthis->buildRequestParamsFromSearch($savedSearch, Suser);=ururerta.:credcerronkedvestmargee €$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge ($requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()):$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, Suser);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filte$this->logger→>info('[AskviminnyReport] Fetched activity IDs for saved search', [saved_search_id => $savedSearch->getid),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;1 usageprivace tunccion bunLakequestrarams-romsearch(search esaveasearch, user suser): array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPropertyO);$valve = $filter->getFilterValve();if Cin_array(Skey,haystack: self::DATE_FILTER_KEYS,strict: true)){X Reject File 0* €, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:30CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D ...again. Why is there issue with that? Where is it [EMAIL]#L44-66 should be samed to work with that. How is it used inwLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 1]).suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest) in Criteriareturns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuvitlesOrganiserGroupInRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic_id[]=..&sequence_number=4 → sequence_number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + durationz1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER _KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getondemandPagerilterset, same ondemandSearchidson ly — so theresults will now match.0 dl •Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams48:4uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11167
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:358Today ~...
|
NULL
|
NULL
|
NULL
|
11168
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositon)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> C AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGASkJiminnykeportAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.phpclass AskJiminnyReportActivityService© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V4 A V59114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) M* @param string $sortColumnThe column t< 45* Cparam string ssortDirection The sort dir 46*orerurn coccectlonsauromcreoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created A55-56* OodrdllusernusenIne User Who: 57*oparam scrine osorclocunnIne coLumn c458* @param string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/14 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J—622 usages/**private function buildSortedQuery(string $sor7e_71* Get all active and enabled reports with ac 73* @param string $frequency—76* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(s 80public function__construct(private readonly ActivitySearch SactivitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,) 1..3* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the behaviour of getContextForAskAnythingByFilte* Creturn string[] Activity IDs14 usagespubuic tunccion getAcuivity.asrorsavedsearchcSearch $savedSearch,user puser): array €$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(AccepuRenectsrequescrarams, L'Limit => seLt.:DEFAULI_TUP_ACTIVIllES_CUUnl, "page"array_merge (SrequestParams,I'Limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'user-›deta nezone u&T to Cascade.mmurerer - vus-raco utyoearciepoerunuenanorader urerser ncrremar suser.$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', ['saved_search_id' => $savedSearch->getId(),'user_id' => $user->getId(),'activity_count' => count($activityIds),return sactvitvlos.Tusageprivate function buildRequestParamsFromSearch(Search $savedSearch, User $user): array$params = []:$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) €$key = $filter->getFilterPropertyO;$valve = $filter->getFilterValueO;if (in_array($key,haystack: self::DATE_FILTER_KEYS,strict: true))continue,X Reject File 0* €, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:35CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 1]).suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest) in Criteriareturns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifActuvltvkecordecOrganiserGroupInDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuvitlesRecorded activities onvRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + durationz1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER _KEYS )3. Aoding imolicit min duration only recorded, ano arouo scone on ton wou d contradict what the saveo search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getonDemandPagefilterset, same ondemandsearchidsonly — so theresults will now match.0 dl •Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> CodeClaude Sonnet 4.6Vew allliReject allAccept allwinasun leams54:1uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11169
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:3986 0Today ~...
|
NULL
|
NULL
|
NULL
|
11170
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> D AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console LUlconsole SlAGiNGASkJiminnykeportAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© OnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.phpclass AskJiminnyReportActivityService© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php(e) TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 X4AV59114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) M* @param string $sortColumnThe column t< 45* Cparam string ssortDirection The sort dir 46*orerurn coccecclonsauromceoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created A55-56* Oodrdll usernusenIne User Who: 57* @param string $sortColumnThe column t( 58* @param string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/14 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J—622 usages/**private function buildSortedQuery(string $sor7e_71* Get all active and enabled reports with ac73* @param string $frequency—76* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(s 80public function__construct(private readonly ActivitySearch SactivitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,) 1..3* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the behaviour of getContextForAskAnythingByFilte* Creturn string[] Activity IDs*/14 usagespubuic tunccion getAcuivity.asrorsavedsearchcSearch $savedSearch,user puser): array €$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(array_mergelsrequescrarams, L'LImit = seLT:.DEFAULI_TUP_ALTIL- Accept Rejedge'array_merge (SrequestParams, [l'limit'F> self::DEFAULT_TOP_ACTIVITIES_CoUNT, 'page'1, 'sequence_number"nuser->cerznezoneu);$filterSet = $this->activitySearch->get0nDemandPageFilterSet($criteria, $user);$activityIds = $this-›elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search'. ['saved_search_id' => $savedSearch->getId(),'user_id' => Suser-›getid(),'accivity_count => count(paccivitylas),return sacurylos1 usageprivate function buildRequestParamsFromSearch(Search $savedSearch, User $user): array$params = []:$arrayFilterKeys = $this-›activitySearch->getArrayFilterKeys(Suser);foreach ($savedSearch->getFilters() as $filter) €$key = $filter->getFilterPropertyO;$valve = $filter->getFilterValueO;if (in_array($key,coneanue.SELT..DAIC PILICK KCYSstrict: true)){X Reject File 0* €, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:39CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 1]).suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest in Criteria returns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifActuvltvkecordecOrganiserGroupInDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuvitlesRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + durationz1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER _KEYS )3. Aoding imolicit min duration only recorded, ano arouo scone on ton wou d contradict what the saveo search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getonDemandPagefilterset, same ondemandsearchidsonly — so theresults will now match.0 dl •Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +2 -1Ask anything (2*L)+ <> CodeClaude Sonnet 4.6Vew allliReject allAccept allwinasun leams52:14uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11171
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:438Today ~...
|
NULL
|
NULL
|
NULL
|
11172
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositon)C InboxRepository.pnp© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> C AjReports(J AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.php© JiminnyDebugCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console LUlconsole SlAGiNGAskJiminnykeporAcuivilyservice.ong xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.phpclass AskJiminnyReportActivityService© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php© TrackProviderInstalledEvent.php© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V4 A V59114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) M* @param string $sortColumnThe column t< 45* Cparam string ssortDirection The sort dir 46*orerurn coccectonsauromareonedor12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created A55-56* OodrdllusernusenIne User Who: 57* @param string $sortColumnIne coLumn c458* @param string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/14 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = 'desc"): Collection {...J—622 usages/**private function buildSortedQuery(string $sor7e_71* Get all active and enabled reports with ac73* @param string $frequency* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(£ 80public function__construct(private readonly ActivitySearch SactivitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,) 1..3* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the behaviour of getContextForAskAnythingByFilte* Creturn string[] Activity IDs*/14 usagespubuic tunccion getAcuivity.asrorsavedsearchcSearch $savedSearch,user puser,): array €$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(array_merge ($requestParams, l'limit' => self::DEFAULT_TOP_ACTIVIT] Accept TRejeage'array_merge (SrequestParams,=> self::DEFAULT_TOP_ACTIVITIES_COUNT,|I'page' => 1.'sequence_number' => 11),nuser-poernezone);$filterSet = $this->activitySearch->get0nDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search'. ['saved_search_id' => $savedSearch->getId(),'user_id' => Suser-›getid(),'activity_count' => count($activityIds),return $activityIds;lusaeeprivate function buildRequestParamsFromSearch(Search $savedSearch, User $user): array$params = [];$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) €nkey =nurer-poerrurerropery.or$valve = $filter->getFilterValueO;if Cin_array(Skey,continte;nayslacaSeRLLICA ALTOstrict: true)){, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:43CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 11)suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest) in Criteriareturns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifOrganiserGroupInDefault on first requestman curation = minonly_recorded = 1User's own aroupEffectUrops u-secone acuvitlesRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + duration≥1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER _KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getondemandPagerilterset, same ondemandSearchidson ly — so theresults will now match.0 dl •Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +3 -1Ask anything (2*L)+ <> CodeClaude Sonnet 4.6Vew allliReject allAccept allwinasun leams53:11uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11173
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aalal]Support Daily - in 2h 43 m100% <47Tue 14 Apr 12:17:518Today ~...
|
NULL
|
NULL
|
NULL
|
11174
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on JY-18909-automated-reports-ask-iminny K v© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> D AjReports(J AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGAskJiminnykeporAcuivilyservice.ong xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpOnDemandV2Controller.php© HistoryService.php© AskJiminnyReportActivityServiceTest.phpclass AskJiminnyReportActivityService© FilterDefinitionCollection.php© RequestGenerateAskJiminnyReportJobTest.php(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php• ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 X4AV59114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) M* @param string $sortColumnThe column t< 45* Cparam string ssortDirection The sort dir 46*orerurn coccectlonsauromcreoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created $55-56* OodrdllusernusenIne User Who: 57* @param string $sortColumnIne coLumn c458* @param string $sortDirection The sort dire59* @return Collection<AutomatedReport>*/14 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J—62692 usages70private function buildSortedQuery(string $sor71/*** Get all active and enabled reports with ac 73* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(§ 80public function.__construct(private readonly ActivitySearch SactivitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,) 1..3* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the behaviour of getContextForAskAnythingByFilte* Creturn string[] Activity IDs*/14 usagespubuic tunccion getAcuivity.asrorsavedsearchcSearch $savedSearch,user puser): array €$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(array_mergelsrequescrarams, L'L1mit => seLT:.DEFAULI_TUP_ALTIVLT Accapt TRejlage"array_merge($requestParams, [=> SeLT::DEFAULI_IOP_ACIIVLILES_COUNL.'page"= 1,sequence_numben' => A$user->getTimezone());$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nLy($user, $criteria, $filter$this->logger->info('[AskJiminnxReport] Fetched activity IDs for saved search'. Esaved_searcn_1d => psavedsearch-›gecta).'user_id' => $user-›getId(),'activity_count' => count($activityIds),return $activityIds;1 usageprivate function buildRequestParamsFromSearch(Search $savedSearch, User $user): array$params = [1;marravruurerkevs = "uis-›acuvltvsearch->oerArravrzurerkeys user.foreach ($savedSearch-›getFilters() as $filter) €$key = $filter->getFilterPropertyO;svalue = sfilter-igetiltervalupfiteAccept File %-X Reject File 0* €, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:51CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..again. Why is there issue with that? Where is it ed to work with that. How is it used inCAskJ1minyReportActivityService. phpL44-66 should be sameed on savedSearch. THe ids in on demand and inLet me read the OnDemandV2Controller to understand how it builds criteria there:Poad OnDemandV?ConwNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:0 phpVO\Repository\0nDemandActivitySearch\Criteria::createFromRequest(array merge($request→>allo, ('limit' = $topCount, 'paqe' = 1]).suser->geclimezoneit passes srequest→>all() - wnich Includes sequence_number Trom the URL (e.g. sequence_number=4 Trom your staging URL). so when a user nas beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for themFilterActivityburaclonkandeisFirstRequest) in Criteriareturns true when sequenceNumber === 0 . When it's the "first request" these implicit defaults kick in automatically even ifDefault on first requestman curation = minEffectUrops u-secone acuvitlesActuvltvkecordecOrganiserGroupInonly recorded = 1User's own aroupRestricts to user's arourFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest() = false → no implicit defaults →reuins e acuvtles,AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-only + durationz1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER _KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence_number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtIdentically to now the controller bullas it - same uriteria:: creater romkequest, same getondemandPagerilterset, same ondemandSearchidson ly — so theresults will now match.0 dl •Itlle wiun changes vapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +5 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allwinasun leams55:15uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11175
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositor)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.© TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp› D Rulesv D Services> [ Activity> D AjReports› D AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.php© JiminnyDebugCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGAskJiminnykepor Acuivilyservice.ono xACuiVilysearch.onp© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e TrackProvidernstallled-vent.ono© OnDemandV2Controller.php© HistoryService.php© FilterDefinitionCollection.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceClosingPeriodFilter::KEY_START_DATE,ClosingPeriodFilter::KEY_END_DATE,© Criteria.phpM2A1AY© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 V4 A V59114115116117118119120123/*** Retrieve all standard (non-Ask Jiminny) M39* @param string $sortColumnThe column t(41* @param string $sortDirection The sort dirt 42* @return Collection<AutomatedReport>12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created A52* Oocrdlll UsernusenIne User Who: 54*oparam scrine osorclocunnThe column tc55* Qparam string $sortDirection The sort dir€56* @return Collection<AutomatedReport>*/-5914 usagespublic function getAskJiminnyReportsByUser(61User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor 68_69/*** Get all active and enabled reports with al71* @param string $frequency* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(s 771:1 usagepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,) 1...7*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no date constraint is applied - matching the hehaviour of getContextForASkAnythingByFi7te* @return string[] Activity IDs*/14 usagespublic function getActivityIdsForSavedSearch(Search $savedSearch,User $user,): array {фrequescraralls - sch1s->001lakequescraramsrromsearchlesavedsearch, suser):$criteria = Criteria::createFromRequest(array_merge($requestParams,['limit'=> self::DEFAULT_TOP_ACTIVITIES_COUNT,'page' => 1,'sequence_number' => 1);$user->getTimezone()$filterSet = $this->activitySearch->get0nDemandPageFilterSet($criteria, Suser);$activityIds = $this->elasticRepository→>onDemandSearchIds0nly($user, $criteria, $filter$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', ['saved_search_id' => $savedSearch-›getId(),'user_id' => $user->getId(),'activity_count' => count($activityIds),1):return $activityIds;usaoeprivate function buildRequestParamsFromSearch(Search $savedSearch, User $user): array$params = []:$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);foreach ($savedSearch->getFilters() as $filter) {, 0lablf Support Daily • in 2h 43 mAAskJiminnyReportActivityServiceT….Defaults100% C•Tue 14 Apr 12:17:53CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Explain it to me again. Why is there issue with thhat? Where is it expected and why do I need to work with that. How is it used inlevzconuroes vasee oll saveuoedichl. Une los m on celllane ane [EMAIL]#L44-66 should be samewLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDe0 phpNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php:90-93:VU kepos1tory onbemandAct1vlcysearch uricer1a:: creacerromkequestarrav meroesrequesoaluo.' umir => 00c0unt "oade$user->getTimezone()It passes Srequest->all() - which includes sequence_number from the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for them:hsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventFiterDefault on first requestEffectActiv1tvburat zonkangelmin_duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvOrganiserGroupInUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration>1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER_KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representssetting sequence number=l Is the minimal, correct signal: "this is not a wresn session open, cont apoly page-load de lauks". Une criterla is otherwise bulltidentically to how the controller builds it - same Criteria::createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchIds0nly - so theresults will now match.Ö ul ...Ask anything (2*L)+ <> Code Claude Sonnet 4.6winasun leams55:13uir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11176
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:038Today ~...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11177
|
|
PhpStormFileEditFV faVsco.jsProjectvViewNavigateCo PhpStormFileEditFV faVsco.jsProjectvViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© DeviceRepository.php© ElasticActivityRepository.pl© EmailMessageRepository.p© GenericAiPromptRepositor:© GroupRepository.php(C) InboxEmailBatchRepositon)InboxRepository.php© InvitationRepository.php© JobRepository.php© LanguageRepository.php© MomentRepository.php© NotificationRepository.php© ParticipantRepository.php© ParticipantSpeechReposito© ParticipantStatsRepository© PlaybookCategoryRepositc© PlaybookRepository.php® PlaylistActivityRepository.fPlaylistRepository.phpPlaylistShareRepository.ph© QuestionRepository.php© RoleChangeEventRepositor© RoleRepository.php© SearchRepository.php© SnapshotRepository.php© SocialAccountRepository.p© StageRepository.php© SubscriptionSetRepository.TaskRepository.php© TeamAiContextRepository.© TeamDomainsRepository.p©TeamInsightsRepository.pt©TeamRepository.php©ThemeRepository.php© TimezoneRepository.php© TopicRepository.php© TopicTriggerRepository.ph© TrackRepository.php© TranscriptionModelLocaleF© TranscriptionRepository.phC) TranscriptionSummarvRep© UserRepository.php© VocabularyRepository.pnp> D Rulesv D Services> [ Activity> C AjReports(J AvatarcalendarD ConferenceD Crm>MImport> MInternallv → Kioskv D AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsStTests passed: 1 (8 minutes ago)© ReportController.php© AutomatedReportsCommand.php© JiminnyDebugCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]< console EUiconsole SlAGiNGASkJIminnykeportAcuivilyservice.ono xActiviysearch.php© Criteria.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpOnDemandV2Controller.php© HistoryService.php© FilterDetinitionCollection.phpC AsKJiminyReporrActivityService Test,php x© RequestGenerateAskJiminnyReportJobTest.phpsrong(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.phpAutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:815 X4 л59114115116117118119120/*** Retrieve all standard (non-Ask Jiminny) m15* @param string $sortColumnThe column to* @param string $sortDirection The sort dire17*orerurn coccectlonsauromcreoreooro12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Liminny reports created :26-27* Oocrdlll UsernusenThe user whos 28*oparam scrine osorclocunnThe column tc29* Oparam string $sortDirection The sort dire* @return Collection<AutomatedReport>*/14 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J2 usagesprivate function buildSortedQuery(string $sor42/*** Get all active and enabled reports with ac44143* @param string $frequency* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(s51X221^declare(strict_types=1);namespace Jiminny\Services\Kiosk\AutomatedReports;use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;use Jiminny\Component\ActivitySearch\Service\ActivitySearch;use Jiminny\Models\Activity\Search;use Jiminny\Models\User;use Jiminny\Repositories\ElasticActivityRepository;use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;use Psr\Log\LoggerInterface;8 usagesclass AskJiminnyReportActivityService1 usageprivace const int UErAULI_lUr_AClLVLILeS_LOUNI - 1001 usageprivate const array [ENV_SECRET],ActivityActualDate: :PARAM_END_DATE,ActivityUpdatedDate::PARAM_UPDATED_FROM,ActivityUpdatedDate: :PARAM_UPDATED_TO,ClosingPeriodFilter::KEY_START_DATE,ClosingPeriodFilter::KEY_END_DATE,1:usaoepublic function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,)f...3/*** Fetch activity IDs for a saved search, passing its filters as-is to Criteria.* Date filters stored on the saved search are excluded; if no other filters exist,* no dace constraint is applled - mauching che penavrour of geccontextroraskanychingbyrilce* Creturn string[] Activity IDs14 usagespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = Sthis->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(array meroe reduestrarams.Support Daily • in 2h 42 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:18:03+D..CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny RepExplain it to me again. Why is there issue with thhat? Where is it expected and why do I need to work with that. How is it used inMllanuvzcontroes vasee oll saveuoedicl Une los m on celllane dile ilOnSkdILmlуnedoT LheLeveLyetVLceronorL44-00 snoule De sallleLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php: 90-93:0 phpVU kepos1tory onbemandAct1vlcysearch uricer1a:: creacerromkequestarrav meroesrequesoaluor' umir => 00c0unt 'oade"$user->getTimezone()It passes Srequest->all() - which includes sequence_number from the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for them:hsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventFiterDefault on first requestEffectActiv1tvburat zonkangelmin_duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvOrganiserGroupInUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration>1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER_KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtidentically to how the controller builds it - same Criteria::createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchIds0nly - so theresults will now match.wÖ ul ...Ask anything (2*L)+ <> Code Claude Sonnet 4.6winasun leams55:13uir-o( 4 spaces...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11178
|
|
PhpStormFileFditViewNavigateCodeLaravelRefactonToo PhpStormFileFditViewNavigateCodeLaravelRefactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vD Unit_ ActionsC ComponentConfigurationM ConsoleM ContractsM DomainD DTO→ Enums_Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> MinteractionsMJobs> M ActivitvM AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversM PoliciesProviders→ Repositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedReportlests passed: 1 (8 minutes ago(©) ReportController.phpC JiminnyDebugCommand.php= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.phg© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.phpOnDemandV2Controller.phpC) HistoryService.php© FilterDetinitionCollection.php© Criteria.phpC) Team.onp(©) AutomatedReportsRepository.php XC) AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.php© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivateLoccerintertacexrockuonect lodder:yusades82 M3 ^ Yc) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php29 0 >© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 M4 . V9311411511611711811911124011211124123* Retrieve all standard (non-Ask Jiminny) m71 M>* dparam string ssorttolumnIne column tc* dparam string SsortDirection The sort dire1A0 MI* dreturn ColZection<AutomatedReport>12 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at'string ssortbirection =desc): Collection {...J118 M>156184185 M206 M225 V* Retrieve all Ask Jiminny reports created i* Oodrdll usernusen227Ine user Ynos* @param string $sortColumnThe column tc228229* dparam string SsortDirection The sort dire* dreturn Collection<AutomatedReport>1254*/14 usagespublic function getAskJzminnyReportsByUser(user suser,suring ssortcolumn = "creaced_at",string ssorcbirection = "desc": Collection {...}—233154236237242243— 244|Z usagesprivate function buildSortedQuery(string Ssor 245246— 247* bet att active and enabled reports with ae 248250*dparam string sfrequency251— 252 V* dreturh coLcectzon<aucomacedкeрort>274Zs usadespublic function getActiveReportsByFrequency(sprivate AskJiminnvReportActivityService Sservice:protected function setUpo: voidk...11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&Mock0bject(...}ousadesprivate function makeSavedSearch(array $filters): Search&MockObiect....public function testGetActivityldsForSavedSearchReturnsidsO: void...hpublic function testGetActivityldsForSavedSearchReturnsEmptyWhenNoResults: voidk...hpublic function testGetActivityldsr1ltersoutDater1lters: vo1di...public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(: voidt...}public function testGetActivityIdsHandlesScalarFilters(: voidf...}public function testGetActivityldsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(suser = sthis->makeUsero:ssavedsearch = sth1s->makesavedSearchclJo*$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);$this->activitvSearch->method( constraint: 'aetArravFilterKevs')38willReturn(fl):ncaotureounrera = nuulsthis-›activitySearch->expects(Sthis->onceo)->method constraint: 'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use SfilterSet, &scapturedCristhis->elasticRepos1tory->method( constraint: 'onbemandSearchldsonly')->w1LlReturn(LJ9:sthis->logger->method( constraint: "1nfo');suh1s->service->gecaculvitytasrorsavedsearcn(psavedsearch, suser):nunus->assercrotvulucaoturedurtertaaSthis->assertFalse(ScapturedCriteria->isFirstRequest00:public function testGetActivityldsLogsWithCorrectContext(): voidk...}: Support Daily • in 2 h 42 m100% [2Tue 14 Apr 12:18:05AskJiminnyReportActivityServiceT..Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepExplain it to me again. Why is there issue with that? Where is it expected and why do I need to work with that. How is it used irlevzconuroes vasee oll saveuoedichl. Une los I on celllane ane [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difterence. The controller's getcontextForAskAnythingByFilter at OnDemandV2Controller.php:96-93:" phoVO Repository OnDemandActivitySearch\Criteria:: createFromRequest(arrav meroesrequesaluo.' umir => 00c0unt oadesuser->oerTimezoneIt passes Srequest→>all() - which includes sequence_number trom the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence number is naturally non-zeroThe full explanationhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventyou didn't ask for them:FilterDefault on first requestEffectActiv1tvburat zonkangelmin duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration≥1 together matchednothing.Why sequence_number=1 ls the righttixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionallv strioped (that's existing logic in DATE FILTER KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representssetting sequence number=l Is the minimal, correct signal: "this is not a wresn session open, cont apoly page-load de lauks". Une criterla is otherwise bulltidentically to how the controller builds it - same Criteria::createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchidsOnly - so theresults will now match.wal .Ask anything (&+L)+ <> Code Claude Sonnet 4.6Winasun leams230:40uir-oia 4 spaces...
|
NULL
|
NULL
|
NULL
|
11179
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:058Today ~...
|
NULL
|
NULL
|
NULL
|
11180
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:088Today ~...
|
NULL
|
NULL
|
NULL
|
11181
|
|
PhpStormFileFditViewNavigateCodeLaravelRefactonToo PhpStormFileFditViewNavigateCodeLaravelRefactonToolsWindowHelpFV faVsco.js v#11894 on JY-18909-automated-reports-ask-iminny K vProject vD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM DomainD DTO→ Enums_Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> MinteractionsMJobs> M ActivitvM AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversM PoliciesProviders→ Repositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedReportlests passed: 1 (8 minutes ago(©) ReportController.phpC JiminnyDebugCommand.php= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.phg© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.phpOnDemandV2Controller.php© HistoryService.php© FilterDetinitionCollection.php© Criteria.phpC) Team.onp(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpC) AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.php© TrackProviderInstalledEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivateLoccerintertacexrockuonect lodder:yusades62 X3^c) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php29 0 >© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 M4 . V9311411511611711811911124011211124123* Retrieve all standard (non-Ask Jiminny) m* dparam string ssortcolumnIne column tc* dparam string SsortDirection The sort dire1A0 MI* dreturn ColZection<AutomatedReport>118 M>15612 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at'string ssortbirection =desc): Collection {...J184185 M206 M225 V* Retrieve all Ask Jiminny reports created i* Oodrdll usernusen227Ine user Ynos* @param string $sortColumnThe column tc228229* dparam string SsortDirection The sort dire* dreturn Collection<AutomatedReport>*/14 usagespublic function getAskJzminnyReportsByUser(user suser,suring ssortcolumn = "creaced_at",string ssorcbirection = "desc": Collection {...}—233154236237242243— 244|Z usagesprivate function buildSortedQuery(string Ssor 245246— 247* bet att active and enabled reports with ae 248250*dparam string sfrequency251* dreturh coLcectzon<aucomacedкeрort>274Zs usadespublic function getActiveReportsByFrequency(sprivate AskJiminnvReportActivityService Sservice:protected function setUpo: voidk...11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&Mock0bject(...}ousadesprivate function makeSavedSearchlarray $filters): Search&MockObiect...public function testGetActivityldsForSavedSearchReturnsidsO: void...hpublic function testGetActivityldsForSavedSearchReturnsEmptyWhenNoResults: voidk...hpublic function testGetActivityldsF1ltersoutDater1lters: vo1di...hpublic function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void(...}public function testGetActivityIdsHandlesArrayFilters(: voidt...}public function testGetActivityIdsHandlesScalarFilters(: voidf...}public function testGetActivityldsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultssuser = sthis->makeUsero:ssavedsearch = sth1s->makesavedSearchclJo*stilterser = suhls->creacerockl originalclassname: FilterberinlcloncoLleccion:.class):Sthis-›activitySearch->method ( constrant: "getArrayFilterKeys") ->willReturn([);ncaotureounrera = nuulsthis-›activitySearch->expects(Sthis->onceO)->method constraint: 'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use SfilterSet, &scapturedCristhis->elasticRepos1tory->method( constraint: 'onbemandSearchldsonly')->w1LlReturn(LJ9:sthis->logger->method( constraint: "info");suhis->service->gecAcclv1tylasrorsavedsearch(psavedsearch, puser):nunus->assercrotvulucaoturedurtertaaSthis->assertFalse(ScapturedCriteria->isFirstRequest00:public function testGetActivityldsLogsWithCorrectContext(): voidk...}: Support Daily • in 2 h 42 m100% [2Tue 14 Apr 12:18:08AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny Rep+0 .Explain it to me again. Why is there issue with that? Where is it expected and why do I need to work with that. How is it used irlevzconuroes vasee oll saveuoedichl. Une los I on celllane ane [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difterence. The controller's getcontextForAskAnythingByFilter at OnDemandV2Controller.php:96-93:" phoVO Repository OnDemandActivitySearch\Criteria:: createFromRequest(arrav meroesrequesaluo.' umir => 00c0unt oadesuser->oerTimezoneIt passes Srequest→>all() - which includes sequence_number trom the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence number is naturally non-zeroThe full explanationhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventyou didn't ask for them:FiterDefault on first requestEffectActiv1tvburat zonkangelmin duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration≥1 together matchednothing.Why sequence_number=1 ls the righttixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionallv strioped (that's existing logic in DATE FILTER KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representssetting sequence number=l Is the minimal, correct signal: "this is not a wresn session open, cont apoly page-load de lauks". Une criterla is otherwise bulltidentically to how the controller builds it - same Criteria::createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchidsOnly - so theresults will now match.wal .Ask anything (&+L)+ <> Code Claude Sonnet 4.6Winasun leams230:40uir-oia 4 spaces...
|
NULL
|
NULL
|
NULL
|
11182
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityServiceTest extends TestCase
{
private ActivitySearch&MockObject $activitySearch;
private ElasticActivityRepository&MockObject $elasticRepository;
private LoggerInterface&MockObject $logger;
private AskJiminnyReportActivityService $service;
protected function setUp(): void
{
$this->activitySearch = $this->createMock(ActivitySearch::class);
$this->elasticRepository = $this->createMock(ElasticActivityRepository::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->service = new AskJiminnyReportActivityService(
$this->activitySearch,
$this->elasticRepository,
$this->logger,
);
}
private function makeFilter(string $key, ?string $value): SearchFilter&MockObject
{
$filter = $this->createMock(SearchFilter::class);
$filter->method('getFilterProperty')->willReturn($key);
$filter->method('getFilterValue')->willReturn($value);
return $filter;
}
private function makeUser(): User&MockObject
{
$tz = new \DateTimeZone('UTC');
$user = $this->createMock(User::class);
$user->method('getTimezone')->willReturn($tz);
$user->method('getId')->willReturn(1);
$user->method('getUuid')->willReturn('user-uuid');
return $user;
}
private function makeSavedSearch(array $filters): Search&MockObject
{
$savedSearch = $this->createMock(Search::class);
$savedSearch->method('getId')->willReturn(42);
$savedSearch->method('getFilters')->willReturn(new \Illuminate\Support\LazyCollection($filters));
return $savedSearch;
}
public function testGetActivityIdsForSavedSearchReturnsIds(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->expects($this->once())
->method('getArrayFilterKeys')
->with($user)
->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->expects($this->once())
->method('onDemandSearchIdsOnly')
->willReturn(['id-1', 'id-2', 'id-3']);
$this->logger->expects($this->once())
->method('info')
->with('[AskJiminnyReport] Fetched activity IDs for saved search');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1', 'id-2', 'id-3'], $result);
}
public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->expects($this->once())->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEmpty($result);
}
public function testGetActivityIdsFiltersOutDateFilters(): void
{
$user = $this->makeUser();
$nonDateFilter = $this->makeFilter('owner_id', '123');
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');
$updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');
$updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');
$savedSearch = $this->makeSavedSearch([
$nonDateFilter,
$startDateFilter,
$endDateFilter,
$updatedFromFilter,
$updatedToFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
}
public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void
{
$user = $this->makeUser();
$closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');
$closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');
$regularFilter = $this->makeFilter('rep_id', '99');
$savedSearch = $this->makeSavedSearch([
$closingStartFilter,
$closingEndFilter,
$regularFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesArrayFilters(): void
{
$user = $this->makeUser();
$filter1 = $this->makeFilter('outcome', 'positive');
$filter2 = $this->makeFilter('outcome', 'negative');
$savedSearch = $this->makeSavedSearch([$filter1, $filter2]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesScalarFilters(): void
{
$user = $this->makeUser();
$filter = $this->makeFilter('direction', 'inbound');
$savedSearch = $this->makeSavedSearch([$filter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-5'], $result);
}
public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
$this->assertFalse($capturedCriteria->isFirstRequest());
}
public function testGetActivityIdsLogsWithCorrectContext(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);
$this->logger->expects($this->once())
->method('info')
->with(
'[AskJiminnyReport] Fetched activity IDs for saved search',
$this->callback(fn ($context) => $context['saved_search_id'] === 42
&& $context['user_id'] === 1
&& $context['activity_count'] === 2)
);
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
NULL
|
11183
|
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\Activity\SearchFilter;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityServiceTest extends TestCase
{
private ActivitySearch&MockObject $activitySearch;
private ElasticActivityRepository&MockObject $elasticRepository;
private LoggerInterface&MockObject $logger;
private AskJiminnyReportActivityService $service;
protected function setUp(): void
{
$this->activitySearch = $this->createMock(ActivitySearch::class);
$this->elasticRepository = $this->createMock(ElasticActivityRepository::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->service = new AskJiminnyReportActivityService(
$this->activitySearch,
$this->elasticRepository,
$this->logger,
);
}
private function makeFilter(string $key, ?string $value): SearchFilter&MockObject
{
$filter = $this->createMock(SearchFilter::class);
$filter->method('getFilterProperty')->willReturn($key);
$filter->method('getFilterValue')->willReturn($value);
return $filter;
}
private function makeUser(): User&MockObject
{
$tz = new \DateTimeZone('UTC');
$user = $this->createMock(User::class);
$user->method('getTimezone')->willReturn($tz);
$user->method('getId')->willReturn(1);
$user->method('getUuid')->willReturn('user-uuid');
return $user;
}
private function makeSavedSearch(array $filters): Search&MockObject
{
$savedSearch = $this->createMock(Search::class);
$savedSearch->method('getId')->willReturn(42);
$savedSearch->method('getFilters')->willReturn(new \Illuminate\Support\LazyCollection($filters));
return $savedSearch;
}
public function testGetActivityIdsForSavedSearchReturnsIds(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->expects($this->once())
->method('getArrayFilterKeys')
->with($user)
->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->expects($this->once())
->method('onDemandSearchIdsOnly')
->willReturn(['id-1', 'id-2', 'id-3']);
$this->logger->expects($this->once())
->method('info')
->with('[AskJiminnyReport] Fetched activity IDs for saved search');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1', 'id-2', 'id-3'], $result);
}
public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->expects($this->once())->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEmpty($result);
}
public function testGetActivityIdsFiltersOutDateFilters(): void
{
$user = $this->makeUser();
$nonDateFilter = $this->makeFilter('owner_id', '123');
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');
$updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');
$updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');
$savedSearch = $this->makeSavedSearch([
$nonDateFilter,
$startDateFilter,
$endDateFilter,
$updatedFromFilter,
$updatedToFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
}
public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void
{
$user = $this->makeUser();
$closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');
$closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');
$regularFilter = $this->makeFilter('rep_id', '99');
$savedSearch = $this->makeSavedSearch([
$closingStartFilter,
$closingEndFilter,
$regularFilter,
]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesArrayFilters(): void
{
$user = $this->makeUser();
$filter1 = $this->makeFilter('outcome', 'positive');
$filter2 = $this->makeFilter('outcome', 'negative');
$savedSearch = $this->makeSavedSearch([$filter1, $filter2]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-1'], $result);
}
public function testGetActivityIdsHandlesScalarFilters(): void
{
$user = $this->makeUser();
$filter = $this->makeFilter('direction', 'inbound');
$savedSearch = $this->makeSavedSearch([$filter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);
$this->logger->method('info');
$result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertEquals(['id-5'], $result);
}
public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$this->logger->method('info');
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
$this->assertNotNull($capturedCriteria);
$this->assertFalse($capturedCriteria->isFirstRequest());
}
public function testGetActivityIdsLogsWithCorrectContext(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);
$this->logger->expects($this->once())
->method('info')
->with(
'[AskJiminnyReport] Fetched activity IDs for saved search',
$this->callback(fn ($context) => $context['saved_search_id'] === 42
&& $context['user_id'] === 1
&& $context['activity_count'] === 2)
);
$this->service->getActivityIdsForSavedSearch($savedSearch, $user);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
NULL
|
11184
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:178Today ~...
|
NULL
|
NULL
|
NULL
|
11185
|
|
PhpStormFileFditViewNavigateCodeLaravelRefactonToo PhpStormFileFditViewNavigateCodeLaravelRefactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vD Unit_ ActionsC ComponentConfigurationM ConsoleM ContractsM DomainD DTO→ Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M ActivitvM AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> M ModelsM Notifications> MObserversPoliciesProviders→ Repositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedReportlests passed:1 (g minutes ago(©) ReportController.phpC JiminnyDebugCommand.php= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.phpOnDemandV2Controller.php© HistoryService.php© FilterDetinitionCollection.php© Criteria.phpC) Team.onp(©) AutomatedReportsRepository.php XC) AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.php© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivateLoccerintertacexrockuonect lodder:yusades82 M3 ^ Yc) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php29 0 >© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 M4 . V9311411511611711811911124011211124123* Retrieve all standard (non-Ask Jiminny) m* dparam string ssortcolumnIne column tc* dparam string SsortDirection The sort dire1A0 MI* dreturn ColZection<AutomatedReport>12 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at'string ssortbirection =desc): Collection {...}118 M>156184185 M206 M225 V* Retrieve all Ask Jiminny reports created i* Oodrdll usernusen227Ine user Ynos* @param string SsortColumnThe column tc228229* dparam string SsortDirection The sort dire* dreturn Collection<AutomatedReport>*/14 usagespublic function getAskJzminnyReportsByUser(user suser,suring ssortcolumn = "creaced_at",string ssorcbirection = "desc": Collection {...}254— 233154236237242243— 244|Z usagesprivate function buildSortedQuery(string Ssor 245246— 247* bet att active and enabled reports with ae 248250*dparam string sfrequency251— 252 V* dreturh coLcectzon<aucomacedкeрort>274Zs usadespublic function getActiveReportsByFrequency(sprivate AskJiminnvReportActivityService Sservice:protected function setUpo: voidk...11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate runcuion makeuser: userdmockudjectl....o usagesprivate function makeSavedSearch(array Sfilters): Search&MockObiect....public function testGetActivityIdsForSavedSearchReturnsidsO: void ...rpublic function testGetActivityldsForSavedSearchReturnsEmptyWhenNoResults: voidi...hpublic function testGetActivityldsF1ltersoutbater1lterso: vo1di...hpublic function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(: voidt...}public function testGetActivityIdsHandlesScalarFilters(: voidt...public function testGetActivityldsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultssuser = sthis->makeUsero:ssavedsearch = sth1s->makesavedSearchclJo*stilterser = schls->creacerock, originalclassname: FilterberinlcloncoLlecclon:.class):$this-sactivitySearch-sethodf constraint: "getArpavEiltenkevs')-swillPeturncFl):ncaotureounrera = nuulsthis-›activitySearch->expects(Sthis->onceO)->method constraint:'getOnDemandPageFilterSet')->willReturnCallbackfunction (Criteria $criteria) use SfilterSet, &ScapturedCristhis->elasticRepos1tory->method( constraint: 'onDemandSearchlasonly')->w1llReturn(LJ)*sthis->logger->method( constraint: "info");suhis->service->gecAcclv1tylasrorsavedsearch(psavedsearch, puser):nunus->assercrotvulucaoturedurtertaaSthis->assertFalse(ScapturedCriteria->isFirstRequest00:public function testGetActivityldsLogsWithCorrectContext(): voidk...}: Support Daily • in 2 h 42 m100% [2Tue 14 Apr 12:18:17AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny Rep+0 .Explain it to me again. Why is there issue with that? Where is it expected and why do I need to work with that. How is it used irlevzconuroes vasee oll saveuoedichl Ine los m on celllane ane [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difterence. The controller's getcontextForAskAnythingByFilter at OnDemandV2Controller.php:96-93:" phoVU kepos1tory onbemandAct1vlcysearch uricer1a:: creacerromkequescarrav meroesrequesoaluor' umir => 00c0unt 'oade"suser->oerTimezoneIt passes Srequest→>all() - which includes sequence_number trom the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence number is naturally non-zeroThe full explanationhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventyou didn't ask for them:FiterDefault on first requestEffectActiv1tvburat zonkangelmin duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration≥1 together matchednothing.Why sequence_number=1 ls the righttixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionallv strioped (that's existing logic in DATE FILTER KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representssetting sequence number=1 IS the minimal, correct signal: "this is not a wresn session open, don t apply page-load derauks". Une criterla is otnerwise bulltidentically to how the controller builds it - same Criteria::createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchidsOnly - so theresults will now match.wal .Ask anything (&+L)+ <> Code Claude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
NULL
|
NULL
|
11186
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:198Today ~...
|
NULL
|
NULL
|
NULL
|
11187
|
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.js v#11894 on JY-18909-automated-reports-ask-iminny K vProject vD Unit>DActionsComponentConfigurationM ConsoleM ContractsM DomainD DTO→ Enums_Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M ActivitvM AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications> MObserversM PoliciesProviders→ Repositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedReportlests passed:1 (g minutes ago(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php< console EUiconsole SlAGiNG© AskJiminnyReportActivityService.phg© ActivitySearch.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpOnDemandV2Controller.phpC) HistoryService.php© FilterDetinitionCollection.php© Criteria.phpC) Team.onp© AutomattgdReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpC) AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.php(e) TrackProviderinstallled=vent.onoclass AskJiminnyReportActivityServiceTest extends TestCaseprivateLoccerintertacexrockuonect lodder:yusades62 X3^c) CreateActivityLoggeacvenconpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php29 0 >© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 M4 . V9311411511611711811911124011211124123* Retrieve all standard (non-Ask Jiminny) m71 M >* dparam string ssorttolumnIne column tc* dparam string SsortDirection The sort dire190 MAI* dreturn ColZection<AutomatedReport>118 M>15612 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at'string ssortbirection =desc): Collection {...J184185 M206 M225 V* Retrieve all Ask Jiminny reports created i* Oodrdll usernusen227Ine user Ynos* @param string $sortColumnThe column tc228229* dparam string SsortDirection The sort dire* dreturn Collection<AutomatedReport>*/14 usagespublic function getAskJzminnyReportsByUser(user suser,suring ssortcolumn = "creaced_at",string ssorcbirection = "desc": Collection {...}1254—233154236237242243— 244|Z usagesprivate function buildSortedQuery(string Ssor 245246— 247* bet att active and enabled reports with ae 248250*dparam string sfrequency251— 252 V* dreturh coLcectzon<aucomacedкeрort>274Zs usadespublic function getActiveReportsByFrequency(sprivate AskJiminnvReportActivityService Sservice:protected function setUpo: voidk...11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&Mock0bject(...}ousadesprivate function makeSavedSearchlarray $filters): Search&MockObiect...public function testGetActivityldsForSavedSearchReturnsidsO: void...hpublic function testGetActivityldsForSavedSearchReturnsEmptyWhenNoResults: voidk...hpublic function testGetActivityIdsFilters0utDateFilters(: void{...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void(...}public function testGetActivityIdsHandlesArrayFilters(: voidt...}public function testGetActivityIdsHandlesScalarFilters(: voidf...}public function testGetActivityldsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(suser = sthis->makeUsero:ssavedsearch = sth1s->makesavedSearchclJo*$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class)nunus-›acuvlrvsearch->neunoo constraint 'detArravrtuterkevs'->Muureturnuo.ncaotureounrera = nuulsthis-›activitySearch->expects(Sthis->onceO)->method constraint: 'getOnDemandPageFilterSet')->willReturnCallbackfunction (Criteria $criteria) use SfilterSet, &ScapturedCristhis->elasticRepos1tory->method( constraint: 'onDemandSearchlasonly')->w1llReturn(LJ)*sthis->logger->method( constraint: "info");suh1s->service->gecaculvitytasrorsavedsearcn(psavedsearch, suser):nunus->assercrotvulucaoturedurtertaaSthis->assertFalse(ScapturedCriteria->isFirstRequest00:public function testGetActivityldsLoqsWithCorrectContextO: voidk...h: Support Daily • in 2 h 42 m100% [2Tue 14 Apr 12:18:19AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepExplain it to me again. Why is there issue with that? Where is it expected and why do I need to work with that. How is it used irlevzconuroes vasee oll saveuoedichl. Une los I on celllane ane [EMAIL]#L44-66 should be sameLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difterence. The controller's getcontextForAskAnythingByFilter at OnDemandV2Controller-php: 96-93:" phoVO Repository OnDemandActivitySearch\Criteria:: createFromRequest(arrav meroesrequesoaluu.' umir => r00c0unt oadesuser->oerTimezoneIt passes Srequest→>all() - which includes sequence_number trom the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence number is naturally non-zeroThe full explanationhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventyou didn't ask for them:FilterDefault on first requestEffectActiv1tvburat zonkangelmin duration = 1 minDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration≥1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionallv strioped (that's existing logic in DATE FILTER KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtidentically to how the controller builds it - same Criteria:: createFromRequest, same getOnDemandPageFilterSet, same onDemandSearchldsOnly - so theresults will now match.wal .Ask anything (&+L)+ ‹> CodeClaude Sonnet 4.6Winasun leams230:40uir-oia 4 spaces...
|
NULL
|
NULL
|
NULL
|
11188
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:218Today ~...
|
NULL
|
NULL
|
NULL
|
11189
|
|
PhpStormFileFV faVsco.js vViewNavigateCodeLaravelR PhpStormFileFV faVsco.js vViewNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-liminny k vToolsWindowHelpProject vProphetAiv D Reports© AutomatedReportsCl© AutomatedReportsRe© AutomatedReportsSt© CreateMockAskJimir© DeleteReportComma© GenerateMarketingR© Team.php© Usage.phpD Slack_leamsD TracksO TranscriptionO TwilioD UsersVocabularyDZoom© CoachingFeedbacksUpr© Command.phpcreateDatabaseusers.pc Daraoase oecountoi© DeleteOldAiCrmNotesC:© DeleteS3LeftoversComiDevPostmanCommand./© DiarizeViaAiParticipantk© EncryptTokensComman© EngagementStatsRegen©FeatureFlagsHelper.php© FixCrossTenantlssues.p(c) -ushro espermissionsc(e) Generatelnterna wepho• GroupSetDefaultLangua© HelperTruncateCoachin© HubspotJournalPollingC© HubspotWebhookServic©ImportRecording.php© ImportUsersFromCsvFil© IterateUsersCommand.f© JiminnyCacheClearCom© JiminnyDebugCommanc© JiminnySetEncryptedTo© JiminnyTokenInfoCommMakeslackLvecoaching(c Manacescimror eam.o© MarkBranchForEnvironn© MuteOrganizerChannel.© PhpApm.php© PropagateCoachingFeer© PurgeConferences.php© PurgeSoftDeletedOppor© PurgeSyncBatchesCom(e Recalculatebealkisksco(c) Removebe eremarkersc(e) Remove-xoiredNudoesc removeunusecrarcloC ResetElasticSearch.php© RestoreActivityCrmProv© RestoreActivityTypeCor© ReportController.phpAulomaleakeporissendcommand.onoJiminnybeouecommana.ong© AddLayoutEntities.php) AutomatedReportsService.php© CreateActivityLoggedEvent.phpAutomatedReportsCommand.php xleam.ono© CreateHeldActivityEvent.php© UserPilotActivityListener.php© RequestGenerateReportJob.php© AutomatedReportResult.phpc) Automatedreport.onoclass AutomatedReportsCommand extends CommandA2^1031041051061071081091101111121131114115116117118119120121122123124125126127128129130131132133134137138139140141142143144145146147148149150151private function processReports(string $frequency): void$this->logger->info(self::LOG_PREFIX . " Processing $frequency reports");$reportId = $this->›option( key: 'report-id');if ($reportId !== null) {$reports = $this->getReportById($reportId);1 else {// Get all enabled, not deleted reports with active teams for the speci 51$reports = $this->reportRepository->getActiveReportsByFrequency($freque 61$this->logger->info(self::LOG_PREFIX ." Found ($reports->count()} $frequer 7071%/** @var AutomatedReport $report */foreach ($reports as $report) {100 ₽$this->logger->info(self::LOG_PREFIX . ' Dispatching Generate Report jC117'reportUvid' = $report->getUvid(),118€'teamId' => $report->getTeamId(),'frequency' => $report->getFrequency(),157 8 >'type' => $report->getType(),1):185 %$job = $report->isAskJiminnyReport()? new RequestGenerateAskJiminnyReportJob($report->getUvid()):new RequestGenerateReportJob($report->getUvid()):$this->dispatcher->dispatch($job);$this->dispatcher->dispatchSync($job);206 ₽ >224225 ₽226228230private function getReportById(string $reportId): Collection1254$report = $this->reportRepository->findById0rUvid($reportId);if ($report === null) {$this->logger->warning(self::LOG_PREFIX'Report not found for --repf237$this->warn( string: "Report not found: {$reportId}");236242243return collect();if (! $report->getStatus()) {$this->Logger->warning(self::LOG_PREFIX'reportId' => SreportId.'reportUvid' => $report->getUvid(),Report is inactive, proces:2481):249250mantial nuon 250g= custom.log= laravel.logA SF [jiminny@localhost]Hs local liminnyalocalnostconsole PRODL console [EUlA console [STAGING]© ActivitySearch.php© AskJiminnyReportActivityService.php•OnDemandV2Controller.php© HistoryService.phprilterDerinitioncollection.ongcriiera.onpCh Ask. liminnvRenortActivitvServiceTest.ohn X© RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceTof26private LoggerInterface&MockUbject Logger;9 usagesBLMSAYprivate AskJiminnvReportActivityService Sservice:29 6t >Eprotected function setup(): voidf...}11 usagesprivate function makeFilter(string $key, ?string $valve):8 usagesprivate function makeUser(): User&Mock0bjectf...}8 usagesprivate function makeSavedSearch(array $filters): Searchspublic function testGetActivityIdsForSavedSearchReturnsIcpublic function testGetActivityIdsForSavedSearchReturnsEnpublic function testGetActivityIdsFilters0utDateFiltersOpublic function testGetActivityIdsFilters0utClosingPeriocpubLic tunction cescbecactivicyLashandLesarrayr1lterscpublic function testGetActivityIdsHandLesScalarFilters:public function testGetActivityIdsPassesNonZeroSequenceNLsusen = sthis->makelcenD$savedSearch = $this->makeSavedSearch([]);$filterSet = $this->createMock( originalClassName: Filtern$this->activitySearch->method( constraint:detArravr$capturedCriteria = null;$this->activitySearch->expects($this->once))->method ( constraint: 'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria$this->elasticRepository->method( constraint: 'onDeman$this->logger->method( constraint:anto')"sthis->service->aetActivitvldsForSavedSearch/SsavedS$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequest(Support Daily • in 2h 42 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:18:23CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Explain it to me again. Why is there issue with thhat? Where is it expected and why do I need to work with that. How is it used inDelllaluvzcontroes vasee oll saveuoedichl. Une los m on celllane ane iiOnSkdImbуnedoT LheLeveLyoetVaceronorL44-0e snoule de sallitwLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzconNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php: 90-93:0 phpVO Repository OnDemandActivitySearch\Criteria::createFromRequest(arrav meroesrequesoaluor' umir => 00c0unt 'oade"$user->getTimezone()It passes Srequest->all() - which includes sequence_number from the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for them:FilterActiv1tvburat zonkangelhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventDefault on first requestmin_duration = 1 minEffectDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration>1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER_KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtidentically to how the controller builds it - same Criteria::createFromRequest, same get0nDemandPageFilterSet, same onDemandSearchIds0nly - so theresults will now match.Ö ul ...Ask anything (2*L)+ <> Code Claude Sonnet 4.6Winasun leamsuir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11190
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:318Today ~...
|
NULL
|
NULL
|
NULL
|
11191
|
|
PhpStormFileEditViewFV faVsco.js vProject vNavigat PhpStormFileEditViewFV faVsco.js vProject vNavigateCodeLaravelRefactor#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelpDProphetAiv D Reports© AutomatedReportsCl© AutomatedReportsRe© AutomatedReportsSt© CreateMockAskJimir© DeleteReportComma© GenerateMarketingR© Team.php© Usage.phpD Slack_leamsD TracksO TranscriptionO TwilioD UsersVocabularyDZoom© CoachingFeedbacksUpr© Command.php© CreateDatabaseUsers.pc Daraoase oecountoi© DeleteOldAiCrmNotesC:© DeleteS3LeftoversComiDevPostmanCommand./© DiarizeViaAiParticipantk© EncryptTokensComman© EngagementStatsRegen© FeatureFlagsHelper.php© FixCrossTenantlssues.p(c) -ushro espermissionsa(e) Generatelnterna wepho• GroupSetDefaultLangua© HelperTruncateCoachin© HubspotJournalPollingC© HubspotWebhookServic©ImportRecording.php© ImportUsersFromCsvFil© IterateUsersCommand.p© JiminnyCacheClearCom© JiminnyDebugCommanc© JiminnySetEncryptedTo© JiminnyTokenInfoCommMakeslackLvecoaching(c Manacescimror eam.oc мarkbranchrorenvironh© MuteOrganizerChannel.© PhpApm.php© PropagateCoachingFeer© PurgeConferences.php© PurgeSoftDeletedOppor© PurgeSyncBatchesCom(e Recalculatebealkisksco(c) Removebe eremarkersc(e) Remove-xoiredNudoesc removeunusecrarcloC ResetElasticSearch.php© RestoreActivityCrmProv© RestoreActivityTypeCor© ReportController.phpAulomaleakeporissendcommand.onoJiminnybeouecommana.ong© AddLayoutEntities.php) AutomatedReportsService.php© CreateActivityLoggedEvent.phpAutomatedReportsCommand.php x= custom.log= laravel.logA SF [jiminny@localhost]leam.onoHs local liminnyalocalnostconsole PRODL console [EUl© CreateHeldActivityEvent.php© UserPilotActivityListener.phpA console [STAGING]© ActivitySearch.php© AskJiminnyReportActivityService.php•OnDemandV2Controller.php© HistoryService.phprilterDerinitioncollection.ongcrilena.onp© RequestGenerateReportJob.phpCh Ask. liminnvRenortActivitvServiceTest.ohn X(©) AutomatedReportResult.php© AutomatedReport.php© RequestGenerateAskJiminnyReportJobTest.phpclass AutomatedReportsCommand extends CommandA2 ^public function handle(): intNNclass AskJiminnyReportActivityServiceTofprivate LoggerInterface&MockUbject Logger;I/ Process quarterly reports on the first day of January, April, July, and9 usagesif ($isFirstDay0fMonth && $isQuarterlyMonth) {private AskJiminnvReportActivitvService Sservice:$this->processReports ( frequency: AutomatedReportsService: :FREQUENCY_QUAR 28BLMSAY1001011031041051061071081091101111121131114111.11811912012112212312412512612712812913013113213313413529 6t >$this->logger->info(self::LOG_PREFIX . ' Completed');rerurn or* Process reports for a specific frequency.* @param string $frequency71>* @return void100%private function processReports(string $frequency): void117118€$this->logger->info(self::LOG_PREFIX . " Processing $frequency reports");156157 % >$reportId = $this->option( key: 'report-id');if ($reportId !== null) ($reports = $this->getReportById($reportId);7 else {185 %206 ₽ >// Get all enabled, not deleted reports with active teams for the speci224geports = $this->reportRepository->getActiveReportsByFrequency($freque225 P226227$this->logger->info(self::LOG_PREFIX . " Found {$reports->count()} $frequer 228229230/** @var AutomatedReport $report */foreach ($reports as $report) {$this->logger->info(self::LOG_PREFIXDispatching Generate Report jc232'reportUuid'→> $report->getUvid(),233'teamId' => $report->getTeamId(),'frequency'=> $report->getFrequency(),'type' = $report->getType(),1):n00 =sreoorre>sasko.mnnvreoort? new RequestGenerateAskJiminnyReportJob($report->getUuid()):new RequestGenerateReportJob($report->getUvid()):$this->dispatcher->dispatch($job);$this->dispatcher->dispatchSync($job);249252protected function setUp(): voidf...}11 usagesprivate function makeFilter(string $key, ?string $valve):8 usagesprivate function makeUser(): User&Mock0bjectf...}8 usagesprivate function makeSavedSearch(array $filters): Searchspublic function testGetActivityIdsForSavedSearchReturnsIcpublic function testGetActivityIdsForSavedSearchReturnsEnpublic function testGetActivityIdsFilters0utDateFiltersOpublic function testGetActivityIdsFilters0utClosingPeriocpubLic tunction cescbecactivicyLashandLesarrayr1lterscpublic function testGetActivityIdsHandLesScalarFilters:public function testGetActivityIdsPassesNonZeroSequenceNL$user = $this->makeUser();SsavedSearch = $this->makeSavedSearch([]):$filterSet = $this->createMock( originalClassName: Filtern$this->activitySearch->method( constraint:detArravr$capturedCriteria = null;$this->activitySearch->expects($this->once())->method ( constraint: 'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria$this->elasticRepository->method( constraint: 'onDemansthns-> lodden->method constraint: "into")"sthis->service->aetActivitvldsForSavedSearch(SsavedS$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequest(Support Daily • in 2h 42 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:18:31CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Explain it to me again. Why is there issue with thhat? Where is it expected and why do I need to work with that. How is it used inDelllaluvzcontroes vasee oll saveuoedichl. Une los m on celllane ane iiOnSkdImbуnedoT LheLeveLyoetVaceronorL44-0e snoule de sallitwLet me read the OnDemandV2Controller to understand how it builds criteria there:Read OnDemanavzcontNow look at the key difference. The controller's getContextForAskAnythingByFilter at OnDemandV2Controller.php: 90-93:0 phpVO Repository OnDemandActivitySearch\Criteria:: createFromRequest(arrav meroesrequesoaluor' umir => 00c0unt 'oade"$user->getTimezone()It passes Srequest->all() - which includes sequence_number from the URL (e.g. sequence_number=4 from your staging URL). So when a user has beenpaginating on the frontend, sequence_number is naturally non-zero.The full explanationyou didn't ask for them:FilterActiv1tvburat zonkangelhsiauist kecuestaouncskenererurns true wnen seauenceNumber === u wnenttsine "trstreduestneseumolci detauirs kickinauromaricalveventDefault on first requestmin_duration = 1 minEffectDroos 0-secono activitiesActivityRecordedonly_recorded = 1Recorded activities onlvUser's own groupRestricts to user's groupFrontend hits /api/v1/page/on-demand?topic id(]=...&sequence number=4 → sequence number=4 → isFirstRequest = false → no implicit defaults →returns 15 activities.AskJiminnyReportActivityService (before the fix) built params from the saved search filters but never included sequence_number → defaulted to 0 → isFirstRequest() = true → implicit defaults applied → 0 activities returned because the topic filter + recorded-onlv + duration>1 together matchednothing.Why sequence_number=1 is the right fixThe service is doing a deliberate, one-shot search - not a paginated session. It should never apply first-request defaults, because:1. The saved search already encodes the user's intent (those filters were chosen explicitly)2. Date filters are already intentionally stripped (that's existing logic in DATE_FILTER_KEYS )3. Adding implicit min_duration, only_recorded, and group scope on top would contradict what the saved search representsSetting sequence number=1 is the minimal, correct signal: "this is not a fresh session open, don't apply page-load defaults". The criteria is otherwise builtidentically to how the controller builds it - same Criteria::createFromRequest, same get0nDemandPageFilterSet, same onDemandSearchIds0nly - so theresults will now match.Ö ul ...Ask anything (2*L)+ <> Code Claude Sonnet 4.6Winasun leamsuir-o( 4 spaces...
|
NULL
|
NULL
|
NULL
|
11192
|
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 42 m100% <47Tue 14 Apr 12:18:358Today ~...
|
NULL
|
NULL
|
NULL
|
11193
|