|
10965
|
217
|
37
|
2026-04-14T09:06:03.305510+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157563305_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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
<?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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.76171875,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.7796875,"top":0.017361112,"width":0.12109375,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.008203125,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","depth":4,"bounds":{"left":0.490625,"top":0.12777779,"width":0.3347656,"height":0.8722222},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.4234375,"top":0.1736111,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.43710938,"top":0.1736111,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4484375,"top":0.17222223,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.45703125,"top":0.17222223,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.0,"width":0.39882812,"height":1.0},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8932460332387265586
|
-8276790037575160524
|
visual_change
|
accessibility
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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
<?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...
|
10964
|
|
10967
|
217
|
38
|
2026-04-14T09:06:04.378032+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157564378_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php= custom.lo9= laravel.logL SF (iminny@localhostD UnitActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php XHs local liminnyalocalnostconsole PRODL console (EUl© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) TrackProviderinstallled-vent.ono¿ consoe STAGING© AskJiminnyReportActivityService.phpC ActivityLogged.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpsrong© AutomatedReportResult.php© AutomatedReport.phpdeclare(strict_types=1);class AutomatedReportsrepos1toryA15 V4namesnace liests Unit Services Klosk AutomatedRenorts:* dreturn AutomatedReportuse...public function create(array $data): AutomatedReport...class AskaminnyReportActivityServicelest extends TestCase* Find an automated report by UUID* dparam string suuld25* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:2729 GT>Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.100 M ›* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 118 %% >* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "des-oe157 % >* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...185 VA N206 D >-224225*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnThe column to sort by. Allowed values: 'created_by', 'created_at'. 232* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez 233* dreturn Collection<AutomatedReport>22923023123425525614 usages244Winasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.ls usadeslo usaces1o usages9 usagesprivate ActivitySearch&Mock0bject $activitySearch;private ElasticActivityRepository&Mock0bject SelasticRepository:private LoggerinterfacexMock0bject sloggerprivate AskJ1minnykeporcAculVityservice sservice;protected function setUp: voidt...hIl usagesprivate function makeFilter(string $key. ?string $value): SearchFilto usaeesprivate function makeUserO: User&Mock0bjecti...h8 usagesprivate function makesavedsearch(array sf1lters): SearchxMockobjectpubLic tunction tescbecAculvityLasrorsavedsearchkecurnstas: vo1dpublic function testGetActivityIdsForSavedSearchReturnsEmptvWhenNoRdpublic function testGetActivityldsFilters0utDateFiltersO: void..public function testGetActivityldsFilters0utClosingPeriodDateFilter.public function testGetActiv1tyldsHandLesArrayF1lters(: vo1di..puDLic tunction tescbecAculvltylashandlesscalarrilters: voldt..pubtao runctaontestGetActivitvIdsPassesNonZeroSequenceNumberToDisalpuser - ochis->makeusert,SsavedSearch = sthis->makeSavedSearch(u.D:sfilterset = Sthis->createMock originalClassName: FilterDefinitioncsthis->activitysearch->method constraint: 'getArrayr1lterKeys')->wScapturedcriteria = null;ninn S->acu v Vsearch-sexoersth S=>oncelu.ui→>iecno constragetOnDemandPageFilterSet')1 eall-›il ~ Accept File *+ k (X Reject file (Griterta 2orätilesia) use ($fil, 0lablSupport Daily • in 2 h 54m100%Tue 14 Apr 12:06:03RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+0 .met opeulibally.Searched sequence_number SequenceNumber and performed 2 other queriesNow nave tne key insionu Let me check what sequence nundel coes in tne context or isrirstkequest .This is the root cause. Ler me check ActivitvActualbate In cerailINowi see tne tuil olcture. Let me also check Accivityburacionkance ano Aculvitykecorded derauls tor 1SFirStKequest():keaа Acuivityburaulonkance.ono ane Acuivilykecoraea.ongNow l have the complete root cause picture. This is critical:Root Cause FoundIne bu1 lakequestraramstromsearch method in AskJ1minnykeportactivicyservice passes sequence number=0implicitly (not in params), which means isFirstRequest() returns truewnen sequencmber is notin requestParams, the Criteria::createFromRequest defaultsitto 0, and isFirstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence_number=4 - meaning it's not a first request. The service doesn't set it, so thecriterla tninks Iu's a TilstrecuestWnen 1sFirstRequest() = true, these Implicht tilters are applied that aren t in the saved search:1. ActivityDurationRange — applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters torecorded-only3, Orcannsergroupin — aoolles user's ceaur crouo TilerBut the frontend with sequence number=4 skips all of these defaults, so it returns more results.nerx snoule oe m our lorequestraranstromsearch- uneeos lo oass sequence number intne ouluoalams losignal "not a first request", so the implicit detaults don't apply. Or alternatively, always pass a non-zero sequence_nunber in tne meree in ceraccivitylasrorsaveasearch.Now let me verity my understanding of isFirstRequest :keac uriterla.onecontirmea. Ine Tix is clear ane minimal. Ine cetaculvicylasrorsaveasearch metnoe neeas lo pass sequence nutber with a non-zero value so that isFirstRequest() returns false and no implicit detaults are applied.U As!Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Eynlored Ack.liminnvPenortActivitvServiceTect nhn and coarched Ack. liminnvPenortActivityksIneed lo add a lest thau verities sequence number=l is passedlo uricerla so 1srirstkequesco rerurns talse ).et me add it to the existind test flle:• AskJi;Tyoelvicelesbone+27Now let's run the test to verify:Command dockero dests/unxe/ srvkees/Kosk/ Auf /ar/w/rts/sKtamannyReportActivityServicetest.php --no-coverageRunae2 files +28 -1 >Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
-6629409606791229597
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php= custom.lo9= laravel.logL SF (iminny@localhostD UnitActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php XHs local liminnyalocalnostconsole PRODL console (EUl© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) TrackProviderinstallled-vent.ono¿ consoe STAGING© AskJiminnyReportActivityService.phpC ActivityLogged.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpsrong© AutomatedReportResult.php© AutomatedReport.phpdeclare(strict_types=1);class AutomatedReportsrepos1toryA15 V4namesnace liests Unit Services Klosk AutomatedRenorts:* dreturn AutomatedReportuse...public function create(array $data): AutomatedReport...class AskaminnyReportActivityServicelest extends TestCase* Find an automated report by UUID* dparam string suuld25* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:2729 GT>Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.100 M ›* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 118 %% >* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "des-oe157 % >* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...185 VA N206 D >-224225*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnThe column to sort by. Allowed values: 'created_by', 'created_at'. 232* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez 233* dreturn Collection<AutomatedReport>22923023123425525614 usages244Winasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.ls usadeslo usaces1o usages9 usagesprivate ActivitySearch&Mock0bject $activitySearch;private ElasticActivityRepository&Mock0bject SelasticRepository:private LoggerinterfacexMock0bject sloggerprivate AskJ1minnykeporcAculVityservice sservice;protected function setUp: voidt...hIl usagesprivate function makeFilter(string $key. ?string $value): SearchFilto usaeesprivate function makeUserO: User&Mock0bjecti...h8 usagesprivate function makesavedsearch(array sf1lters): SearchxMockobjectpubLic tunction tescbecAculvityLasrorsavedsearchkecurnstas: vo1dpublic function testGetActivityIdsForSavedSearchReturnsEmptvWhenNoRdpublic function testGetActivityldsFilters0utDateFiltersO: void..public function testGetActivityldsFilters0utClosingPeriodDateFilter.public function testGetActiv1tyldsHandLesArrayF1lters(: vo1di..puDLic tunction tescbecAculvltylashandlesscalarrilters: voldt..pubtao runctaontestGetActivitvIdsPassesNonZeroSequenceNumberToDisalpuser - ochis->makeusert,SsavedSearch = sthis->makeSavedSearch(u.D:sfilterset = Sthis->createMock originalClassName: FilterDefinitioncsthis->activitysearch->method constraint: 'getArrayr1lterKeys')->wScapturedcriteria = null;ninn S->acu v Vsearch-sexoersth S=>oncelu.ui→>iecno constragetOnDemandPageFilterSet')1 eall-›il ~ Accept File *+ k (X Reject file (Griterta 2orätilesia) use ($fil, 0lablSupport Daily • in 2 h 54m100%Tue 14 Apr 12:06:03RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+0 .met opeulibally.Searched sequence_number SequenceNumber and performed 2 other queriesNow nave tne key insionu Let me check what sequence nundel coes in tne context or isrirstkequest .This is the root cause. Ler me check ActivitvActualbate In cerailINowi see tne tuil olcture. Let me also check Accivityburacionkance ano Aculvitykecorded derauls tor 1SFirStKequest():keaа Acuivityburaulonkance.ono ane Acuivilykecoraea.ongNow l have the complete root cause picture. This is critical:Root Cause FoundIne bu1 lakequestraramstromsearch method in AskJ1minnykeportactivicyservice passes sequence number=0implicitly (not in params), which means isFirstRequest() returns truewnen sequencmber is notin requestParams, the Criteria::createFromRequest defaultsitto 0, and isFirstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence_number=4 - meaning it's not a first request. The service doesn't set it, so thecriterla tninks Iu's a TilstrecuestWnen 1sFirstRequest() = true, these Implicht tilters are applied that aren t in the saved search:1. ActivityDurationRange — applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters torecorded-only3, Orcannsergroupin — aoolles user's ceaur crouo TilerBut the frontend with sequence number=4 skips all of these defaults, so it returns more results.nerx snoule oe m our lorequestraranstromsearch- uneeos lo oass sequence number intne ouluoalams losignal "not a first request", so the implicit detaults don't apply. Or alternatively, always pass a non-zero sequence_nunber in tne meree in ceraccivitylasrorsaveasearch.Now let me verity my understanding of isFirstRequest :keac uriterla.onecontirmea. Ine Tix is clear ane minimal. Ine cetaculvicylasrorsaveasearch metnoe neeas lo pass sequence nutber with a non-zero value so that isFirstRequest() returns false and no implicit detaults are applied.U As!Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Eynlored Ack.liminnvPenortActivitvServiceTect nhn and coarched Ack. liminnvPenortActivityksIneed lo add a lest thau verities sequence number=l is passedlo uricerla so 1srirstkequesco rerurns talse ).et me add it to the existind test flle:• AskJi;Tyoelvicelesbone+27Now let's run the test to verify:Command dockero dests/unxe/ srvkees/Kosk/ Auf /ar/w/rts/sKtamannyReportActivityServicetest.php --no-coverageRunae2 files +28 -1 >Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
|
10969
|
217
|
39
|
2026-04-14T09:06:06.926749+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157566926_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php= custom.lo9= laravel.logL SF (iminny@localhostD UnitActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php XHs local liminnyalocalnostconsole PRODL console [EUl© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) TrackProviderinstallled-vent.ono¿ consoe STAGING© AskJiminnyReportActivityService.phpC ActivityLogged.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpsrong© AutomatedReportResult.php© AutomatedReport.phpdeclare(strict_types=1);class AutomatedReportsrepos1toryA15 V4namesnace liests Unit Services Klosk AutomatedRenorts:* dreturn AutomatedReportuse...public function create(array $data): AutomatedReport...class AskaminnyReportActivityServicelest extends TestCase* Find an automated report by UUID*dparam string suuld25* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:2729 GT>Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.100 M ›* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 118 %% >* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "des-oe157 % >* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...185 VA N206 D >-2242251*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnThe column to sort by. Allowed values: 'created_by', 'created_at'. 232* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez 233* dreturn Collection<AutomatedReport>22923023123425525614 usagesWinasun ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.ls usadeslo usaces1o usages9 usagesprivate ActivitySearch&Mock0bject $activitySearch;private ElasticActivityRepository&Mock0bject SelasticRepository:private LoggerinterfacexMock0bject sloggerprivate AskJ1minnykeporcAculVityservice sservice;protected function setUp: voidt...hIl usagesprivate function makeFilter(string $key. ?string $value): SearchFilto usaeesprivate function makeUserO: User&Mock0bjecti...h8 usagesprivate function makesavedsearch(array sf1lters): SearchxMockobjectpubLic tunction tescbecAculvityLasrorsavedsearchkecurnstas: voldtpublic function testGetActivityIdsForSavedSearchReturnsEmptvWhenNoRdpublic function testGetActivityldsFilters0utDateFiltersO: void...public function testGetActivityldsFilters0utClosingPeriodDateFilter:public function testGetActiv1tyldsHandLesArrayF1lters: vo1di..pubLic tunction tescbecAculvltylashandlesscalarrilters: voldt..pubtao runctaontestGetActivitvIdsPassesNonZeroSequenceNumberToDisarpuser - ochis->makeusert,SsavedSearch = sthis->makeSavedSearch(u.D:sfilterset = Sthis->createMock originalClassName: FilterDefinitioncsthis->activitysearch->method constraint: 'getArrayr1lterKeys')->wScapturedcriteria = null;ninnS->acu vVsearch-sexdecsim s-sonce ui→>iecno constragetOnDemandPageFilterSet')1 eall-›il ~ Accept File *+ k (X Reject file (Griterta 2orätilesia) use ($fil, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:06RequestGenerateAskJiminnyReportJobTestCascadeFixing ReportControlleAutomated Report Ma XFixing Ask Jiminny F+D ..ha RNow l have the key insight. Let me check what sequence_number does in the context of isFirstRequest() :searched ishlch wonp/Inis is tne root cause. Let me check AcCIVItyActualDace In delallNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequestNow lhave the comnlete root cause nicture. iTihis is criticaikoor cause rounolThe bui ldRequestParamsFromSearch method in AskJiminnyReportActivityservice passes sequence_number=0implcitiy not in params, which means 1srir stkequest rerums true .When sequence_number Is notin requestparams, the criteria:: createrromkequest deraultsitto o, and isFirstRequesel letums true when elply seguencenunber ==0Ine trontend UkL has sequence number=4 — meaning il's not a tirst request. Ine service doesh't set it, so thecriteria thinks it's a first redlest.wnen isrirstkequestl) = true, these Impllcht tllters are apolled that aren tin tne savee seareh:1. ActivityDurationRange— applies min duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-only3. OrganiserGroupIn - applies user's default group filterBut the trontend with sequence number=4 skios alll of these deraults, so It returns more resultsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params tosignal "not a tirst recuest", so tne implicit derauls con t apoly. or alternatively, always pass a non-zero sequence number in the merge in getActivityldsForSavedSearch.Road Ack.liminnvRenortActivitService nhn " 44.02Now let me verty my understanalne or isrirstkequest.Read Criteria.nhoContirmed. The fix is clear and minimal. The getActivityldsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• AskJiminnvReportActivitvService.phpNow let me check t there's an existine lesttor AskJ1minnykeportaccivicyservice lo updaleI need to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() returns false).Letme ade Iulo tne existine lesttlle.• AskJiminnyReportActivityServiceTest.phpNowers run the esto vertv.• aоскer еxесcovel dgedocker lamp 1onp varwwwncnl arulsan cesttests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php ==no-Could not open input file: /var/www/html/artisan2 files +28-1%Reject allAccent alllAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spacesw...
|
NULL
|
8134419933017474641
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php= custom.lo9= laravel.logL SF (iminny@localhostD UnitActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php XHs local liminnyalocalnostconsole PRODL console [EUl© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) TrackProviderinstallled-vent.ono¿ consoe STAGING© AskJiminnyReportActivityService.phpC ActivityLogged.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpC RequestGenerateAskJiminnyReportJob.phpC RequestGenerateReportJob.phpsrong© AutomatedReportResult.php© AutomatedReport.phpdeclare(strict_types=1);class AutomatedReportsrepos1toryA15 V4namesnace liests Unit Services Klosk AutomatedRenorts:* dreturn AutomatedReportuse...public function create(array $data): AutomatedReport...class AskaminnyReportActivityServicelest extends TestCase* Find an automated report by UUID*dparam string suuld25* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:2729 GT>Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.100 M ›* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 118 %% >* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "des-oe157 % >* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...185 VA N206 D >-2242251*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnThe column to sort by. Allowed values: 'created_by', 'created_at'. 232* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez 233* dreturn Collection<AutomatedReport>22923023123425525614 usagesWinasun ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.ls usadeslo usaces1o usages9 usagesprivate ActivitySearch&Mock0bject $activitySearch;private ElasticActivityRepository&Mock0bject SelasticRepository:private LoggerinterfacexMock0bject sloggerprivate AskJ1minnykeporcAculVityservice sservice;protected function setUp: voidt...hIl usagesprivate function makeFilter(string $key. ?string $value): SearchFilto usaeesprivate function makeUserO: User&Mock0bjecti...h8 usagesprivate function makesavedsearch(array sf1lters): SearchxMockobjectpubLic tunction tescbecAculvityLasrorsavedsearchkecurnstas: voldtpublic function testGetActivityIdsForSavedSearchReturnsEmptvWhenNoRdpublic function testGetActivityldsFilters0utDateFiltersO: void...public function testGetActivityldsFilters0utClosingPeriodDateFilter:public function testGetActiv1tyldsHandLesArrayF1lters: vo1di..pubLic tunction tescbecAculvltylashandlesscalarrilters: voldt..pubtao runctaontestGetActivitvIdsPassesNonZeroSequenceNumberToDisarpuser - ochis->makeusert,SsavedSearch = sthis->makeSavedSearch(u.D:sfilterset = Sthis->createMock originalClassName: FilterDefinitioncsthis->activitysearch->method constraint: 'getArrayr1lterKeys')->wScapturedcriteria = null;ninnS->acu vVsearch-sexdecsim s-sonce ui→>iecno constragetOnDemandPageFilterSet')1 eall-›il ~ Accept File *+ k (X Reject file (Griterta 2orätilesia) use ($fil, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:06RequestGenerateAskJiminnyReportJobTestCascadeFixing ReportControlleAutomated Report Ma XFixing Ask Jiminny F+D ..ha RNow l have the key insight. Let me check what sequence_number does in the context of isFirstRequest() :searched ishlch wonp/Inis is tne root cause. Let me check AcCIVItyActualDace In delallNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequestNow lhave the comnlete root cause nicture. iTihis is criticaikoor cause rounolThe bui ldRequestParamsFromSearch method in AskJiminnyReportActivityservice passes sequence_number=0implcitiy not in params, which means 1srir stkequest rerums true .When sequence_number Is notin requestparams, the criteria:: createrromkequest deraultsitto o, and isFirstRequesel letums true when elply seguencenunber ==0Ine trontend UkL has sequence number=4 — meaning il's not a tirst request. Ine service doesh't set it, so thecriteria thinks it's a first redlest.wnen isrirstkequestl) = true, these Impllcht tllters are apolled that aren tin tne savee seareh:1. ActivityDurationRange— applies min duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-only3. OrganiserGroupIn - applies user's default group filterBut the trontend with sequence number=4 skios alll of these deraults, so It returns more resultsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params tosignal "not a tirst recuest", so tne implicit derauls con t apoly. or alternatively, always pass a non-zero sequence number in the merge in getActivityldsForSavedSearch.Road Ack.liminnvRenortActivitService nhn " 44.02Now let me verty my understanalne or isrirstkequest.Read Criteria.nhoContirmed. The fix is clear and minimal. The getActivityldsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• AskJiminnvReportActivitvService.phpNow let me check t there's an existine lesttor AskJ1minnykeportaccivicyservice lo updaleI need to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() returns false).Letme ade Iulo tne existine lesttlle.• AskJiminnyReportActivityServiceTest.phpNowers run the esto vertv.• aоскer еxесcovel dgedocker lamp 1onp varwwwncnl arulsan cesttests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php ==no-Could not open input file: /var/www/html/artisan2 files +28-1%Reject allAccent alllAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spacesw...
|
10967
|
|
10970
|
217
|
40
|
2026-04-14T09:06:09.944850+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157569944_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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
<?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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.76171875,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.7796875,"top":0.017361112,"width":0.12109375,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.008203125,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","depth":4,"bounds":{"left":0.490625,"top":0.12777779,"width":0.3347656,"height":0.8722222},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.4234375,"top":0.1736111,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.43710938,"top":0.1736111,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.4484375,"top":0.17222223,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.45703125,"top":0.17222223,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.0,"width":0.39882812,"height":1.0},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8932460332387265586
|
-8276790037575160524
|
visual_change
|
accessibility
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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
<?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...
|
NULL
|
|
10971
|
217
|
41
|
2026-04-14T09:06:16.010317+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157576010_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 M >Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 239* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.242124512441245246247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creaced_oy, creaced_ar". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonrapublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void.public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->nscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)getonDemandPagerilterset")->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria):sthis->assertralse(scapturedCriter1a->1sF1rstRequestOJhpubLic tunction tescbecAculvitylasLogswichcorrectconcextl: voldt..1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:15RequestGenerateAskJiminnyReportJobTestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..nd.php#L211 and add validation with logs inside@AutomatedReportsCommand. php#L209-213Let me read the current state of the command file first.kead Automareakeporscommand.ongIcan see the user's approach - processsing LeReport already exists trom my earlier work but getReportByld iswhat's being used in processReports.Ineed to implement getReportById properly with validation + logs, and addthe reposilory method. Let me also check the Illuminate Support collection impon situation:Searched use Illuminate (Support Collection in app/Console/Commands/Reports/AutomatedReportsCommand.ph.Now implement both changes - the repository method and the getReportByld method with proper validation:trror while editing automacedkeportscommand. pnpPoad AutomatedReoorscommana.ong /The file is now only 140 lines - the user removed the processSingleReport/warnIfNotApplicableForSchedulemetnoas. Now "l implement oot changes:AutomatedReportsCommand.php+57 -1Now add findByldorUuid to the repository:• AutomatedReportsRepository.phpAlso fix the import order Collection should be before the models alphabetically):• AutomatedReportsCommand.php+1 -1• AutomatedReportsCommand.php+1-1Done. summary or changes:AutomatedReportsRepository::findByld0rUuid() (AutomatedReportsRepository-php:47-54):• Numeric string → find() by int ID• Non-numeric → UUID lookup via toOptimized()• Both use withTrashed() so soft-deleted reports are findable manuallygetReportById() (AutomatedReportsCommand.php:135-194) - checks all conditions that getActiveReportsByFrequency entorces, loceine a warnine to the loe channel ane orintne a warn lo the terminal tor eaeh violation,out stlll returns the revort so orocessina continuesCheckBehaviour on failNot toundwarnino loo + terminal warn. returns emory collection skios processino))nactive statuswarning log + terminal warn, continuesTeam not activewarnind llod + terminal warn. continuesExoiredwarning log + terminal warn, continuesrrecuency woulentrun toodyinfo log + terminal warn, continueswGAl mAsk anything (&+L)+ < CodeClaude Sennet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
525892152718833132
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 M >Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 239* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.242124512441245246247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creaced_oy, creaced_ar". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonrapublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void.public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->nscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)getonDemandPagerilterset")->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria):sthis->assertralse(scapturedCriter1a->1sF1rstRequestOJhpubLic tunction tescbecAculvitylasLogswichcorrectconcextl: voldt..1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:15RequestGenerateAskJiminnyReportJobTestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..nd.php#L211 and add validation with logs inside@AutomatedReportsCommand. php#L209-213Let me read the current state of the command file first.kead Automareakeporscommand.ongIcan see the user's approach - processsing LeReport already exists trom my earlier work but getReportByld iswhat's being used in processReports.Ineed to implement getReportById properly with validation + logs, and addthe reposilory method. Let me also check the Illuminate Support collection impon situation:Searched use Illuminate (Support Collection in app/Console/Commands/Reports/AutomatedReportsCommand.ph.Now implement both changes - the repository method and the getReportByld method with proper validation:trror while editing automacedkeportscommand. pnpPoad AutomatedReoorscommana.ong /The file is now only 140 lines - the user removed the processSingleReport/warnIfNotApplicableForSchedulemetnoas. Now "l implement oot changes:AutomatedReportsCommand.php+57 -1Now add findByldorUuid to the repository:• AutomatedReportsRepository.phpAlso fix the import order Collection should be before the models alphabetically):• AutomatedReportsCommand.php+1 -1• AutomatedReportsCommand.php+1-1Done. summary or changes:AutomatedReportsRepository::findByld0rUuid() (AutomatedReportsRepository-php:47-54):• Numeric string → find() by int ID• Non-numeric → UUID lookup via toOptimized()• Both use withTrashed() so soft-deleted reports are findable manuallygetReportById() (AutomatedReportsCommand.php:135-194) - checks all conditions that getActiveReportsByFrequency entorces, loceine a warnine to the loe channel ane orintne a warn lo the terminal tor eaeh violation,out stlll returns the revort so orocessina continuesCheckBehaviour on failNot toundwarnino loo + terminal warn. returns emory collection skios processino))nactive statuswarning log + terminal warn, continuesTeam not activewarnind llod + terminal warn. continuesExoiredwarning log + terminal warn, continuesrrecuency woulentrun toodyinfo log + terminal warn, continueswGAl mAsk anything (&+L)+ < CodeClaude Sennet 4.6winasun leamsuir-oia 4 spaces...
|
10970
|
|
10973
|
217
|
42
|
2026-04-14T09:06:17.413955+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157577413_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID* dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 239* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creaced_oy, creaced_ar". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonrapublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void.public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->nscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)iDemandPageF1lterset')->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCriter1a->1sF1rstRequestOJhpubLic tunction tescbecAculvitylasLogswichcorrectconcextl: voldt..1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:16RequestGenerateAskJiminnyReportJobTest vCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..• php#L211 and add validation with logs inside@AutomatedReportsCommand. php#L209-213Let me read the current state of the command file first.kead Automareakeporscommand.ongIcan see the user's approach - processsing LeReport already exists trom my earlier work but getReportByld iswhat's being used in processReports.Ineed to implement getReportById properly with validation + logs, and addthe reposilory method. Let me also check the Illuminate Support collection impon situation:Searched use Illuminate (Support Collection in app/Console/Commands/Reports/AutomatedReportsCommand.ph.Now implement both changes - the repository method and the getReportByld method with proper validation:trror while editing automacedkeportscommand. pnpPoad AutomatedReoorscommana.ong /The file is now only 140 lines - the user removed the processSingleReport/warnIfNotApplicableForSchedulemetnoas. Now "l implement oot changes:AutomatedReportsCommand.php+57 -1Now add findByldorUuid to the repository:• AutomatedReportsRepository.phpAlso fix the import order Collection should be before the models alphabetically):• AutomatedReportsCommand.php+1 -1• AutomatedReportsCommand.php+1-1Done. summary or changes:AutomatedReportsRepository::findByld0rUuid() (AutomatedReportsRepository-php:47-54):• Numeric string → find() by int ID• Non-numeric → UUID lookup via toOptimized()• Both use withTrashed() so soft-deleted reports are findable manuallygetReportById() (AutomatedReportsCommand.php:135-194) - checks all conditions that getActiveReportsByFrequency entorces, loceine a warnine to the loe channel ane orintne a warn lo the terminal tor eaeh violation,out stlll returns the revort so orocessina continuesCheckBehaviour on failNot toundwarnino loo + terminal warn. returns emory collection skios processino))nactive statuswarning log + terminal warn, continuesTeam not activewarnind llod + terminal warn. continuesExoiredwarning log + terminal warn, continuesrrecuency woulentrun toodyinfo log + terminal warn, continuesGAl mAsk anything (&+L)+ < CodeClaude Sennet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
4190548772381822036
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID* dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 239* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creaced_oy, creaced_ar". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonrapublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void.public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->nscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)iDemandPageF1lterset')->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCriter1a->1sF1rstRequestOJhpubLic tunction tescbecAculvitylasLogswichcorrectconcextl: voldt..1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0labl: Support Daily • in 2 h 54 m100% |45]Tue 14 Apr 12:06:16RequestGenerateAskJiminnyReportJobTest vCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..• php#L211 and add validation with logs inside@AutomatedReportsCommand. php#L209-213Let me read the current state of the command file first.kead Automareakeporscommand.ongIcan see the user's approach - processsing LeReport already exists trom my earlier work but getReportByld iswhat's being used in processReports.Ineed to implement getReportById properly with validation + logs, and addthe reposilory method. Let me also check the Illuminate Support collection impon situation:Searched use Illuminate (Support Collection in app/Console/Commands/Reports/AutomatedReportsCommand.ph.Now implement both changes - the repository method and the getReportByld method with proper validation:trror while editing automacedkeportscommand. pnpPoad AutomatedReoorscommana.ong /The file is now only 140 lines - the user removed the processSingleReport/warnIfNotApplicableForSchedulemetnoas. Now "l implement oot changes:AutomatedReportsCommand.php+57 -1Now add findByldorUuid to the repository:• AutomatedReportsRepository.phpAlso fix the import order Collection should be before the models alphabetically):• AutomatedReportsCommand.php+1 -1• AutomatedReportsCommand.php+1-1Done. summary or changes:AutomatedReportsRepository::findByld0rUuid() (AutomatedReportsRepository-php:47-54):• Numeric string → find() by int ID• Non-numeric → UUID lookup via toOptimized()• Both use withTrashed() so soft-deleted reports are findable manuallygetReportById() (AutomatedReportsCommand.php:135-194) - checks all conditions that getActiveReportsByFrequency entorces, loceine a warnine to the loe channel ane orintne a warn lo the terminal tor eaeh violation,out stlll returns the revort so orocessina continuesCheckBehaviour on failNot toundwarnino loo + terminal warn. returns emory collection skios processino))nactive statuswarning log + terminal warn, continuesTeam not activewarnind llod + terminal warn. continuesExoiredwarning log + terminal warn, continuesrrecuency woulentrun toodyinfo log + terminal warn, continuesGAl mAsk anything (&+L)+ < CodeClaude Sennet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
|
10974
|
217
|
43
|
2026-04-14T09:06:19.191460+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157579191_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl& consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lesclase29@>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilto usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsrorSavedSearchReturnsids(: vo1dpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokpublic function testGetActivitvIdsFiltersOutDateFilters@: void...public function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->makeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)iDemandPageF1lterset')->willReturnCallback(function (Criteria $criteria) use ($filSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->logger->method constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction testbetactivity-asLogswchcorrectcontexto: volar.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:18RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+0 .Now nave tne root cause. Letme look al sequence nunber Tier soecitically.searcneo seduence numoer secuencenumoer ano venormeo z other ouerles»Now l have the key insight. Let me check what sequence_number does in the context of isFirstRequest() :Inis is tne root cause. Let me check AcClvityActualDace in celall.Now I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded detaults for isFirstRequestRead ActivityDurationRange.php and ActivityRecorded.phpNow |have the comolete root cause picture. This is critica.koor cause rounoThe bur dRequestPanarch method in AskJiminnyReportActivityService passes sequence_number=0implcitiy not in params, whieh means 1srir Stkequest rerums true.When sequence_number Is notin requestparams, the criteria:: createrromkequest deraultsitto o, and isrirstRequest() returns true when empty |l sequenceNumber == 0.Ine trontend UkL has sequence number=4 — meaning il's not a tirst reouest. Ine service doesh't ser it, so thecriteria thinks it's a first request.When isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange — applies min duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-only3. OrganiserGroupIn - applies user's default group filterBut the trontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params tosignal "not a tirst recuest" so the implicit derauls con t apoly. or alternatively, always pass a non-zero sequence number in the merge in getActivityldsForSavedSearch.Now let me verify my understanding of isFirstRequest :Read Criteria.phpContirmed. The fix is clear and minimal. The getActivityldsForSavedSearch method needs to pass sequence_number with a non-zero value so tnat 1srirstkequestl returns Talse ane no impllclt deraults are appllea.• Ask.JNow let me check iT there's an existine lestror AskJ1minnykeportaccivicyservice lo uodare:ExploredAskJiminnvReoortActivtvServicelest.onv and searched.Ask.iminnvReoortActivitvI need to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() hiturns false).Letme ade lulo tne existine lesttlle.• AskJ.Now let's run the test to veriry:aocker execinnyReportActivityServiceTest.php --no-Could not open input file: /var/www/html/artisanCommand dockeno dests/nxe/sdrvkces/K105k/Automate/aeports/A5kJiminnyReportActivityserviceTest.php -no-2 files +28-1%Reject allAccent allAsk anything (&+L)+ & CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
-6347880079697164300
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl& consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lesclase29@>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilto usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsrorSavedSearchReturnsids(: vo1dpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokpublic function testGetActivitvIdsFiltersOutDateFilters@: void...public function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->makeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)iDemandPageF1lterset')->willReturnCallback(function (Criteria $criteria) use ($filSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->logger->method constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction testbetactivity-asLogswchcorrectcontexto: volar.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:18RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+0 .Now nave tne root cause. Letme look al sequence nunber Tier soecitically.searcneo seduence numoer secuencenumoer ano venormeo z other ouerles»Now l have the key insight. Let me check what sequence_number does in the context of isFirstRequest() :Inis is tne root cause. Let me check AcClvityActualDace in celall.Now I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded detaults for isFirstRequestRead ActivityDurationRange.php and ActivityRecorded.phpNow |have the comolete root cause picture. This is critica.koor cause rounoThe bur dRequestPanarch method in AskJiminnyReportActivityService passes sequence_number=0implcitiy not in params, whieh means 1srir Stkequest rerums true.When sequence_number Is notin requestparams, the criteria:: createrromkequest deraultsitto o, and isrirstRequest() returns true when empty |l sequenceNumber == 0.Ine trontend UkL has sequence number=4 — meaning il's not a tirst reouest. Ine service doesh't ser it, so thecriteria thinks it's a first request.When isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange — applies min duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-only3. OrganiserGroupIn - applies user's default group filterBut the trontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params tosignal "not a tirst recuest" so the implicit derauls con t apoly. or alternatively, always pass a non-zero sequence number in the merge in getActivityldsForSavedSearch.Now let me verify my understanding of isFirstRequest :Read Criteria.phpContirmed. The fix is clear and minimal. The getActivityldsForSavedSearch method needs to pass sequence_number with a non-zero value so tnat 1srirstkequestl returns Talse ane no impllclt deraults are appllea.• Ask.JNow let me check iT there's an existine lestror AskJ1minnykeportaccivicyservice lo uodare:ExploredAskJiminnvReoortActivtvServicelest.onv and searched.Ask.iminnvReoortActivitvI need to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() hiturns false).Letme ade lulo tne existine lesttlle.• AskJ.Now let's run the test to veriry:aocker execinnyReportActivityServiceTest.php --no-Could not open input file: /var/www/html/artisanCommand dockeno dests/nxe/sdrvkces/K105k/Automate/aeports/A5kJiminnyReportActivityserviceTest.php -no-2 files +28-1%Reject allAccent allAsk anything (&+L)+ & CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
10973
|
|
10976
|
217
|
44
|
2026-04-14T09:06:20.864622+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157580864_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID* dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc'): Collection i...r*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esorceocunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl& consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsrorSavedSearchReturnsids(: vo1dpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testceracewvosruersuurvatertuersur voglog ...ipublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->makeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)DemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction tescbecAculvitylasLogswichcorrectconcextl: vold.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:20RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - tllters out J-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reac criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false).Let me add it to the existing test file:• AskJ.LACIIVILyoervicelestongNow ler's tun tne lestto verity.aocker Lame/var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exedcoverrageoocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.pho --no-Run &+ Skip2 files +28 -1 >Reject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sennet 4.6winasun leamsuir-oia 4 spacesw...
|
NULL
|
-7553770785843485909
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID* dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc'): Collection i...r*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249250_251252 0 >274*oparan scring esorceocunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasur ch00 2.12.21: A new version is avallable. View chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console (EUl& consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lescuase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsrorSavedSearchReturnsids(: vo1dpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testceracewvosruersuurvatertuersur voglog ...ipublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->makeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)DemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->loggen->methodc constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction tescbecAculvitylasLogswichcorrectconcextl: vold.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:20RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - tllters out J-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reac criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false).Let me add it to the existing test file:• AskJ.LACIIVILyoervicelestongNow ler's tun tne lestto verity.aocker Lame/var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exedcoverrageoocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.pho --no-Run &+ Skip2 files +28 -1 >Reject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sennet 4.6winasun leamsuir-oia 4 spacesw...
|
NULL
|
|
10978
|
217
|
45
|
2026-04-14T09:06:22.952393+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157582952_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 /4 л* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249|250_251|252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lesclase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonearipublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)DemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->logger->method constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction testbetactivitytasLogswichcorrectcontexto: volar.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:22RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseuy.Reao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityburationKange — applies min_duration = 1 (INITIAL_MIN) - tliters out J-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reac criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• AskNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIIVILyoervicelestongNow ler's tun tne lestto verity.aocker Lame/var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockeno cocker execoocker lano " ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverrageRun &+ Skip2 files with changestests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRep/ytActivityservicelest.phpann/Services/Kiosk/AutomatedRenorts/MAsk.liminnvRenortActivitvService.ohnt1View allReject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sennet 4.6wwinasun leamsuir-oia 4 spaces...
|
NULL
|
5395747404596970677
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRetactonTool PhpStormFileFditViewNavigateCodelaraveRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.phpD Unit_ ActionsComponentConfigurationM ConsoleM ContractsM7 DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReportsAulomaleakeporissendcommand.ongC AddLayoutEntities.phpC Team.phpC) AutomatedReportsRepository.php X© AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTest→I Listeners> MModelsM Notifications› M ObserversPoliciesProvidersRepositories> D Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 /4 л* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReport118 M >return AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:157 Y185 MTusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport206 >if (is numeric(sidorluid)) "225 D226227return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.250LOJ232- 233* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by', 'created_at'. 235* @param string $sortDirection The sort direction. Allowed values:"asc, "desc". veraults to "0ex236* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam usersuserIne user wnose reporus to retrieve.2421243144245240247248249|250_251|252 0 >274*oparan scring esortho lunnIne cocumn co sorc oy. Accowed vacues. created_oy, "creaced_ac". 275)* Oparam string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'dez* dreturn Collection<AutomatedReport>14 usagesWinasun ch00 2.12.21: A new version is avallable." View Chancelod loday 10:33.= custom.lo9= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGING© AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php XC) RequestGenerateAskJiminnyReportJobTest.phpclass AskuLminnyкeporcActIviLyservicelest extenas lesclase290>procecced tunccion secupl: voldt...s11 usagesprivate function makeFilter(string $key, ?string $value): SearchFil1o usagesprivate function makeUserO: User&MockObject...8 usagesprivate function makesavedsearch(array sfilters): SearchxMock0bjectpublic function testGetActivityldsForsavedsearchReturnsuds(): vo1dtpubLic tunction tescbecAculvityLasrorsavedsearchkecurnsemptywnennokououc Tuncmion testcerAcewrosruersuurvatertuerstur voglonearipublic function testGetActivityldsFilters0utClosingPeriodDateFiltenpublic function testGetActivityldsHandlesArrayFiltersO: void..public function testGetActiv1tyldsHandlesscalarr1lters: vo1di...fo ae runecion, testoelactava y easressesnonderoseavencen men louasaesuser = schis->makeuseru;SsavedSearch = Sthis->nakeSavedSearchdiD:$filterSet = Sthis->createMock( originalClassName: FilterDefinitionCsthis->activitySearch->method( constraint:getArrayFilterKeys )->uscapturedcriteria = nului$this->activitySearch->expects ($this->onceO)DemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($fiSthis-›elasticRepository->methodd constraint: "onDemandSearchIdsOnlSthis->logger->method constraint: "info'):sthis-›service->getActivityldsForSavedSearch($savedSearch. suse.sthis->assertNotNull(ScapturedCriteria)isthis->assertralse(scapturedCr1ter1a->1sF1rstRequest0J:pubLic tunction testbetactivitytasLogswichcorrectcontexto: volar.1 eailAcceot rlle do+X Reject File 4 %@+ 2 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:22RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny F+D ..Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseuy.Reao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityburationKange — applies min_duration = 1 (INITIAL_MIN) - tliters out J-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reac criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• AskNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIIVILyoervicelestongNow ler's tun tne lestto verity.aocker Lame/var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockeno cocker execoocker lano " ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverrageRun &+ Skip2 files with changestests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRep/ytActivityservicelest.phpann/Services/Kiosk/AutomatedRenorts/MAsk.liminnvRenortActivitvService.ohnt1View allReject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sennet 4.6wwinasun leamsuir-oia 4 spaces...
|
10976
|
|
10979
|
217
|
46
|
2026-04-14T09:06:25.541392+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157585541_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vv _ AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M Mail_ MeetingGenerator> NotificationD 0Auth2RecallAl_ Security_ StrategyStreamingM TeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© Intercomservice.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.lC PlaylistGeneratorinterface.(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© slackservice.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.phpC) Uuid.php› C Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.png(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC) Team.phpC) AutomatedReportsRepository.php X) AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?roviderinstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory62A15 V4 ^-14* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 46* dparam string SsortDirection The sort direction. Allowed values:"asc","desc". befaults to "des47* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.—57* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnIne cocumn co sorc by. Accowed vacues. createa_by!creaced_ar".xoocran saino osorcutreccion lne sorc anreccion. Accoyeo vocues.'asc'.'desc'. Defaults to 'dex 6e* dreturn Collection<AutomatedReport>14 usagesWinasurt changelog 2.12.21: A new version is avallable. |/ View Changelog (today 10:33)= custom.log= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php x©) AskJiminnyReportActivityServiceTest.phpC) RequestGenerateAskJiminnyReportJobTest.phpuseJlninny Models Acclvity seareh,useJiminny Models User:use Jiminny Repositories ElasticActivityRepository:use Jiminny VO Repository OnDemandActivitySearch\Criteria;use Psr\Log Loggerinterface;class ASKJ1minnyReportAct1vityserviceonvare const nt UEFAULI UP ACILEES CUUN = 100private const arrav DATE FILTER KEYS =AccIvLcyAccuaLbace..PARAM_SIAKI_UAlE.ActivityActualDate:: PARAM END DATE.ActivityUpdatedDate::PARAM_UPDATED_FROMActivityUpdatedDate::PARAM_UPDATED_TO.ClosingPer1odF1lter::KEY_START_DATE,ClosingPer1odF1lter::KEY_END_DATE,pubuic tunction __conscructlprivace readonly Aculviltysearch saccivitysearch,privace readonty clascicactiviсукeposicory selasucкepository.private readonty Loggerincertace +logger,Df...r*** Fetch activity IDs for a saved search, passing 1ts filters as-1s* Date filters stored on the saved search are excluded; 1f no othen* no date constraint 1s applied - matching the behaviour of getcont.* Oreturn string[] Activity IDspublic function getActivitvIdsForSavedSearchdSearch SsavedSearch.User suser,D: arraySrequestParams = Sthis->buildRequestParamsFromSearchSsavedSearc.scriteria = criteria::createrromrequestlAcceptmarьa-SrequestParams. "'Timit' => self::DEFAULT TOP AC1array_mergelsrequestrarams, L'Limlu => seLt::UEFAULI_10P_ACnuser-poernezone$filterSet = Sthis-›activitySearch->qetOnDemandPageFilterSet(ScriSactivityIds = sthis->elasticRepository->onDemandSearchlds0nly(Ssth1s->Logger->1nfolLAskJ1minnyReport) Fetched activity IDs fon=> ssavedSearch->getid)."user_1d = suser->gecia).=> count(SactivitvIds).1):Accept rlle ao+X Reject File 40 38 @* 1 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:25RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny FNow see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarKoot cause rounene oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIVILyoervicelestongNow ler's tun tne lestto verity.aосker Lamplpnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php -=no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exec vocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php -=no-coverrageRun &+ Skip2 files with changestests/Unit/services/Klosk Automatedkenoris/AskJiminnvrenortActivivservicellest.onoView allapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sennet 4.6Wwinasur leamsuir-oia 4 spaces...
|
NULL
|
4427173165647033107
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vv _ AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M Mail_ MeetingGenerator> NotificationD 0Auth2RecallAl_ Security_ StrategyStreamingM TeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© Intercomservice.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.lC PlaylistGeneratorinterface.(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© slackservice.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.phpC) Uuid.php› C Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.png(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC) Team.phpC) AutomatedReportsRepository.php X) AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?roviderinstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory62A15 V4 ^-14* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 46* dparam string SsortDirection The sort direction. Allowed values:"asc","desc". befaults to "des47* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.—57* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnIne cocumn co sorc by. Accowed vacues. createa_by!creaced_ar".xoocran saino osorcutreccion lne sorc anreccion. Accoyeo vocues.'asc'.'desc'. Defaults to 'dex 6e* dreturn Collection<AutomatedReport>14 usagesWinasurt changelog 2.12.21: A new version is avallable. |/ View Changelog (today 10:33)= custom.log= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php x©) AskJiminnyReportActivityServiceTest.phpC) RequestGenerateAskJiminnyReportJobTest.phpuseJlninny Models Acclvity seareh,useJiminny Models User:use Jiminny Repositories ElasticActivityRepository:use Jiminny VO Repository OnDemandActivitySearch\Criteria;use Psr\Log Loggerinterface;class ASKJ1minnyReportAct1vityserviceonvare const nt UEFAULI UP ACILEES CUUN = 100private const arrav DATE FILTER KEYS =AccIvLcyAccuaLbace..PARAM_SIAKI_UAlE.ActivityActualDate:: PARAM END DATE.ActivityUpdatedDate::PARAM_UPDATED_FROMActivityUpdatedDate::PARAM_UPDATED_TO.ClosingPer1odF1lter::KEY_START_DATE,ClosingPer1odF1lter::KEY_END_DATE,pubuic tunction __conscructlprivace readonly Aculviltysearch saccivitysearch,privace readonty clascicactiviсукeposicory selasucкepository.private readonty Loggerincertace +logger,Df...r*** Fetch activity IDs for a saved search, passing 1ts filters as-1s* Date filters stored on the saved search are excluded; 1f no othen* no date constraint 1s applied - matching the behaviour of getcont.* Oreturn string[] Activity IDspublic function getActivitvIdsForSavedSearchdSearch SsavedSearch.User suser,D: arraySrequestParams = Sthis->buildRequestParamsFromSearchSsavedSearc.scriteria = criteria::createrromrequestlAcceptmarьa-SrequestParams. "'Timit' => self::DEFAULT TOP AC1array_mergelsrequestrarams, L'Limlu => seLt::UEFAULI_10P_ACnuser-poernezone$filterSet = Sthis-›activitySearch->qetOnDemandPageFilterSet(ScriSactivityIds = sthis->elasticRepository->onDemandSearchlds0nly(Ssth1s->Logger->1nfolLAskJ1minnyReport) Fetched activity IDs fon=> ssavedSearch->getid)."user_1d = suser->gecia).=> count(SactivitvIds).1):Accept rlle ao+X Reject File 40 38 @* 1 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:25RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny FNow see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarKoot cause rounene oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIVILyoervicelestongNow ler's tun tne lestto verity.aосker Lamplpnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php -=no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exec vocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php -=no-coverrageRun &+ Skip2 files with changestests/Unit/services/Klosk Automatedkenoris/AskJiminnvrenortActivivservicellest.onoView allapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sennet 4.6Wwinasur leamsuir-oia 4 spaces...
|
NULL
|
|
10981
|
217
|
47
|
2026-04-14T09:06:35.002088+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157595002_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vv _ AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M Mail_ MeetingGenerator› NotificationD 0Auth2RecallAl_ Security_ StrategyStreamingM TeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© Intercomservice.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.lC PlaylistGeneratorinterface.(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© slackservice.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.php© Uuid.php> C Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.png(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC) Team.phpC) AutomatedReportsRepository.php X) AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory62A15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 46* dparam string SsortDirection The sort direction. Allowed values:"asc","desc". befaults to "des47* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.—57* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creacea_by!creaced_ar".xoocran saino osorcutreccion lne sorc anreccion. Accoyeo vocues.'asc'.'desc'. Defaults to 'dex 6e* dreturn Collection<AutomatedReport>14 usagesWinasurt changelog 2.12.21: A new version is avallable. |/ View Changelog (today 10:33)= custom.log= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php x©) AskJiminnyReportActivityServiceTest.phpC) RequestGenerateAskJiminnyReportJobTest.phpuseJlninny Models Acclvity seareh,useJiminny Models User:use Jiminny Repositories ElasticActivityRepository:-14use Jiminny VO Repository OnDemandActivitySearch\Criteria;use Psr\Log Loggerinterface;17!class ASkJ1minnyReportAct1v1tyServiceonvare const nt UEFAULI UP ACILEES CUUN = 100private const arrav DATE FILTER KEYS =AccIvLcyAccuaLbace..PARAM_SIAKI_UAlE.ActivityActualDate:: PARAM END DATE.ActivityUpdatedDate::PARAM_UPDATED_FROMActivityUpdatedDate::PARAM_UPDATED_TO.ClosingPer1odF1lter::KEY_START_DATE,ClosingPer1odF1lter::KEY_END_DATE,pubuic tunction __conscructlprivace readonly Aculviltysearch saccivitysearch,privace readonty clascicactiviсукeposicory selasucкepository.private readonty Loggerincertace +logger,Df...r*** Fetch activity IDs for a saved search, passing 1ts filters as-1s* Date filters stored on the saved search are excluded; 1f no othen* no date constraint 1s applied - matching the behaviour of getcont.* Oreturn string[] Activity IDspublic function getActivitvIdsForSavedSearchdSearch SsavedSearch.User suser,): array 1SrequestParams = Sthis->buildRequestParamsFromSearchSsavedSearc.scriteria = criteria::createrromrequestlAcceptmreet$requestParams, l'limit' => self::DEFAULT_TOP_AC1array_mergelsrequestrarams, L'Limlu => seLt::UEFAULI_10P_ACnuser-poernezone$filterSet = Sthis-›activitySearch->qetOnDemandPageFilterSet(ScriSactivityIds = sthis->elasticRepository->onDemandSearchlds0nly(Ssth1s->Logger->1nfolLAskJ1minnyReport) Fetched activity IDs fon=> ssavedSearch->getid)."user_1d = suser->gecia).=> count(SactivitvIds).1):Accept rlle ao+X Reject File 40 38 @* 1 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:34RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny FNow see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarKoot cause rounene oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIVILyoervicelestongNow ler's tun tne lestto verity.aосker Lamplpnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php -=no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exec vocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php -=no-coverrageRun &+ Skip2 files with changestests/Unit/services/Klosk Automatedkenoris/AskJiminnvrenortActivivservicellest.onoView allapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sennet 4.6Wwinasur leamsuir-oia 4 spaces...
|
NULL
|
8594671960778487352
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vv _ AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M Mail_ MeetingGenerator› NotificationD 0Auth2RecallAl_ Security_ StrategyStreamingM TeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© Intercomservice.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.lC PlaylistGeneratorinterface.(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© slackservice.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.php© Uuid.php> C Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.png(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php(©) ReportController.phpJiminnybeouecommana.ongAutomatedReportsCommand.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC) Team.phpC) AutomatedReportsRepository.php X) AutomatedReportsService.php© CreateHeldActivityEvent.phpe) Track?rovidernstalled-vent.onoC ActivityLogged.phpC RequestGenerateAskJiminnyReportJob.phpRequestGeneratekeportJob.ong© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsrepos1tory62A15 V4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...* Find an automated report by UUID*dparam string suuld* drecurn Aurondredkeoorcnuupublic function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport:: to0ptimized(Suuid))->firstO:Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is numeric(sidorluid)) "return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport::where('uvid', AutomatedReport::to0ptimized(Sid0rUuid))->firstO;* Retrieve all standard (non-Ask Jiminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed values: 'created_by", 'created_at'. 46* dparam string SsortDirection The sort direction. Allowed values:"asc","desc". befaults to "des47* drerurn couuectonsaurondredredor*/12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection = 'desc': Collection 1...*** Recrieve aLL Ask Jaminny reporus created Dy the given user.—57* dparam usersuserIne user wnose reporus to retrieve.*oparan scring esortho lunnIne cocumn co sorc oy. Accowed values. creacea_by!creaced_ar".xoocran saino osorcutreccion lne sorc anreccion. Accoyeo vocues.'asc'.'desc'. Defaults to 'dex 6e* dreturn Collection<AutomatedReport>14 usagesWinasurt changelog 2.12.21: A new version is avallable. |/ View Changelog (today 10:33)= custom.log= laravel.logL SF (iminny@localhostHs local liminnyalocalnostconsole PRODL console [EUl¿ consoe STAGINGI© AskJiminnyReportActivityService.php x©) AskJiminnyReportActivityServiceTest.phpC) RequestGenerateAskJiminnyReportJobTest.phpuseJlninny Models Acclvity seareh,useJiminny Models User:use Jiminny Repositories ElasticActivityRepository:-14use Jiminny VO Repository OnDemandActivitySearch\Criteria;use Psr\Log Loggerinterface;17!class ASkJ1minnyReportAct1v1tyServiceonvare const nt UEFAULI UP ACILEES CUUN = 100private const arrav DATE FILTER KEYS =AccIvLcyAccuaLbace..PARAM_SIAKI_UAlE.ActivityActualDate:: PARAM END DATE.ActivityUpdatedDate::PARAM_UPDATED_FROMActivityUpdatedDate::PARAM_UPDATED_TO.ClosingPer1odF1lter::KEY_START_DATE,ClosingPer1odF1lter::KEY_END_DATE,pubuic tunction __conscructlprivace readonly Aculviltysearch saccivitysearch,privace readonty clascicactiviсукeposicory selasucкepository.private readonty Loggerincertace +logger,Df...r*** Fetch activity IDs for a saved search, passing 1ts filters as-1s* Date filters stored on the saved search are excluded; 1f no othen* no date constraint 1s applied - matching the behaviour of getcont.* Oreturn string[] Activity IDspublic function getActivitvIdsForSavedSearchdSearch SsavedSearch.User suser,): array 1SrequestParams = Sthis->buildRequestParamsFromSearchSsavedSearc.scriteria = criteria::createrromrequestlAcceptmreet$requestParams, l'limit' => self::DEFAULT_TOP_AC1array_mergelsrequestrarams, L'Limlu => seLt::UEFAULI_10P_ACnuser-poernezone$filterSet = Sthis-›activitySearch->qetOnDemandPageFilterSet(ScriSactivityIds = sthis->elasticRepository->onDemandSearchlds0nly(Ssth1s->Logger->1nfolLAskJ1minnyReport) Fetched activity IDs fon=> ssavedSearch->getid)."user_1d = suser->gecia).=> count(SactivitvIds).1):Accept rlle ao+X Reject File 40 38 @* 1 of 2 files →, 0lablSupport Daily • in 2 h 54m100% |45]Tue 14 Apr 12:06:34RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny FNow see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRequeseureReao Acuviyburauonkance ono ano Acrivivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarKoot cause rounene oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty sequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atrstrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) - filters torecorded-ohly3. OrganiserGroupln - applies user's detault group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in bui ldRequestParamsFromsearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest :reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*need to add a test that verifies sequence number=1 IS passed to Criteria (so 1sFirstRequest( returns false )Let me add it to the existing test file:• AskJ.LACIVILyoervicelestongNow ler's tun tne lestto verity.aосker Lamplpnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php -=no-covelayeCould not open input file: /var/www/html/artisanCommand dockenO cocker exec vocker lano i ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php -=no-coverrageRun &+ Skip2 files with changestests/Unit/services/Klosk Automatedkenoris/AskJiminnvrenortActivivservicellest.onoView allapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> CodeClaude Sennet 4.6Wwinasur leamsuir-oia 4 spaces...
|
10979
|
|
10983
|
217
|
48
|
2026-04-14T09:06:38.376524+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157598376_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelpProject vD AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph® ReportSort.php(e) Reporisonbirection.Kloskservice.php> M Mail• MeetingGenerator> D NotificationD OAuth2D RecallAl[ SecurityC StrategyStreamingD TeamTelephonyUserPilotM Webhook© AbstractService.php© ActivityProviderFactory.ph|©ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php©IntercomService.php©IpapiClient.phpIpapiService.php© ParticipantShareService.ph© PlanhatService.php© PlaybackService.phpPlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php©TeamService.php© TranscodeParameterResol© UserService.php© Uuid.php› C Traits› D UseCases> D User→IUTIS• I validation> D VOphp helpers.php© InitialFrontendState.php© Jiminny.php© Plan.php© ReportController.php© AutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.php© AutomatedReportsSendCommana.pnp• Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) User?llorActiviv.istener.oho© ActivityLogged.php(©) AutomatedReportsCallbackService.php• RequestGenerateAskJiminnyReportJob.php© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsRepository(C) RequestGenerateReportJob.phpA15 V4^475152535456646574* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf./*** Find an automated report by UUID* @param string $uvid* @return AutomatedReport/nullpublic function findByUuid(string $uuid): ?AUtomatedRep(33return AutomatedReport:: where('uuid', AutomatedRepor 3637-381 usagepublic function findById0rUuid(string $id0rUuid): ?Autonif (is_numeric($idOrUuid)) €return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport: :where('uvid', AutomatedRepor/*** Retrieve all standard (non-ASk Liminny) automated retso* @param string $sortColumnThe column to sort by. A* Oparam string $sortDirection The sort direction. AllC51* Oreturn Collection<AutomatedReport>12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Ziminny reports created by the giver 62* @param UsersusenThe user whose reports 164*oodrdl sarno osorccocuminIne cocumn co sorc Dy. ·65* Oparam string $sortDirection The sort direction. AllC66Windsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)= custom.log= laravel.logA SF [jiminny@localhost]L console [STAGING]© AskJiminnyReportActivityService.php xRequestGenerateAskJiminnyReportJobTest.phpuse Jiminny\Models\Activity\Search;useJiminny\Models \User;use Jiminny\Repositories\ElasticActivityRepository;use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;usePsr\Log\LoggerInterface;A HS_local [jiminny@localhost]Al console [PROD]© AskJiminnyReportActivityServiceTest.phpA console (EU]class asкуладукерorcaccvicyserviceprivate const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;private const array [ENV_SECRET],ActivityActualDate: :PARAM_END_DATE,ActivityUpdatedDate: :PARAM_UPDATED_FROM,ActivityUpdatedDate::PARAM_UPDATED_TO,ClosingPeriodFilter::KEY_START_DATE,closingrer1odrilter..KEY_ENU_bAlE,public function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,0 {...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 getContextForAskAnythingByFilter.* Oreturn string[] Activity IDspublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(Acceptmagze ($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1]),array_merge($requestParams, ['Limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => A,'sequence_numb$user->getTimezone()$filterSet = $this-›activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filterSet);nunus-> looder>info('lAskJiminnxRepont] Fetched activity IDsfor saved search'.→> $savedSearch->getId(),'user id' => Suser->qetIdo.'activity_count' => count($activityIds),ID:return SactivityIds;V Accept File *+X Reject File 0 38@€ 1 of 2 files →, 0lablSupport Daily - in 2h 54mA100% |45]Tue 14 Apr 12:06:37RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny R+D ...Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRwequeseuy.Reao Acuiviyburauonkance ono ano Actvivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty || sequenceNumber === 0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atistrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters torecorded-ohly3. OrganiserGroupIn - applies user's default group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence_number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest:reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ).Let me add it to the existing test file:• AskJ.RACIViLyoervicelestoneNow ler's tun tne lestto verity.exeddocker_lamp_pnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockeno cocker execoocker lano " ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverrageRun a8+ (Skip2 files with changestests/Unit/services/Klosk AutomateckeporisAsk.iminnvrenortActivivservicellest.onoapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasur leamsuir-o( 4 spaces...
|
NULL
|
-6823678993976724559
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelpProject vD AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph® ReportSort.php(e) Reporisonbirection.Kloskservice.php> M Mail• MeetingGenerator> D NotificationD OAuth2D RecallAl[ SecurityC StrategyStreamingD TeamTelephonyUserPilotM Webhook© AbstractService.php© ActivityProviderFactory.ph|©ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php©IntercomService.php©IpapiClient.phpIpapiService.php© ParticipantShareService.ph© PlanhatService.php© PlaybackService.phpPlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php©TeamService.php© TranscodeParameterResol© UserService.php© Uuid.php› C Traits› D UseCases> D User→IUTIS• I validation> D VOphp helpers.php© InitialFrontendState.php© Jiminny.php© Plan.php© ReportController.php© AutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.php© AutomatedReportsSendCommana.pnp• Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) User?llorActiviv.istener.oho© ActivityLogged.php(©) AutomatedReportsCallbackService.php• RequestGenerateAskJiminnyReportJob.php© AutomatedReportResult.php© AutomatedReport.phpclass AutomatedReportsRepository(C) RequestGenerateReportJob.phpA15 V4^475152535456646574* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf./*** Find an automated report by UUID* @param string $uvid* @return AutomatedReport/nullpublic function findByUuid(string $uuid): ?AUtomatedRep(33return AutomatedReport:: where('uuid', AutomatedRepor 3637-381 usagepublic function findById0rUuid(string $id0rUuid): ?Autonif (is_numeric($idOrUuid)) €return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport: :where('uvid', AutomatedRepor/*** Retrieve all standard (non-ASk Liminny) automated retso* @param string $sortColumnThe column to sort by. A* Oparam string $sortDirection The sort direction. AllC51* Oreturn Collection<AutomatedReport>12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/*** Retrieve all Ask Ziminny reports created by the giver 62* @param UsersusenThe user whose reports 164*oodrdl sarno osorccocuminIne cocumn co sorc Dy. ·65* Oparam string $sortDirection The sort direction. AllC66Windsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)= custom.log= laravel.logA SF [jiminny@localhost]L console [STAGING]© AskJiminnyReportActivityService.php xRequestGenerateAskJiminnyReportJobTest.phpuse Jiminny\Models\Activity\Search;useJiminny\Models \User;use Jiminny\Repositories\ElasticActivityRepository;use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;usePsr\Log\LoggerInterface;A HS_local [jiminny@localhost]Al console [PROD]© AskJiminnyReportActivityServiceTest.phpA console (EU]class asкуладукерorcaccvicyserviceprivate const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;private const array [ENV_SECRET],ActivityActualDate: :PARAM_END_DATE,ActivityUpdatedDate: :PARAM_UPDATED_FROM,ActivityUpdatedDate::PARAM_UPDATED_TO,ClosingPeriodFilter::KEY_START_DATE,closingrer1odrilter..KEY_ENU_bAlE,public function __construct(private readonly ActivitySearch $activitySearch,private readonly ElasticActivityRepository $elasticRepository,private readonly LoggerInterface $logger,0 {...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 getContextForAskAnythingByFilter.* Oreturn string[] Activity IDspublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array {$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequest(Acceptmagze ($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1]),array_merge($requestParams, ['Limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => A,'sequence_numb$user->getTimezone()$filterSet = $this-›activitySearch->getOnDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filterSet);nunus-> looder>info('lAskJiminnxRepont] Fetched activity IDsfor saved search'.→> $savedSearch->getId(),'user id' => Suser->qetIdo.'activity_count' => count($activityIds),ID:return SactivityIds;V Accept File *+X Reject File 0 38@€ 1 of 2 files →, 0lablSupport Daily - in 2h 54mA100% |45]Tue 14 Apr 12:06:37RequestGenerateAsk.liminnvRenort.lob TestCascadeFixing ReportControlleAutomated Report Ma© Fixing Ask Jiminny R+D ...Now see tne Tul o clure, Lerme also check Activitvlurat ionkande ano Actwvitvkecorded ceauis or 1sFirstRwequeseuy.Reao Acuiviyburauonkance ono ano Actvivrecorcec.onoNow Inave tne comolere roo, cause o cture. nis s crucarRoot Cause Foundne oua lokequestraramsrromsearch mernocin Ask aminnvredortActvl vservice vasses sequence number=implicitly (not in params), which means isFirstRequest() returns true.When sequence number Is notin requestParams, the criteria:: createrromkequest delaulsitlo o, and 1sr1rstRequest() returns true when empty || sequenceNumber === 0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so thecriera thinks iu's atistrecuestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. Activityburationkange — applies min_duration = 1 (INITIAL_MIN) - Tllters out U-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters torecorded-ohly3. OrganiserGroupIn - applies user's default group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuits.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params tosignal "not a first request", so the implicit defaults don't apply. Or alternatively, always pass a non-zero sequence_number In tne merce in derAcuivlivlostorsaveNow let me verify my understanding of isFirstRequest:reao criera,onoConirmeo, Ine rixis cear ano minimar Une oetActivlvlosrorsavedsearch menoo neeos o oass sequence nurber with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.• Ask.Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ).Let me add it to the existing test file:• AskJ.RACIViLyoervicelestoneNow ler's tun tne lestto verity.exeddocker_lamp_pnp /var/www/ncml/drc1san lesytests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServicelest.php --no-covelayeCould not open input file: /var/www/html/artisanCommand dockeno cocker execoocker lano " ono aoparusan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverrageRun a8+ (Skip2 files with changestests/Unit/services/Klosk AutomateckeporisAsk.iminnvrenortActivivservicellest.onoapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasur leamsuir-o( 4 spaces...
|
NULL
|
|
10985
|
217
|
49
|
2026-04-14T09:06:41.417828+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157601417_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.76171875,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.7796875,"top":0.017361112,"width":0.12109375,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.008203125,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","depth":4,"bounds":{"left":0.38867188,"top":0.0,"width":0.41015625,"height":1.0},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.32460937,"top":0.23819445,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.33828124,"top":0.23819445,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.34960938,"top":0.23680556,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3582031,"top":0.23680556,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.04097222,"width":0.39882812,"height":0.95902777},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4414873592361684168
|
-5968484087913173388
|
visual_change
|
accessibility
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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...
|
10983
|
|
10987
|
217
|
50
|
2026-04-14T09:07:11.812338+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157631812_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.76171875,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.7796875,"top":0.017361112,"width":0.12109375,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.009375,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.00859375,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.008203125,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1, 'sequence_number' => 1]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.32460937,"top":0.23819445,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.33828124,"top":0.23819445,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.34960938,"top":0.23680556,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3582031,"top":0.23680556,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.04097222,"width":0.39882812,"height":0.95902777},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4414873592361684168
|
-5968484087913173388
|
idle
|
accessibility
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
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...
|
NULL
|
|
10991
|
217
|
51
|
2026-04-14T09:07:42.801207+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157662801_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.76171875,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.7796875,"top":0.017361112,"width":0.12109375,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-632572907885338208
|
-8635651950404714175
|
click
|
hybrid
|
NULL
|
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
RequestGenerateAskJiminnyReportJobTest
PhpStormFileFditViewNavigateCodelaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vv _ AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M Mail› MeetingGenerator› Notification> D0Auth2RecallAl_ Security_ StrategyStreamingM TeamTelephonyM UserPilot>MWebhook© AbstractService.php© ActivityProviderFactory.ph(©) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpC IntercomService.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.phpPlaybackVideoOnlyService(C) PlaybookCategoryService.C PlaylistGeneratorinterface.(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© SlackService.php© SocialAccountService.phpC) SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.phpC) Uuid.php› D Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.png(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php(©) ReportController.php© JiminnyDebugCommand.php© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) User?llorActvtvuistener.ono(C) Activtv odded.nnrc) AutomatedRenorscalloackoerwce.onvC) RequestGenerateaskJiminnykeportJob.ono(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.phpclass AutomatedReportsrepos1toryA15 У4 л515354647576* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...Д26* Find an automated report by UUID* dparam string suuld.30*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?AutomatedReportreturn AutomatedReport::where('uuid', AutomatedReport::to0ptim37-39Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReport 41— 42if (is_numeric($id0rUuid)) {return Automacedkeport..tznal(1nt) s1auruu1a);return AutomatedReport::where('uvid', AutomatedReport::to0ptim.46/*** Retrieve all standard (non-Ask Jaminny) automated reports._5€* dparam string ssortcolumnThe column to sort by. Allowed val* dparam string ssortuireccion ine sorc direccion. ALlowed values*dreturn coLLectlon<Aucomacedkeport>12 usagespublic function getAllStandardReportsstring $sortColumn = 'created_at",string SsortDirection =desc— 5/: Collection 1..\ 59/*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dodran UsensuserIne user whose reports to retrieve 64*oodrdl sarno osorccocumintne column to sort by. Allowed val 6s* Oparam string $sortDirection The sort direction. Allowed values 66Windsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)= custom.log= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGC AskJiminnyReportActivityservice.pnp x© AskJiminnyReportActivityService lest.pnp *C RequestGenerateAskJiminnyReportJobTest.phpuse Psr\Log Loggerincertace:8 usagesclass asкудmадукерorcaccvicyserviceprivate const int DEFAULT TOP_ACTIVITIES COUNT = 100:Tusdyeprivate const array [ENV_SECRET],ACEIVALEVACTUALDATE.-PAKAN ENUWANEAculvityupdaceduace:.PARAN_UPDATEU_FRUN,ACINLTVUDOaLeODaTe.:PAKAN UPDAIEU U.ClosingPeriodFilter::KEY START DATE.ClosingPeriodFilter::KEY_END_DATE]:public function __constructlprivate readonly ActivitySearch Sactivitysearch,private readonly Elast1cActiv1tyRepos1tory selasticrepos1tory.privace readonly Loggerintertace slogger.) 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 getContextForAskAnuthingByfilter.* Oreturn string[] Activity IDs*/14 usagespublic function getActivityIdsForSavedSearch(Search SsavedSearch,user puser,D: arraySrequestParams = Sthis->buildRequestParamsFromSearchSsavedSearch. Suser):$criteria = Criteria::createFromRequestmarree ($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page' => 1]),array_merge(srequestParams, L'Lim1t => self::DEFAULT_TOP_ACTIVITIES_COUNI,|'page' => 1, 'sequence_number' => 110.puser-›geclinezonel)SfilterSet = Sthis->activitySearch->getonbemandPager1lcersec(scruterta, suser):Sactivitylds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filterSet);sthis->logger->info(lAskJiminnyReport Fetched activity IDs for saved search','saved_search_1d => ssavedsearch->getid).'user_1d => Suser->getid),'actvity counti=> count(sactivitylds),J:return sactvitvlos.Accept File 8+X Reject File 138&€ 1 of 2 files →: Support Daily • in 2 h 53 m100% [2Tue 14 Apr 12:07:42RequestGenerateAskJiminnyReportJobTest vCascade†ControlleAutomated Renort Mal© Fixing Ask Jiminny FNow I nave the complele root cause picture. Inis is criucal:Poot calce SallndlIne ous lokequestraranst romsearch metnoe in Askudminnykeportactlv1tyService passes sequence number=" Implicitv not in params. whichimeals esrerstnequestly retums trueWhen sequence number Is notin requestParams, the criteria:: createrromRequest detaults itto 0, and isFirstRequest() returns true when emptysequencenunber ===0The frontend URL has sequence number=4 — meaning it's not a firstrequest. The service doesn t set it, so the criteria thinks it's a first request.wnen 1srirstkeouest = chue, tnese lmpllcit tlters are agglled tnalaren 't in the saved search1. ActivityDurationRange — applies min_duration = 1 (INITIAL_MIN)- filters out 0-second calls%AcIIvlivrecorded — adoles only recorded = 1 D--AULI VALUE=OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterburthe Tronteno Wiun sequence numberza skiosalll ortnese ceaulis. soitvetums more resullsIne tix snoule oe in bur lakequestraranstrombearch - lneeas lo pass sequence number in the oult params to sicnal "not a first recuest" so theimplicit defaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in gecactivitylasrorsavedsearch.Now let me verify my understanding of isFirstRequest :reao crieraronoContirmed. The fix is clear and minimal. Tine detActivirvidsForsavedsearich method needs to pass sequence number with a non-zero value so that 1srirstrequesc returns talse ane no imolicit aeraults are apollea1 ASkJInNow let me check ir there's an existing test for AskJiminnykeportActivityService to update:Explorea AskJiminnykepor Activilyservicelest.ono and searched ASkJl..Ineed lo add a lest thau verities sequence number=l is passed to criceriaso 1sFirstRequestlo returns false ). Ler me add It to the existine testi• AskJiminnyReportActivityServiceTest.phpNow ler's run the lestto verity.docker exec docker lamp 1 php /var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepo"enceevalyoet veccteotephrTurcovelayeCould not open input file: /var/www/html/artisanCommand docken•docker exec aockerdocker_Lamp_1 php /app/artisan2 files with chandes.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27View all.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6Winasun leams42:31uir-oia 4 spacesW...
|
10987
|
|
10993
|
217
|
52
|
2026-04-14T09:07:45.027562+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157665027_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.lod= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListenersC AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpC) AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bect slogger9 usagesC CreateActivityLoggedEvent.phpprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC) RequestGenerateaskJiminnykeportJob.ono1l usages(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.onoprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpclass AutomatedReportsrepos1toryo usaees> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^private function makeUsero: UserxMockobject...h* dreturn AutomatedReport8 usagesprivate runcuion makesavedsearcn(array prilters): searchomockudjeccl...spublic function create(array $data): AutomatedReport...71 M >public function testGetActivityIdsForSavedSearchReturnsIds: voidf...}* Find an automated report by UUID100 M >public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidt...}* dparam string $uu1d118 M >public function testGetActivityldsFilters0utDateFiltersO: voidk...h*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?AutomatedReport157 % >184185 ₽ >public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)public function testGetActivityIdsHandlesScalarFilters(: void{...}Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is_numeric($id0rUuid)) {225 h Pun 'testGetActivitvldsPaO- Debug 'testGetActivityldsPa...'( Run 'testGetActivitvidsPa...' with CoverageModify Run Configuration….PassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: void228229230edSearch([]) ;sfilterSet = sthis-›createMock( originalClassName: FilterDefinitionCollection::class):sthis->activitysearch->method( constraint:'getArrayr1lterKeys')->w1LLReturn(LJD:lreturn AutomatedReport::where('uvid', AutomatedReport::to0ptim.Ncaoruredtrtertae nuuu/*** Retrieve all standard (non-Ask Jiminny) automated reports.ani S->acuwVsearch-sexdectsiun S->once u→>iecno constraind'getOnDemandPageFilterSet')-LurerurnlacLoacku runculon(Criteria $criteria) use ($filterSet, &$capturedCriteria) {...F);* dparam string ssortcolumnThe column to sort by. Allowed vaz 242* dparam string ssortuireccion ine sorc direccion. ALlowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection =desc: Collection 1.245245— 246247248— 249250_231252 M >$this-›elasticRepository->method( constraint:'onDemandSearchldsonly')->willReturn(LJD:sthis->Loggen->method constraint: "info'D:sthis->service->getActiv1tyudsForsavedsearch(ssavedsearch,suser);sthis->assertNotnulu(scapturedcriter1a)punis->assercralsel.capcureacriter1a->1srirsckequescoohpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf..../*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne couin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed values1 eal/ Accept File &+X Reject File 1%g+ 2 of 2 files →Winasun ch. // View Changelog (today 10:33)AcceotRenect: Support Daily • in 2 h 53 m100% [2Tue 14 Apr 12:07:44RequestGenerateAskJiminnyReportJobTest vCascade†ControlleAutomated Renort Mal© Fixing Ask Jiminny FNow I nave the complele root cause picture. Inis is criucal:Poot calce SallndlIne ous lokequestraranst romsearch metnoe in Askudminnykeportactiv.tyService passes sequence number=" Implicitv not in params. whichimeals esrerstnequestly retums trueWhen sequence number Is notin requestParams, the criteria:: createrromRequest detaults itto 0, and isFirstRequest() returns true when emptysequencenumberThe frontend URL has sequence number=4 — meanina it's not a firstrequest. The service doesn't set it, so the criteria thinks it's a first request.wnen 1srirstkeouest = chue, tnese lmpllcit tlters are agglled tnalaren 't in the saved search1. ActivityDurationRange — applies min_duration = 1 (INITIAL_MIN)- filters out 0-second calls%AcIIvlivrecorded — adoles only recorded = 1 D--AULI VALUE=OPTION_RECORDED) - filters to recorded-onlyOrganiserGroupIn — applies user's default group filterburthe Tronteno Wiun sequence numberza skiosalll ortnese ceaulis. soitretums more resullsIne tix snoule oe in bur lakequestraranstrombearch - lneeas lo pass sequence number in the oult params to sicnal "not a first recuest" so theimplicit defaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in gecactivitylasrorsavedsearch.Read As.Now let me verify my understanding of isFirstRequest :reao crieraoneContirmed. The fix is clear and minimal. Tine detActivirvidsForsavedSearich method needs to pass sequence number with a non-zero value so that 1srirstrequesc returns talse ane no imolicit aeraults are apollea1 ASkJInNow let me check ir there's an existing test for AskJiminnykeportActivityService to update:Explorea AskJiminnykepor Activilyservicelest.ono and searched ASkJl..Ineed lo add a lest thau verities sequence number=l is passed to criceriaso 1sFirstRequestlo returns false ). Ler me add It to the existine testi• AskJiminnyReportActivityServiceTest.phpNow ler's run the lestto verity.docker exec docker lamp 1 php /var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepo"enceevalyoet veccteotephrTurcovelayeCould not open input file: /var/www/html/artisanCommand docken•docker exec aockerdocker_Lamp_1 php /app/artisanView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.phpReject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spacesW...
|
NULL
|
-2957561828763719742
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.lod= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListenersC AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpC) AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bect slogger9 usagesC CreateActivityLoggedEvent.phpprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC) RequestGenerateaskJiminnykeportJob.ono1l usages(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.onoprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpclass AutomatedReportsrepos1toryo usaees> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4 ^private function makeUsero: UserxMockobject...h* dreturn AutomatedReport8 usagesprivate runcuion makesavedsearcn(array prilters): searchomockudjeccl...spublic function create(array $data): AutomatedReport...71 M >public function testGetActivityIdsForSavedSearchReturnsIds: voidf...}* Find an automated report by UUID100 M >public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidt...}* dparam string $uu1d118 M >public function testGetActivityldsFilters0utDateFiltersO: voidk...h*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?AutomatedReport157 % >184185 ₽ >public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)public function testGetActivityIdsHandlesScalarFilters(: void{...}Tusdyepublic function findByldorUu1d(string s1d0rUu1d): ?AutomatedReportif (is_numeric($id0rUuid)) {225 h Pun 'testGetActivitvldsPaO- Debug 'testGetActivityldsPa...'( Run 'testGetActivitvidsPa...' with CoverageModify Run Configuration….PassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: void228229230edSearch([]) ;sfilterSet = sthis-›createMock( originalClassName: FilterDefinitionCollection::class):sthis->activitysearch->method( constraint:'getArrayr1lterKeys')->w1LLReturn(LJD:lreturn AutomatedReport::where('uvid', AutomatedReport::to0ptim.Ncaoruredtrtertae nuuu/*** Retrieve all standard (non-Ask Jiminny) automated reports.ani S->acuwVsearch-sexdectsiun S->once u→>iecno constraind'getOnDemandPageFilterSet')-LurerurnlacLoacku runculon(Criteria $criteria) use ($filterSet, &$capturedCriteria) {...F);* dparam string ssortcolumnThe column to sort by. Allowed vaz 242* dparam string ssortuireccion ine sorc direccion. ALlowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReportsstring SsortColumn ="created_at',string SsortDirection =desc: Collection 1.245245— 246247248— 249250_231252 M >$this-›elasticRepository->method( constraint:'onDemandSearchldsonly')->willReturn(LJD:sthis->Loggen->method constraint: "info'D:sthis->service->getActiv1tyudsForsavedsearch(ssavedsearch,suser);sthis->assertNotnulu(scapturedcriter1a)punis->assercralsel.capcureacriter1a->1srirsckequescoohpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf..../*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne couin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed values1 eal/ Accept File &+X Reject File 1%g+ 2 of 2 files →Winasun ch. // View Changelog (today 10:33)AcceotRenect: Support Daily • in 2 h 53 m100% [2Tue 14 Apr 12:07:44RequestGenerateAskJiminnyReportJobTest vCascade†ControlleAutomated Renort Mal© Fixing Ask Jiminny FNow I nave the complele root cause picture. Inis is criucal:Poot calce SallndlIne ous lokequestraranst romsearch metnoe in Askudminnykeportactiv.tyService passes sequence number=" Implicitv not in params. whichimeals esrerstnequestly retums trueWhen sequence number Is notin requestParams, the criteria:: createrromRequest detaults itto 0, and isFirstRequest() returns true when emptysequencenumberThe frontend URL has sequence number=4 — meanina it's not a firstrequest. The service doesn't set it, so the criteria thinks it's a first request.wnen 1srirstkeouest = chue, tnese lmpllcit tlters are agglled tnalaren 't in the saved search1. ActivityDurationRange — applies min_duration = 1 (INITIAL_MIN)- filters out 0-second calls%AcIIvlivrecorded — adoles only recorded = 1 D--AULI VALUE=OPTION_RECORDED) - filters to recorded-onlyOrganiserGroupIn — applies user's default group filterburthe Tronteno Wiun sequence numberza skiosalll ortnese ceaulis. soitretums more resullsIne tix snoule oe in bur lakequestraranstrombearch - lneeas lo pass sequence number in the oult params to sicnal "not a first recuest" so theimplicit defaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in gecactivitylasrorsavedsearch.Read As.Now let me verify my understanding of isFirstRequest :reao crieraoneContirmed. The fix is clear and minimal. Tine detActivirvidsForsavedSearich method needs to pass sequence number with a non-zero value so that 1srirstrequesc returns talse ane no imolicit aeraults are apollea1 ASkJInNow let me check ir there's an existing test for AskJiminnykeportActivityService to update:Explorea AskJiminnykepor Activilyservicelest.ono and searched ASkJl..Ineed lo add a lest thau verities sequence number=l is passed to criceriaso 1sFirstRequestlo returns false ). Ler me add It to the existine testi• AskJiminnyReportActivityServiceTest.phpNow ler's run the lestto verity.docker exec docker lamp 1 php /var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepo"enceevalyoet veccteotephrTurcovelayeCould not open input file: /var/www/html/artisanCommand docken•docker exec aockerdocker_Lamp_1 php /app/artisanView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.phpReject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spacesW...
|
NULL
|
|
10995
|
217
|
53
|
2026-04-14T09:07:51.093583+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157671093_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactorToo PhpStormFileFditViewNavigateCodeLaravelRetactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit_ ActionsComponent› ConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixturesD Helpers_ Http>_Integrations> MinteractionsMJobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpC AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bect slogger9 usagesC CreateActivityLoggedEvent.phpprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC) RequestGenerateaskJiminnykeportJob.ong1l usages(©) RequestGenerateReportJob.php(C) AutomatedReportResult.phpprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpclass AutomatedReportsrepos1toryo usaees(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordin(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversD PoliciesProvidersRepositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyReporA15 V4^private function makeUsero: UserxMockobject...h* dreturn AutomatedReportpublic function create(array $data): AutomatedfRunAAskJiminnyReportActivityServiceTest.testGetActivityldsPasse..GGGUGKOA* Find an automated report by UUIDv * Running tests...v *- CLI Arguments* dparam string $uu1d> * Tests(Unit(Services\Kiosk\AutomatedReports\AsKJiminnyReportActivityServiceTest*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?Autcreturn AutomatedReport::where('uuid', Auton0 test passed 0/1 testsTusdyepublic function findbyldoruu1d(string s1d0rUulcif (is_numeric($id0rUuid)) {return Aucomacedkeport:.tznal(1nt) $1dlreturn AutomatedReport::where(('uuid'. Auton/*** Retrieve all standard (non-Ask Jaminny) autc* dparam string ssortcolumnThe column to s* dparam string ssortulreccion ine sort direct* drerurn couuectonsaurondredredor12 usagespublic function getAllStandardReportsstring SsortColumn E"created_at',string SsortDirection =desc: Collection 1./*** Recrieve aLL Ask Jaminny reporus created Dy tne given user.* dparam usersuserIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou1 eallv Accept File *~ X Reject File + 38 €* 2 of 2 files →(c AutomatedRenor* dparam string SsortDirection The sort direction. Allowed valuesWinasur change. // View Changelog (today 10:33)a Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:50L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Renort Mal© Fixing Ask Jiminny Fmrequest eauisirod ano 1sFirstreovesto reurs true when emotyseouencenunbelThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search1. ActivityionRanae — applies min duration = 1 (INITIAL MIN)— Tllters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, soitreturns more resultsyequestraransrrombearch — it neeas to pass soarams lo sional "nota Tistrecuest", so the: Or alternatively, always pass a non-zero sequevecactivitylosrorsavecsearchstanding of isfirstRequest:no minimar Une oetActivlvlosrorsavedseanequence_number with a non-zero value so that 1False and no implicit defaults are appliedan existine lesttor AskuiminnукeporLaccivicyMes sequence numderet is passeeto cricerlains talse)rlerme acc Tto tne ex sune lestlyservicelestongphp /var/www/html/artisan test/Kiosk/AutomatedReports/AskJiminnyRepost.phpno-coverayertlle. var ww htmyartisanlamp 1 php /app/artisan test/Kiosk/AutomatedReports/AskJiminnyReposleone -no-covelayeRun 88+ SkipView allJskJiminnvReportActivitvServiceTest.phv +27./Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ <› Code.Claude Sonnet 4.6winasun leamsZ45uir-oia 4 spaces...
|
NULL
|
-3417829161379963207
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactorToo PhpStormFileFditViewNavigateCodeLaravelRetactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit_ ActionsComponent› ConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixturesD Helpers_ Http>_Integrations> MinteractionsMJobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpC AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bect slogger9 usagesC CreateActivityLoggedEvent.phpprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC) RequestGenerateaskJiminnykeportJob.ong1l usages(©) RequestGenerateReportJob.php(C) AutomatedReportResult.phpprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpclass AutomatedReportsrepos1toryo usaees(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordin(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversD PoliciesProvidersRepositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyReporA15 V4^private function makeUsero: UserxMockobject...h* dreturn AutomatedReportpublic function create(array $data): AutomatedfRunAAskJiminnyReportActivityServiceTest.testGetActivityldsPasse..GGGUGKOA* Find an automated report by UUIDv * Running tests...v *- CLI Arguments* dparam string $uu1d> * Tests(Unit(Services\Kiosk\AutomatedReports\AsKJiminnyReportActivityServiceTest*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?Autcreturn AutomatedReport::where('uuid', Auton0 test passed 0/1 testsTusdyepublic function findbyldoruu1d(string s1d0rUulcif (is_numeric($id0rUuid)) {return Aucomacedkeport:.tznal(1nt) $1dlreturn AutomatedReport::where(('uuid'. Auton/*** Retrieve all standard (non-Ask Jaminny) autc* dparam string ssortcolumnThe column to s* dparam string ssortulreccion ine sort direct* drerurn couuectonsaurondredredor12 usagespublic function getAllStandardReportsstring SsortColumn E"created_at',string SsortDirection =desc: Collection 1./*** Recrieve aLL Ask Jaminny reporus created Dy tne given user.* dparam usersuserIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou1 eallv Accept File *~ X Reject File + 38 €* 2 of 2 files →(c AutomatedRenor* dparam string SsortDirection The sort direction. Allowed valuesWinasur change. // View Changelog (today 10:33)a Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:50L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Renort Mal© Fixing Ask Jiminny Fmrequest eauisirod ano 1sFirstreovesto reurs true when emotyseouencenunbelThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search1. ActivityionRanae — applies min duration = 1 (INITIAL MIN)— Tllters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, soitreturns more resultsyequestraransrrombearch — it neeas to pass soarams lo sional "nota Tistrecuest", so the: Or alternatively, always pass a non-zero sequevecactivitylosrorsavecsearchstanding of isfirstRequest:no minimar Une oetActivlvlosrorsavedseanequence_number with a non-zero value so that 1False and no implicit defaults are appliedan existine lesttor AskuiminnукeporLaccivicyMes sequence numderet is passeeto cricerlains talse)rlerme acc Tto tne ex sune lestlyservicelestongphp /var/www/html/artisan test/Kiosk/AutomatedReports/AskJiminnyRepost.phpno-coverayertlle. var ww htmyartisanlamp 1 php /app/artisan test/Kiosk/AutomatedReports/AskJiminnyReposleone -no-covelayeRun 88+ SkipView allJskJiminnvReportActivitvServiceTest.phv +27./Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ <› Code.Claude Sonnet 4.6winasun leamsZ45uir-oia 4 spaces...
|
10993
|
|
10997
|
217
|
54
|
2026-04-14T09:07:56.030432+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157676030_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelPetactonToo PhpStormFileFditViewNavigateCodeLaravelPetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit_ ActionsC Component› ConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixturesD Helpers_ Http>_Integrations> MinteractionsMJobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordin(c) SqsVisibilityControlTestMListeners© AutomatedReportsCommand.php© AutomatedReportsSendCommana.pnpC AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.php)AddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bject slogger:9 usagesprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC RequestGenerateAskJiminnyReportJob.php1l usages(©) RequestGenerateReportJob.php(C) AutomatedReportResult.phpprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpo usaeesa Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:55L AskJiminnyReportActivityServiceT..DefaultsCascade†ControlleAutomated Renort Mal© Fixing Ask Jiminny Fmrequest eauisirod ano 1sFirstreovesto reurs true when emotyseouencenunbelThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search1. ActivitvionRanae — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterclass AutomatedReportsrepos1tory> MModelsM Notifications› M ObserversD PoliciesProvidersRepositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4^private function makeUsero: UserxMockobject...h* dreturn AutomatedReportpublic function create(array $data): AutomatedfAAskJiminnyReportActivityServiceTest.testGetActivityldsPasse..GKOA* Find an automated report by UUID* dparam string $uu1dGGGUv *: Running tests...v v CLI Arguments> v Tests\Unit|Services\Kiosk\AutomatedReports\AsKJiminnyReportActivityServiceTest*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?Autcreturn AutomatedReport::where('uuid', Auton1 test passed 1 test total, 2 sec 80 msTusdyepublic function findbyldoruu1d(string s1d0rUulcif (is_numeric($id0rUuid)) {return Aucomacedkeport:.tznal(1nt) $1dlreturn AutomatedReport::where(('uuid'. Auton/*** Retrieve all standard (non-Ask Jaminny) autc* dparam string ssortcolumnThe column to s* dparam string ssortulreccion ine sort direct* drerurn couuectonsaurondredredor12 usagespublic function getAllStandardReports(string SsortColumn E"created_at',string SsortDirection =desc: Collection 1./*** Recrieve aLL Ask Jaminny reporus created Dy tne given user.* dparam usersuserIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne couin co sorc ou. Accowed voc* dparam string SsortDirection The sort direction. Allowed valuesbut the Trontend With sequence number=4 sklos all or these deraults, soitreturns more resultsyequestraransrrombearch — it neeas to pass soarams lo sional "nota Tist recuest", so the: Or alternatively, always pass a non-zero sequevecactivitylosrorsavecsearch4s voumsstanding of isfirstRequest:no minimar Une oetActivlvlosrorsavedseanequence_number with a non-zero value so that 1False and no implicit defaults are appliedan existine lesttor AskuiminnукeporLaccivicyMes sequence numderet is passeeto cricerlains talse)rlerme acc Tto tne ex sune lestlyservicelestongphp /var/www/html/artisan testIKlosk/AutomatedReports/AskJiminnyRepost.phpno-coverayertlle. var ww htmyartisanlamp 1 php /app/artisan test/Kiosk/AutomatedReports/AskJiminnyReposleone -no-covelayeRun 88+ SkipView allJskJiminnvReportActivitvServiceTest.phv +27./Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)1 eaitJ v Accept File *~ X Reject File t%@* 2 of 2 files →+ <› Code.Claude Sonnet 4.6Winasun chand. // View Changelog (today 10:33)winasun leamsZ45uir-oia 4 spaces...
|
NULL
|
-989252043184715980
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelPetactonToo PhpStormFileFditViewNavigateCodeLaravelPetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.logL SF (iminny@localhostc HS_local fiminny@localhostL console (PROD]& console (EU]L console (STAGINGD Unit_ ActionsC Component› ConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixturesD Helpers_ Http>_Integrations> MinteractionsMJobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordin(c) SqsVisibilityControlTestMListeners© AutomatedReportsCommand.php© AutomatedReportsSendCommana.pnpC AskJiminnyReportActivityService.phpC) AskJiminnyReportActivityServiceTest.php x C) RequestGenerateAskJiminnyReportJobTest.php)AddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerinterfacexMock0bject slogger:9 usagesprivate AskJ1minnykeporcAculVityservice sservice;(C) Activtv odded.nnr29 GT>protected function setUp(: voidf...c) AutomatedRenorscalloackoerwce.onvC RequestGenerateAskJiminnyReportJob.php1l usages(©) RequestGenerateReportJob.php(C) AutomatedReportResult.phpprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...h© AutomatedReport.phpo usaeesa Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:55L AskJiminnyReportActivityServiceT..DefaultsCascade†ControlleAutomated Renort Mal© Fixing Ask Jiminny Fmrequest eauisirod ano 1sFirstreovesto reurs true when emotyseouencenunbelThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search1. ActivitvionRanae — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterclass AutomatedReportsrepos1tory> MModelsM Notifications› M ObserversD PoliciesProvidersRepositories> D Rulesv Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenorA15 V4^private function makeUsero: UserxMockobject...h* dreturn AutomatedReportpublic function create(array $data): AutomatedfAAskJiminnyReportActivityServiceTest.testGetActivityldsPasse..GKOA* Find an automated report by UUID* dparam string $uu1dGGGUv *: Running tests...v v CLI Arguments> v Tests\Unit|Services\Kiosk\AutomatedReports\AsKJiminnyReportActivityServiceTest*dreturn AutomatedReportnul7public function findByUuid(string Suuid): ?Autcreturn AutomatedReport::where('uuid', Auton1 test passed 1 test total, 2 sec 80 msTusdyepublic function findbyldoruu1d(string s1d0rUulcif (is_numeric($id0rUuid)) {return Aucomacedkeport:.tznal(1nt) $1dlreturn AutomatedReport::where(('uuid'. Auton/*** Retrieve all standard (non-Ask Jaminny) autc* dparam string ssortcolumnThe column to s* dparam string ssortulreccion ine sort direct* drerurn couuectonsaurondredredor12 usagespublic function getAllStandardReports(string SsortColumn E"created_at',string SsortDirection =desc: Collection 1./*** Recrieve aLL Ask Jaminny reporus created Dy tne given user.* dparam usersuserIne user wnose reporus to retrieve*oodrdl sarno osorccocuminIne couin co sorc ou. Accowed voc* dparam string SsortDirection The sort direction. Allowed valuesbut the Trontend With sequence number=4 sklos all or these deraults, soitreturns more resultsyequestraransrrombearch — it neeas to pass soarams lo sional "nota Tist recuest", so the: Or alternatively, always pass a non-zero sequevecactivitylosrorsavecsearch4s voumsstanding of isfirstRequest:no minimar Une oetActivlvlosrorsavedseanequence_number with a non-zero value so that 1False and no implicit defaults are appliedan existine lesttor AskuiminnукeporLaccivicyMes sequence numderet is passeeto cricerlains talse)rlerme acc Tto tne ex sune lestlyservicelestongphp /var/www/html/artisan testIKlosk/AutomatedReports/AskJiminnyRepost.phpno-coverayertlle. var ww htmyartisanlamp 1 php /app/artisan test/Kiosk/AutomatedReports/AskJiminnyReposleone -no-covelayeRun 88+ SkipView allJskJiminnvReportActivitvServiceTest.phv +27./Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)1 eaitJ v Accept File *~ X Reject File t%@* 2 of 2 files →+ <› Code.Claude Sonnet 4.6Winasun chand. // View Changelog (today 10:33)winasun leamsZ45uir-oia 4 spaces...
|
NULL
|
|
10998
|
217
|
55
|
2026-04-14T09:07:57.383943+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157677383_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.phpD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums_Events_ Exceptions© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) Activtv odded.nnrc) AutomatedRenorscalloackoelvice.onvC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.php→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitvclass AutomatedReportsrepos1toryA15 X4 ^> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenor* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...71 M >* Find an automated report by UUID100 M ›* dparam string $uu1dAM9 MAY*dreturn AutomatedReportnul7157 A>public function findByUuid(string Suuid): ?AutomatedReport185 ₴)return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)Tusdye225public function findbyldorUu1d(string s1d0rUu1d): ?Automatedreport227if (is_numeric($id0rUuid)) {return AutomatedReport::find((int) $id0rUuid);229236return AutomatedReport::where('uvid', AutomatedReport::to0ptim./*** Retrieve all standard (non-Ask Jaminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed vaz 242* dparam string ssortuireccion ine sorc direccion. ALlowed values244245* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(247248string SsortColumn ="created_at',256string SsortDirection =desc): Collection 1.252 M >/*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun ch. // View Changelog (today 10:33)E custom.loc= laravel.logL SF liminny@localhostc HS_local fiminny@localhostconcole DPOlbllL console (EU]L console (STAGINGC) AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x C RequestGenerateAskJiminnyReportJobTest.phpclass AskuaminnvreoortAcovlrvservcelest extenos estuastorivate Logder interracexmockobnect sloggers9 usagesorivate AskJiminnvRenortActivitvService Sservice:29 GT>protected function setUpO: voidk...?11 usagesprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...hprivate function makeUser(): User&Mock0bject{...}orivate function makeSavedSearch(arnav Sfilters): Search&MockObiect..?public function testGetActivitvIdsForSavedSearchReturnsIds@: voidl...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidt...}public function testGetActivityIdsFilters0utDateFiltersO: void{...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(: void{...}public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: voidAcceot$user = $this->makeUserO):SsavedSearch = sthis->makeSavedSearch(u.D:$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sthis-›activitysearch->method( constraint: 'getArrayr1lterkeys')->w1LLReturn(LJD:ScanturedCriteria = null:sthis->activitvSearch->expects(sthis->once@)→>iecno constraind'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) (...F);$this-›elasticRepository->method( constraint: "onDemandSearchldsonly")->willReturn(LJD:sthis->loqger->method constraint: "info'D:sthis->service->getAct1v1tyldsForsavedsearch(ssavedsearch, suser):$this->assertNotNull($capturedCriteria):sthis->assertFalse(ScapturedCriteria->1sF1rstrequest0.hpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf...}Accept File 8+X Reject File 1 38 @+ 2 of 2 files →Renect• Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:57L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Report Ma© Fixing Ask Jiminny Fmrequest eauisiro d ano 1sFirstreovesto reurs true when emotyseouencenunbetThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search" ACLIVILVDIationRande — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, so itreturns more resultsIne tix snoule be in bus lakequestraransfrombearch — it neeas to pass sequence number In the oult oarams lo sional "nota Ttistrecuest", so the.implicit detaults don't apply. Or alternatively, always pass a non-zero sequence number in tne meree in ceractivitylasrorsavecsearchNow let me verify my understanding of isfirstRequest :keae uriterla.ono ?Contirmeo, Ine Tx s cear ano minimar Une oetActivlvlosrorsavedsearich method needs to pass sequence_number with a non-zero value so that 1sFirstRequest() returns false and no implicit defaults are applied• AskJi.Now let me check il tnere's an existine lesttor AskuiminnykeportaccivicyService to uodate.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi... ›Ineed to ade a lest that vertles sequence numderet is passeeto cricerlaso 1srurstreqvestlo rerurns tallse)r ler meaco Ilo tne ex sune lestfile.• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtactivityservicelest.pnpphp /var/www/html/artisan testnauon nuculld ceunerot topnonocicnmynerenocoverayeCould not open input file: /var/www/html/artisandockerexec docker lamp 1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepoTenclevelyoeivecelesteune e-norcovelayeKUnX+SkipView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
-3412582121067477459
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.phpD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums_Events_ Exceptions© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) Activtv odded.nnrc) AutomatedRenorscalloackoelvice.onvC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.php→ fixtures_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitvclass AutomatedReportsrepos1toryA15 X4 ^> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenor* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...71 M >* Find an automated report by UUID100 M ›* dparam string $uu1dAM9 MAY*dreturn AutomatedReportnul7157 A>public function findByUuid(string Suuid): ?AutomatedReport185 ₴)return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)Tusdye225public function findbyldorUu1d(string s1d0rUu1d): ?Automatedreport227if (is_numeric($id0rUuid)) {return AutomatedReport::find((int) $id0rUuid);229236return AutomatedReport::where('uvid', AutomatedReport::to0ptim./*** Retrieve all standard (non-Ask Jaminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed vaz 242* dparam string ssortuireccion ine sorc direccion. ALlowed values244245* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(247248string SsortColumn ="created_at',256string SsortDirection =desc): Collection 1.252 M >/*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun ch. // View Changelog (today 10:33)E custom.loc= laravel.logL SF liminny@localhostc HS_local fiminny@localhostconcole DPOlbllL console (EU]L console (STAGINGC) AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x C RequestGenerateAskJiminnyReportJobTest.phpclass AskuaminnvreoortAcovlrvservcelest extenos estuastorivate Logder interracexmockobnect sloggers9 usagesorivate AskJiminnvRenortActivitvService Sservice:29 GT>protected function setUpO: voidk...?11 usagesprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...hprivate function makeUser(): User&Mock0bject{...}orivate function makeSavedSearch(arnav Sfilters): Search&MockObiect..?public function testGetActivitvIdsForSavedSearchReturnsIds@: voidl...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidt...}public function testGetActivityIdsFilters0utDateFiltersO: void{...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(: void{...}public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: voidAcceot$user = $this->makeUserO):SsavedSearch = sthis->makeSavedSearch(u.D:$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sthis-›activitysearch->method( constraint: 'getArrayr1lterkeys')->w1LLReturn(LJD:ScanturedCriteria = null:sthis->activitvSearch->expects(sthis->once@)→>iecno constraind'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) (...F);$this-›elasticRepository->method( constraint: "onDemandSearchldsonly")->willReturn(LJD:sthis->loqger->method constraint: "info'D:sthis->service->getAct1v1tyldsForsavedsearch(ssavedsearch, suser):$this->assertNotNull($capturedCriteria):sthis->assertFalse(ScapturedCriteria->1sF1rstrequest0.hpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf...}Accept File 8+X Reject File 1 38 @+ 2 of 2 files →Renect• Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:57L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Report Ma© Fixing Ask Jiminny Fmrequest eauisiro d ano 1sFirstreovesto reurs true when emotyseouencenunbetThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search" ACLIVILVDIationRande — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, so itreturns more resultsIne tix snoule be in bus lakequestraransfrombearch — it neeas to pass sequence number In the oult oarams lo sional "nota Ttistrecuest", so the.implicit detaults don't apply. Or alternatively, always pass a non-zero sequence number in tne meree in ceractivitylasrorsavecsearchNow let me verify my understanding of isfirstRequest :keae uriterla.ono ?Contirmeo, Ine Tx s cear ano minimar Une oetActivlvlosrorsavedsearich method needs to pass sequence_number with a non-zero value so that 1sFirstRequest() returns false and no implicit defaults are applied• AskJi.Now let me check il tnere's an existine lesttor AskuiminnykeportaccivicyService to uodate.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi... ›Ineed to ade a lest that vertles sequence numderet is passeeto cricerlaso 1srurstreqvestlo rerurns tallse)r ler meaco Ilo tne ex sune lestfile.• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtactivityservicelest.pnpphp /var/www/html/artisan testnauon nuculld ceunerot topnonocicnmynerenocoverayeCould not open input file: /var/www/html/artisandockerexec docker lamp 1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepoTenclevelyoeivecelesteune e-norcovelayeKUnX+SkipView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
10997
|
|
11000
|
217
|
56
|
2026-04-14T09:07:58.853762+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157678853_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.phpD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) Activtv odded.nnrc) AutomatedRenorscalloackoerwce.onvC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAulomaleakeportkesuit.ono_ Events© AutomatedReport.php_ Exceptions→ fixturesclass AutomatedReportsrepos1toryA15 У 4 л_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenor* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...71 M >* Find an automated report by UUID100 M ›* dparam string $uu1dAM9 MAY*dreturn AutomatedReportnul7157 A>public function findByUuid(string Suuid): ?AutomatedReport185 ₴)return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)Tusdye225public function findById0rUuid(string $idOrUuid): ?AutomatedReport 226if (is_numeric($id0rUuid)) {return AutomatedReport::find((int) $id0rUuid);229236return AutomatedReport::where('uvid', AutomatedReport::to0ptim./*** Retrieve all standard (non-Ask Jaminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed vaz 242243* dparam string ssortuireccion ine sort cireccion. ALlowea values244245* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports247248string SsortColumn ="created_at',string SsortDirection =desc250): Collection 1.252 M >/*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun ch. // View Changelog (today 10:33)E custom.loc= laravel.logL SF liminny@localhostc HS_local fiminny@localhostconcole DPOlbllL console (EU]L console (STAGINGC) AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x C RequestGenerateAskJiminnyReportJobTest.phpclass AskuaminnvreoortAcovlrvservcelest extenos estuastorivate Logger interracexmockobnect slodger9 usagesorivate AskJiminnvRenortActivitvService Sservice:29 GT>protected function setUpO: voidk...?11 usagesprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...hprivate function makeUser(): User&Mock0bject{...}orivate function makeSavedSearch(arnav Sfilters): Search&MockObiect..?public function testGetActivitvIdsForSavedSearchReturnsIds@: voidl...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidf...}public function testGetActivityIdsFilters0utDateFiltersO: void{...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(: void{...}public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: voidAccept$user = $this->makeUserO):$savedSearch = $this->makeSavedSearch([]D;$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sth1s->activitysearch->method( constraint: |'getArrayr1lterkeys')->w1LLReturn(LJDHScanturedCriteria = null:sthis->activitvSearch->expects(sthis->once@)→>iecno constraind'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) (...F);$this-›elasticRepository->method( constraint: "onDemandSearchldsonly")->willReturn(LJD:sthis->Loggen->method constraint: "info'D:sthis->service->getAct1v1tyldsForsavedsearch(ssavedsearch, suser):sthis->assertNotnull(scapturedcr1ter1a)hsthis->assertFalse(ScapturedCriteria->1sF1rstrequest0.hpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf...}Accept File 8+X Reject File 1 38 @+ 2 of 2 files →Renect• Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:58L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Report Ma© Fixing Ask Jiminny Fmrequest eauisiro d ano 1sFirstreovesto reurs true when emotyseouencenunbetThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search" ACLIVILVDIationRande — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, so itreturns more resultsIne tix snoule be in bus lakequestraransfrombearch — it neeas to pass sequence number In the oult oarams lo sional "nota Ttistrecuest", so the.implicit detaults don't apply. Or alternatively, always pass a non-zero sequence number in tne meree in ceractivitylasrorsavecsearchNow let me verify my understanding of isfirstRequest :keae uriterla.ono ?Contirmeo, Ine Tx s cear ano minimar Une oetActivlvlosrorsavedsearich method needs to pass sequence_number with a non-zero value so that 1sFirstRequest() returns false and no implicit defaults are applied• AskJ.Now let me check il tnere's an existine lesttor AskuiminnykeportaccivicyService to uodate.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi... ›Ineed to ade a lest that vertles sequence numderet is passeeto cricerlaso 1srurstreqvestlo rerurns tallse)r ler meaco Ilo tne ex sune lestfile.• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtactivityservicelest.pnpphp /var/www/html/artisan testnuon nuculld ceunerot topnonociammynewenocoverayeCould not open input file: /var/www/html/artisandockerexec docker lamp 1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepoTenclevelyoeivecelesteune e-norcovelayeKUnX+SkipView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
-7675255147252091928
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaravePetactonTool PhpStormFileFditViewNavigateCodelaravePetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.phpD Unit>DActions> Component› Configuration> MConsoleM ContractsM DomainD DTO• Enums© AutomatedReportsCommand.phpC AutomatedReportsSendCommand.phpAddLayoutentities.php(C) Team.nho© AutomatedReportsRepository.php X© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php(C) Activtv odded.nnrc) AutomatedRenorscalloackoerwce.onvC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAulomaleakeportkesuit.ono_ Events© AutomatedReport.php_ Exceptions→ fixturesclass AutomatedReportsrepos1toryA15 У 4 л_ HelpersD Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobtcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyD User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners→]Mal> MModelsM Notifications› M ObserversPoliciesProvidersRepositoriesD Rules• _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServi(c) AskJiminnyRepor(c) AskJiminnyRepor(c AutomatedRenor* dreturn AutomatedReportpublic function create(array $data): AutomatedReport...71 M >* Find an automated report by UUID100 M ›* dparam string $uu1dAM9 MAY*dreturn AutomatedReportnul7157 A>public function findByUuid(string Suuid): ?AutomatedReport185 ₴)return AutomatedReport::where('uuid', AutomatedReport::toOptim.206 6)Tusdye225public function findById0rUuid(string $idOrUuid): ?AutomatedReport 226if (is_numeric($id0rUuid)) {return AutomatedReport::find((int) $id0rUuid);229236return AutomatedReport::where('uvid', AutomatedReport::to0ptim./*** Retrieve all standard (non-Ask Jaminny) automated reports.* dparam string ssortcolumnThe column to sort by. Allowed vaz 242243* dparam string ssortuireccion ine sort cireccion. ALlowea values244245* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports247248string SsortColumn ="created_at',string SsortDirection =desc250): Collection 1.252 M >/*** Recrieve aLL Ask Jaminny reporus created Dy the given user.* dparam userThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun ch. // View Changelog (today 10:33)E custom.loc= laravel.logL SF liminny@localhostc HS_local fiminny@localhostconcole DPOlbllL console (EU]L console (STAGINGC) AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x C RequestGenerateAskJiminnyReportJobTest.phpclass AskuaminnvreoortAcovlrvservcelest extenos estuastorivate Logger interracexmockobnect slodger9 usagesorivate AskJiminnvRenortActivitvService Sservice:29 GT>protected function setUpO: voidk...?11 usagesprivate function makeFilter(string Skey. ?string $value): SearchFilter&Mock0bject...hprivate function makeUser(): User&Mock0bject{...}orivate function makeSavedSearch(arnav Sfilters): Search&MockObiect..?public function testGetActivitvIdsForSavedSearchReturnsIds@: voidl...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(: voidf...}public function testGetActivityIdsFilters0utDateFiltersO: void{...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandlesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(: void{...}public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaultsQ: voidAccept$user = $this->makeUserO):$savedSearch = $this->makeSavedSearch([]D;$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sth1s->activitysearch->method( constraint: |'getArrayr1lterkeys')->w1LLReturn(LJDHScanturedCriteria = null:sthis->activitvSearch->expects(sthis->once@)→>iecno constraind'getOnDemandPageFilterSet')->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) (...F);$this-›elasticRepository->method( constraint: "onDemandSearchldsonly")->willReturn(LJD:sthis->Loggen->method constraint: "info'D:sthis->service->getAct1v1tyldsForsavedsearch(ssavedsearch, suser):sthis->assertNotnull(scapturedcr1ter1a)hsthis->assertFalse(ScapturedCriteria->1sF1rstrequest0.hpublic function testGetActivitvIdsLogsWithCorrectContext@: voidf...}Accept File 8+X Reject File 1 38 @+ 2 of 2 files →Renect• Support Daily • in 2 h 53 m100% |45]Tue 14 Apr 12:07:58L AskJiminnyReportActivityServiceT..DefaultsCascade*ControlleAutomated Report Ma© Fixing Ask Jiminny Fmrequest eauisiro d ano 1sFirstreovesto reurs true when emotyseouencenunbetThe frontend URL has sequence number=4 — meaning it's not a firstreduest, Tihe service doesn't ser lt, so the criteria thinks it's a first reduest.When isFirstRequest() = true , these implicit filters are applied thataren tin the saveo search" ACLIVILVDIationRande — applies min duration = 1 (INITIAL MIN)— flters out 0-second callls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE =OPTION_RECORDED) — filters to recorded-onlyOrganiserGroupin — applies user's default group filterbut the Trontend With sequence number=4 sklos all or these deraults, so itreturns more resultsIne tix snoule be in bus lakequestraransfrombearch — it neeas to pass sequence number In the oult oarams lo sional "nota Ttistrecuest", so the.implicit detaults don't apply. Or alternatively, always pass a non-zero sequence number in tne meree in ceractivitylasrorsavecsearchNow let me verify my understanding of isfirstRequest :keae uriterla.ono ?Contirmeo, Ine Tx s cear ano minimar Une oetActivlvlosrorsavedsearich method needs to pass sequence_number with a non-zero value so that 1sFirstRequest() returns false and no implicit defaults are applied• AskJ.Now let me check il tnere's an existine lesttor AskuiminnykeportaccivicyService to uodate.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi... ›Ineed to ade a lest that vertles sequence numderet is passeeto cricerlaso 1srurstreqvestlo rerurns tallse)r ler meaco Ilo tne ex sune lestfile.• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtactivityservicelest.pnpphp /var/www/html/artisan testnuon nuculld ceunerot topnonociammynewenocoverayeCould not open input file: /var/www/html/artisandockerexec docker lamp 1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyRepoTenclevelyoeivecelesteune e-norcovelayeKUnX+SkipView all.sk/AutomatedReports/@ AskJiminnvReportActivitvServiceTest.phv +27.../Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (&+L)+ ‹› CodeClaude Sonnet 4.6winasun leamsuir-oia 4 spaces...
|
NULL
|
|
11002
|
217
|
57
|
2026-04-14T09:08:00.675611+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157680675_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v• Unit> Actions› D Component› D Configuration> MConsoleM ContractsD DomainODTO• EnumsD Events• ExceptionsO fixtures• HelpersD Http> D Integrations> Minteractions~ D Jobs> M Activitv> D AiAutomation>_ Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeaksks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTestMListeners→]Mal> MModelsNotifications› M Observers[ PoliciesO ProvidersD RepositoriesC RulesServicesC Activity[ ActivityProvidersDJ AvatarcallendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServi© AskJiminnyRepori© AskJiminnyReport© AutomatedReport© ReportController.phpAutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.phpC AutomatedReportsSendCommand.php© Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php© ActivityLogged.phpc) AutomatedRenorscalloackoerwce.onv© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.phpclass AutomatedReportsRepositoryA15 X4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf..}71 8 >/*** Find an automated report by UUID* @param string $uvid100 % >-1171118 ₽ >* @return AutomatedReport/nulz157 8 >public function findByUuid(string $uvid): ?AutomatedReport185 % >return AutomatedReport::where('uvid', AutomatedReport:: toOptim206 8 >225 DTusdyepublic function findBy[dOruuid(string $idoruuid): PAutomatedReport 226if (is_numeric($idOrUuid)) €return AutomatedReport::find((int) $id0rUvid);229230return AutomatedReport: :where('uvid', AutomatedReport:: toOptim/*** Retrieve all standard (non-Ask Jiminny) automated reports.* @param string $sortColumnThe column to sort by. Allowed vaz 242.* @param string $sortDirection The sort direction. Allowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection {.247248-249250-251252 Ф >/*** Retrieve all Ask Ziminny reports created by the given user.* Oparam UserThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun chз. // View Changelog (today 10:33)= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]E console (PROD]A console [EU]AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x © RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceTest extends TestCaseorivate Logger interracexmockobnect slodder9 usagesAl console [STAGING]42 X3 ^orVare AskunlunnvredortActultvservlce servcet29 6t >protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&MockObjectf..78 usagesprivate function makeSavedSearch(array $filters): Search&MockObjectf...}public function testGetActivityIdsForSavedSearchReturnsIds(): voidf...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): voidf...}public function testGetActivityIdsFiltersOutDateFilters(): voidf…..}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandLesArrayFilters(): voidf...}public function testGetActivityIdsHandLesScalarFilters(): voidf...}•public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void$user = $this->makeUser();$savedSearch = $this->makeSavedSearch([]);$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);$this-›activitySearch-›method ( constraint: 'getArrayFilterKeys')->willReturn([]);$capturedCriteria = null;nanu so>acu vvsearch-sexdectsti s-sonce->necno constraind'getOnDemandPageFilterSet')->wil1ReturnCallback(function (Criteria $criteria) use ($FilterSet, &$capturedCriteria) (..3);$this->elasticRepository->method( constraint: 'onDemandSearchIdsOnly')->willReturn([I);$this->logger->method( constraint:'info');$this->service->getActivityIdsForSavedSearch($savedSearch, $user);$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequestO));public function testGetActivitvIdsLoqsWithCorrectContext@: voidf....j Support Daily • in 2h 53 mA100% C•Tue 14 Apr 12:08:00L AskJiminnyReportActivityServiceT...DefaultsCascadetControlleAutomated Report Mar© Fixing Ask Jiminny R+D ..When sequence_number is not in requestParams, the Criteria::createFromkequest ceraunsilo o, ane isrirstrequest returs true when empuy sequenceNumber === 0The frontend URL has sequence_number=4 — meaning it's not a firstrequest. Ine service doesn't serit, so the criteria thinks il's a tirst recuest.wWhen isFirstRequest() = true, these implicit filters are applied thataren tin the saved searen.1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN)- ters ouro-secono calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE =UrloN KecOrDcD — titers to recoraea-onlyOroanzsercroupin — aoolles user's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so itreturns more resuitsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so theImol lcir cerauls con'taoov Oralernarvev alwavs oass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest :Read Criteria.nhoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch metnoe neeas lo oass sequence number witn a non-zero value so tnat 1sFirstRequest() returns false and no implicit defaults are applied.D AskNow let me check if there's an existing test for AskJiminnyReportActivityservice lo upaale.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi...>I need to add a test that verifies sequence _number=1 is passed to Criteria(so isFirstRequest() returns false). Let me add it to the existing test• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:ortS/ ASKJ1mInnyKeDortActivityServiceTest.phpCould not open input file: /var/www/html/artisancommana aockeldoste/ tt/ dovkces/k2o5k/ANPO/app/artisan testomatedReports/AskJiminnyReportActivityServiceTest.phpSkipItlle wiun changesvView all.../Kiosk/AutomatedReports/DAskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasun leamsZ25:10Suir-o( 4 spaces...
|
NULL
|
5084243092035999080
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v• Unit> Actions› D Component› D Configuration> MConsoleM ContractsD DomainODTO• EnumsD Events• ExceptionsO fixtures• HelpersD Http> D Integrations> Minteractions~ D Jobs> M Activitv> D AiAutomation>_ Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeaksks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTestMListeners→]Mal> MModelsNotifications› M Observers[ PoliciesO ProvidersD RepositoriesC RulesServicesC Activity[ ActivityProvidersDJ AvatarcallendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServi© AskJiminnyRepori© AskJiminnyReport© AutomatedReport© ReportController.phpAutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.phpC AutomatedReportsSendCommand.php© Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php© ActivityLogged.phpc) AutomatedRenorscalloackoerwce.onv© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.phpclass AutomatedReportsRepositoryA15 X4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf..}71 8 >/*** Find an automated report by UUID* @param string $uvid100 % >-1171118 ₽ >* @return AutomatedReport/nulz157 8 >public function findByUuid(string $uvid): ?AutomatedReport185 % >return AutomatedReport::where('uvid', AutomatedReport:: toOptim206 8 >225 DTusdyepublic function findBy[dOruuid(string $idoruuid): PAutomatedReport 226if (is_numeric($idOrUuid)) €return AutomatedReport::find((int) $id0rUvid);229230return AutomatedReport: :where('uvid', AutomatedReport:: toOptim/*** Retrieve all standard (non-Ask Jiminny) automated reports.* @param string $sortColumnThe column to sort by. Allowed vaz 242.* @param string $sortDirection The sort direction. Allowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection {.247248-249250-251252 Ф >/*** Retrieve all Ask Ziminny reports created by the given user.* Oparam UserThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasun chз. // View Changelog (today 10:33)= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]E console (PROD]A console [EU]AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x © RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceTest extends TestCaseorivate Logger interracexmockobnect slodder9 usagesAl console [STAGING]42 X3 ^orVare AskunlunnvredortActultvservlce servcet29 6t >protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&MockObjectf..78 usagesprivate function makeSavedSearch(array $filters): Search&MockObjectf...}public function testGetActivityIdsForSavedSearchReturnsIds(): voidf...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): voidf...}public function testGetActivityIdsFiltersOutDateFilters(): voidf…..}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandLesArrayFilters(): voidf...}public function testGetActivityIdsHandLesScalarFilters(): voidf...}•public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void$user = $this->makeUser();$savedSearch = $this->makeSavedSearch([]);$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);$this-›activitySearch-›method ( constraint: 'getArrayFilterKeys')->willReturn([]);$capturedCriteria = null;nanu so>acu vvsearch-sexdectsti s-sonce->necno constraind'getOnDemandPageFilterSet')->wil1ReturnCallback(function (Criteria $criteria) use ($FilterSet, &$capturedCriteria) (..3);$this->elasticRepository->method( constraint: 'onDemandSearchIdsOnly')->willReturn([I);$this->logger->method( constraint:'info');$this->service->getActivityIdsForSavedSearch($savedSearch, $user);$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequestO));public function testGetActivitvIdsLoqsWithCorrectContext@: voidf....j Support Daily • in 2h 53 mA100% C•Tue 14 Apr 12:08:00L AskJiminnyReportActivityServiceT...DefaultsCascadetControlleAutomated Report Mar© Fixing Ask Jiminny R+D ..When sequence_number is not in requestParams, the Criteria::createFromkequest ceraunsilo o, ane isrirstrequest returs true when empuy sequenceNumber === 0The frontend URL has sequence_number=4 — meaning it's not a firstrequest. Ine service doesn't serit, so the criteria thinks il's a tirst recuest.wWhen isFirstRequest() = true, these implicit filters are applied thataren tin the saved searen.1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN)- ters ouro-secono calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE =UrloN KecOrDcD — titers to recoraea-onlyOroanzsercroupin — aoolles user's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so itreturns more resuitsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so theImol lcir cerauls con'taoov Oralernarvev alwavs oass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest :Read Criteria.nhoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch metnoe neeas lo oass sequence number witn a non-zero value so tnat 1sFirstRequest() returns false and no implicit defaults are applied.D AskNow let me check if there's an existing test for AskJiminnyReportActivityservice lo upaale.Explored AskJiminnyReportActivityServiceTest.php and searched AskJi...>I need to add a test that verifies sequence _number=1 is passed to Criteria(so isFirstRequest() returns false). Let me add it to the existing test• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:ortS/ ASKJ1mInnyKeDortActivityServiceTest.phpCould not open input file: /var/www/html/artisancommana aockeldoste/ tt/ dovkces/k2o5k/ANPO/app/artisan testomatedReports/AskJiminnyReportActivityServiceTest.phpSkipItlle wiun changesvView all.../Kiosk/AutomatedReports/DAskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasun leamsZ25:10Suir-o( 4 spaces...
|
11000
|
|
11003
|
217
|
58
|
2026-04-14T09:08:03.619798+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157683619_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v• Unit> Actions› D Component› D Configuration> MConsoleM ContractsD DomainDDTO• EnumsD Events• ExceptionsO fixtures• HelpersD Http> D Integrations> Minteractions~ D Jobs> M Activitv> D AiAutomation>_ Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeak sks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTestMListeners→]Mal> MModelsNotifications› M Observers[ PoliciesO ProvidersD RepositoriesC RulesServicesC Activity[ ActivityProvidersDJ AvatarcallendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServi© AskJiminnyRepori© AskJiminnyReport© AutomatedReport© ReportController.phpAutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.phpC AutomatedReportsSendCommand.php© Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php© ActivityLogged.phpc) AutomatedRenorscalloackoelvice.onv© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.phpclass AutomatedReportsRepositoryA15 X4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf..}71 8 >/*** Find an automated report by UUID* @param string $uvid100 % >-1171118 ₽ >* @return AutomatedReport/null157 8 >public function findByUuid(string $uvid): ?AutomatedReport185 % >return AutomatedReport::where('uvid', AutomatedReport:: toOptim206 8 >225 DTusdyepublic function findBy[dOruuid(string $idoruuid): PAutomatedReport 226if (is_numeric($idOrUuid)) €return AutomatedReport::find((int) $id0rUvid);228229230return AutomatedReport: :where('uvid', AutomatedReport:: toOptim/*** Retrieve all standard (non-Ask Jiminny) automated reports.* @param string $sortColumnThe column to sort by. Allowed vaz 242* @param string $sortDirection The sort direction. Allowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection {.247248-249250-251252 Ф >/*** Retrieve all Ask Ziminny reports created by the given user.* Oparam UserThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasur chз. // View Changelog (today 10:33)= custom.logE laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]Al console [PROD]A console [EU]AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x © RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerIntertace&Mock0bject $logger;9 usagesAl console [STAGING]j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...DefaultsCascadetControlleAutomated Report Mar100% C•Tue 14 Apr 12:08:03O Fixing Ask Jiminny R+D ..42 X3 ^orVare AskunlunnvredortActultvservlce servcet29 6t >protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&MockObjectf..78 usagesprivate function makeSavedSearch(array $filters): Search&MockObjectf...}public function testGetActivityIdsForSavedSearchReturnsIds(): voidf...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): voidf...}public function testGetActivityIdsFiltersOutDateFilters(): voidf...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandLesArrayFilters(): voidf...}public function testGetActivityIdsHandLesScalarFilters(): voidf...}•public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void$user = $this->makeUser();$savedSearch = $this->makeSavedSearch([]);$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);$this-›activitySearch-›method ( constraint: 'getArrayFilterKeys')->willReturn([]);$capturedCriteria = null;nanu so>acu vvsearch-sexdectsti s-sonce->neuno constraint'getOnDemandPageFilterSet')->wil1ReturnCallback(function (Criteria $criteria) use ($FilterSet, &$capturedCriteria) (..3);$this->elasticRepository->method( constraint: 'onDemandSearchIdsOnly')->willReturn([I);$this->logger->method( constraint:'info');$this->service->getActivityIdsForSavedSearch($savedSearch, $user);$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequestO));public function testGetActivitvIdsLoqsWithCorrectContext@: voidf....mkequest deraunsiuto o ane isrirsthequesel returs true when empyvsequenceumber ===The frontend URL has sequence_number=4 - meaning it's not a firstreouest. Ine service doesn't setlt, so te crlterla tninks il's a tirst reouest.When uspurstRequest = true.nese mollcttitersareadole. tnararen't in the saved search.1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN)- Tlters out o-secone calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE =OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so itreturs more resuitsThe fix should be in bui ldrequestParamsFromsearch - it needs to pass sequence_number in the built params to signal "not a first request", so theImplicit deraults dont apoly. or alternatively, always pass a non-zero sequence number In the meroe in detactivitviidsForsaverSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanchtg of isFirstRequest:Read criteria.nnoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch metnoe neeas to pass sequence number with a non-zero value so that 1srurstrequestl rerurns false anc nomolcrcecursarea..leo• AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityservice to updale.Explored AskJiminnvReoortActivtvServicelest.onv and searched Ask.h.I need to add a test that verifies sequence_number=1 is passed to Criteria(so isFirstRequest() returns false). Let me add it to the existing test• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtActivityServiceTest.phpCould not open input file: /var/www/html/artisanartisanieportes AskJiminnyRepoCould not open input file: /app/artisanItlle wiun changesvView all.../Kiosk/AutomatedReports/DAskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (20L)+ <> CodeClaude Sonnet 4.6225:103uir-o( 4 spaces...
|
NULL
|
3803632695952396004
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v• Unit> Actions› D Component› D Configuration> MConsoleM ContractsD DomainDDTO• EnumsD Events• ExceptionsO fixtures• HelpersD Http> D Integrations> Minteractions~ D Jobs> M Activitv> D AiAutomation>_ Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeak sks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTestMListeners→]Mal> MModelsNotifications› M Observers[ PoliciesO ProvidersD RepositoriesC RulesServicesC Activity[ ActivityProvidersDJ AvatarcallendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServi© AskJiminnyRepori© AskJiminnyReport© AutomatedReport© ReportController.phpAutomatedReportsCommand.phpAddLayoutEntities.php© JiminnyDebugCommand.phpC AutomatedReportsSendCommand.php© Team.php© AutomatedReportsRepository.php x© CreateHeldActivityEvent.phpC CreateActivityLoggedEvent.php© ActivityLogged.phpc) AutomatedRenorscalloackoelvice.onv© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.phpAuLomaleakeportkesult.ono© AutomatedReport.phpclass AutomatedReportsRepositoryA15 X4 ^* dreturn AutomatedReportpublic function create(array $data): AutomatedReportf..}71 8 >/*** Find an automated report by UUID* @param string $uvid100 % >-1171118 ₽ >* @return AutomatedReport/null157 8 >public function findByUuid(string $uvid): ?AutomatedReport185 % >return AutomatedReport::where('uvid', AutomatedReport:: toOptim206 8 >225 DTusdyepublic function findBy[dOruuid(string $idoruuid): PAutomatedReport 226if (is_numeric($idOrUuid)) €return AutomatedReport::find((int) $id0rUvid);228229230return AutomatedReport: :where('uvid', AutomatedReport:: toOptim/*** Retrieve all standard (non-Ask Jiminny) automated reports.* @param string $sortColumnThe column to sort by. Allowed vaz 242* @param string $sortDirection The sort direction. Allowed values* drerurn cocuectonsaurondredredor»12 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection {.247248-249250-251252 Ф >/*** Retrieve all Ask Ziminny reports created by the given user.* Oparam UserThe user whose reports to retrieve*oodrdl sarno osorccocuminIne cocuin co sorc ou. Accowed vou* dparam string SsortDirection The sort direction. Allowed valuesWinasur chз. // View Changelog (today 10:33)= custom.logE laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]Al console [PROD]A console [EU]AskJiminnyReportActivityService.php© AskJiminnyReportActivityServiceTest.php x © RequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceTest extends TestCaseprivate LoggerIntertace&Mock0bject $logger;9 usagesAl console [STAGING]j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...DefaultsCascadetControlleAutomated Report Mar100% C•Tue 14 Apr 12:08:03O Fixing Ask Jiminny R+D ..42 X3 ^orVare AskunlunnvredortActultvservlce servcet29 6t >protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject{...}8 usagesprivate function makeUser(): User&MockObjectf..78 usagesprivate function makeSavedSearch(array $filters): Search&MockObjectf...}public function testGetActivityIdsForSavedSearchReturnsIds(): voidf...}public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): voidf...}public function testGetActivityIdsFiltersOutDateFilters(): voidf...}public function testGetActivityIdsFilters0utClosingPeriodDateFilters(): void{...}public function testGetActivityIdsHandLesArrayFilters(): voidf...}public function testGetActivityIdsHandLesScalarFilters(): voidf...}•public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void$user = $this->makeUser();$savedSearch = $this->makeSavedSearch([]);$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);$this-›activitySearch-›method ( constraint: 'getArrayFilterKeys')->willReturn([]);$capturedCriteria = null;nanu so>acu vvsearch-sexdectsti s-sonce->neuno constraint'getOnDemandPageFilterSet')->wil1ReturnCallback(function (Criteria $criteria) use ($FilterSet, &$capturedCriteria) (..3);$this->elasticRepository->method( constraint: 'onDemandSearchIdsOnly')->willReturn([I);$this->logger->method( constraint:'info');$this->service->getActivityIdsForSavedSearch($savedSearch, $user);$this->assertNotNull($capturedCriteria);$this->assertFalse($capturedCriteria->isFirstRequestO));public function testGetActivitvIdsLoqsWithCorrectContext@: voidf....mkequest deraunsiuto o ane isrirsthequesel returs true when empyvsequenceumber ===The frontend URL has sequence_number=4 - meaning it's not a firstreouest. Ine service doesn't setlt, so te crlterla tninks il's a tirst reouest.When uspurstRequest = true.nese mollcttitersareadole. tnararen't in the saved search.1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN)- Tlters out o-secone calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE =OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so itreturs more resuitsThe fix should be in bui ldrequestParamsFromsearch - it needs to pass sequence_number in the built params to signal "not a first request", so theImplicit deraults dont apoly. or alternatively, always pass a non-zero sequence number In the meroe in detactivitviidsForsaverSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanchtg of isFirstRequest:Read criteria.nnoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch metnoe neeas to pass sequence number with a non-zero value so that 1srurstrequestl rerurns false anc nomolcrcecursarea..leo• AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityservice to updale.Explored AskJiminnvReoortActivtvServicelest.onv and searched Ask.h.I need to add a test that verifies sequence_number=1 is passed to Criteria(so isFirstRequest() returns false). Let me add it to the existing test• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:rtActivityServiceTest.phpCould not open input file: /var/www/html/artisanartisanieportes AskJiminnyRepoCould not open input file: /app/artisanItlle wiun changesvView all.../Kiosk/AutomatedReports/DAskJiminnyReportActivityService.php+1 -1Reject allAccept allAsk anything (20L)+ <> CodeClaude Sonnet 4.6225:103uir-o( 4 spaces...
|
NULL
|
|
11005
|
217
|
59
|
2026-04-14T09:08:06.651449+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157686651_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.l0gL SF (iminny@localhostL HS_local fiminny@localhost)& console (PROD]D Unit>DActions> ComponentConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ Helpers•_ Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners© AutomatedReportsCommand.php4 console [EUl4 console [STAGING]© AskJiminnyReportActivityService.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC AskJiminnyReportActivityServiceTest.php *© RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseviavale Loucerencer тaceхmockud cel sroceeln9 usagesA2/3 MV© TrackProviderInstalledEvent.phpc) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php29 @ >(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:> MModelsM Notifications› M ObserversPoliciesProviders→ Repositories> D Rulesv _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServiC Ack.imnnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 M4 . V* dreturn Automatedreportpublic function create(array $data): Automate* rino on qucondred revorr ou vuru* @param string Suuid* dreturn AutomatedReport nullpublic function findbyuuld(string suuld): ?Al2asreturn AutomatedReport::where 'uu1d', AUt2oz157 % >184185 M >DA6VA— 2251 usagepubLic tunction tindby.auruunalscring +1aurut 228ifis numeric($id0rUuidreturn AutomatedReport:: find((int) $1231233return Automatedkeport: :where('uuld", AUt 234235236237* Recrieve alc scandara (non-Ask Jimanny) al24212451*oodrdl sarno osorccocuminThe column cC244* @param string $sortDirection The sort dire 245246* dreturn Collection<AutomatedReport>247_24812 usages249public function getAllStandardReports250string Ssortcolumn ='created_at'251scring ssortbireccion = "desc": Collection {...252 V—214* Retrieve all Ask Jiminny reports created tprivate ASkJ1minnyReportAct1v1tyService sservice:protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject(...}ousadesprivate function makeUser@: User&Mock0biect(...8 usagesprivate function makeSavedSearch(array sfilters): Search&Mock0bject...public function testGetActivityldsForsavedsearchReturnsids: vo1di...лpublic function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void{...}public function testGetActivityIdsFilters0utDateFilters(: voidf...}public function testGetActivitvIdsFilters0utClosingPeriodDateFiltersO: voidf...?public function testGetActivityIdsHandLesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(): void{...}public function testGetActiv1tyldsPassesNonZeroSequenceNumberlob1sabler1rstrequestbefauuts(nuser z sus-snakeuserussavedsearch = schls->makesavedsearcnul.:$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sthis-›activitySearch->method( constraint: 'qetArrayFilterKeys')->willReturn(00:ScapturedCriteria = null;sthis->activ1tysearch->expects(sth1s->once)->method( constraint: 'getonDemandPageFilterset')->WILLReturnCallback(function (Criteria scriteria) use (sfilterset, xcapturedcritSthis-›elasticRepository->method( constraint: 'onDemandSearchIdsOnlv')->willReturn([1):$this->logger->method( constraint:'info');фchus->service->gecaccivicyrasroroavedsearchtesavedsearch, puser):sthis->assertNotNullScapturedCriteria):sthis-›assertFalseScapturedCriteria->isFirstRequest00:public function testGetActivityldsLogsW1thcorrectcontext: vo1di...hWinasur change: Support Daily • in 2h 52 m100% |45]Tue 14 Apr 12:08:06L AskJiminnyReportActivityServiceT….DefaultscaccadeFixing ReportControlleiAutomated Renort MaiFixing Ask Jiminny P+0 .Now nave the key insienu Let me check what sequence nunder coes in tne context or isrirstrequest.Searched isFirstRequest in app/Component/ActivitySearch (*.php) (/)This is the root cause. Let me check ActivityActualDate in detall:Read ActivityActualDate.phNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded detaults for isFirstRequest() :Read ActivitvDuration?Now l have the complete root cause picture. This is critical:Root Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence number=0 implicitly (not in params), which meansisFirstRequest() returns true.When sequence_number is notin requestParams, the Criteria:: createFromRequest detaultsitto 0, and isFirstRequest() returns true when empty llsequenceNumber == 0.The frontend URL has sequence number=4 — meanina it's not a first request. The service doesn't set it. so the criteria thinks it's a first requestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) — filters to recorded-onlyorgannsergroupin — aoolesuser's ceaur orouo titerBut the frontend with sequence number=4 skips all of these defaults, so it returns more resultsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.ASkuIminnvreoonAcuvuservce.onoNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Exolored Ask.liminnvReIneed to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verifyCommand dockeldorker eyer docker lamn 1 nho var ww htmibartican tecttests/unttervices/Klosk/Automatedkenorts/ask.nminnvkenortactiv1tv.ervicellest.oho =-no-coveradeCould not open input file: /var/www/html/artisanCommand docken• docker exerc docker_lantests/Unit/Services/Kjate/aeports/AskJiminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanhloauinaVew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6winasun leamsZ25:10Suir-oia 4 spacesew...
|
NULL
|
5338531742167179584
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.l0gL SF (iminny@localhostL HS_local fiminny@localhost)& console (PROD]D Unit>DActions> ComponentConfigurationM ConsoleM ContractsM DomainD DTO• Enums_ Events_ Exceptions→ fixtures_ Helpers•_ Http>_Integrations> Minteractions• D Jobs> M Activitv> M AiAutomation>_ Audiov _ AutomatedReports©) CreateResultsTest.pl(C) RequestGenerateAs'© RequestGenerateRerC SendReportJobTest.(ch SendRenortMailJobTcallendar!1CrmDeaksksM Mailbox_ Streaming→ Team_ TelephonyU User(c) ImportRecallAlRecordins(c) SqsVisibilityControlTestMListeners© AutomatedReportsCommand.php4 console [EUl4 console [STAGING]© AskJiminnyReportActivityService.php© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpC AskJiminnyReportActivityServiceTest.php *© RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass AskJiminnyReportActivityServiceTest extends TestCaseviavale Loucerencer тaceхmockud cel sroceeln9 usagesA2/3 MV© TrackProviderInstalledEvent.phpc) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php29 @ >(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:> MModelsM Notifications› M ObserversPoliciesProviders→ Repositories> D Rulesv _ Services_ Activity_ ActivityProvidersI IAvatarcallendarConference! CinmiM InternallKioskv _ AutomatedReports©) ActivityTypeServiC Ack.imnnyRepor(c) AskJiminnyRepor(c) AutomatedRenonA15 M4 . V* dreturn Automatedreportpublic function create(array $data): Automate* rino on qucondred revorr ou vuru* @param string Suuid* dreturn AutomatedReport nullpublic function findbyuuld(string suuld): ?Al2asreturn AutomatedReport::where 'uu1d', AUt2oz157 % >184185 M >DA6VA— 2251 usagepubLic tunction tindby.auruunalscring +1aurut 228ifis numeric($id0rUuidreturn AutomatedReport:: find((int) $1231233return Automatedkeport: :where('uuld", AUt 234235236237* Recrieve alc scandara (non-Ask Jimanny) al24212451*oodrdl sarno osorccocuminThe column cC244* @param string $sortDirection The sort dire 245246* dreturn Collection<AutomatedReport>247_24812 usages249public function getAllStandardReports250string Ssortcolumn ='created_at'251scring ssortbireccion = "desc": Collection {...252 V—214* Retrieve all Ask Jiminny reports created tprivate ASkJ1minnyReportAct1v1tyService sservice:protected function setUp(): void{...}11 usagesprivate function makeFilter(string $key, ?string $value): SearchFilter&Mock0bject(...}ousadesprivate function makeUser@: User&Mock0biect(...8 usagesprivate function makeSavedSearch(array sfilters): Search&Mock0bject...public function testGetActivityldsForsavedsearchReturnsids: vo1di...лpublic function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void{...}public function testGetActivityIdsFilters0utDateFilters(: voidf...}public function testGetActivitvIdsFilters0utClosingPeriodDateFiltersO: voidf...?public function testGetActivityIdsHandLesArrayFilters(): void{...}public function testGetActivityIdsHandlesScalarFilters(): void{...}public function testGetActiv1tyldsPassesNonZeroSequenceNumberlob1sabler1rstrequestbefauuts(nuser z sus-snakeuserussavedsearch = schls->makesavedsearcnul.:$filterSet = $this->createMock( originalClassName: FilterDefinitionCollection::class);sthis-›activitySearch->method( constraint: 'qetArrayFilterKeys')->willReturn(00:ScapturedCriteria = null;sthis->activ1tysearch->expects(sth1s->once)->method( constraint: 'getonDemandPageFilterset')->WILLReturnCallback(function (Criteria scriteria) use (sfilterset, xcapturedcritSthis-›elasticRepository->method( constraint: 'onDemandSearchIdsOnlv')->willReturn([1):$this->logger->method( constraint:'info');фchus->service->gecaccivicyrasroroavedsearchtesavedsearch, puser):sthis->assertNotNullScapturedCriteria):sthis-›assertFalseScapturedCriteria->isFirstRequest00:public function testGetActivityldsLogsW1thcorrectcontext: vo1di...hWinasur change: Support Daily • in 2h 52 m100% |45]Tue 14 Apr 12:08:06L AskJiminnyReportActivityServiceT….DefaultscaccadeFixing ReportControlleiAutomated Renort MaiFixing Ask Jiminny P+0 .Now nave the key insienu Let me check what sequence nunder coes in tne context or isrirstrequest.Searched isFirstRequest in app/Component/ActivitySearch (*.php) (/)This is the root cause. Let me check ActivityActualDate in detall:Read ActivityActualDate.phNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded detaults for isFirstRequest() :Read ActivitvDuration?Now l have the complete root cause picture. This is critical:Root Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence number=0 implicitly (not in params), which meansisFirstRequest() returns true.When sequence_number is notin requestParams, the Criteria:: createFromRequest detaultsitto 0, and isFirstRequest() returns true when empty llsequenceNumber == 0.The frontend URL has sequence number=4 — meanina it's not a first request. The service doesn't set it. so the criteria thinks it's a first requestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) — filters to recorded-onlyorgannsergroupin — aoolesuser's ceaur orouo titerBut the frontend with sequence number=4 skips all of these defaults, so it returns more resultsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.ASkuIminnvreoonAcuvuservce.onoNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Exolored Ask.liminnvReIneed to add a test that verifies sequence number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.phpNow let's run the test to verifyCommand dockeldorker eyer docker lamn 1 nho var ww htmibartican tecttests/unttervices/Klosk/Automatedkenorts/ask.nminnvkenortactiv1tv.ervicellest.oho =-no-coveradeCould not open input file: /var/www/html/artisanCommand docken• docker exerc docker_lantests/Unit/Services/Kjate/aeports/AskJiminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanhloauinaVew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6winasun leamsZ25:10Suir-oia 4 spacesew...
|
11003
|
|
11007
|
217
|
60
|
2026-04-14T09:08:15.141098+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157695141_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
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
<?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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7589844,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceT…Defaults","depth":6,"bounds":{"left":0.7769531,"top":0.017361112,"width":0.12382813,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.940625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.575,"top":0.10902778,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.58671874,"top":0.10902778,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.5980469,"top":0.10763889,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.60664064,"top":0.10763889,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.2589844,"top":0.28125,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.27265626,"top":0.28125,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.28398436,"top":0.27986112,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.29257813,"top":0.27986112,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.084027775,"width":0.39882812,"height":0.91597223},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4526339401913685350
|
-8276790037575160400
|
click
|
accessibility
|
NULL
|
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
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
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
<?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...
|
NULL
|
|
11008
|
217
|
61
|
2026-04-14T09:08:15.913338+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157695913_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFV faVsco.s vProject vEditViewNavigate PhpStormFileFV faVsco.s vProject vEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on JY-18909-automated-reports-ask-jiminny k ~© ReportController.php© JiminnyDebugCommand.php© AutomatedReportsCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]• Unit> Actions› D ComponentConfigurationO ConsoleM ContractsM DomainDDTO• EnumsD Events• ExceptionsO fixtures• Helpers©Http> D Integrations> MinteractionsMJobs> M Activitv> D AiAutomation> D Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeaksks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTest> D Listeners→]Mal> MModelsNotifications› M ObserversOPolicies› Providers> DJ Repositories> D Rules~ D Services[ Activity[ ActivityProvidersD AvatarD CalendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServiC Ack.iminyReport© AskJiminnyReport© AutomatedReport< console EUiconsole SlAGiNGAskJiminnykeporlAcuivilyservice.ong x© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceActivityUpdatedDate::PARAM_UPDATED_FROM,ActivityUpdatedDate: :PARAM_UPDATED_TO,© TrackProviderInstalledEvent.phpClosingPeriodFilter::KEY_START_DATE,© CreateActivityLoggedEvent.php© UserPilotActivityListener.phpClosingPeriodFilter::KEY_END_DATE,(©) ActivityLogged.php];AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V.4 ^1 usagepublic function __construct(private readonly ActivitvSearch SactivitvSearch.privace readonty clasticacciуiсукерosсогy фelаsсскерosiсory.private readonly LoggerInterface $logger,D4...3* Oreturn AutomatedReportpublic function create(array $data): Automate/*** Find an automated report by UUID* @param string $uvid* Oreturn AutomatedReport|null46public function findByUuid(string $uvid): ?ALreturn AutomatedReport: :where('uvid', Aut1 usagepublic function findById0rUuid(string $id0rtt 51if (is_numeric($id0rUuid)) {53return AutomatedReport:: find((int) $154return AutomatedReport: :Where('uvid', Aut57/*** Retrieve all standard (non-Ask Liminny) al 61* oodral sarno osorccocunnThe column t( 63* @param string $sortDirection The sort dire64* Oreturn Collection<AutomatedReport>66_6712 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection f.+/*** Retrieve all Ask Liminny reports created k74* 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 behavioun of getContextForAskAnythingByFilte* Creturn string[] Activity IDs14 usagespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array &$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequestCAcceptmargee €$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()$filterSet = $this->activitySearch->get0nDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskJiminnyReport] Fetched activity IDs for saved search', ['saveo search 10'> $savedSearch->getId(),'user_id' => Suser-›getId@,'activity_count' => count($activityIds),1):return $activityIds;1 usageprivate function buildRequestParamsFromSearch(Search $savedSearch,User $user): array$params = [];nanravnurerkeys = nus-racau toearci-poerArravrturerkeys userrforeach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPronertvO:$value = $Filter->getFhlt.X Reject File 0* €Winasur changeSupport Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:15CascadeFixing ReportControllerAutomated Report Mar• Fixing Ask Jiminny RNow nave the key insienu Let me check what sequence nunder coes in tne context or isrirstrequest.+D ...eSearched isFirstRequest in app/Component/ActivitySearch (-php) (7)This is the root cause. Let me check ActivityActualDate in detail:Read ActivNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :Read ActivitvDuration?Now I have the complete root cause picture. This is critical:wRoot Cause FoundThe rs eResti) elinas tr8eaFromSearch method in AskJiminnyReportActivityService passes sequence_number=0 implicitly (not in params), which meansWhen sequence_number is not in requestParams, the Criteria:: createFromRequest defaults it to 0, and isFirstRequest() returns true when empty 11sequenceNumber == 0.The frontend URL has sequence number=4 — meanina it's not a first request. The service doesn't set it. so the criteria thinks it's a first reguestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-onlyorgannsergroupin — aoolesuser's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.ASkJIminnvreoorAc.Vivservice.onoNow let me check T there's an existine lesttor AskJiminnykeportaccivicyservice lo uodale:Exolored Ask.liminnvReI need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:Command dockeldocker exec docker lamp 1 php /var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /var/www/html/artisanCommand dockerodoste/une/ervaces/KJosk/AuF omaate/aeports/AskJiminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisannavicaunohVew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasun leamsb8: /ob chars, 23 line breaksuir-o( 4 spaces...
|
NULL
|
5324824059177070058
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFV faVsco.s vProject vEditViewNavigate PhpStormFileFV faVsco.s vProject vEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on JY-18909-automated-reports-ask-jiminny k ~© ReportController.php© JiminnyDebugCommand.php© AutomatedReportsCommand.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]• Unit> Actions› D ComponentConfigurationO ConsoleM ContractsM DomainDDTO• EnumsD Events• ExceptionsO fixtures• Helpers©Http> D Integrations> MinteractionsMJobs> M Activitv> D AiAutomation> D Audiov D AutomatedReports© CreateResultsTest.pl© RequestGenerateAskC RequestGenerateRerC SendReportJobTest.© SendReportMailJobTcallendar!1CrmDeaksks• MailboxD StreamingD Team• TelephonyD User© ImportRecallAlRecording© SqsVisibilityControlTest> D Listeners→]Mal> MModelsNotifications› M ObserversOPolicies› Providers> DJ Repositories> D Rules~ D Services[ Activity[ ActivityProvidersD AvatarD CalendarConference! Cinmi[ InternalD Kioskv _ AutomatedReports© ActivityTypeServiC Ack.iminyReport© AskJiminnyReport© AutomatedReport< console EUiconsole SlAGiNGAskJiminnykeporlAcuivilyservice.ong x© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.phpclass AskJiminnyReportActivityServiceActivityUpdatedDate::PARAM_UPDATED_FROM,ActivityUpdatedDate: :PARAM_UPDATED_TO,© TrackProviderInstalledEvent.phpClosingPeriodFilter::KEY_START_DATE,© CreateActivityLoggedEvent.php© UserPilotActivityListener.phpClosingPeriodFilter::KEY_END_DATE,(©) ActivityLogged.php];AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedkeportskepo ofA15 V.4 ^1 usagepublic function __construct(private readonly ActivitvSearch SactivitvSearch.privace readonty clasticacciуiсукерosсогy фelаsсскерosiсory.private readonly LoggerInterface $logger,D4...3* Oreturn AutomatedReportpublic function create(array $data): Automate/*** Find an automated report by UUID* @param string $uvid* Oreturn AutomatedReport|null46public function findByUuid(string $uvid): ?ALreturn AutomatedReport: :where('uvid', Aut1 usagepublic function findById0rUuid(string $id0rtt 51if (is_numeric($id0rUuid)) {53return AutomatedReport:: find((int) $154return AutomatedReport: :Where('uvid', Aut57/*** Retrieve all standard (non-Ask Liminny) al 61* oodral sarno osorccocunnThe column t( 63* @param string $sortDirection The sort dire64* Oreturn Collection<AutomatedReport>66_6712 usagespublic function getAllStandardReports(string $sortColumn ='created_at',string $sortDirection = 'desc'): Collection f.+/*** Retrieve all Ask Liminny reports created k74* 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 behavioun of getContextForAskAnythingByFilte* Creturn string[] Activity IDs14 usagespublic function getActivityIdsForSavedSearchCSearch $savedSearch,User $user,): array &$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);$criteria = Criteria::createFromRequestCAcceptmargee €$requestParams,['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'array_merge($requestParams, ['limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT, 'page'$user->getTimezone()$filterSet = $this->activitySearch->get0nDemandPageFilterSet($criteria, $user);$activityIds = $this->elasticRepository->onDemandSearchIds0nly($user, $criteria, $filter$this->logger→>info('[AskJiminnyReport] Fetched activity IDs for saved search', ['saveo search 10'> $savedSearch->getId(),'user_id' => Suser-›getId@,'activity_count' => count($activityIds),1):return $activityIds;1 usageprivate function buildRequestParamsFromSearch(Search $savedSearch,User $user): array$params = [];nanravnurerkeys = nus-racau toearci-poerArravrturerkeys userrforeach ($savedSearch->getFilters() as $filter) {$key = $filter->getFilterPronertvO:$value = $Filter->getFhlt.X Reject File 0* €Winasur changeSupport Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:15CascadeFixing ReportControllerAutomated Report Mar• Fixing Ask Jiminny RNow nave the key insienu Let me check what sequence nunder coes in tne context or isrirstrequest.+D ...eSearched isFirstRequest in app/Component/ActivitySearch (-php) (7)This is the root cause. Let me check ActivityActualDate in detail:Read ActivNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :Read ActivitvDuration?Now I have the complete root cause picture. This is critical:wRoot Cause FoundThe rs eResti) elinas tr8eaFromSearch method in AskJiminnyReportActivityService passes sequence_number=0 implicitly (not in params), which meansWhen sequence_number is not in requestParams, the Criteria:: createFromRequest defaults it to 0, and isFirstRequest() returns true when empty 11sequenceNumber == 0.The frontend URL has sequence number=4 — meanina it's not a first request. The service doesn't set it. so the criteria thinks it's a first reguestWhen isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-onlyorgannsergroupin — aoolesuser's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.ASkJIminnvreoorAc.Vivservice.onoNow let me check T there's an existine lesttor AskJiminnykeportaccivicyservice lo uodale:Exolored Ask.liminnvReI need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:AskJiminnyReportActivityServiceTest.phpNow let's run the test to verify:Command dockeldocker exec docker lamp 1 php /var/www/html/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /var/www/html/artisanCommand dockerodoste/une/ervaces/KJosk/AuF omaate/aeports/AskJiminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisannavicaunohVew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6winasun leamsb8: /ob chars, 23 line breaksuir-o( 4 spaces...
|
11007
|
|
11011
|
217
|
62
|
2026-04-14T09:08:18.960813+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157698960_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.loge SF (iminny@localhostL HS_local fiminny@localhost)& console (PROD]AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M MailMeetingGenerator> Notification→0Auth2RecallAl_ Security_ StrategyStreamingeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpC IntercomService.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohpC) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.C PlaylistGeneratorinterface.(C) ResolveTeamCrmConnecti© SimpleThrottleService.php© slackservice.phpC) SocialAccountService.phnC) SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.phpC) Uuid.php> D Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.php(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php© AutomatedReportsCommand.php< console LUlconsole SlAGiNGAskJiminnykepor Acuivilyservice.ono x© AutomatedReportsSendCommand.php© AddLayoutEntities.phpC AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.php<?php(©) Team.php(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php(©) CreateActivityLoggedEvent.phpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.phpC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 V.4 ^* dreturn Automatedreportpublic function create(array $data): Automatee* Find an automated report bu UUID* dparam string Suuid* dreturn AutomatedReport null22public function findbyuuld(string suuid): ?Alreturn AutomatedReport::where('uuld', Aut-261 usagepublic function findByTdOrUuid string Sidorttifis numeric($id0rUuidreturn AutomatedReport: :Jind((Int) $I31return Automatedkeport: :where ("uuid", Autze* ketrieve alt standara (hon ask min e*oodrdl sarno osorccocuminThe coLumn 41*dearal string ssortosrection the sort dare 42* dreturn Collection<AutomatedReport>-4412 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at',scring ssortbireccion = "desc"CoLlectlon t...—46—4%* Retrieve all Ask Jiminny reports created tWinasurt changelog 2.12.21: A new version is avallable. # View Changelog (today 10:33,declare(strict_types=l):nanespace Jamunny servaces Klosk Autonareokedorts.luse smunny Lonoonen Acewtsearch rurerverin cion AcauvActuauuairenuse 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 Useruse Jiminny Repos1tor1es Elast1cAct1v1tyRepos1tory:use Jiminny vu keposttory\unbemandaculVitysearcn criteria;use PsryLog Loggerintertace;8 usagesclass AskJiminnyReportActivityServicecascade "tlCommand&Tusageprivate const int DEFAULT TOP ACTIVITIES COUNT = 100:1 usageprivate const array [ENV_SECRET],ACCIVItyACCUaLDaCe: :PARAM_END_DATEAcuIvityupdacedbace::PARAN_UPDATEU_FRON,ACuNLTVUDOareOUaTe::PAKAM UPUAIEU 10.Llosingrertoaricter..ner_orAKl_bAle,Losnoreroortuterxer Nu DAne.1:1 usagepublic function __constructlprivate readonly Activitysearch sactivitysearchprivate readonly ElasticActivityRepos1tory selasticrepositoryprivate readonly Loggerintertace slogger,) 1..3xx* Fetch activitu IDs for a saved search. passina 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 getActivityldsForsavedsearchsearch ssavedsearch,user suser): array {nreouestrarallis = us-70uloke.uestraraisrrolbearchosaveooearchr suserorScriteria = Criteria::createFromRequest(AccepuRenectsrequescrarams,L'LInit => seLt::UEFAULI_TUP_ACTIVITLES_CUUNl,array_merge ($redJestPaYaV Accept File &-X-Reject File #33T0P ACTTVITTES COUNTa Support Daily • in 2h 52 m100% |45]Tue 14 Apr 12:08:18L AskJiminnyReportActivityServiceT….DefaultsCascadeFixing ReportControlleAutomated Report MaiFixing Ask Jiminny P+D ...Now l see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest():kead Activityduradionkange.ono ana Acuivitykecorded.onpNow have the comolete root cause victure. This is critical.Root Cause FoundIhe bui LakequestParamstromsearch method in AskuaminnykeportActivityservice passes sequence_number= Implicitly (not in params), Wnich meansisFirstRequest( returns trueWhen sequence number is notin reguestParams, the Criteria:: createFromRequest defaultsitto 0,and isFirstRequest() returns true when empty 1lsequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - Tilters to recorded-only3. OrganiserGroupIn - applies user's default group filterburtne Tronteno Wiun sequence numberza skiosal or nese cecurs, so trerurns more resuisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Read Ask.liminnvRenortActivitvService.nno #44-93Now let me verity my understanding of isFirstRequest:Read Criteria.phpConfirmed. The fix is clear and minimal. The getAct.ivitvIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:=xo oree ASkJlminnvkeImeed oraddan est narevermes seouence numberel stoassed orusenrsossanis keqesiao recumns ta lseo. cemerado onnerex stino estaile• AskJiminnyReportActivityServicelest.phpNow let's run the test to verify:Command dockerdesks/uext/sdrvkces/K10sk/Automate/mep/rts/Asktiman yespcomaceareports/ AskJiminnyreportaccivityservicelest.ono =-no-coveraacould not open input tile: /var/www/html/artisanCommand dockero teste/unxt/ drvaees/Ko5k/Autonate/aeports/ASk3-1minnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerdesker ext/ drvkees/K1osk /AusonatedReports/AskJiminnvReportActivitvServiceTest,php --no-coverage 2>61'sallineVew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sonnet 4.6winasun leams1/:l2046 chars, /s line breaksuir-oia 4 spacesew...
|
NULL
|
-6507571708961195058
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ReportController.php© JiminnyDebugCommand.php= custom.log= laravel.loge SF (iminny@localhostL HS_local fiminny@localhost)& console (PROD]AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M MailMeetingGenerator> Notification→0Auth2RecallAl_ Security_ StrategyStreamingeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpC IntercomService.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohpC) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.C PlaylistGeneratorinterface.(C) ResolveTeamCrmConnecti© SimpleThrottleService.php© slackservice.phpC) SocialAccountService.phnC) SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.phpC) TranscodeParameterResolC UserService.phpC) Uuid.php> D Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.php(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php© AutomatedReportsCommand.php< console LUlconsole SlAGiNGAskJiminnykepor Acuivilyservice.ono x© AutomatedReportsSendCommand.php© AddLayoutEntities.phpC AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.php<?php(©) Team.php(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php(©) CreateActivityLoggedEvent.phpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.phpC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 V.4 ^* dreturn Automatedreportpublic function create(array $data): Automatee* Find an automated report bu UUID* dparam string Suuid* dreturn AutomatedReport null22public function findbyuuld(string suuid): ?Alreturn AutomatedReport::where('uuld', Aut-261 usagepublic function findByTdOrUuid string Sidorttifis numeric($id0rUuidreturn AutomatedReport: :Jind((Int) $I31return Automatedkeport: :where ("uuid", Autze* ketrieve alt standara (hon ask min e*oodrdl sarno osorccocuminThe coLumn 41*dearal string ssortosrection the sort dare 42* dreturn Collection<AutomatedReport>-4412 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at',scring ssortbireccion = "desc"CoLlectlon t...—46—4%* Retrieve all Ask Jiminny reports created tWinasurt changelog 2.12.21: A new version is avallable. # View Changelog (today 10:33,declare(strict_types=l):nanespace Jamunny servaces Klosk Autonareokedorts.luse smunny Lonoonen Acewtsearch rurerverin cion AcauvActuauuairenuse 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 Useruse Jiminny Repos1tor1es Elast1cAct1v1tyRepos1tory:use Jiminny vu keposttory\unbemandaculVitysearcn criteria;use PsryLog Loggerintertace;8 usagesclass AskJiminnyReportActivityServicecascade "tlCommand&Tusageprivate const int DEFAULT TOP ACTIVITIES COUNT = 100:1 usageprivate const array [ENV_SECRET],ACCIVItyACCUaLDaCe: :PARAM_END_DATEAcuIvityupdacedbace::PARAN_UPDATEU_FRON,ACuNLTVUDOareOUaTe::PAKAM UPUAIEU 10.Llosingrertoaricter..ner_orAKl_bAle,Losnoreroortuterxer Nu DAne.1:1 usagepublic function __constructlprivate readonly Activitysearch sactivitysearchprivate readonly ElasticActivityRepos1tory selasticrepositoryprivate readonly Loggerintertace slogger,) 1..3xx* Fetch activitu IDs for a saved search. passina 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 getActivityldsForsavedsearchsearch ssavedsearch,user suser): array {nreouestrarallis = us-70uloke.uestraraisrrolbearchosaveooearchr suserorScriteria = Criteria::createFromRequest(AccepuRenectsrequescrarams,L'LInit => seLt::UEFAULI_TUP_ACTIVITLES_CUUNl,array_merge ($redJestPaYaV Accept File &-X-Reject File #33T0P ACTTVITTES COUNTa Support Daily • in 2h 52 m100% |45]Tue 14 Apr 12:08:18L AskJiminnyReportActivityServiceT….DefaultsCascadeFixing ReportControlleAutomated Report MaiFixing Ask Jiminny P+D ...Now l see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest():kead Activityduradionkange.ono ana Acuivitykecorded.onpNow have the comolete root cause victure. This is critical.Root Cause FoundIhe bui LakequestParamstromsearch method in AskuaminnykeportActivityservice passes sequence_number= Implicitly (not in params), Wnich meansisFirstRequest( returns trueWhen sequence number is notin reguestParams, the Criteria:: createFromRequest defaultsitto 0,and isFirstRequest() returns true when empty 1lsequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - Tilters to recorded-only3. OrganiserGroupIn - applies user's default group filterburtne Tronteno Wiun sequence numberza skiosal or nese cecurs, so trerurns more resuisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Read Ask.liminnvRenortActivitvService.nno #44-93Now let me verity my understanding of isFirstRequest:Read Criteria.phpConfirmed. The fix is clear and minimal. The getAct.ivitvIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no implicit defaults are applied.AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:=xo oree ASkJlminnvkeImeed oraddan est narevermes seouence numberel stoassed orusenrsossanis keqesiao recumns ta lseo. cemerado onnerex stino estaile• AskJiminnyReportActivityServicelest.phpNow let's run the test to verify:Command dockerdesks/uext/sdrvkces/K10sk/Automate/mep/rts/Asktiman yespcomaceareports/ AskJiminnyreportaccivityservicelest.ono =-no-coveraacould not open input tile: /var/www/html/artisanCommand dockero teste/unxt/ drvaees/Ko5k/Autonate/aeports/ASk3-1minnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerdesker ext/ drvkees/K1osk /AusonatedReports/AskJiminnvReportActivitvServiceTest,php --no-coverage 2>61'sallineVew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (&+L)+ ‹> CodeClaude Sonnet 4.6winasun leams1/:l2046 chars, /s line breaksuir-oia 4 spacesew...
|
NULL
|
|
11013
|
217
|
63
|
2026-04-14T09:08:22.537545+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157702537_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
PhpStormFileFditViewNavig Project: faVsco.js, menu
PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vc) ReportController.onp© JiminnyDebugCommand.php= custom.log= laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]AutomatedReports(C) ActivityTypeService.(C AskJiminnyReportAc(C) AutomatedReportse(C) AutomatedReportsS© DealStagesService.p© Recipientsservice.pr@ Reportsort.php(e) Reporisonbirection.Kloskservice.php> M MailMeetingGenerator› Notification→0Auth2l RecallAl_ Security_ Strategy_ StreamingeamTelephonyM UserPilotM Webhook© AbstractService.php© ActivityProviderFactory.phC) ActivityService.phpC ApiResponseService.php(C) ConferenceService.php© InsightSeatService.php© InstantMeetingService.phpC IntercomService.php© IpapiClient.phpC) IpapiService.phpC) ParticioantShareService.phC PlanhatService.ohp(C) PlaybackService.php(C PlaybackVideoOnlyService(C) PlaybookCategoryService.lC PlaylistGeneratorinterface(C) ResolveTeamCrmConnectiC SimpleThrottleService.php© SlackService.phpC) SocialAccountService.phnC) SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php(C) TeamService.php(C) TranscodeParameterResolC UserService.phpC) Uuid.php> D Traits• → UseCases> D UserDUtils• I validation•IV0pnp nelpers.php(C InitialFrontendState.php(©) Jiminny.php(C) Plan.php© AutomatedReportsCommand.php< console EUi4 console [STAGING]AskJiminnykeporAcuivilyservice.ong x© AutomatedReportsSendCommand.phpC AddLayoutEntities.phpCh Ask.JiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.php(C) Team.php(©) AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php© TrackProviderInstalledEvent.php(©) CreateActivityLoggedEvent.phpC UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.phpC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 V.4 ^* dreturn Automatedreportpublic function create(array $data): Automat: 27* Find an automated report bu UUID* @param string Suuid32* dreturn AutomatedReport nullpublic function findByUuid(string $uuid): ?A136return AutomatedReport::where('uvid', Aut38—391 usagepublic function findByTdOrUuidstring $id0rüt 42ifis numeric($id0rUuidreturn AutomatedReport:: find((int) $j44return AutomatedReport::where('uu1d', AUt41* Recrieve alc scandara (non-Ask Jiminny) al*oodrdl sarno osorccocuminThe column to*dearal string ssortosrection the sort dare* dreturn Collection<AutomatedReport>— 5612 usagespublic function getAllStandardReportsstring ssortcolumn = 'created_at',scring ssortbireccion = "desc"CoLlectlon t...use PsryLog Loggerintertace;o usagesclass AskJiminnyReportActivityService—585960— 6173* Retrieve all Ask Jiminny reports created t°3Winasurt changelog 2.12.21: A new version is avallable. # View Changelog (today 10:33,lusaeeprivate const int DEFAULT_TOP_ACTIVITIES_COUNT = 100:1 usageprivate const array [ENV_SECRET],ACuIVItyACcUaLbaCe::PARAM_END_DAIEActivitvUodatedDate::PARAM UPDATED FROM.IActivityUodatedDate::PARAM UPDATED TO.Extract SurroundClosingPeriodFilter::KEY START DATE.closinorer1ouriuter..kcrcNu DAlc,]:1 usagepublic function -_constructlprivate readonly Activitysearch Sactivitysearch.private readonly ElasticActivitykeposicory selasclckepos1tory.private readonly Loggerintertace slogger,) 4.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 stringl. Activity Ibs*/14 usagespublic function getActivityIdsForSavedSearch(search ssavedsearch,user puser,): array €mrecuestraralis = ms-70ucokecuestraraliisrrolbearcilnsaveosearchrouserorScriteria = Criteria::createFromRequestAccepuRenect,requescrarams, L'uImit => seLt:: DEFAULI_TUP_ACTIVITLES_CUUNI, 'page" =array_mergelsrequescraramsL" L1n1u => SeLT::DEFAULI_10P_ACIIVLILES_COUN/.page" Fpuser-›geclimezone)$filterSet = $this->activitvSearch->aetOnDemandPaaefilterSet(Scriteria,l suser):SactivityIds = sthis->elasticRepository->onDemandSearchIds0nlySuser, Scriteria, sfilter$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [saved_search_1d => $savedsearch->getid(),'user_1d => suser->getia),'activity count'=> count(sactivitylds),1):notiinn santivit!/ Accept File &+X Reject File 1 38 €a Support Daily • in 2h 52 mA100% [2Tue 14 Apr 12:08:22L AskJiminnyReportActivityServiceT….DefaultsCascadeFixing ReportControlleiAutomated Report Mai© Fixing Ask Jiminny PNow l see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest():kead Activityduradionkange.ono ana Acuivitykecorded.onpNow |have the comolete root cause picture. This is critica.Root Cause FoundIDtemItoke a est atans aion eaTdi me oe inTASKE iVKeDOT VATa owat vservceloassies sequence numberemolcuvaino Uht oalamsirWnlIchImeahsisFirstRequest() returns trueWhen sequence number is notin requestParams, the Criteria:: createFromRequest defaultsitto 0,and isFirstRequest() returns true when empty 1lsequenceNumber == 0.The frontend URL has sequence number=4 - meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterburthe Tronteno Wiun sequence numberza skiosalll or nese ceaurs so trerurns more resuisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitderauts dont agoy. Ur alernatvely, always gass a nohzzero sequence nunder in the mergein detactlvltysastorsavedsearchh.Now let me verify my understanding of isFirstRequest :Read Criteria.phpCoimeor inenxasteea alnlalr lnel e Ata ewhwsorveseananme noo eeust olass sequence number winrnonzzero value sonnaleisiauistRequest() returns false and no implicit defaults are applied.• AskJiminnyReportA÷1-1|Now let me check if there's an existing test for AskJiminnyReportActivityService to update:=xolore. Ask.iminnvreoonActvivserviceles.ono and searche. Ask./lminnvreoor Acuvi"Interecnoraodrn (est anaevernes sequence numbere stoasseo oluieme sossanske esdo euns a seonre merdcueonerex sie estanteAskJiminnvrepor.acuvilyserMcerest.onpNow let's run the test to verify:tests/unxt/sdrvkces/K105k/Automatr/mep/rts/Asktiman yRsportActivityserviceTest php --no-coverageCould not open input Tile: /var/www/html/artisancommana aockelteste/unit/Serutces/x4psk/AutofaperBenosts/Ask1iminnvReportActivitvServiceTest.pho eeno-coveraaetests/Unit/Services/KidLoula nor open Inpuc Tile: app arcisanCommand dockerewnnvrevortAcnvtsercel estono =-no-coverade zolItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (&+L)+ <> Code Claude Sonnet 4.6Run &&+SkipVew allliReject allAccept allW Windsur leams24:49uir-oia 4 spaces...
|
11011
|
|
11015
|
217
|
64
|
2026-04-14T09:08:27.844439+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157707844_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelpD AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph® ReportSort.php(e) Reporisonbirection.Kloskservice.php> M Mail• MeetingGenerator> D NotificationD OAuth2D RecallAl[ SecurityC StrategyStreamingD TeamTelephonyUserPilotM Webhook© AbstractService.php© ActivityProviderFactory.ph|© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php©IntercomService.php©IpapiClient.php©IpapiService.php© ParticipantShareService.ph© PlanhatService.php© PlaybackService.phpPlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php©TeamService.php© TranscodeParameterResol© UserService.php© Uuid.php› D Traits› D UseCases> D UserDUtils• I validation•IV0pnp nelpers.pngInitialFrontendState.php© Jiminny.php© Plan.php© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]© AskJiminnyReportActivityService.phpA console [PROD]© ActivitySearch.php x< console LUlconsole SlAGiNG© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.php© Team.php© AutomatedReportsRepository.php X<?php© AutomatedReportsService.phpC CreateHeldActivityEvent.phpRequestGenerateAskJiminnyReportJobTest.phpdeclare(strict_types=1);(e TrackProvidernstallled-vent.ononanespace Jamunny conoonent Acuvurvsearchservice.© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpuseclass ActivitySearchclass Automacedкeрortskepo o:A15 X.4 A* Oreturn AutomatedReportpublic function create(array $data): Automate1073536/*** Find an automated report by UUID109110* @param string $uvid* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115116return AutomatedReport: :where('uvid', Aut1181 usage47pubLie tunction tinabytaurousdlstring eiaurul 136if (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]198return AutomatedReport: :where('uvid', Aut19920057* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column t 234* Oparam string $sortDirection The sort dir 235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}245—246247124873/**L07* Retrieve all ASK Lininny reports created k260Windsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)7 usagesprivate Container $container;public function __construct(Container $container){.}public function getOnDemandPageFilters(): FilterDefinitionCollectionf...}public function |getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDe@andPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):1 usagepublic function getArrayFilterKeys(User $consumer): array{...;1 usageprivate function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollec1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.booL +includeripeline - Talse.): FilterDefinitionCollection {..}public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}1 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerj Support Daily • in 2h 52mAL AskJiminny ReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:08:27CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny RNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :kead Activityduradionkange.ono ana Acuivitykecorded.onp+D..eNow |have the comolete root cause picture. This is criticaliwRoot Cause FoundIDtemItoke a est atans aion eaTdi me oe inTASKE iVKeDOT VATa owat vservceloassies sequence numberemolcuvaino Uht oalamsirWnlIchImeahsisFirstRequest() returns true.When sequence number is notin requestParams, the Criteria:: createFromRequest defaultsit to 0,and isFirstRequest() returns true when empty 1lsequenceNumber ==0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterDurtne Tronteno Wiun sequence numberzs sklos alll or tnese ceaulis, sotrerurns more resuiisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest:Read Criteria.phpCoimeor inenxasteea alnlalr lnel e Ata ewhwsorveseananme noo eeust olass sequence number winrnonzzero value sonnaleisiauistRequest() returns false and no implicit defaults are applied.D AskJiminnyReportAo+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:=xolore. Ask.iminnvreoorActvivserviceles.ono and searchee Ask/lminnvreoor AcuviwInterecnoraodrn (est anaevernes sequence numbere stoasseo oluieme sossanske esdo euns a seonre merdcueonerex sie estanteAskJiminnvrepor.acuvilyserMcerest.onpNow let's run the test to verify:tests/unxt/sdrvkces/K105k/Automatr/mep/rts/Asktiman yRsportActivityserviceTest php --no-coverageCould not open input file: /var/www/html/artisancommana aockeldests/untt/servkces/Kiosk/Automatedkeports/ AskJiminnyReportActivityServiceTest.php --no-coveragetests/Unit/Services/KioLoula nor open Inpuc Tile: app arcisanCommand dockerdests/ nxee sdovkers/ksost/ husonate*Reports/A5k 1m.nnyReportActivityServiceTest.php --no-coverage 2>&1"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Run set(SkipView allReject allAccept allwinasur leams10/:2uir-o( 4 spaces...
|
NULL
|
1978175152545223442
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelpD AutomatedReports© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsCi© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph® ReportSort.php(e) Reporisonbirection.Kloskservice.php> M Mail• MeetingGenerator> D NotificationD OAuth2D RecallAl[ SecurityC StrategyStreamingD TeamTelephonyUserPilotM Webhook© AbstractService.php© ActivityProviderFactory.ph|© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php©IntercomService.php©IpapiClient.php©IpapiService.php© ParticipantShareService.ph© PlanhatService.php© PlaybackService.phpPlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p© TeamOwnerService.php©TeamService.php© TranscodeParameterResol© UserService.php© Uuid.php› D Traits› D UseCases> D UserDUtils• I validation•IV0pnp nelpers.pngInitialFrontendState.php© Jiminny.php© Plan.php© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]© AskJiminnyReportActivityService.phpA console [PROD]© ActivitySearch.php x< console LUlconsole SlAGiNG© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.php© Team.php© AutomatedReportsRepository.php X<?php© AutomatedReportsService.phpC CreateHeldActivityEvent.phpRequestGenerateAskJiminnyReportJobTest.phpdeclare(strict_types=1);(e TrackProvidernstallled-vent.ononanespace Jamunny conoonent Acuvurvsearchservice.© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpuseclass ActivitySearchclass Automacedкeрortskepo o:A15 X.4 A* Oreturn AutomatedReportpublic function create(array $data): Automate1073536/*** Find an automated report by UUID109110* @param string $uvid* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115116return AutomatedReport: :where('uvid', Aut1181 usage47pubLie tunction tinabytaurousdlstring eiaurul 136if (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]198return AutomatedReport: :where('uvid', Aut19920057* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column t 234* Oparam string $sortDirection The sort dir 235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}245—246247124873/**L07* Retrieve all ASK Lininny reports created k260Windsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)7 usagesprivate Container $container;public function __construct(Container $container){.}public function getOnDemandPageFilters(): FilterDefinitionCollectionf...}public function |getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDe@andPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):1 usagepublic function getArrayFilterKeys(User $consumer): array{...;1 usageprivate function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollec1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.booL +includeripeline - Talse.): FilterDefinitionCollection {..}public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}1 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerj Support Daily • in 2h 52mAL AskJiminny ReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:08:27CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny RNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :kead Activityduradionkange.ono ana Acuivitykecorded.onp+D..eNow |have the comolete root cause picture. This is criticaliwRoot Cause FoundIDtemItoke a est atans aion eaTdi me oe inTASKE iVKeDOT VATa owat vservceloassies sequence numberemolcuvaino Uht oalamsirWnlIchImeahsisFirstRequest() returns true.When sequence number is notin requestParams, the Criteria:: createFromRequest defaultsit to 0,and isFirstRequest() returns true when empty 1lsequenceNumber ==0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterDurtne Tronteno Wiun sequence numberzs sklos alll or tnese ceaulis, sotrerurns more resuiisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest:Read Criteria.phpCoimeor inenxasteea alnlalr lnel e Ata ewhwsorveseananme noo eeust olass sequence number winrnonzzero value sonnaleisiauistRequest() returns false and no implicit defaults are applied.D AskJiminnyReportAo+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:=xolore. Ask.iminnvreoorActvivserviceles.ono and searchee Ask/lminnvreoor AcuviwInterecnoraodrn (est anaevernes sequence numbere stoasseo oluieme sossanske esdo euns a seonre merdcueonerex sie estanteAskJiminnvrepor.acuvilyserMcerest.onpNow let's run the test to verify:tests/unxt/sdrvkces/K105k/Automatr/mep/rts/Asktiman yRsportActivityserviceTest php --no-coverageCould not open input file: /var/www/html/artisancommana aockeldests/untt/servkces/Kiosk/Automatedkeports/ AskJiminnyReportActivityServiceTest.php --no-coveragetests/Unit/Services/KioLoula nor open Inpuc Tile: app arcisanCommand dockerdests/ nxee sdovkers/ksost/ husonate*Reports/A5k 1m.nnyReportActivityServiceTest.php --no-coverage 2>&1"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Run set(SkipView allReject allAccept allwinasur leams10/:2uir-o( 4 spaces...
|
NULL
|
|
11017
|
217
|
65
|
2026-04-14T09:08:30.533600+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157710533_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php X© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennanespace Jamunny conoonent Acuvurvsearchservice.g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(©) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function get0nDemandPageFilters(): FilterDefinitionCollection{...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):/*** @return string[]› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): array{...;DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> D ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232* oodral sarno osorccocunn233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:30CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny RNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :kead Activityduradionkange.ono ana Acuivitykecorded.onp+D ..Now |have the comolete root cause picture. This is criticaliwRoot Cause FoundIDtemItoke a est atans aion eaTdi me oe inTASKE iVKeDOT VATa owat vservceloassies sequence numberemolcuvaino Uht oalamsirWnlIchImeahsisFirstRequest() returns true.When sequence number is notin reguestParams, the Criteria:: createFromRequest defaultsitto 0,and isFirstRequest() returns true when empty 1lsequenceNumber ==0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterDurtne Tronteno Wiun sequence numberzs sklos alll or tnese ceaulis, sotrerurns more resuiisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest:Read Criteria.phpCoimeor inenxasteea alnlalr lnel e Ata ewhwsorveseananme noo eeust olass sequence number winrnonzzero value sonnaleisiauistRequest() returns false and no implicit defaults are applied.D AskJiminnyReportAoNow let me check if there's an existing test for AskJiminnyReportActivityService to update:=xolore. Ask.iminnvreoorActvivserviceles.ono and searchee Ask/lminnvreoor AcuviwInterecnoraodrn (est anaevernes sequence numbere stoasseo oluieme sossanske esdo euns a seonre merdcueonerex sie estanteAskJiminnvrepor.acuvilysericerest.onpNow let's run the test to verify:tests/unxt/sdrvkces/K105k/Automatr/mep/rts/Asktiman yRsportActivityserviceTest php --no-coverageCould not open input file: /var/www/html/artisancommana aockeldests/unxe/serkces/Klosk/Automate/Rrports/AskJ iminnyReportActivityServicetest-php --no-coverageCould not open input file: /app/artisanCommand dockerdests/ nxee sdovkers/ksost/ husonate*Reports/A5k 1m.nyReportActivityServiceTest.php --no-coverage 2>&1"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (884L)+ <> Code Claude Sonnet 4.6Run getSkipView allReject allAccept allwinasur leams110:24uir-o( 4 spaces...
|
NULL
|
4654257469702329471
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php X© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennanespace Jamunny conoonent Acuvurvsearchservice.g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(©) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function get0nDemandPageFilters(): FilterDefinitionCollection{...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):/*** @return string[]› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): array{...;DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> D ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232* oodral sarno osorccocunn233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:30CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny RNow I see the full picture. Let me also check ActivityDurationRange and ActivityRecorded defaults for isFirstRequest() :kead Activityduradionkange.ono ana Acuivitykecorded.onp+D ..Now |have the comolete root cause picture. This is criticaliwRoot Cause FoundIDtemItoke a est atans aion eaTdi me oe inTASKE iVKeDOT VATa owat vservceloassies sequence numberemolcuvaino Uht oalamsirWnlIchImeahsisFirstRequest() returns true.When sequence number is notin reguestParams, the Criteria:: createFromRequest defaultsitto 0,and isFirstRequest() returns true when empty 1lsequenceNumber ==0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1SF1rstRequest = true, these Implicht tilers are apolled that aren tin the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out O-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterDurtne Tronteno Wiun sequence numberzs sklos alll or tnese ceaulis, sotrerurns more resuiisThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearch.Now let me verify my understanding of isFirstRequest:Read Criteria.phpCoimeor inenxasteea alnlalr lnel e Ata ewhwsorveseananme noo eeust olass sequence number winrnonzzero value sonnaleisiauistRequest() returns false and no implicit defaults are applied.D AskJiminnyReportAoNow let me check if there's an existing test for AskJiminnyReportActivityService to update:=xolore. Ask.iminnvreoorActvivserviceles.ono and searchee Ask/lminnvreoor AcuviwInterecnoraodrn (est anaevernes sequence numbere stoasseo oluieme sossanske esdo euns a seonre merdcueonerex sie estanteAskJiminnvrepor.acuvilysericerest.onpNow let's run the test to verify:tests/unxt/sdrvkces/K105k/Automatr/mep/rts/Asktiman yRsportActivityserviceTest php --no-coverageCould not open input file: /var/www/html/artisancommana aockeldests/unxe/serkces/Klosk/Automate/Rrports/AskJ iminnyReportActivityServicetest-php --no-coverageCould not open input file: /app/artisanCommand dockerdests/ nxee sdovkers/ksost/ husonate*Reports/A5k 1m.nyReportActivityServiceTest.php --no-coverage 2>&1"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (884L)+ <> Code Claude Sonnet 4.6Run getSkipView allReject allAccept allwinasur leams110:24uir-o( 4 spaces...
|
11015
|
|
11018
|
217
|
66
|
2026-04-14T09:08:33.374866+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157713374_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e) TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennanespace Jamunny conoonent Acuvurvsearchservice.g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> D ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:33+D ...CascadeFixing ReportControllerAutomated Renort Ma• Fixing Ask Jiminny RRead ActivityDurationRange.php and ActivityRecorded.phpNow I have the complete root cause picture. This is critical:Root Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence_number=0 implicitly (not in params), which meansusFurstrequest rerurns trueWhen sequence_number is not in requestParams, the Criteria::createFromRequest defaults it to 0, and isFirstRequest() returns true when empty 11sequenceNumber == 0.ine Tronenc Urunas sequence number=d- neanino ils nora Tistreouest, Ine service •oesh't serr, so the crlera thinks u's a tistrecuestWhen isFirstRequest() = true , these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) — filters to recorded-oniy3, Oroansercroupin —aoollesuser's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.Tneiix shoulo dennoue wokequest diatamsiaromsertidi- neeas orpass seauence numbernine oultparamsio siana notamrstrequest sonnelimolicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityIdsForSavedSearch.Read AskJiminnykepor ActiVilyse.Now let me verify my understanding of isFirstRequest :Read Criteria.ohnConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no imolicit defaults are apolied.• AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyRe1іи1.1518428182241898845828588885888818812I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.php+2/Now let's run the test to verify:commana dockeldocker_doste/nke/ tockces/klosk/Ru /ar/ep/rts/AKzinanyReportActivityServacetest-php -no-coverageCould not open input file: /var/www/html/artisanCommand docker• docker exec docker_lamp_1 php /app/artisan testrests unleservlces Klosk Altonareoredorts askamnnvrevortacuvtsercel estono --no-coveradeCould not open input file: /app/artisanCommand dockeno destsrext/Serukees/K1os1 Automate®Reports/Ask im phpReportAc tvstes/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisanNavigating..eItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams11O:24uir-o( 4 spaces...
|
NULL
|
-600025735675103094
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e) TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennanespace Jamunny conoonent Acuvurvsearchservice.g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> D ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT...Defaults100% |45]Tue 14 Apr 12:08:33+D ...CascadeFixing ReportControllerAutomated Renort Ma• Fixing Ask Jiminny RRead ActivityDurationRange.php and ActivityRecorded.phpNow I have the complete root cause picture. This is critical:Root Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence_number=0 implicitly (not in params), which meansusFurstrequest rerurns trueWhen sequence_number is not in requestParams, the Criteria::createFromRequest defaults it to 0, and isFirstRequest() returns true when empty 11sequenceNumber == 0.ine Tronenc Urunas sequence number=d- neanino ils nora Tistreouest, Ine service •oesh't serr, so the crlera thinks u's a tistrecuestWhen isFirstRequest() = true , these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only recorded = 1 (DEFAULT VALUE = OPTION RECORDED) — filters to recorded-oniy3, Oroansercroupin —aoollesuser's ceaur orouo titerBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.Tneiix shoulo dennoue wokequest diatamsiaromsertidi- neeas orpass seauence numbernine oultparamsio siana notamrstrequest sonnelimolicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityIdsForSavedSearch.Read AskJiminnykepor ActiVilyse.Now let me verify my understanding of isFirstRequest :Read Criteria.ohnConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence number with a non-zero value so that isFirstRequest() returns false and no imolicit defaults are apolied.• AskJiminnyReportActivityService.php+1 -1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyRe1іи1.1518428182241898845828588885888818812I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.php+2/Now let's run the test to verify:commana dockeldocker_doste/nke/ tockces/klosk/Ru /ar/ep/rts/AKzinanyReportActivityServacetest-php -no-coverageCould not open input file: /var/www/html/artisanCommand docker• docker exec docker_lamp_1 php /app/artisan testrests unleservlces Klosk Altonareoredorts askamnnvrevortacuvtsercel estono --no-coveradeCould not open input file: /app/artisanCommand dockeno destsrext/Serukees/K1os1 Automate®Reports/Ask im phpReportAc tvstes/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisanNavigating..eItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams11O:24uir-o( 4 spaces...
|
NULL
|
|
11019
|
217
|
67
|
2026-04-14T09:08:39.409070+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157719409_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console EUiconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e) TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(©) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,usen sconsumenWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT..Defaults100% C•Tue 14 Apr 12:08:39CascadeFixing ReportControllerAutomated Report Mai© Fixing Ask Jiminny R+D ...Une bun Lakequestraramst romsearch metnod in AskJaminnykeportAct lvlcyservice passes sequence number= Impllcity (not in params , Wnich meansisFirstRequest() returns true.When sequence_number is not in requestParams, the Criteria:: createFromRequest defaultsit to 0, and isFirstRequest() returns true when empty 11sequencenumber == 0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.When isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuitsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_ number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearchNow let me verify my understanding of isFirstRequest:Read Criteria.phpcontirmed. Ine Tix is clear and minimal. Ine qetacuntylasForsavedsearch method needs to pass sequence_number With a non-zero value so that isrirstRequest() returns false and no implicit defaults are applied.• AskJiminnyReportAc)Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReporNow let's run the test to verirytests/unxt/servaces/K105k/AutomeCould not open input file: /var/www/html/artisandReports/AskJiminnyReportActivityServiceTest.php --no-coveragedocker exec docker_lamp_1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisandocker exec docker_lamp_1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisanCommand dockero docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Munae+ SkipView allReject allAccept allwinasur leams110:24uir-o( 4 spaces...
|
NULL
|
-5895872733280284593
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console EUiconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e) TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(©) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,usen sconsumenWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL AskJiminnyReportActivityServiceT..Defaults100% C•Tue 14 Apr 12:08:39CascadeFixing ReportControllerAutomated Report Mai© Fixing Ask Jiminny R+D ...Une bun Lakequestraramst romsearch metnod in AskJaminnykeportAct lvlcyservice passes sequence number= Impllcity (not in params , Wnich meansisFirstRequest() returns true.When sequence_number is not in requestParams, the Criteria:: createFromRequest defaultsit to 0, and isFirstRequest() returns true when empty 11sequencenumber == 0.The frontend URL has sequence_number=4 — meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.When isFirstRequest() = true, these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange— applies min duration = 1 (INITIAL MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterbut the Trontend With sequence number=4 sklos all or these derauls, so it returns more resuitsThe fix should be in buildRequestParamsFromSearch - it needs to pass sequence_ number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence number in the merge in getActivityIdsForSavedSearchNow let me verify my understanding of isFirstRequest:Read Criteria.phpcontirmed. Ine Tix is clear and minimal. Ine qetacuntylasForsavedsearch method needs to pass sequence_number With a non-zero value so that isrirstRequest() returns false and no implicit defaults are applied.• AskJiminnyReportAc)Now let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReporNow let's run the test to verirytests/unxt/servaces/K105k/AutomeCould not open input file: /var/www/html/artisandReports/AskJiminnyReportActivityServiceTest.php --no-coveragedocker exec docker_lamp_1 php /app/artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisandocker exec docker_lamp_1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisanCommand dockero docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (2*L)+ <> Code Claude Sonnet 4.6Munae+ SkipView allReject allAccept allwinasur leams110:24uir-o( 4 spaces...
|
11018
|
|
11021
|
NULL
|
0
|
2026-04-14T09:08:42.495739+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157722495_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquageDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)Support Daily • in 2h 52mAL AskJiminny ReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:08:42+D ...CascadeFixing ReportControllerAutomated Report Mar• Fixing Ask Jiminny RRoot Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence _number=0 implicitly (not in params), which meansisFirstRequest( returns true.When sequence_number is not in requestParams, the Criteria:: CreateFromkequest defaults it to 0, and isFirstRequest() returns true when empty I1sequenceNumber === 0.The frontend URL has sequence number=4— meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1srirstrequest = true.nese mollicttites are adalled tnar aren un tne saveo searehs" Acuvltylurar lonkande — aooles min curation = 1 lINAL MIN - tIters ourO-secono callls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apolv. Or alternatively, alwavs pass a non-zero sequence number in the merge in getAct.ivitvIdsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest:Reao crierla,onoConfirmed. The fix is clear and minimal. The getAivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest () returns false and no implicit defaults are applied.• AskJiminnyReportActivityService.php+I-1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:ExploredAskJiminnvReoortActivtvServicelest.onv and searchedAsk.iminnvReoortActivitvI need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.php+27Now let's run the test to verify:Command dockerdoste/ nkt sdovkeeskneate/ep/rts/ASktimannyReportActivityServiceTest.php --no-coverageCould not open input file: /var/www/html/artisandocker exec docker_lamp_1 php /app/artisantests/Unit/Services/Kiosk/testedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockel• docker exec docker lamp 1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisancommand dockelo docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"Itlle win changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams11O:24uir-o( 4 spaces...
|
NULL
|
-1721715682181738533
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquageDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)Support Daily • in 2h 52mAL AskJiminny ReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:08:42+D ...CascadeFixing ReportControllerAutomated Report Mar• Fixing Ask Jiminny RRoot Cause FoundThe buildRequestParamsFromSearch method in AskJiminnyReportActivityService passes sequence _number=0 implicitly (not in params), which meansisFirstRequest( returns true.When sequence_number is not in requestParams, the Criteria:: CreateFromkequest defaults it to 0, and isFirstRequest() returns true when empty I1sequenceNumber === 0.The frontend URL has sequence number=4— meaning it's not a first request. The service doesn't set it, so the criteria thinks it's a first request.Wnen 1srirstrequest = true.nese mollicttites are adalled tnar aren un tne saveo searehs" Acuvltylurar lonkande — aooles min curation = 1 lINAL MIN - tIters ourO-secono callls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apolv. Or alternatively, alwavs pass a non-zero sequence number in the merge in getAct.ivitvIdsForSavedSearch.Read AskJiminnyReportActivityService.php #L44-93Now let me verify my understanding of isFirstRequest:Reao crierla,onoConfirmed. The fix is clear and minimal. The getAivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest () returns false and no implicit defaults are applied.• AskJiminnyReportActivityService.php+I-1Now let me check if there's an existing test for AskJiminnyReportActivityService to update:ExploredAskJiminnvReoortActivtvServicelest.onv and searchedAsk.iminnvReoortActivitvI need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:• AskJiminnyReportActivityServiceTest.php+27Now let's run the test to verify:Command dockerdoste/ nkt sdovkeeskneate/ep/rts/ASktimannyReportActivityServiceTest.php --no-coverageCould not open input file: /var/www/html/artisandocker exec docker_lamp_1 php /app/artisantests/Unit/Services/Kiosk/testedReports/AskJiminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockel• docker exec docker lamp 1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1"Could not open input file: artisancommand dockelo docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"Itlle win changesvapp/Services/Kiosk/AutomatedReports/ [ AskJiminnyReportActivityService.php +1 -1Ask anything (24L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allWinasun leams11O:24uir-o( 4 spaces...
|
NULL
|
|
11022
|
219
|
0
|
2026-04-14T09:08:57.582059+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157737582_m2.jpg...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
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
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\Service;
use Illuminate\Container\Container;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\AiCallScoreFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\AutoScoreFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\ClosedDealsFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealCloseDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\HasTopicTriggersFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\PlaybackTopicFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictActivityChannel;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictPublicActivitiesOnly;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictTeam;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictUserActive;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictUserGroupScope;
use Jiminny\Component\ActivitySearch\FilterDefinition\TeamInsights\TopicFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\User;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\LayoutRepository;
use Jiminny\Services\TeamService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
class ActivitySearch
{
private Container $container;
public function __construct(Container $container)
{
$this->container = $container;
}
public function getOnDemandPageFilters(): FilterDefinitionCollection
{
return FilterDefinitionCollection::make(
Collection::make([
// special case filters
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\ActivityUpdatedDate::class,
FilterDefinition\ActivityRecordingStopped::class,
FilterDefinition\ActivityFilter::class,
FilterDefinition\ExternalId::class,
FilterDefinition\NudgeRunId::class,
FilterDefinition\ParticipantUserIn::class,
FilterDefinition\PartnerFilterDefinition::class,
// healthy restrictions
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictUserActive::class,
FilterDefinition\Security\PrivateMeetingsForCurrentUserOnly::class,
// regular filters
FilterDefinition\ActivityActualDate::class,
FilterDefinition\ActivityChannel::class,
FilterDefinition\ActivityDurationRange::class,
FilterDefinition\ActivityPlaylistIn::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\ActivityRecorded::class,
FilterDefinition\ActivityType::class,
FilterDefinition\CoachingFeedbackAverageScore::class,
AutoScoreFilter::class,
AiCallScoreFilter::class,
FilterDefinition\CoachingFeedbackCoachUserIn::class,
FilterDefinition\CrmFieldCollection::class,
FilterDefinition\CurrentStage::class,
FilterDefinition\Customer::class,
FilterDefinition\CustomerMonologueDuration::class,
FilterDefinition\CustomerQuestionCount::class,
FilterDefinition\DealAge::class,
DealCloseDate::class,
FilterDefinition\DealValue::class,
FilterDefinition\EngagingQuestionCount::class,
FilterDefinition\ShowInternalExternalActivitiesFilter::class,
FilterDefinition\HasTranscription::class,
FilterDefinition\InsightfulQuestionCount::class,
FilterDefinition\LanguageFilterDefinition::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\OrganiserGroupIn:[PASSWORD]
FilterDefinition\OrganiserUserIn::class,
FilterDefinition\PatienceRange::class,
PlaybackTopicFilterDefinition::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\SpeechRate::class,
FilterDefinition\StageAtCallFilterDefinition::class,
FilterDefinition\TalkTimeRatio::class,
FilterDefinition\TeamMemberUserIn::class,
FilterDefinition\TranscriptionComposite::class,
FilterDefinition\UserMonologueDuration::class,
FilterDefinition\UserQuestionCount::class,
FilterDefinition\CommentCountRange::class,
FilterDefinition\HasPendingAiCrmNotes::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection
{
return $this
->getOnDemandPageFilters()
->withCriteria($criteria)
->withConsumer($consumer)
->withRestrictions($consumer->getTeam());
}
/**
* @return string[]
*/
public function getArrayFilterKeys(User $consumer): array
{
return $this
->getOnDemandPageFilters()
->withConsumer($consumer)
->getPropertyTypes([FilterDefinitionCollection::PROPERTY_TYPE_ARRAY])
->keys()
->filter(static fn (string $key): bool => ! str_contains($key, '.'))
->values()
->all();
}
private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollection
{
$dateRangeFilterClass = $isExport
? FilterDefinition\TeamInsights\ConversationExport\DateRangeFilter::class
: FilterDefinition\TeamInsights\DateRangeFilter::class;
return FilterDefinitionCollection::make(
Collection::make([
// special cases
$dateRangeFilterClass,
FilterDefinition\TeamInsights\Exists::class,
// healthy restrictions
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictPublicActivitiesOnly::class,
RestrictUserActive::class,
// regular filters
FilterDefinition\ActivityChannel::class,
FilterDefinition\TeamInsights\ActivityDurationRange::class,
FilterDefinition\ActivityPlaylistIn::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\TeamInsights\ActivityRecorded::class,
FilterDefinition\ActivityType::class,
FilterDefinition\CoachingFeedbackAverageScore::class,
AutoScoreFilter::class,
AiCallScoreFilter::class,
FilterDefinition\CoachingFeedbackCoachUserIn::class,
FilterDefinition\CrmFieldCollection::class,
FilterDefinition\Customer::class,
FilterDefinition\CurrentStage::class,
FilterDefinition\CustomerMonologueDuration::class,
FilterDefinition\CustomerQuestionCount::class,
FilterDefinition\DealAge::class,
DealCloseDate::class,
FilterDefinition\DealValue::class,
FilterDefinition\EngagingQuestionCount::class,
FilterDefinition\ShowInternalExternalActivitiesFilter::class,
FilterDefinition\InsightfulQuestionCount::class,
FilterDefinition\LanguageFilterDefinition::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\TeamInsights\UserInFilter::class,
FilterDefinition\TeamInsights\UserGroupInFilter::class,
FilterDefinition\PatienceRange::class,
PlaybackTopicFilterDefinition::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\SpeechRate::class,
FilterDefinition\StageAtCallFilterDefinition::class,
FilterDefinition\TalkTimeRatio::class,
FilterDefinition\TeamMemberUserIn::class,
FilterDefinition\TranscriptionComposite::class,
FilterDefinition\UserMonologueDuration::class,
FilterDefinition\UserQuestionCount::class,
FilterDefinition\CommentCountRange::class,
// Relevant for topics in deals.
ClosedDealsFilter::class,
HasTopicTriggersFilterDefinition::class,
TopicFilterDefinition::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
private function getDealInsightsPageFilters(
bool $useCreatedDate = false,
bool $includeDealType = false,
bool $includePipeline = false,
): FilterDefinitionCollection {
if ($useCreatedDate) {
$periodFilterClass = FilterDefinition\DealInsights\CreatedPeriodFilter::class;
} else {
$periodFilterClass = FilterDefinition\DealInsights\ClosingPeriodFilter::class;
}
$filterSet = [
RestrictTeam::class,
$periodFilterClass,
FilterDefinition\DealInsights\UserInFilter::class,
FilterDefinition\DealInsights\UserGroupInFilter::class,
FilterDefinition\DealInsights\DealStageInFilter::class,
FilterDefinition\DealInsights\DealNameFilter::class,
];
if ($includePipeline) {
$filterSet[] = FilterDefinition\DealInsights\DealPipelineInFilter::class;
}
if ($includeDealType) {
$filterSet[] = FilterDefinition\DealInsights\DealTypeInFilter::class;
}
return FilterDefinitionCollection::make(
Collection::make($filterSet)
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getTeamInsightsPageFilterSet(
Criteria $criteria,
User $consumer,
bool $isExport = false
): FilterDefinitionCollection {
return $this
->getTeamInsightsPageFilters($isExport)
->withCriteria($criteria)
->withConsumer($consumer)
->withRestrictions($consumer->getTeam());
}
public function getDealInsightsPageFilterSet(
Criteria $criteria,
User $consumer
): FilterDefinitionCollection {
$includeDealType = $this->shouldIncludeDealType($consumer);
$includePipeline = $this->shouldIncludePipeline($consumer);
$useCreatedDate = $this->shouldUseCreatedDate($consumer);
return $this
->getDealInsightsPageFilters($useCreatedDate, $includeDealType, $includePipeline)
->withCriteria($criteria)
->withConsumer($consumer);
}
public function getTeamAiAutomationFilterSet(
Criteria $criteria,
User $consumer
): FilterDefinitionCollection {
return $this
->getTeamAiAutomationPageFilterSet()
->withCriteria($criteria)
->withConsumer($consumer);
}
private function getTeamAiAutomationPageFilterSet(): FilterDefinitionCollection
{
$filterSet = [
RestrictTeam::class,
FilterDefinition\DealInsights\DealStageInFilter::class,
];
return FilterDefinitionCollection::make(
Collection::make($filterSet)
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getHomepageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection
{
$filterDefinitionCollection = FilterDefinitionCollection::make(
Collection::make([
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictUserActive::class,
FilterDefinition\Security\PrivateMeetingsForCurrentUserOnly::class,
FilterDefinition\ActivityActualDate::class,
FilterDefinition\Customer::class,
FilterDefinition\ActivityChannel::class,
FilterDefinition\ActivityDurationRange::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\ActivityRecorded::class,
FilterDefinition\ActivityRecordingStopped::class,
FilterDefinition\ActivityScheduledDate::class,
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\OrganiserUserIn::class,
FilterDefinition\OrganiserUserNotIn::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\UserGroupInOptionalFilter::class,
FilterDefinition\OnlyActiveUsers::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
$filterDefinitionCollection->withCriteria($criteria);
$filterDefinitionCollection->withConsumer($consumer);
return $filterDefinitionCollection;
}
public function getPartnerFilterSet(Criteria $criteria): FilterDefinitionCollection
{
$filterDefinitionCollection = FilterDefinitionCollection::make(
Collection::make([
RestrictActivityChannel::class,
FilterDefinition\OrganiserTeamIn::class,
FilterDefinition\ActivityUpdatedDate::class,
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\SortBy::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all()
);
$filterDefinitionCollection->withCriteria($criteria);
return $filterDefinitionCollection;
}
private function shouldIncludeDealType(User $user): bool
{
$crmConfig = $user->getTeam()->getCrmConfiguration();
$crmProviderName = $crmConfig->getProviderName();
if (! array_key_exists($crmProviderName, Field::BUSINESS_TYPE_FIELDS)) {
return false;
}
$layoutRepository = app(LayoutRepository::class);
$layoutFields = $layoutRepository->getDealInsightLayoutFields($crmConfig);
$dealTypeField = Field::BUSINESS_TYPE_FIELDS[$crmProviderName];
if (! in_array($dealTypeField, $layoutFields)) {
return false;
}
return true;
}
private function shouldIncludePipeline(User $user): bool
{
$crmConfig = $user->getTeam()->getCrmConfiguration();
$crmProviderName = $crmConfig->getProviderName();
if (in_array($crmProviderName, [
Configuration::PROVIDER_SALESFORCE,
Configuration::PROVIDER_INTEGRATION_APP,
])) {
return false;
}
return true;
}
private function shouldUseCreatedDate(User $user): bool
{
$teamService = app(TeamService::class);
return ! $teamService->useDealInsightsClosedDateFilter($user->getTeam());
}
}
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
app ~/jiminny/app
.circleci
.cursor
.github
.sonarlint
.vscode
.windsurf
app, sources root
Actions
Component
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
EventSubscriber, folder
FilterDefinition, folder
Service
ActivityApiSearch.php, class
ActivitySearch.php, class
UserOptionsByGroup.php, class
AbstractStageFilterDefinition.php, abstract class
ActivitySearchServiceProvider.php, final class
DealInsightsPeriodFilterFactory.php
DealInsightsPeriodFilterFactoryInterface.php, interface
FilterDefinition.php, abstract class
FilterDefinitionCollection.php, class
FilterDefinitionQuery.php, class
FilterDefinitionQueryCollection.php, class
FilteredValueContainerInterface.php, interface
IntMinMaxRange.php, class
AiActivityType
AiAutomation
AiCallScoring
AskAnything
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding
Encryption
ES
Faker
FeatureFlags
FFMpeg
FileSystem
Gecko
Gong
GuzzleHttp
KeyPoints
Kiosk
LanguageDetection
LiveFeed
Locks
Math
MediaPipeline
MeetingBot
MobileSettings
Model
Notification
Nudge...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7589844,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceT…Defaults","depth":6,"bounds":{"left":0.7769531,"top":0.017361112,"width":0.12382813,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.940625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\Service;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\AiCallScoreFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\AutoScoreFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ClosedDealsFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealCloseDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\HasTopicTriggersFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\PlaybackTopicFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictActivityChannel;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictPublicActivitiesOnly;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictTeam;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictUserActive;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictUserGroupScope;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\TeamInsights\\TopicFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\LayoutRepository;\nuse Jiminny\\Services\\TeamService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\n\nclass ActivitySearch\n{\n private Container $container;\n\n public function __construct(Container $container)\n {\n $this->container = $container;\n }\n\n public function getOnDemandPageFilters(): FilterDefinitionCollection\n {\n return FilterDefinitionCollection::make(\n Collection::make([\n // special case filters\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\ActivityUpdatedDate::class,\n FilterDefinition\\ActivityRecordingStopped::class,\n FilterDefinition\\ActivityFilter::class,\n FilterDefinition\\ExternalId::class,\n FilterDefinition\\NudgeRunId::class,\n FilterDefinition\\ParticipantUserIn::class,\n FilterDefinition\\PartnerFilterDefinition::class,\n\n // healthy restrictions\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictUserActive::class,\n FilterDefinition\\Security\\PrivateMeetingsForCurrentUserOnly::class,\n\n // regular filters\n FilterDefinition\\ActivityActualDate::class,\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\ActivityDurationRange::class,\n FilterDefinition\\ActivityPlaylistIn::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\ActivityRecorded::class,\n FilterDefinition\\ActivityType::class,\n FilterDefinition\\CoachingFeedbackAverageScore::class,\n AutoScoreFilter::class,\n AiCallScoreFilter::class,\n FilterDefinition\\CoachingFeedbackCoachUserIn::class,\n FilterDefinition\\CrmFieldCollection::class,\n FilterDefinition\\CurrentStage::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\CustomerMonologueDuration::class,\n FilterDefinition\\CustomerQuestionCount::class,\n FilterDefinition\\DealAge::class,\n DealCloseDate::class,\n FilterDefinition\\DealValue::class,\n FilterDefinition\\EngagingQuestionCount::class,\n FilterDefinition\\ShowInternalExternalActivitiesFilter::class,\n FilterDefinition\\HasTranscription::class,\n FilterDefinition\\InsightfulQuestionCount::class,\n FilterDefinition\\LanguageFilterDefinition::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\OrganiserGroupIn::class,\n FilterDefinition\\OrganiserUserIn::class,\n FilterDefinition\\PatienceRange::class,\n PlaybackTopicFilterDefinition::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\SpeechRate::class,\n FilterDefinition\\StageAtCallFilterDefinition::class,\n FilterDefinition\\TalkTimeRatio::class,\n FilterDefinition\\TeamMemberUserIn::class,\n FilterDefinition\\TranscriptionComposite::class,\n FilterDefinition\\UserMonologueDuration::class,\n FilterDefinition\\UserQuestionCount::class,\n FilterDefinition\\CommentCountRange::class,\n FilterDefinition\\HasPendingAiCrmNotes::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection\n {\n return $this\n ->getOnDemandPageFilters()\n ->withCriteria($criteria)\n ->withConsumer($consumer)\n ->withRestrictions($consumer->getTeam());\n }\n\n /**\n * @return string[]\n */\n public function getArrayFilterKeys(User $consumer): array\n {\n return $this\n ->getOnDemandPageFilters()\n ->withConsumer($consumer)\n ->getPropertyTypes([FilterDefinitionCollection::PROPERTY_TYPE_ARRAY])\n ->keys()\n ->filter(static fn (string $key): bool => ! str_contains($key, '.'))\n ->values()\n ->all();\n }\n\n private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollection\n {\n $dateRangeFilterClass = $isExport\n ? FilterDefinition\\TeamInsights\\ConversationExport\\DateRangeFilter::class\n : FilterDefinition\\TeamInsights\\DateRangeFilter::class;\n\n return FilterDefinitionCollection::make(\n Collection::make([\n // special cases\n $dateRangeFilterClass,\n FilterDefinition\\TeamInsights\\Exists::class,\n\n // healthy restrictions\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictPublicActivitiesOnly::class,\n RestrictUserActive::class,\n\n // regular filters\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\TeamInsights\\ActivityDurationRange::class,\n FilterDefinition\\ActivityPlaylistIn::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\TeamInsights\\ActivityRecorded::class,\n FilterDefinition\\ActivityType::class,\n FilterDefinition\\CoachingFeedbackAverageScore::class,\n AutoScoreFilter::class,\n AiCallScoreFilter::class,\n FilterDefinition\\CoachingFeedbackCoachUserIn::class,\n FilterDefinition\\CrmFieldCollection::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\CurrentStage::class,\n FilterDefinition\\CustomerMonologueDuration::class,\n FilterDefinition\\CustomerQuestionCount::class,\n FilterDefinition\\DealAge::class,\n DealCloseDate::class,\n FilterDefinition\\DealValue::class,\n FilterDefinition\\EngagingQuestionCount::class,\n FilterDefinition\\ShowInternalExternalActivitiesFilter::class,\n FilterDefinition\\InsightfulQuestionCount::class,\n FilterDefinition\\LanguageFilterDefinition::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\TeamInsights\\UserInFilter::class,\n FilterDefinition\\TeamInsights\\UserGroupInFilter::class,\n FilterDefinition\\PatienceRange::class,\n PlaybackTopicFilterDefinition::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\SpeechRate::class,\n FilterDefinition\\StageAtCallFilterDefinition::class,\n FilterDefinition\\TalkTimeRatio::class,\n FilterDefinition\\TeamMemberUserIn::class,\n FilterDefinition\\TranscriptionComposite::class,\n FilterDefinition\\UserMonologueDuration::class,\n FilterDefinition\\UserQuestionCount::class,\n FilterDefinition\\CommentCountRange::class,\n // Relevant for topics in deals.\n ClosedDealsFilter::class,\n HasTopicTriggersFilterDefinition::class,\n TopicFilterDefinition::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n private function getDealInsightsPageFilters(\n bool $useCreatedDate = false,\n bool $includeDealType = false,\n bool $includePipeline = false,\n ): FilterDefinitionCollection {\n if ($useCreatedDate) {\n $periodFilterClass = FilterDefinition\\DealInsights\\CreatedPeriodFilter::class;\n } else {\n $periodFilterClass = FilterDefinition\\DealInsights\\ClosingPeriodFilter::class;\n }\n\n $filterSet = [\n RestrictTeam::class,\n $periodFilterClass,\n FilterDefinition\\DealInsights\\UserInFilter::class,\n FilterDefinition\\DealInsights\\UserGroupInFilter::class,\n FilterDefinition\\DealInsights\\DealStageInFilter::class,\n FilterDefinition\\DealInsights\\DealNameFilter::class,\n ];\n\n if ($includePipeline) {\n $filterSet[] = FilterDefinition\\DealInsights\\DealPipelineInFilter::class;\n }\n\n if ($includeDealType) {\n $filterSet[] = FilterDefinition\\DealInsights\\DealTypeInFilter::class;\n }\n\n return FilterDefinitionCollection::make(\n Collection::make($filterSet)\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getTeamInsightsPageFilterSet(\n Criteria $criteria,\n User $consumer,\n bool $isExport = false\n ): FilterDefinitionCollection {\n return $this\n ->getTeamInsightsPageFilters($isExport)\n ->withCriteria($criteria)\n ->withConsumer($consumer)\n ->withRestrictions($consumer->getTeam());\n }\n\n public function getDealInsightsPageFilterSet(\n Criteria $criteria,\n User $consumer\n ): FilterDefinitionCollection {\n $includeDealType = $this->shouldIncludeDealType($consumer);\n $includePipeline = $this->shouldIncludePipeline($consumer);\n $useCreatedDate = $this->shouldUseCreatedDate($consumer);\n\n return $this\n ->getDealInsightsPageFilters($useCreatedDate, $includeDealType, $includePipeline)\n ->withCriteria($criteria)\n ->withConsumer($consumer);\n }\n\n public function getTeamAiAutomationFilterSet(\n Criteria $criteria,\n User $consumer\n ): FilterDefinitionCollection {\n return $this\n ->getTeamAiAutomationPageFilterSet()\n ->withCriteria($criteria)\n ->withConsumer($consumer);\n }\n\n private function getTeamAiAutomationPageFilterSet(): FilterDefinitionCollection\n {\n $filterSet = [\n RestrictTeam::class,\n FilterDefinition\\DealInsights\\DealStageInFilter::class,\n ];\n\n return FilterDefinitionCollection::make(\n Collection::make($filterSet)\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getHomepageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection\n {\n $filterDefinitionCollection = FilterDefinitionCollection::make(\n Collection::make([\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictUserActive::class,\n FilterDefinition\\Security\\PrivateMeetingsForCurrentUserOnly::class,\n FilterDefinition\\ActivityActualDate::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\ActivityDurationRange::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\ActivityRecorded::class,\n FilterDefinition\\ActivityRecordingStopped::class,\n FilterDefinition\\ActivityScheduledDate::class,\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\OrganiserUserIn::class,\n FilterDefinition\\OrganiserUserNotIn::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\UserGroupInOptionalFilter::class,\n FilterDefinition\\OnlyActiveUsers::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n $filterDefinitionCollection->withCriteria($criteria);\n $filterDefinitionCollection->withConsumer($consumer);\n\n return $filterDefinitionCollection;\n }\n\n public function getPartnerFilterSet(Criteria $criteria): FilterDefinitionCollection\n {\n $filterDefinitionCollection = FilterDefinitionCollection::make(\n Collection::make([\n RestrictActivityChannel::class,\n FilterDefinition\\OrganiserTeamIn::class,\n FilterDefinition\\ActivityUpdatedDate::class,\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\SortBy::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all()\n );\n $filterDefinitionCollection->withCriteria($criteria);\n\n return $filterDefinitionCollection;\n }\n\n private function shouldIncludeDealType(User $user): bool\n {\n $crmConfig = $user->getTeam()->getCrmConfiguration();\n $crmProviderName = $crmConfig->getProviderName();\n\n if (! array_key_exists($crmProviderName, Field::BUSINESS_TYPE_FIELDS)) {\n return false;\n }\n\n $layoutRepository = app(LayoutRepository::class);\n $layoutFields = $layoutRepository->getDealInsightLayoutFields($crmConfig);\n $dealTypeField = Field::BUSINESS_TYPE_FIELDS[$crmProviderName];\n\n if (! in_array($dealTypeField, $layoutFields)) {\n return false;\n }\n\n return true;\n }\n\n private function shouldIncludePipeline(User $user): bool\n {\n $crmConfig = $user->getTeam()->getCrmConfiguration();\n $crmProviderName = $crmConfig->getProviderName();\n\n if (in_array($crmProviderName, [\n Configuration::PROVIDER_SALESFORCE,\n Configuration::PROVIDER_INTEGRATION_APP,\n ])) {\n return false;\n }\n\n return true;\n }\n\n private function shouldUseCreatedDate(User $user): bool\n {\n $teamService = app(TeamService::class);\n\n return ! $teamService->useDealInsightsClosedDateFilter($user->getTeam());\n }\n}","depth":4,"bounds":{"left":0.32617188,"top":0.10625,"width":0.34101564,"height":0.89375},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Component\\ActivitySearch\\Service;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\AiCallScoreFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\AutoScoreFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ClosedDealsFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealCloseDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\HasTopicTriggersFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\PlaybackTopicFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictActivityChannel;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictPublicActivitiesOnly;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictTeam;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictUserActive;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\Security\\RestrictUserGroupScope;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\TeamInsights\\TopicFilterDefinition;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Repositories\\Crm\\LayoutRepository;\nuse Jiminny\\Services\\TeamService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\n\nclass ActivitySearch\n{\n private Container $container;\n\n public function __construct(Container $container)\n {\n $this->container = $container;\n }\n\n public function getOnDemandPageFilters(): FilterDefinitionCollection\n {\n return FilterDefinitionCollection::make(\n Collection::make([\n // special case filters\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\ActivityUpdatedDate::class,\n FilterDefinition\\ActivityRecordingStopped::class,\n FilterDefinition\\ActivityFilter::class,\n FilterDefinition\\ExternalId::class,\n FilterDefinition\\NudgeRunId::class,\n FilterDefinition\\ParticipantUserIn::class,\n FilterDefinition\\PartnerFilterDefinition::class,\n\n // healthy restrictions\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictUserActive::class,\n FilterDefinition\\Security\\PrivateMeetingsForCurrentUserOnly::class,\n\n // regular filters\n FilterDefinition\\ActivityActualDate::class,\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\ActivityDurationRange::class,\n FilterDefinition\\ActivityPlaylistIn::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\ActivityRecorded::class,\n FilterDefinition\\ActivityType::class,\n FilterDefinition\\CoachingFeedbackAverageScore::class,\n AutoScoreFilter::class,\n AiCallScoreFilter::class,\n FilterDefinition\\CoachingFeedbackCoachUserIn::class,\n FilterDefinition\\CrmFieldCollection::class,\n FilterDefinition\\CurrentStage::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\CustomerMonologueDuration::class,\n FilterDefinition\\CustomerQuestionCount::class,\n FilterDefinition\\DealAge::class,\n DealCloseDate::class,\n FilterDefinition\\DealValue::class,\n FilterDefinition\\EngagingQuestionCount::class,\n FilterDefinition\\ShowInternalExternalActivitiesFilter::class,\n FilterDefinition\\HasTranscription::class,\n FilterDefinition\\InsightfulQuestionCount::class,\n FilterDefinition\\LanguageFilterDefinition::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\OrganiserGroupIn::class,\n FilterDefinition\\OrganiserUserIn::class,\n FilterDefinition\\PatienceRange::class,\n PlaybackTopicFilterDefinition::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\SpeechRate::class,\n FilterDefinition\\StageAtCallFilterDefinition::class,\n FilterDefinition\\TalkTimeRatio::class,\n FilterDefinition\\TeamMemberUserIn::class,\n FilterDefinition\\TranscriptionComposite::class,\n FilterDefinition\\UserMonologueDuration::class,\n FilterDefinition\\UserQuestionCount::class,\n FilterDefinition\\CommentCountRange::class,\n FilterDefinition\\HasPendingAiCrmNotes::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection\n {\n return $this\n ->getOnDemandPageFilters()\n ->withCriteria($criteria)\n ->withConsumer($consumer)\n ->withRestrictions($consumer->getTeam());\n }\n\n /**\n * @return string[]\n */\n public function getArrayFilterKeys(User $consumer): array\n {\n return $this\n ->getOnDemandPageFilters()\n ->withConsumer($consumer)\n ->getPropertyTypes([FilterDefinitionCollection::PROPERTY_TYPE_ARRAY])\n ->keys()\n ->filter(static fn (string $key): bool => ! str_contains($key, '.'))\n ->values()\n ->all();\n }\n\n private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollection\n {\n $dateRangeFilterClass = $isExport\n ? FilterDefinition\\TeamInsights\\ConversationExport\\DateRangeFilter::class\n : FilterDefinition\\TeamInsights\\DateRangeFilter::class;\n\n return FilterDefinitionCollection::make(\n Collection::make([\n // special cases\n $dateRangeFilterClass,\n FilterDefinition\\TeamInsights\\Exists::class,\n\n // healthy restrictions\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictPublicActivitiesOnly::class,\n RestrictUserActive::class,\n\n // regular filters\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\TeamInsights\\ActivityDurationRange::class,\n FilterDefinition\\ActivityPlaylistIn::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\TeamInsights\\ActivityRecorded::class,\n FilterDefinition\\ActivityType::class,\n FilterDefinition\\CoachingFeedbackAverageScore::class,\n AutoScoreFilter::class,\n AiCallScoreFilter::class,\n FilterDefinition\\CoachingFeedbackCoachUserIn::class,\n FilterDefinition\\CrmFieldCollection::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\CurrentStage::class,\n FilterDefinition\\CustomerMonologueDuration::class,\n FilterDefinition\\CustomerQuestionCount::class,\n FilterDefinition\\DealAge::class,\n DealCloseDate::class,\n FilterDefinition\\DealValue::class,\n FilterDefinition\\EngagingQuestionCount::class,\n FilterDefinition\\ShowInternalExternalActivitiesFilter::class,\n FilterDefinition\\InsightfulQuestionCount::class,\n FilterDefinition\\LanguageFilterDefinition::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\TeamInsights\\UserInFilter::class,\n FilterDefinition\\TeamInsights\\UserGroupInFilter::class,\n FilterDefinition\\PatienceRange::class,\n PlaybackTopicFilterDefinition::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\SpeechRate::class,\n FilterDefinition\\StageAtCallFilterDefinition::class,\n FilterDefinition\\TalkTimeRatio::class,\n FilterDefinition\\TeamMemberUserIn::class,\n FilterDefinition\\TranscriptionComposite::class,\n FilterDefinition\\UserMonologueDuration::class,\n FilterDefinition\\UserQuestionCount::class,\n FilterDefinition\\CommentCountRange::class,\n // Relevant for topics in deals.\n ClosedDealsFilter::class,\n HasTopicTriggersFilterDefinition::class,\n TopicFilterDefinition::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n private function getDealInsightsPageFilters(\n bool $useCreatedDate = false,\n bool $includeDealType = false,\n bool $includePipeline = false,\n ): FilterDefinitionCollection {\n if ($useCreatedDate) {\n $periodFilterClass = FilterDefinition\\DealInsights\\CreatedPeriodFilter::class;\n } else {\n $periodFilterClass = FilterDefinition\\DealInsights\\ClosingPeriodFilter::class;\n }\n\n $filterSet = [\n RestrictTeam::class,\n $periodFilterClass,\n FilterDefinition\\DealInsights\\UserInFilter::class,\n FilterDefinition\\DealInsights\\UserGroupInFilter::class,\n FilterDefinition\\DealInsights\\DealStageInFilter::class,\n FilterDefinition\\DealInsights\\DealNameFilter::class,\n ];\n\n if ($includePipeline) {\n $filterSet[] = FilterDefinition\\DealInsights\\DealPipelineInFilter::class;\n }\n\n if ($includeDealType) {\n $filterSet[] = FilterDefinition\\DealInsights\\DealTypeInFilter::class;\n }\n\n return FilterDefinitionCollection::make(\n Collection::make($filterSet)\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getTeamInsightsPageFilterSet(\n Criteria $criteria,\n User $consumer,\n bool $isExport = false\n ): FilterDefinitionCollection {\n return $this\n ->getTeamInsightsPageFilters($isExport)\n ->withCriteria($criteria)\n ->withConsumer($consumer)\n ->withRestrictions($consumer->getTeam());\n }\n\n public function getDealInsightsPageFilterSet(\n Criteria $criteria,\n User $consumer\n ): FilterDefinitionCollection {\n $includeDealType = $this->shouldIncludeDealType($consumer);\n $includePipeline = $this->shouldIncludePipeline($consumer);\n $useCreatedDate = $this->shouldUseCreatedDate($consumer);\n\n return $this\n ->getDealInsightsPageFilters($useCreatedDate, $includeDealType, $includePipeline)\n ->withCriteria($criteria)\n ->withConsumer($consumer);\n }\n\n public function getTeamAiAutomationFilterSet(\n Criteria $criteria,\n User $consumer\n ): FilterDefinitionCollection {\n return $this\n ->getTeamAiAutomationPageFilterSet()\n ->withCriteria($criteria)\n ->withConsumer($consumer);\n }\n\n private function getTeamAiAutomationPageFilterSet(): FilterDefinitionCollection\n {\n $filterSet = [\n RestrictTeam::class,\n FilterDefinition\\DealInsights\\DealStageInFilter::class,\n ];\n\n return FilterDefinitionCollection::make(\n Collection::make($filterSet)\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n }\n\n public function getHomepageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection\n {\n $filterDefinitionCollection = FilterDefinitionCollection::make(\n Collection::make([\n RestrictTeam::class,\n RestrictUserGroupScope::class,\n RestrictActivityChannel::class,\n RestrictUserActive::class,\n FilterDefinition\\Security\\PrivateMeetingsForCurrentUserOnly::class,\n FilterDefinition\\ActivityActualDate::class,\n FilterDefinition\\Customer::class,\n FilterDefinition\\ActivityChannel::class,\n FilterDefinition\\ActivityDurationRange::class,\n FilterDefinition\\ActivityProviderIn::class,\n FilterDefinition\\ActivityRecorded::class,\n FilterDefinition\\ActivityRecordingStopped::class,\n FilterDefinition\\ActivityScheduledDate::class,\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\LoggedToCrm::class,\n FilterDefinition\\OrganiserUserIn::class,\n FilterDefinition\\OrganiserUserNotIn::class,\n FilterDefinition\\ProviderFilterDefinition::class,\n FilterDefinition\\SortBy::class,\n FilterDefinition\\UserGroupInOptionalFilter::class,\n FilterDefinition\\OnlyActiveUsers::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all(),\n );\n $filterDefinitionCollection->withCriteria($criteria);\n $filterDefinitionCollection->withConsumer($consumer);\n\n return $filterDefinitionCollection;\n }\n\n public function getPartnerFilterSet(Criteria $criteria): FilterDefinitionCollection\n {\n $filterDefinitionCollection = FilterDefinitionCollection::make(\n Collection::make([\n RestrictActivityChannel::class,\n FilterDefinition\\OrganiserTeamIn::class,\n FilterDefinition\\ActivityUpdatedDate::class,\n FilterDefinition\\ActivityStatusIn::class,\n FilterDefinition\\SortBy::class,\n ])\n ->map(fn (string $className): FilterDefinition => $this->container->make($className))\n ->all()\n );\n $filterDefinitionCollection->withCriteria($criteria);\n\n return $filterDefinitionCollection;\n }\n\n private function shouldIncludeDealType(User $user): bool\n {\n $crmConfig = $user->getTeam()->getCrmConfiguration();\n $crmProviderName = $crmConfig->getProviderName();\n\n if (! array_key_exists($crmProviderName, Field::BUSINESS_TYPE_FIELDS)) {\n return false;\n }\n\n $layoutRepository = app(LayoutRepository::class);\n $layoutFields = $layoutRepository->getDealInsightLayoutFields($crmConfig);\n $dealTypeField = Field::BUSINESS_TYPE_FIELDS[$crmProviderName];\n\n if (! in_array($dealTypeField, $layoutFields)) {\n return false;\n }\n\n return true;\n }\n\n private function shouldIncludePipeline(User $user): bool\n {\n $crmConfig = $user->getTeam()->getCrmConfiguration();\n $crmProviderName = $crmConfig->getProviderName();\n\n if (in_array($crmProviderName, [\n Configuration::PROVIDER_SALESFORCE,\n Configuration::PROVIDER_INTEGRATION_APP,\n ])) {\n return false;\n }\n\n return true;\n }\n\n private function shouldUseCreatedDate(User $user): bool\n {\n $teamService = app(TeamService::class);\n\n return ! $teamService->useDealInsightsClosedDateFilter($user->getTeam());\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.049609374,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"15","depth":4,"bounds":{"left":0.2589844,"top":0.28125,"width":0.011328125,"height":0.013194445},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.27265626,"top":0.28125,"width":0.009375,"height":0.013194445},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.28398436,"top":0.27986112,"width":0.00859375,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.29257813,"top":0.27986112,"width":0.008203125,"height":0.015972223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","depth":4,"bounds":{"left":0.15234375,"top":0.084027775,"width":0.39882812,"height":0.91597223},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Repositories;\n\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Database\\Eloquent\\Builder;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\DB;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSort;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\ReportSortDirection;\n\nclass AutomatedReportsRepository\n{\n /**\n * Create a new automated report\n *\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function create(array $data): AutomatedReport\n {\n return AutomatedReport::create($data);\n }\n\n /**\n * Find an automated report by UUID\n *\n * @param string $uuid\n *\n * @return AutomatedReport|null\n */\n public function findByUuid(string $uuid): ?AutomatedReport\n {\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($uuid))->first();\n }\n\n public function findByIdOrUuid(string $idOrUuid): ?AutomatedReport\n {\n if (is_numeric($idOrUuid)) {\n return AutomatedReport::find((int) $idOrUuid);\n }\n\n return AutomatedReport::where('uuid', AutomatedReport::toOptimized($idOrUuid))->first();\n }\n\n /**\n * Retrieve all standard (non-Ask Jiminny) automated reports.\n *\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAllStandardReports(\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->whereNot('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->get();\n }\n\n /**\n * Retrieve all Ask Jiminny reports created by the given user.\n *\n * @param User $user The user whose reports to retrieve.\n * @param string $sortColumn The column to sort by. Allowed values: 'created_by', 'created_at'. Defaults to 'created_at'.\n * @param string $sortDirection The sort direction. Allowed values: 'asc', 'desc'. Defaults to 'desc'.\n *\n * @return Collection<AutomatedReport>\n */\n public function getAskJiminnyReportsByUser(\n User $user,\n string $sortColumn = 'created_at',\n string $sortDirection = 'desc'\n ): Collection {\n return $this->buildSortedQuery($sortColumn, $sortDirection)\n ->where('type', AutomatedReportsService::TYPE_ASK_JIMINNY)\n ->where('created_by', $user->getId())\n ->get();\n }\n\n private function buildSortedQuery(string $sortColumn, string $sortDirection): \\Illuminate\\Database\\Eloquent\\Builder\n {\n $allowedColumns = ['created_by', 'created_at'];\n if (! in_array($sortColumn, $allowedColumns)) {\n $sortColumn = 'created_at';\n }\n\n $sortDirection = strtolower($sortDirection) === 'asc' ? 'asc' : 'desc';\n\n $query = AutomatedReport::query()->with(['creator', 'team']);\n\n if ($sortColumn === 'created_by') {\n $query->leftJoin('users', 'users.id', '=', 'automated_reports.created_by')\n ->orderByRaw(\"users.name COLLATE utf8mb4_unicode_ci {$sortDirection}\")\n ->select('automated_reports.*');\n } else {\n $query->orderBy($sortColumn, $sortDirection);\n }\n\n return $query;\n }\n\n /**\n * Get all active and enabled reports with active teams for the specified frequency.\n *\n * @param string $frequency\n *\n * @return Collection<AutomatedReport>\n */\n public function getActiveReportsByFrequency(string $frequency): Collection\n {\n return AutomatedReport::where('automated_reports.status', true)\n ->where('automated_reports.frequency', $frequency)\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->where('teams.status', Team::STATUS_ACTIVE)\n ->where(function ($query) {\n $query->whereNull('automated_reports.expires_at')\n ->orWhere('automated_reports.expires_at', '>=', now()->toDateString());\n })\n ->select('automated_reports.*')\n ->get();\n }\n\n /**\n * Update an automated report\n *\n * @param AutomatedReport $report\n * @param array $data\n *\n * @return AutomatedReport\n */\n public function update(AutomatedReport $report, array $data): AutomatedReport\n {\n $report->update($data);\n\n return $report;\n }\n\n /**\n * Create a new automated report result.\n *\n * @param array $data The data to create the automated report result with.\n *\n * @return AutomatedReportResult The newly created automated report result.\n */\n public function createResult(array $data): AutomatedReportResult\n {\n return AutomatedReportResult::create($data);\n }\n\n /**\n * Find an automated report result by UUID.\n *\n * @param string $uuid The UUID to find the automated report result with.\n *\n * @return AutomatedReportResult|null The automated report result if found, otherwise null.\n */\n public function findResultByUuid(string $uuid): ?AutomatedReportResult\n {\n return AutomatedReportResult::where('uuid', AutomatedReportResult::toOptimized($uuid))->first();\n }\n\n public function findResultByUuidForUser(string $uuid, User $user): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('uuid', AutomatedReportResult::toOptimized($uuid))\n ->whereHas('report', static function ($query) use ($user): void {\n $query->where('team_id', $user->getTeamId())\n ->where('created_by', $user->getId());\n })\n ->first();\n }\n\n public function findChildResult(AutomatedReportResult $result, string $type): ?AutomatedReportResult\n {\n return AutomatedReportResult::query()\n ->where('parent_id', $result->getId())\n ->where('media_type', $type)\n ->first();\n }\n\n public function getGeneratedNotSentResults(): Collection\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNull('sent_at')\n ->where('status', AutomatedReportResult::STATUS_GENERATED)\n ->whereHas('report')\n ->with('report')\n ->get();\n }\n\n public function getPaginatedUserReports(\n User $user,\n ReportSort $sort,\n ReportSortDirection $sortDirection,\n int $resultsPerPage,\n int $page,\n ?Carbon $fromDate,\n ?Carbon $toDate,\n array $teamIds,\n array $reportTypes,\n ?string $name,\n ): LengthAwarePaginator {\n $query = AutomatedReportResult::query()\n ->whereNotNull('automated_report_results.generated_at')\n ->join('automated_reports', 'automated_report_results.report_id', '=', 'automated_reports.id')\n ->where('automated_reports.team_id', $user->getTeamId())\n ->whereJsonContains('automated_reports.recipients->users', $user->getId())\n ->orderByRaw(\"$sort->value COLLATE utf8mb4_unicode_ci {$sortDirection->value}\")\n ->select('automated_report_results.*')\n ->with('report.team');\n\n if ($fromDate !== null && $toDate !== null) {\n $query->whereBetween('generated_at', [$fromDate, $toDate]);\n }\n\n if (! empty($teamIds)) {\n $query->where(function ($q) use ($teamIds) {\n foreach ($teamIds as $id) {\n $q->orWhereJsonContains('automated_reports.groups', $id);\n }\n });\n }\n\n if (! empty($reportTypes)) {\n $query->whereIn('automated_reports.type', $reportTypes);\n }\n\n if (! empty($name)) {\n $query->whereLike('name', \"%$name%\");\n }\n\n return $query->paginate($resultsPerPage, ['*'], 'page', $page);\n }\n\n public function countUserReports(User $user): int\n {\n return AutomatedReportResult::query()\n ->whereNotNull('generated_at')\n ->whereNotNull('sent_at')\n ->whereHas('report', function ($q) use ($user) {\n $q->where('team_id', $user->getTeamId())\n ->whereJsonContains('recipients->users', $user->getId());\n })\n ->count();\n }\n\n /**\n * Get report IDs for a specific team\n *\n * @param Team $team\n *\n * @return \\Illuminate\\Support\\Collection\n */\n public function getReportIdsByTeam(Team $team): \\Illuminate\\Support\\Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->pluck('id');\n }\n\n /**\n * Get all reports for a specific team\n *\n * @param Team $team\n *\n * @return Collection\n */\n public function getReportsByTeam(Team $team): Collection\n {\n return AutomatedReport::where('team_id', $team->getId())->get();\n }\n\n /**\n * Get all report results for a specific report\n *\n * @param AutomatedReport $report\n *\n * @return Collection\n */\n public function getResultsByReport(AutomatedReport $report): Collection\n {\n return $this->getResultsByReportQuery($report)->get();\n }\n\n public function getResultsByReportQuery(AutomatedReport $report): Builder\n {\n return AutomatedReportResult::where('report_id', $report->getId());\n }\n\n public function getReportResultsQueryForRetention(Team $team, CarbonImmutable $retentionDate): Builder\n {\n $reportIds = $this->getReportIdsByTeam($team);\n\n return AutomatedReportResult::query()->whereIn('report_id', $reportIds)\n ->whereRaw('IFNULL(generated_at, created_at) <= ?', [$retentionDate]);\n }\n\n /**\n * @param int|null $teamId Optional team ID to filter results\n *\n * @return \\Illuminate\\Support\\Collection<int, int> Collection of team IDs\n */\n public function getTeamIdsWithReportsResults(?int $teamId = null): \\Illuminate\\Support\\Collection\n {\n $query = DB::table('automated_reports')\n ->join('teams', 'automated_reports.team_id', '=', 'teams.id')\n ->select('teams.id')\n ->distinct();\n\n if ($teamId !== null) {\n $query->where('teams.id', $teamId);\n }\n\n return $query->pluck('teams.id');\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.0140625,"top":0.041666668,"width":0.028515626,"height":0.021527778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.23320313,"top":1.0,"width":0.01015625,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"bounds":{"left":0.03203125,"top":0.0,"width":0.01875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"bounds":{"left":0.039453126,"top":0.0,"width":0.027734375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"bounds":{"left":0.039453126,"top":0.0,"width":0.0375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","depth":9,"bounds":{"left":0.046875,"top":0.0,"width":0.0171875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActionItems, folder","depth":9,"bounds":{"left":0.046875,"top":0.0,"width":0.03828125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Activity, folder","depth":9,"bounds":{"left":0.046875,"top":0.0,"width":0.027734375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics, folder","depth":9,"bounds":{"left":0.046875,"top":0.0020833334,"width":0.049609374,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","depth":9,"bounds":{"left":0.046875,"top":0.017361112,"width":0.04453125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"EventSubscriber, folder","depth":10,"bounds":{"left":0.054296874,"top":0.03263889,"width":0.04921875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition, folder","depth":10,"bounds":{"left":0.054296874,"top":0.047916666,"width":0.04453125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Service","depth":10,"bounds":{"left":0.054296874,"top":0.063194446,"width":0.02734375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActivityApiSearch.php, class","depth":11,"bounds":{"left":0.06171875,"top":0.07847222,"width":0.06289063,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch.php, class","depth":11,"bounds":{"left":0.06171875,"top":0.09375,"width":0.055078126,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"UserOptionsByGroup.php, class","depth":11,"bounds":{"left":0.06171875,"top":0.10902778,"width":0.07109375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AbstractStageFilterDefinition.php, abstract class","depth":10,"bounds":{"left":0.054296874,"top":0.124305554,"width":0.08945312,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearchServiceProvider.php, final class","depth":10,"bounds":{"left":0.054296874,"top":0.13958333,"width":0.09296875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"DealInsightsPeriodFilterFactory.php","depth":10,"bounds":{"left":0.054296874,"top":0.15486111,"width":0.0953125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"DealInsightsPeriodFilterFactoryInterface.php, interface","depth":10,"bounds":{"left":0.054296874,"top":0.1701389,"width":0.11679687,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition.php, abstract class","depth":10,"bounds":{"left":0.054296874,"top":0.18541667,"width":0.055078126,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionCollection.php, class","depth":10,"bounds":{"left":0.054296874,"top":0.20069444,"width":0.07890625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionQuery.php, class","depth":10,"bounds":{"left":0.054296874,"top":0.21597221,"width":0.06953125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionQueryCollection.php, class","depth":10,"bounds":{"left":0.054296874,"top":0.23125,"width":0.09375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FilteredValueContainerInterface.php, interface","depth":10,"bounds":{"left":0.054296874,"top":0.24652778,"width":0.096875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"IntMinMaxRange.php, class","depth":10,"bounds":{"left":0.054296874,"top":0.26180556,"width":0.06015625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"bounds":{"left":0.046875,"top":0.27708334,"width":0.04453125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"bounds":{"left":0.046875,"top":0.2923611,"width":0.041796874,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"bounds":{"left":0.046875,"top":0.30763888,"width":0.04140625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"bounds":{"left":0.046875,"top":0.32291666,"width":0.03984375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"bounds":{"left":0.046875,"top":0.33819443,"width":0.04140625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"bounds":{"left":0.046875,"top":0.35347223,"width":0.02109375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"bounds":{"left":0.046875,"top":0.36875,"width":0.055078126,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"bounds":{"left":0.046875,"top":0.38402778,"width":0.025,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"bounds":{"left":0.046875,"top":0.39930555,"width":0.055859376,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Country","depth":9,"bounds":{"left":0.046875,"top":0.41458333,"width":0.02890625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi","depth":9,"bounds":{"left":0.046875,"top":0.4298611,"width":0.040625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Database","depth":9,"bounds":{"left":0.046875,"top":0.4451389,"width":0.032421876,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Datadog","depth":9,"bounds":{"left":0.046875,"top":0.46041667,"width":0.030078124,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"DateTime","depth":9,"bounds":{"left":0.046875,"top":0.47569445,"width":0.0328125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":9,"bounds":{"left":0.046875,"top":0.49097222,"width":0.0390625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"bounds":{"left":0.046875,"top":0.50625,"width":0.0328125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"bounds":{"left":0.046875,"top":0.52152777,"width":0.0421875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"bounds":{"left":0.046875,"top":0.53680557,"width":0.03046875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"bounds":{"left":0.046875,"top":0.5520833,"width":0.03203125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Encryption","depth":9,"bounds":{"left":0.046875,"top":0.5673611,"width":0.03515625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"ES","depth":9,"bounds":{"left":0.046875,"top":0.58263886,"width":0.016015625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Faker","depth":9,"bounds":{"left":0.046875,"top":0.59791666,"width":0.023046875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags","depth":9,"bounds":{"left":0.046875,"top":0.61319447,"width":0.040625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":9,"bounds":{"left":0.046875,"top":0.6284722,"width":0.029296875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"FileSystem","depth":9,"bounds":{"left":0.046875,"top":0.64375,"width":0.0359375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Gecko","depth":9,"bounds":{"left":0.046875,"top":0.65902776,"width":0.025,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Gong","depth":9,"bounds":{"left":0.046875,"top":0.67430556,"width":0.022265624,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp","depth":9,"bounds":{"left":0.046875,"top":0.68958336,"width":0.036328126,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints","depth":9,"bounds":{"left":0.046875,"top":0.7048611,"width":0.03359375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Kiosk","depth":9,"bounds":{"left":0.046875,"top":0.7201389,"width":0.02265625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection","depth":9,"bounds":{"left":0.046875,"top":0.73541665,"width":0.056640625,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed","depth":9,"bounds":{"left":0.046875,"top":0.75069445,"width":0.031640626,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Locks","depth":9,"bounds":{"left":0.046875,"top":0.7659722,"width":0.023828125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Math","depth":9,"bounds":{"left":0.046875,"top":0.78125,"width":0.021875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline","depth":9,"bounds":{"left":0.046875,"top":0.7965278,"width":0.04296875,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot","depth":9,"bounds":{"left":0.046875,"top":0.81180555,"width":0.037109375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings","depth":9,"bounds":{"left":0.046875,"top":0.82708335,"width":0.0453125,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Model","depth":9,"bounds":{"left":0.046875,"top":0.8423611,"width":0.024609376,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Notification","depth":9,"bounds":{"left":0.046875,"top":0.8576389,"width":0.037109375,"height":0.015277778},"role_description":"text"},{"role":"AXStaticText","text":"Nudge","depth":9,"bounds":{"left":0.046875,"top":0.87291664,"width":0.025390625,"height":0.015277778},"role_description":"text"}]...
|
-3507986962049824144
|
-3743354318684703676
|
visual_change
|
accessibility
|
NULL
|
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
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
declare(strict_types=1);
namespace Jiminny\Component\ActivitySearch\Service;
use Illuminate\Container\Container;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\AiCallScoreFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\AutoScoreFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\ClosedDealsFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealCloseDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\HasTopicTriggersFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\PlaybackTopicFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictActivityChannel;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictPublicActivitiesOnly;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictTeam;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictUserActive;
use Jiminny\Component\ActivitySearch\FilterDefinition\Security\RestrictUserGroupScope;
use Jiminny\Component\ActivitySearch\FilterDefinition\TeamInsights\TopicFilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinitionCollection;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\User;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Repositories\Crm\LayoutRepository;
use Jiminny\Services\TeamService;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
class ActivitySearch
{
private Container $container;
public function __construct(Container $container)
{
$this->container = $container;
}
public function getOnDemandPageFilters(): FilterDefinitionCollection
{
return FilterDefinitionCollection::make(
Collection::make([
// special case filters
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\ActivityUpdatedDate::class,
FilterDefinition\ActivityRecordingStopped::class,
FilterDefinition\ActivityFilter::class,
FilterDefinition\ExternalId::class,
FilterDefinition\NudgeRunId::class,
FilterDefinition\ParticipantUserIn::class,
FilterDefinition\PartnerFilterDefinition::class,
// healthy restrictions
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictUserActive::class,
FilterDefinition\Security\PrivateMeetingsForCurrentUserOnly::class,
// regular filters
FilterDefinition\ActivityActualDate::class,
FilterDefinition\ActivityChannel::class,
FilterDefinition\ActivityDurationRange::class,
FilterDefinition\ActivityPlaylistIn::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\ActivityRecorded::class,
FilterDefinition\ActivityType::class,
FilterDefinition\CoachingFeedbackAverageScore::class,
AutoScoreFilter::class,
AiCallScoreFilter::class,
FilterDefinition\CoachingFeedbackCoachUserIn::class,
FilterDefinition\CrmFieldCollection::class,
FilterDefinition\CurrentStage::class,
FilterDefinition\Customer::class,
FilterDefinition\CustomerMonologueDuration::class,
FilterDefinition\CustomerQuestionCount::class,
FilterDefinition\DealAge::class,
DealCloseDate::class,
FilterDefinition\DealValue::class,
FilterDefinition\EngagingQuestionCount::class,
FilterDefinition\ShowInternalExternalActivitiesFilter::class,
FilterDefinition\HasTranscription::class,
FilterDefinition\InsightfulQuestionCount::class,
FilterDefinition\LanguageFilterDefinition::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\OrganiserGroupIn:[PASSWORD]
FilterDefinition\OrganiserUserIn::class,
FilterDefinition\PatienceRange::class,
PlaybackTopicFilterDefinition::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\SpeechRate::class,
FilterDefinition\StageAtCallFilterDefinition::class,
FilterDefinition\TalkTimeRatio::class,
FilterDefinition\TeamMemberUserIn::class,
FilterDefinition\TranscriptionComposite::class,
FilterDefinition\UserMonologueDuration::class,
FilterDefinition\UserQuestionCount::class,
FilterDefinition\CommentCountRange::class,
FilterDefinition\HasPendingAiCrmNotes::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getOnDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection
{
return $this
->getOnDemandPageFilters()
->withCriteria($criteria)
->withConsumer($consumer)
->withRestrictions($consumer->getTeam());
}
/**
* @return string[]
*/
public function getArrayFilterKeys(User $consumer): array
{
return $this
->getOnDemandPageFilters()
->withConsumer($consumer)
->getPropertyTypes([FilterDefinitionCollection::PROPERTY_TYPE_ARRAY])
->keys()
->filter(static fn (string $key): bool => ! str_contains($key, '.'))
->values()
->all();
}
private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollection
{
$dateRangeFilterClass = $isExport
? FilterDefinition\TeamInsights\ConversationExport\DateRangeFilter::class
: FilterDefinition\TeamInsights\DateRangeFilter::class;
return FilterDefinitionCollection::make(
Collection::make([
// special cases
$dateRangeFilterClass,
FilterDefinition\TeamInsights\Exists::class,
// healthy restrictions
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictPublicActivitiesOnly::class,
RestrictUserActive::class,
// regular filters
FilterDefinition\ActivityChannel::class,
FilterDefinition\TeamInsights\ActivityDurationRange::class,
FilterDefinition\ActivityPlaylistIn::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\TeamInsights\ActivityRecorded::class,
FilterDefinition\ActivityType::class,
FilterDefinition\CoachingFeedbackAverageScore::class,
AutoScoreFilter::class,
AiCallScoreFilter::class,
FilterDefinition\CoachingFeedbackCoachUserIn::class,
FilterDefinition\CrmFieldCollection::class,
FilterDefinition\Customer::class,
FilterDefinition\CurrentStage::class,
FilterDefinition\CustomerMonologueDuration::class,
FilterDefinition\CustomerQuestionCount::class,
FilterDefinition\DealAge::class,
DealCloseDate::class,
FilterDefinition\DealValue::class,
FilterDefinition\EngagingQuestionCount::class,
FilterDefinition\ShowInternalExternalActivitiesFilter::class,
FilterDefinition\InsightfulQuestionCount::class,
FilterDefinition\LanguageFilterDefinition::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\TeamInsights\UserInFilter::class,
FilterDefinition\TeamInsights\UserGroupInFilter::class,
FilterDefinition\PatienceRange::class,
PlaybackTopicFilterDefinition::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\SpeechRate::class,
FilterDefinition\StageAtCallFilterDefinition::class,
FilterDefinition\TalkTimeRatio::class,
FilterDefinition\TeamMemberUserIn::class,
FilterDefinition\TranscriptionComposite::class,
FilterDefinition\UserMonologueDuration::class,
FilterDefinition\UserQuestionCount::class,
FilterDefinition\CommentCountRange::class,
// Relevant for topics in deals.
ClosedDealsFilter::class,
HasTopicTriggersFilterDefinition::class,
TopicFilterDefinition::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
private function getDealInsightsPageFilters(
bool $useCreatedDate = false,
bool $includeDealType = false,
bool $includePipeline = false,
): FilterDefinitionCollection {
if ($useCreatedDate) {
$periodFilterClass = FilterDefinition\DealInsights\CreatedPeriodFilter::class;
} else {
$periodFilterClass = FilterDefinition\DealInsights\ClosingPeriodFilter::class;
}
$filterSet = [
RestrictTeam::class,
$periodFilterClass,
FilterDefinition\DealInsights\UserInFilter::class,
FilterDefinition\DealInsights\UserGroupInFilter::class,
FilterDefinition\DealInsights\DealStageInFilter::class,
FilterDefinition\DealInsights\DealNameFilter::class,
];
if ($includePipeline) {
$filterSet[] = FilterDefinition\DealInsights\DealPipelineInFilter::class;
}
if ($includeDealType) {
$filterSet[] = FilterDefinition\DealInsights\DealTypeInFilter::class;
}
return FilterDefinitionCollection::make(
Collection::make($filterSet)
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getTeamInsightsPageFilterSet(
Criteria $criteria,
User $consumer,
bool $isExport = false
): FilterDefinitionCollection {
return $this
->getTeamInsightsPageFilters($isExport)
->withCriteria($criteria)
->withConsumer($consumer)
->withRestrictions($consumer->getTeam());
}
public function getDealInsightsPageFilterSet(
Criteria $criteria,
User $consumer
): FilterDefinitionCollection {
$includeDealType = $this->shouldIncludeDealType($consumer);
$includePipeline = $this->shouldIncludePipeline($consumer);
$useCreatedDate = $this->shouldUseCreatedDate($consumer);
return $this
->getDealInsightsPageFilters($useCreatedDate, $includeDealType, $includePipeline)
->withCriteria($criteria)
->withConsumer($consumer);
}
public function getTeamAiAutomationFilterSet(
Criteria $criteria,
User $consumer
): FilterDefinitionCollection {
return $this
->getTeamAiAutomationPageFilterSet()
->withCriteria($criteria)
->withConsumer($consumer);
}
private function getTeamAiAutomationPageFilterSet(): FilterDefinitionCollection
{
$filterSet = [
RestrictTeam::class,
FilterDefinition\DealInsights\DealStageInFilter::class,
];
return FilterDefinitionCollection::make(
Collection::make($filterSet)
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
}
public function getHomepageFilterSet(Criteria $criteria, User $consumer): FilterDefinitionCollection
{
$filterDefinitionCollection = FilterDefinitionCollection::make(
Collection::make([
RestrictTeam::class,
RestrictUserGroupScope::class,
RestrictActivityChannel::class,
RestrictUserActive::class,
FilterDefinition\Security\PrivateMeetingsForCurrentUserOnly::class,
FilterDefinition\ActivityActualDate::class,
FilterDefinition\Customer::class,
FilterDefinition\ActivityChannel::class,
FilterDefinition\ActivityDurationRange::class,
FilterDefinition\ActivityProviderIn::class,
FilterDefinition\ActivityRecorded::class,
FilterDefinition\ActivityRecordingStopped::class,
FilterDefinition\ActivityScheduledDate::class,
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\LoggedToCrm::class,
FilterDefinition\OrganiserUserIn::class,
FilterDefinition\OrganiserUserNotIn::class,
FilterDefinition\ProviderFilterDefinition::class,
FilterDefinition\SortBy::class,
FilterDefinition\UserGroupInOptionalFilter::class,
FilterDefinition\OnlyActiveUsers::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all(),
);
$filterDefinitionCollection->withCriteria($criteria);
$filterDefinitionCollection->withConsumer($consumer);
return $filterDefinitionCollection;
}
public function getPartnerFilterSet(Criteria $criteria): FilterDefinitionCollection
{
$filterDefinitionCollection = FilterDefinitionCollection::make(
Collection::make([
RestrictActivityChannel::class,
FilterDefinition\OrganiserTeamIn::class,
FilterDefinition\ActivityUpdatedDate::class,
FilterDefinition\ActivityStatusIn::class,
FilterDefinition\SortBy::class,
])
->map(fn (string $className): FilterDefinition => $this->container->make($className))
->all()
);
$filterDefinitionCollection->withCriteria($criteria);
return $filterDefinitionCollection;
}
private function shouldIncludeDealType(User $user): bool
{
$crmConfig = $user->getTeam()->getCrmConfiguration();
$crmProviderName = $crmConfig->getProviderName();
if (! array_key_exists($crmProviderName, Field::BUSINESS_TYPE_FIELDS)) {
return false;
}
$layoutRepository = app(LayoutRepository::class);
$layoutFields = $layoutRepository->getDealInsightLayoutFields($crmConfig);
$dealTypeField = Field::BUSINESS_TYPE_FIELDS[$crmProviderName];
if (! in_array($dealTypeField, $layoutFields)) {
return false;
}
return true;
}
private function shouldIncludePipeline(User $user): bool
{
$crmConfig = $user->getTeam()->getCrmConfiguration();
$crmProviderName = $crmConfig->getProviderName();
if (in_array($crmProviderName, [
Configuration::PROVIDER_SALESFORCE,
Configuration::PROVIDER_INTEGRATION_APP,
])) {
return false;
}
return true;
}
private function shouldUseCreatedDate(User $user): bool
{
$teamService = app(TeamService::class);
return ! $teamService->useDealInsightsClosedDateFilter($user->getTeam());
}
}
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
app ~/jiminny/app
.circleci
.cursor
.github
.sonarlint
.vscode
.windsurf
app, sources root
Actions
Component
Acl, folder
ActionItems, folder
Activity, folder
ActivityAnalytics, folder
ActivitySearch, folder
EventSubscriber, folder
FilterDefinition, folder
Service
ActivityApiSearch.php, class
ActivitySearch.php, class
UserOptionsByGroup.php, class
AbstractStageFilterDefinition.php, abstract class
ActivitySearchServiceProvider.php, final class
DealInsightsPeriodFilterFactory.php
DealInsightsPeriodFilterFactoryInterface.php, interface
FilterDefinition.php, abstract class
FilterDefinitionCollection.php, class
FilterDefinitionQuery.php, class
FilterDefinitionQueryCollection.php, class
FilteredValueContainerInterface.php, interface
IntMinMaxRange.php, class
AiActivityType
AiAutomation
AiCallScoring
AskAnything
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding
Encryption
ES
Faker
FeatureFlags
FFMpeg
FileSystem
Gecko
Gong
GuzzleHttp
KeyPoints
Kiosk
LanguageDetection
LiveFeed
Locks
Math
MediaPipeline
MeetingBot
MobileSettings
Model
Notification
Nudge...
|
11021
|
|
11024
|
219
|
1
|
2026-04-14T09:09:00.179401+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157740179_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennamespace Jiminny\Component\ActivitySearch\Service;g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*dearal string ssortosrection the sort dam 235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,usen sconsumenWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL° AskJiminnyReportActivityServiceT…..Defaults100% |45]Tue 14 Apr 12:08:59CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny R+D ...When 1SFirstRequest() = true, these Implicht tilters are applled that aren tin the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdeauis con aoov oralemarve v always oass a nonzzero sequence number hhe necel nerscuywastomaveisearch.wNow let me verify my understanding of isFirstRequest :reao CrieraonoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest () returns false and no implicit defaults are applied.• AskJiniNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnvReoortActivtvServicelest.onv and searched.Ask.iminnvReoortActivitvI need to add a test that verifies sequence _number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:U AskJimi,Now let's run the test to verify:docker exec docker_lamp_1 php /var/www/html/artisan testrests unluservces/Klosk Alconareokedorts AskmnnvrevortAcuvtsercel est.ono =-no-coveradeCould not open input file: /var/www/html/artisantests/unxt/servkces/K1o5k/AutomatedReports/AskJ iminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisandocker exec docker_lamp_1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1'Could not open input file: artisancommand dockel• docker exec docker_lamp 1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null head -5'/home/jiminny/artisanCommand dockertests/Unxt/Services/KLosk/AutomatedReports/ASkJimäyReportActiVätyServiceTest-php --no-coverage 2>61"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (884L)+ <> Code Claude Sonnet 4.6Phan se+ SkipView allReject allAccept allwinasur leams11O:24uir-o( 4 spaces...
|
NULL
|
-1307015034234637566
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennamespace Jiminny\Component\ActivitySearch\Service;g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*dearal string ssortosrection the sort dam 235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection {...public function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,usen sconsumenWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 52mAL° AskJiminnyReportActivityServiceT…..Defaults100% |45]Tue 14 Apr 12:08:59CascadeFixing ReportControllerAutomated Report Mar© Fixing Ask Jiminny R+D ...When 1SFirstRequest() = true, these Implicht tilters are applled that aren tin the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-only3. OrganiserGroupIn — applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdeauis con aoov oralemarve v always oass a nonzzero sequence number hhe necel nerscuywastomaveisearch.wNow let me verify my understanding of isFirstRequest :reao CrieraonoConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest () returns false and no implicit defaults are applied.• AskJiniNow let me check if there's an existing test for AskJiminnyReportActivityService to update:Explored AskJiminnvReoortActivtvServicelest.onv and searched.Ask.iminnvReoortActivitvI need to add a test that verifies sequence _number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:U AskJimi,Now let's run the test to verify:docker exec docker_lamp_1 php /var/www/html/artisan testrests unluservces/Klosk Alconareokedorts AskmnnvrevortAcuvtsercel est.ono =-no-coveradeCould not open input file: /var/www/html/artisantests/unxt/servkces/K1o5k/AutomatedReports/AskJ iminnyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisandocker exec docker_lamp_1 bash -c "cd /var/www && php artisan testtests/Unit/Services/Kiosk/AutomatedReports/AskJiminnyReportActivityServiceTest.php --no-coverage 2>&1'Could not open input file: artisancommand dockel• docker exec docker_lamp 1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null head -5'/home/jiminny/artisanCommand dockertests/Unxt/Services/KLosk/AutomatedReports/ASkJimäyReportActiVätyServiceTest-php --no-coverage 2>61"Itlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (884L)+ <> Code Claude Sonnet 4.6Phan se+ SkipView allReject allAccept allwinasur leams11O:24uir-o( 4 spaces...
|
NULL
|
|
11025
|
219
|
2
|
2026-04-14T09:09:01.854582+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157741854_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitioncollection ...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 51 mAL AskJiminnyReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:09:01CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny R+D ..lne ronteno UxLhas sequence numbere4 - meanno s nor a list reduest. ne sevice doesh seut. so the cireda chnks s a listrequestWhen isFirstRequest() = true , these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-onlyOraaniserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearchRead AskJiminnyReportActivitySelce.ono #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onolConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no imolicit defaults are apolied.ewAskJiminnyReportActivityService.php+1-11Now ler me check mtnere's anex sune estror AskyiminnvredortAcuvi vservice lo uocare.Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:AskJiminnyReportActivityServicelest.pnpNow let's run the test to verify:commana dockelo decte/nke/ tockces/klosk/RuP /ar/ep/nts/AkJinanyReportActivityServacetest- php -no-coverageCould not open input file: /var/www/html/artisanCommand dockerdester ext/sdrvices/KLosk/Automate/kepirts/ASkJ iminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanaocker exec aocker lamp 1 bash -c"cd /var/www && php artisan testLests/unte/services/ nlosk/ Aucomacearepores/ Askuemennyкeportactivilyservicelest.onp =-no-coverdge 22al"Could not open input file: artisanCommand docker• docker exec docker lamp 1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"home/iiminny/artisanartisan testdests/axec sdovkers/k2p 1/Autonae Reports/A5 kaimay yRportArtivatySesviceTest.php --no-coverage 2›61Itlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (X4L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allwinasur leams11O:24uir-o( 4 spaces...
|
NULL
|
4616817957594730042
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e TrackProvidernstallled-vent.ono0 DealinsidnisPeriodrilteng FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpnamespace Jiminny \Component\ActivitySearch\Service;c rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.bool +inctuderipellhe - Talse): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232*oodrdl sarno osorccocumin233The column tl 234*Cearal string ssorcosrection the sort a1m235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitioncollection ...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)j Support Daily • in 2h 51 mAL AskJiminnyReportActivityServiceT...Defaults100% C•Tue 14 Apr 12:09:01CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny R+D ..lne ronteno UxLhas sequence numbere4 - meanno s nor a list reduest. ne sevice doesh seut. so the cireda chnks s a listrequestWhen isFirstRequest() = true , these implicit filters are applied that aren't in the saved search:1. ActivityDurationRange - applies min_duration = 1 (INITIAL_MIN) - filters out 0-second calls2. ActivityRecorded - applies only_recorded = 1 (DEFAULT_VALUE = OPTION_RECORDED) - filters to recorded-onlyOraaniserGroupIn - applies user's default group filterBut the frontend with sequence_number=4 skips all of these defaults, so it returns more results.The fix should be in buildRequestParamsFromSearch - it needs to pass sequence_number in the built params to signal "not a first request", so the implicitdefaults don't apply. Or alternatively, always pass a non-zero sequence_number in the merge in getActivityldsForSavedSearchRead AskJiminnyReportActivitySelce.ono #L44-93Now let me verify my understanding of isFirstRequest :Read criteria.onolConfirmed. The fix is clear and minimal. The getActivityIdsForSavedSearch method needs to pass sequence_number with a non-zero value so that isFirstRequest() returns false and no imolicit defaults are apolied.ewAskJiminnyReportActivityService.php+1-11Now ler me check mtnere's anex sune estror AskyiminnvredortAcuvi vservice lo uocare.Explored AskJiminnyReportActivityServiceTest.php and searched AskJiminnyReportActivity*I need to add a test that verifies sequence_number=1 is passed to Criteria (so isFirstRequest() returns false ). Let me add it to the existing test file:AskJiminnyReportActivityServicelest.pnpNow let's run the test to verify:commana dockelo decte/nke/ tockces/klosk/RuP /ar/ep/nts/AkJinanyReportActivityServacetest- php -no-coverageCould not open input file: /var/www/html/artisanCommand dockerdester ext/sdrvices/KLosk/Automate/kepirts/ASkJ iminnyReportActivityserviceTest.php --no-coverageCould not open input file: /app/artisanaocker exec aocker lamp 1 bash -c"cd /var/www && php artisan testLests/unte/services/ nlosk/ Aucomacearepores/ Askuemennyкeportactivilyservicelest.onp =-no-coverdge 22al"Could not open input file: artisanCommand docker• docker exec docker lamp 1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"home/iiminny/artisanartisan testdests/axec sdovkers/k2p 1/Autonae Reports/A5 kaimay yRportArtivatySesviceTest.php --no-coverage 2›61Itlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (X4L)+ <> Code Claude Sonnet 4.6Vew allliReject allAccept allwinasur leams11O:24uir-o( 4 spaces...
|
11024
|
|
11027
|
219
|
3
|
2026-04-14T09:09:17.318819+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157757318_m2.jpg...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Tests passed: 1
text/html
text/html
text/html
Proj Tests passed: 1
text/html
text/html
text/html
Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXTextField","text [{"role":"AXTextField","text":"Tests passed: 1","depth":3,"bounds":{"left":0.94257814,"top":0.11180556,"width":0.0375,"height":0.011805556},"value":"Tests passed: 1","help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":4,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":4,"bounds":{"left":0.94257814,"top":0.11180556,"width":0.0375,"height":0.011805556},"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"text/html","depth":4,"help_text":"text/html","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.03046875,"top":0.017361112,"width":0.0453125,"height":0.022222223},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.07578125,"top":0.017361112,"width":0.14960937,"height":0.022222223},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7589844,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceT…Defaults","depth":6,"bounds":{"left":0.7769531,"top":0.017361112,"width":0.12382813,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9007813,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9140625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'","depth":6,"bounds":{"left":0.9273437,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.940625,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96015626,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9734375,"top":0.017361112,"width":0.01328125,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9867188,"top":0.017361112,"width":0.013281226,"height":0.022222223},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-1117453743363212307
|
-7190066597166601333
|
click
|
hybrid
|
NULL
|
Tests passed: 1
text/html
text/html
text/html
Proj Tests passed: 1
text/html
text/html
text/html
Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Rerun 'PHPUnit: AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Stop 'AskJiminnyReportActivityServiceTest.testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v© ReportController.phpToolsWindowHelpJiminnybeouecommana.ong= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]v _ ServiceAulomaleakeporscommand.ono< console LUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.php x© ActivityApiSearch.ph© ActivitySearch.php© AutomatedReportsSendCommand.php© AddLayoutEntities.php© AskJiminnyReportActivityServiceTest.phpRequestGenerateAskJiminnyReportJobTest.php© UserOptionsByGrour© Team.php© AutomatedReportsRepository.php X<?php© AbstractStageFilterDefil© AutomatedReportsService.phpC CreateHeldActivityEvent.phpActivitySearchServicePrdeclare(strict_types=1);C DeallnsightsPeriodFilter(e) TrackProvidernstallled-vent.ono0 DealinsidnisPeriodriltennamespace Jiminny\Component\ActivitySearch\Service;g FilterDetinition.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.phpc rterverntoncolectousec rterverntoncuev.on© FilterDefinitionQueryColclass ActivitySearch© AutomatedReportResult.php• FilteredValueContainerli© IntMinMaxRange.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php[ AiActivityTypeclass Automacedкeрortskepo o:B15 X4 ^7 usagesprivate Container $container;[ AiAutomationD AiCallScoringpublic function __construct(Container $container){.}* Oreturn AutomatedReportD AskAnythingD AskJiminnyAipublic function getOnDemandPageFilters(): FilterDefinitionCollectionf...}DAWS• BillingManagementCache• CoachingFeedback> D CountryD CustomerApi35373839• DatabaseC DatadogC DateTimeDeallnsights• Dealkisks> IEasuicsearchpublic function create(array $data): Automate106107/**-108* Find an automated report by UUID109110* @param string $uvid111112* Oreturn AutomatedReport|null113114public function findByUuid(string $uvid): ?Al]115return AutomatedReport: :where('uvid', Aut118public function get0nDemandPageFilterSet(Criteria $criteria, User $consumer): FilterDefinitreturn $this->getOnDemandPageFilters()-›withCriteria($criteria)-›withConsumer ($consumer)->withRestrictions($consumer->getTeam()):› D Eloquent> DEncoding9 usages1 usage> M Encryption117public function getArrayFilterKeys(User $consumer): arrayf...}DESpubLie tunction tinabytaurousdlstring eiaurul 136> D Faker1 usage• FeatureFlagsif (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $1]private function getTeamInsightsPageFilters(bool $isExport = false): FilterDefinitionCollecO FFMpeg• FileSystemD GeckoD GongGuzzleHttp198return AutomatedReport: :where('uvid', Aut199200KeyPoints• Kiosk1 usageprivate function getDealInsightsPageFilters(bool $useCreatedDate = false,booL pincLudebeallype = ralse.oool mneuudertoeune = tause): FilterDefinitionCollection {..}M LanquadeDetectionLiveFeedD Locks• Math• MediaPipeline• MeetingBot_ MobileSettings| ModelNotiticationD Nudge> [ ParagraphBreakerM ParticipantSpeechPartitionedCookie12402* Retrieve all standard (non-ASk Liminay) al 232* oodral sarno osorccocunn233The column tl 234*dearal string ssortosrection the sort dam 235236* Oreturn Collection<AutomatedReport>237— 24412 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}/**245— 2462471248public function getTeamInsightsPageFilterSet(Criteria $criteria,User $consumer,bool $isExport = false): FilterDefinitionCollection i...rpublic function getDealInsightsPageFilterSet(Criteria $criteria,user consunen): FilterDefinitionCollectionf...}D PlaybackPageD PlaylistL07* Retrieve all ASK Lininny reports created k2601 usagepublic function getTeamAiAutomationFilterSet(Criteria $criteria,User $consumerWindsurf changelog 2.12.21: A new version is available. // View Changelog (today 10:33)40j Support Daily • in 2h 51 mAL AskJiminnyReportActivityServiceT….Defaults100% |45]Tue 14 Apr 12:09:16CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D ...Now let's run the test to verifvtests/Unxt/Servsces/Kiosk/Automate/meports/AskJ1minnyreportActivätyserviceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest. php --no-coverageCould not open input file: /app/artisanCommand dockeroocker exec oocker vand ioash -d"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisanCommand docken• docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests/nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest, php --no-coverage 2561"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTestemoty when no resultsE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildReguestParamsFromSearch never set sequence number in the reguest params, so Criteria: : createFromkequest defaulted it to o .Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters out o-second activitiesi• ActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturee o.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.lest added: testbetacc1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest () === false.Öul ..Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> Code Claude Sonnet 4.6Winasun leams11O:24uir-o( 4 spaces...
|
NULL
|
|
11030
|
219
|
4
|
2026-04-14T09:09:32.433690+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157772433_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewProject vNavigateCodeLaravelRe PhpStormFileEditViewProject vNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© ReportController.phpC AutomatedReportsCommand.php© JiminnyDebugCommand.php© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlSecurity> D Strategy> Streaming>MTeam> M Telephonv> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© IpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.phpC) SoftPhoneService.php©) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> M Validationv DVOv D Repositoryv D OnDemandActivitySears© Criteria.php© TranscriptionKeywordP:>D TeamSettings© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e TrackProvidernstallled-vent.ono= custom.logA console (EU]= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]console SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© Criteria.phpAskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpclass Criteria01 446 V3 л Vpublic static function createFromRequest(if ($attributes->has( key: 'deal_type_id')) {$instance->dealTypeIds = $attributes->get( key: 'deal_type_id');© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpS0/sod509510511512513class Automacedкeрortskepo o:Tests passed: 1 (moments ago)A15 M4 . V516* Oreturn AutomatedReport519public function create(array $data): Automate520/*** Find an automated report by UUID* @param string $uvid* Oreturn AutomatedReport|null526527528public function findByUuid(string $uvid): ?ALreturn AutomatedReport: :where('uvid', Aut5325331 usage534puouc tunccion tnoby ouruul scrino olourut535536if (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $i53855%540return AutomatedReport: :where('uvid', Aut547/*** Retrieve all standard (non-Ask Liminny) ai557558*oodrdl sarno osorccocuminThe column cc* oocrdl sorno osorcutreccion lne sort oure* Oreturn Collection<AutomatedReport>56/12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}578583/*** Retrieve all Ask Liminny reports created tif ($attributes->has( key: 'start_date')) {§instance-›startDate = CarbonImmutable::parse(jattributes->get(key: "start_date'),it mattr oures-nast key.'end_date')) {sinstance-›enduate = Lardonimmutable:.parselpactributes->geut key: 'end_date), pesif ($attributes->has ( key: 'scheduled_from')) {$instance->scheduledFrom = Carbon: :parse($attributes->get( key: 'scheduled_from'),if ($attributes->has( key: 'scheduled_to')) {Strtnctes haet kerto e caroent: pore (atrabutes aget ( kor chetured t0 ), Sif ($attributes->has( key: 'updated_from')) {Sinstance->updatedFrom = Carbon::parse(Sattributes->qet key:' updated. fron'), stif ($attributes->has( key: 'updated_to')) {$instance->updatedTo = Carbon::parse($attributes->get( key: 'updated_to'), $timezon$instance->sortBy = $attributes->get( key: 'sort_by');$instance->sortDirection = $attributes->get( key: 'sort_direction');return sinstancerpublic function setContext(?string $context): self{...}public function getContext(): ?stringf...}public function getMinDealValue(): Pintf..,public function getMaxDealValue(): Pintf..,public function hasMinDealAge(): boolf..public function getMinDealAge(): intf...}public function hasMaxDealAge(): boolf...}public function getMaxDealAge(): intf...}public function hasTranscriptKeywords(): boolf...}public function getTranscriptKeywords(): stringf...}40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:32CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wprts/art1nan yReportActivityserviceTest-php --no-coverageloul nor oen ndlr Tler var ww nunbarusanCommand dockeldoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land 1oash -d"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisanCommand docken"cd /homee/jiminny && php artisan testtests nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest,php --no-coverage 261"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned O.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct.1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest () === false.Öul ..Vew allliItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (24L)< CodeClaude Sonnet 4.6Winasun leams305:14uir-o( 4 spaces...
|
NULL
|
-4275360557554882114
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewProject vNavigateCodeLaravelRe PhpStormFileEditViewProject vNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vToolsWindowHelp© ReportController.phpC AutomatedReportsCommand.php© JiminnyDebugCommand.php© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlSecurity> D Strategy> Streaming>MTeam> M Telephonv> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© IpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.phpC) SoftPhoneService.php©) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> M Validationv DVOv D Repositoryv D OnDemandActivitySears© Criteria.php© TranscriptionKeywordP:>D TeamSettings© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php(e TrackProvidernstallled-vent.ono= custom.logA console (EU]= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]console SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© Criteria.phpAskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpclass Criteria01 446 V3 л Vpublic static function createFromRequest(if ($attributes->has( key: 'deal_type_id')) {$instance->dealTypeIds = $attributes->get( key: 'deal_type_id');© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpS0/sod509510511512513class Automacedкeрortskepo o:Tests passed: 1 (moments ago)A15 M4 . V516* Oreturn AutomatedReport519public function create(array $data): Automate520/*** Find an automated report by UUID* @param string $uvid* Oreturn AutomatedReport|null526527528public function findByUuid(string $uvid): ?ALreturn AutomatedReport: :where('uvid', Aut5325331 usage534puouc tunccion tnoby ouruul scrino olourut535536if (is_numeric($id0rUuid)) {return AutomatedReport:: find((int) $i53855%540return AutomatedReport: :where('uvid', Aut547/*** Retrieve all standard (non-Ask Liminny) ai557558*oodrdl sarno osorccocuminThe column cc* oocrdl sorno osorcutreccion lne sort oure* Oreturn Collection<AutomatedReport>56/12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection f...}578583/*** Retrieve all Ask Liminny reports created tif ($attributes->has( key: 'start_date')) {§instance-›startDate = CarbonImmutable::parse(jattributes->get(key: "start_date'),it mattr oures-nast key.'end_date')) {sinstance-›enduate = Lardonimmutable:.parselpactributes->geut key: 'end_date), pesif ($attributes->has ( key: 'scheduled_from')) {$instance->scheduledFrom = Carbon: :parse($attributes->get( key: 'scheduled_from'),if ($attributes->has( key: 'scheduled_to')) {Strtnctes haet kerto e caroent: pore (atrabutes aget ( kor chetured t0 ), Sif ($attributes->has( key: 'updated_from')) {Sinstance->updatedFrom = Carbon::parse(Sattributes->qet key:' updated. fron'), stif ($attributes->has( key: 'updated_to')) {$instance->updatedTo = Carbon::parse($attributes->get( key: 'updated_to'), $timezon$instance->sortBy = $attributes->get( key: 'sort_by');$instance->sortDirection = $attributes->get( key: 'sort_direction');return sinstancerpublic function setContext(?string $context): self{...}public function getContext(): ?stringf...}public function getMinDealValue(): Pintf..,public function getMaxDealValue(): Pintf..,public function hasMinDealAge(): boolf..public function getMinDealAge(): intf...}public function hasMaxDealAge(): boolf...}public function getMaxDealAge(): intf...}public function hasTranscriptKeywords(): boolf...}public function getTranscriptKeywords(): stringf...}40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:32CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wprts/art1nan yReportActivityserviceTest-php --no-coverageloul nor oen ndlr Tler var ww nunbarusanCommand dockeldoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land 1oash -d"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisanCommand docken"cd /homee/jiminny && php artisan testtests nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest,php --no-coverage 261"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned O.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct.1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest () === false.Öul ..Vew allliItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (24L)< CodeClaude Sonnet 4.6Winasun leams305:14uir-o( 4 spaces...
|
11027
|
|
11032
|
219
|
5
|
2026-04-14T09:09:38.095199+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157778095_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlD Security> D Strategy> Streaming>MTeam> D Telephony> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectiiSimpleThrottleService.php© SlackService.phpC) SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> M Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (moments ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.logA console (EU]© Criteria.php:© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]• AskJiminnyReportActivityService.php© ActivitySearch.phpAskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc w .*TVY:class CriteriaH1846 M3 ^© TrackProviderInstalledEvent.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:12161217122112221226I2L1123114041236A15 V4 A V-123712411242125112523638* Oreturn AutomatedReportpublic function create(array $data): Automat€ 1247/*** Find an automated report by UUID* @param string $uvid12611262* Oreturn AutomatedReport|null12661267public function findByUvid(string $uvid): ?Al 12711272return AutomatedReport: :where('uvid', Aut1273— 12741 usage1276pubLic tunction tinaby.auruunalscring p1aurut12771L01if (is_numeric($id0rUuid)) {1282return AutomatedReport:: find((int) $112831285return AutomatedReport: :where('uvid', Aut 128612881282* Retrieve all standard (non-Ask Jiminny) al 12901ZY1*oodrdl sarno osorccocuminThe column t( 1292*oparan scring osorcutreccion ine sorc aure4 usages1470private static function parseDealInsightsDate(* Oreturn Collection<AutomatedReport>1294Collection $attributes,_1295string $key,12 usages1296DateTimeZone $timezonepublic function getAllStandardReports(string $sortColumn = 'created_at',1297): CarbonImmutablelstringlnull f..string $sortDirection = 'desc'15111): Collection f...}/*** Retrieve all Ask Liminny reports created tpublic function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...;public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intf...}public function isEmpty(): boolf..public function isFärstRequest(): boolreturn $this->empty || $this->seqyenceNumber === 0;ExtractSurround/Cascade &e TICommand apublic function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes, handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* dodron Dore znezone outmezone* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if explicitly null, CarbonImmutable if valid date40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:37CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land ioash —e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest,php --no-coverage 261"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tilterThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturnee o.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct:1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (24L)<>Code Claude Sonnet 4.6Winasun leams12/4:43 |4 Charsuir-o( 4 spaces...
|
NULL
|
-6813170832552867885
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlD Security> D Strategy> Streaming>MTeam> D Telephony> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectiiSimpleThrottleService.php© SlackService.phpC) SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> M Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (moments ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong= custom.logA console (EU]© Criteria.php:© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]• AskJiminnyReportActivityService.php© ActivitySearch.phpAskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc w .*TVY:class CriteriaH1846 M3 ^© TrackProviderInstalledEvent.php© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:12161217122112221226I2L1123114041236A15 V4 A V-123712411242125112523638* Oreturn AutomatedReportpublic function create(array $data): Automat€ 1247/*** Find an automated report by UUID* @param string $uvid12611262* Oreturn AutomatedReport|null12661267public function findByUvid(string $uvid): ?Al 12711272return AutomatedReport: :where('uvid', Aut1273— 12741 usage1276pubLic tunction tinaby.auruunalscring p1aurut12771L01if (is_numeric($id0rUuid)) {1282return AutomatedReport:: find((int) $112831285return AutomatedReport: :where('uvid', Aut 128612881282* Retrieve all standard (non-Ask Jiminny) al 12901ZY1*oodrdl sarno osorccocuminThe column t( 1292*oparan scring osorcutreccion ine sorc aure4 usages1470private static function parseDealInsightsDate(* Oreturn Collection<AutomatedReport>1294Collection $attributes,_1295string $key,12 usages1296DateTimeZone $timezonepublic function getAllStandardReports(string $sortColumn = 'created_at',1297): CarbonImmutablelstringlnull f..string $sortDirection = 'desc'15111): Collection f...}/*** Retrieve all Ask Liminny reports created tpublic function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...;public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intf...}public function isEmpty(): boolf..public function isFärstRequest(): boolreturn $this->empty || $this->seqyenceNumber === 0;ExtractSurround/Cascade &e TICommand apublic function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes, handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* dodron Dore znezone outmezone* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if explicitly null, CarbonImmutable if valid date40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:37CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land ioash —e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest,php --no-coverage 261"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tilterThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturnee o.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct:1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (24L)<>Code Claude Sonnet 4.6Winasun leams12/4:43 |4 Charsuir-o( 4 spaces...
|
NULL
|
|
11034
|
219
|
6
|
2026-04-14T09:09:42.889238+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157782889_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlD Security> D Strategy> Streaming>MTeam> D Telephony> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectiiSimpleThrottleService.php© SlackService.phpC) SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (moments ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.logA console (EU]© Criteria.php >sequclass Criteria= laravel.logconsole SlAGiNGA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc W .*TVY:41846 M3 ^(0 TrackProviderinstalled-vent.onv© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:12161217122112221226I2L1123114041236A15 M4 . V-12371241124212513638* Oreturn AutomatedReportpublic function create(array $data): Automat€ 1247/*** Find an automated report by UUID* @param string $uvid12611262* Oreturn AutomatedReport|null12661267public function findByUuid(string $uuid): ?Al12711272return AutomatedReport: :where('uvid', Aut1273—12741 usage1276pubLic tunction tinaby.auruunalscring p1aurut12771L01if (is_numeric($id0rUuid)) {1282return AutomatedReport:: find((int) $112831285return AutomatedReport: :where('uvid', Aut 128612881282* Retrieve all standard (non-Ask Jiminny) al 12901ZY1* oodral sarno osorccocunnThe column t( 1292* @param string $sortDirection The sort dire1470* Oreturn Collection<AutomatedReport>1294_129512 usages1296public function getAllStandardReports(string $sortColumn = 'created_at',1297string $sortDirection = 'desc'15111): Collection f...}/*** Retrieve all Ask Liminny reports created tpublic function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...}public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}111public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf...}public function isFirstR[quest(): boolreturn suns->enoty© Criteriapublic function isFirstRequest(): boolpUDLlC TUnccion cecUnLyASource: .../app/VO/Repository/OnDemandActivitySearch/Criteria.pl 0/*** Parse a Deal Insights date from request attributes,handting null/empty values gracefut* This method is specifically for Deal Insights date fields to support the "All time" fil* @param Collection $attributes* Oparam string $key* dodron Dore znezone outmezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if explicitly null, CarbonImmutable if valid date4 usagesprivate static function parseDealInsightsDate(Collection $attributes,string $key,DateTimeZone $timezone): CarbonImmutablelstringlnull f..40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT...Defaults v100% C•Tue 14 Apr 12:09:42CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land ioash —e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests/nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest, php --no-coverage 2561"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct.1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (X4L)<>Code Claude Sonnet 4.6winasun leams1272:26uir-o( 4 spaces...
|
NULL
|
-4745527170688648364
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D MailMeetingGeneratorC NotificationOAuth2D RecallAlD Security> D Strategy> Streaming>MTeam> D Telephony> _ UserPilot> D Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectiiSimpleThrottleService.php© SlackService.phpC) SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (moments ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php© Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.logA console (EU]© Criteria.php >sequclass Criteria= laravel.logconsole SlAGiNGA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc W .*TVY:41846 M3 ^(0 TrackProviderinstalled-vent.onv© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:12161217122112221226I2L1123114041236A15 M4 . V-12371241124212513638* Oreturn AutomatedReportpublic function create(array $data): Automat€ 1247/*** Find an automated report by UUID* @param string $uvid12611262* Oreturn AutomatedReport|null12661267public function findByUuid(string $uuid): ?Al12711272return AutomatedReport: :where('uvid', Aut1273—12741 usage1276pubLic tunction tinaby.auruunalscring p1aurut12771L01if (is_numeric($id0rUuid)) {1282return AutomatedReport:: find((int) $112831285return AutomatedReport: :where('uvid', Aut 128612881282* Retrieve all standard (non-Ask Jiminny) al 12901ZY1* oodral sarno osorccocunnThe column t( 1292* @param string $sortDirection The sort dire1470* Oreturn Collection<AutomatedReport>1294_129512 usages1296public function getAllStandardReports(string $sortColumn = 'created_at',1297string $sortDirection = 'desc'15111): Collection f...}/*** Retrieve all Ask Liminny reports created tpublic function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...}public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}111public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf...}public function isFirstR[quest(): boolreturn suns->enoty© Criteriapublic function isFirstRequest(): boolpUDLlC TUnccion cecUnLyASource: .../app/VO/Repository/OnDemandActivitySearch/Criteria.pl 0/*** Parse a Deal Insights date from request attributes,handting null/empty values gracefut* This method is specifically for Deal Insights date fields to support the "All time" fil* @param Collection $attributes* Oparam string $key* dodron Dore znezone outmezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if explicitly null, CarbonImmutable if valid date4 usagesprivate static function parseDealInsightsDate(Collection $attributes,string $key,DateTimeZone $timezone): CarbonImmutablelstringlnull f..40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT...Defaults v100% C•Tue 14 Apr 12:09:42CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land ioash —e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests/nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest, php --no-coverage 2561"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct.1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (X4L)<>Code Claude Sonnet 4.6winasun leams1272:26uir-o( 4 spaces...
|
11032
|
|
11036
|
219
|
7
|
2026-04-14T09:09:50.100242+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157790100_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaravelRetactonToo PhpStormFileFditViewNavigateCodelaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ NotificationD 0Auth2RecallAl_ security>_ Strategy07 Streaming>MTeam> M Telephonv› _ UserPilotWebhookFindvecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php XO-isFirstRequestX 3 Cc W *T.YA© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteria41A46 MS^© TrackProviderInstalledEvent.php1261c) CreateActivityLoggeacvenconpC UserPilotActivityListener.php1204public function getLimito: intf...h(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267public function isEmptyo: bool...hC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276public function isFirstRequestO: boolk...h(C) AutomatedReport.php1277public function getonLyActiveUsers: boolt...hclass Automacedкeрortskepo o:B15 X4 Av 12811284#1283/*** Porse a wedt Instonts dote tron reduest deroures, nonduno nutdenory values drdcet* Inis mechod is specifically for beal insights date flelas to support the "ALl time" fi* Retrieve all standard (non-Ask Jiminny) m-2os11280x ooaran coccecmon meceroures* dparam string ssortcolumnThe column 1287* Anaram ctnina Sconthinection The cont dinc 1288* oparam scrine okeu*opara vaceicwecone occllecone• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php' 1 result>nclassiried result40lobla Support Daily • in 2h 51 m100% [AskJiminnyReportActivityServiceT...Defaults vTue 14 Apr 12:09:49CascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltesterunxt/ drvkee-/Kosk/Autonatedeports/AartinanyReportActivityserviceTest.php -n-coverageloul nor oen nolt tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactiv1tv.ervicelest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockerItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (&+L)+ <> Code Claude Sonnet 4.6wView allReject allAccept allOUT›‹ <›Select item to previewlests passed: (moments agoW Windsurf Teams 1272:35 (14 chars)UTF-8ia 4 spaces...
|
NULL
|
1605497110261020743
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaravelRetactonToo PhpStormFileFditViewNavigateCodelaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ NotificationD 0Auth2RecallAl_ security>_ Strategy07 Streaming>MTeam> M Telephonv› _ UserPilotWebhookFindvecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php XO-isFirstRequestX 3 Cc W *T.YA© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteria41A46 MS^© TrackProviderInstalledEvent.php1261c) CreateActivityLoggeacvenconpC UserPilotActivityListener.php1204public function getLimito: intf...h(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267public function isEmptyo: bool...hC RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276public function isFirstRequestO: boolk...h(C) AutomatedReport.php1277public function getonLyActiveUsers: boolt...hclass Automacedкeрortskepo o:B15 X4 Av 12811284#1283/*** Porse a wedt Instonts dote tron reduest deroures, nonduno nutdenory values drdcet* Inis mechod is specifically for beal insights date flelas to support the "ALl time" fi* Retrieve all standard (non-Ask Jiminny) m-2os11280x ooaran coccecmon meceroures* dparam string ssortcolumnThe column 1287* Anaram ctnina Sconthinection The cont dinc 1288* oparam scrine okeu*opara vaceicwecone occllecone• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php' 1 result>nclassiried result40lobla Support Daily • in 2h 51 m100% [AskJiminnyReportActivityServiceT...Defaults vTue 14 Apr 12:09:49CascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltesterunxt/ drvkee-/Kosk/Autonatedeports/AartinanyReportActivityserviceTest.php -n-coverageloul nor oen nolt tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactiv1tv.ervicelest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockerItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (&+L)+ <> Code Claude Sonnet 4.6wView allReject allAccept allOUT›‹ <›Select item to previewlests passed: (moments agoW Windsurf Teams 1272:35 (14 chars)UTF-8ia 4 spaces...
|
NULL
|
|
11038
|
219
|
8
|
2026-04-14T09:09:51.619147+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157791619_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ Notification_ 0Auth2RecallAl_ security_ StrategyL7 Streaming> MTeam> M Telephonv→ UserPilotWebhookFindvecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.php,leam.ono(©) AutomatedReportsRepository.php XO-isFirstRequestX 3 Cc W *T.YA© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteria41A46 MS^© TrackProviderInstalledEvent.php1261c) CreateActivityLoggeacvenconpC UserPilotActivityListener.php1204(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267C RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276(C) AutomatedReport.php1277class Automacedкeрortskepo o:B15 X4 Av 12811284#1283* Retrieve all standard (non-Ask Jiminny) m-2os* dparam string ssortcolumnThe column 1287* Anaram ctnina Sconthinection The cont dinc 1288• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php 1 resultv Unc assitied "" resuliiv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv C) OnDemandActivitvSearch/Criteria.pho 1 result1272 public function isFirstRequest0: boopublic function getLimito: intf...hpublic function isEmptyo: bool...hpublic function isFirstRequestO: boolk...hpublic function getonLyActiveUsers: boolt...h* Porse a wedt Instonts dote tron reduest deroures, nonduno nutdenory values drdcet* Inis mechod is specifically for beal insights date flelas to support the "ALl time" fix ooaran coccecmon meceroures* oparam scrine okeu*opara vaceicwecone occllecone40lobla Support Daily • in 2h 51 m100% [AskJiminnyReportActivityServiceT...Defaults vTue 14 Apr 12:09:51CascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltesterunxt/ drvkee-/Kosk/Autonatedeports/AartinanyReportActivityserviceTest.php -n-coverageloul nor oen nolt tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactiv1tv.ervicelest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockerItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (&+L)+ <> Code Claude Sonnet 4.6wView allReject allAccept allOUTSelect item to previewlests passed: (moments agoW Windsurf Teams 1272:35 (14 chars)UTF-8ia 4 spaces...
|
NULL
|
-7356880823722609142
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodeLaravelRetactonToo PhpStormFileFditViewNavigateCodeLaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ Notification_ 0Auth2RecallAl_ security_ StrategyL7 Streaming> MTeam> M Telephonv→ UserPilotWebhookFindvecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.php,leam.ono(©) AutomatedReportsRepository.php XO-isFirstRequestX 3 Cc W *T.YA© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteria41A46 MS^© TrackProviderInstalledEvent.php1261c) CreateActivityLoggeacvenconpC UserPilotActivityListener.php1204(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267C RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276(C) AutomatedReport.php1277class Automacedкeрortskepo o:B15 X4 Av 12811284#1283* Retrieve all standard (non-Ask Jiminny) m-2os* dparam string ssortcolumnThe column 1287* Anaram ctnina Sconthinection The cont dinc 1288• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php 1 resultv Unc assitied "" resuliiv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv C) OnDemandActivitvSearch/Criteria.pho 1 result1272 public function isFirstRequest0: boopublic function getLimito: intf...hpublic function isEmptyo: bool...hpublic function isFirstRequestO: boolk...hpublic function getonLyActiveUsers: boolt...h* Porse a wedt Instonts dote tron reduest deroures, nonduno nutdenory values drdcet* Inis mechod is specifically for beal insights date flelas to support the "ALl time" fix ooaran coccecmon meceroures* oparam scrine okeu*opara vaceicwecone occllecone40lobla Support Daily • in 2h 51 m100% [AskJiminnyReportActivityServiceT...Defaults vTue 14 Apr 12:09:51CascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltesterunxt/ drvkee-/Kosk/Autonatedeports/AartinanyReportActivityserviceTest.php -n-coverageloul nor oen nolt tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactiv1tv.ervicelest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockerItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Ask anything (&+L)+ <> Code Claude Sonnet 4.6wView allReject allAccept allOUTSelect item to previewlests passed: (moments agoW Windsurf Teams 1272:35 (14 chars)UTF-8ia 4 spaces...
|
11036
|
|
11040
|
219
|
9
|
2026-04-14T09:09:53.039644+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157793039_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaravelRetactonToo PhpStormFileFditViewNavigateCodelaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ Notification0Auth2RecallAl_ security> _ Strategy7 Streaming> MTeamM Telephonv→ UserPilotWebhookrinavecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]C AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpleam.ono(©) AutomatedReportsRepository.php XO-isFirstRequestX3CcW*TVY:Automaleakeporisservice.onpC CreateHeldActivityEvent.phpclass criteria61446 M3© TrackProviderinstalledEvent.php1261c) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php1204(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267C RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276(C) AutomatedReport.php1277class Automacedкeрortskepo o:815 X4 лv 12811284#1283* Retrieve all standard (non-Ask Jiminny) m-2os11280* dparam string ssortcolumnThe column E 1287* Anaram ctnina tconthinection The cont dinc 1288• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php 1 resultv Unc assitied " resultv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv C) OnDemandActivitvSearch/Criteria.pho 1 result12/2 publlc tunction IsrirstReguestl: boolpublic function getLimito: int...}public function isEmptyo: bool...hpublic function isFirstRequestO: boolf...}public function getonlyActiveUsers: boolk...h* Parse a Deat Insights date from request attributes, handling null/emptu vatues gracefea* This method is specifically for Deal Insights date fields to support the "All time" filx ooaran coccecmon vecaroures* oparam scrine okeu*osaral bucetcmezone ocalezone40Support Daily • in 2h 51 m100% (Tue 14 Apr 12:09:52AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControllelAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltests/axt/ervkces/k3o5k/Autoatr/Rep/rtS/SrimannyReportActivtyserviceTest.php --no-coverageloul nor oen ndlr Tler var ww nunbarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactivitv.ervicellest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockenItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6w1400126112621263126412651262126812/012/11L1412741275127612841L001284198519%А128712981291112751274public function getLimito: intreturn sthis->L1m1t;pubuic tunction istmptyl: boolreturn suns->elorypublic function isFirstRequesto: boolreturn sthis->empty | sthis->sequenceNumber === 0*public function getOnlyActiveUsers(): boolreturn sums->onuvactveusers === urue.* Parse a Deal Insights date from request attributes, handling null empty values gracefully.* This method is specificallu for Deal Insights date fields to support the "All time" filter.* dparam collection sattributes* dparam string skey*dparam Davelimezone suimezone* dreturh carbonimmucable nucl/scring keturns seLf:.UAlE_PARANEIER_NUI_PROVIDED If parameter 15* mussing, nucl if expliciely nucl, cardonimmuzable if vacla daceprivate static function parseDealInsightsDate(Collection $attributes,string Skey.lests passed: (moments agow Windsurt leams 12/2:35 (14 chars) UlF-oia 4 spaces...
|
NULL
|
-5398147216660132811
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaravelRetactonToo PhpStormFileFditViewNavigateCodelaravelRetactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject v(©) ActivityTypeService.(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportss© DealStagesService.pC) RecipientsService.ph€ ReportSort. php€ ReportSortDirection.(©) KioskService.php> _ MailMeetingGenerator_ Notification0Auth2RecallAl_ security> _ Strategy7 Streaming> MTeamM Telephonv→ UserPilotWebhookrinavecurences or isrirstkeouestTargets(©) ReportController.phpJiminnybeouecommana.ong= custom.log= laravel.l0ge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]C AutomatedReportsCommand.php4 console [EUlconsole SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php >© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpleam.ono(©) AutomatedReportsRepository.php XO-isFirstRequestX3CcW*TVY:Automaleakeporisservice.onpC CreateHeldActivityEvent.phpclass criteria61446 M3© TrackProviderinstalledEvent.php1261c) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php1204(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php12001267C RequestGenerateAskJiminnyReportJob.php(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721276(C) AutomatedReport.php1277class Automacedкeрortskepo o:815 X4 лv 12811284#1283* Retrieve all standard (non-Ask Jiminny) m-2os11280* dparam string ssortcolumnThe column E 1287* Anaram ctnina tconthinection The cont dinc 1288• Occurrences of "isFirstRequest' in File 'Criteria.phpFound occurrences in File 'Criteria.php 1 resultv Unc assitied " resultv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv C) OnDemandActivitvSearch/Criteria.pho 1 result12/2 publlc tunction IsrirstReguestl: boolpublic function getLimito: int...}public function isEmptyo: bool...hpublic function isFirstRequestO: boolf...}public function getonlyActiveUsers: boolk...h* Parse a Deat Insights date from request attributes, handling null/emptu vatues gracefea* This method is specifically for Deal Insights date fields to support the "All time" filx ooaran coccecmon vecaroures* oparam scrine okeu*osaral bucetcmezone ocalezone40Support Daily • in 2h 51 m100% (Tue 14 Apr 12:09:52AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControllelAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltests/axt/ervkces/k3o5k/Autoatr/Rep/rtS/SrimannyReportActivtyserviceTest.php --no-coverageloul nor oen ndlr Tler var ww nunbarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.lminnvrenortactivitv.ervicellest.ohn =-no-coveradeCould not open input file: /app/artisarCommand dockenItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6w1400126112621263126412651262126812/012/11L1412741275127612841L001284198519%А128712981291112751274public function getLimito: intreturn sthis->L1m1t;pubuic tunction istmptyl: boolreturn suns->elorypublic function isFirstRequesto: boolreturn sthis->empty | sthis->sequenceNumber === 0*public function getOnlyActiveUsers(): boolreturn sums->onuvactveusers === urue.* Parse a Deal Insights date from request attributes, handling null empty values gracefully.* This method is specificallu for Deal Insights date fields to support the "All time" filter.* dparam collection sattributes* dparam string skey*dparam Davelimezone suimezone* dreturh carbonimmucable nucl/scring keturns seLf:.UAlE_PARANEIER_NUI_PROVIDED If parameter 15* mussing, nucl if expliciely nucl, cardonimmuzable if vacla daceprivate static function parseDealInsightsDate(Collection $attributes,string Skey.lests passed: (moments agow Windsurt leams 12/2:35 (14 chars) UlF-oia 4 spaces...
|
NULL
|
|
11042
|
219
|
10
|
2026-04-14T09:09:56.415325+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157796415_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRefactonTool PhpStormFileFditViewNavigateCodelaraveRefactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v(©) ReportController.phpJiminnybeouecommana.ong= custom.log=laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUl(©) ActivityTypeService.console SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php XIsrirstheouestX 3 Cc W *TVY:© AutomatedReportss© DealStagesService.pC) RecipientsService.ph© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteri61446 M3© TrackProviderInstalledEvent.php1261€ ReportSort. php€ ReportSortDirection.c) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php1204public function getLimito: int...}(©) KioskService.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php> _ Mail12001267public function isEmptyo: bool...hC RequestGenerateAskJiminnyReportJob.phpMeetingGenerator_ Notification(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721273public function isFirstRequestO: bool_ 0Auth2(C) AutomatedReport.php1274return sthis->empty l sthis->sequenceNumber === 03RecallAlclass Automacedкeрortskepo o:815 X4 лv 1275_ security> _ StrategyL7 Streaming>MTeampublic function getOnlyActiveUsers(): boolf...}> M Telephonv* Retrieve all standard (non-Ask Jiminny) m-282*rorse a veot unstonus dure troll redves ucaroures.mone uno nucaemoru vacues ardcerua› _ UserPilotWebhook* dparam string ssorttolumnThe column Z6-204* Anaram ctnina Sconthinection The cont dinc 1285* Inis mecnod 1s speciricaclu Tor veac insionts dace rielas to supoorc une AlL clme" T..rinavecurences or isrirstreouest XTargetsu Occurrences of "isFirstReques,yn File 'Criteria.phpFound occurrences in File 'Criteria.php' 1 resultv Unc assitied " resultv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv (C) OnDemandActivitvSearch/Criteria.pho 1 result140012611262126312641265126212/2 publlc tunction IsrirstReguesto: bool126812/012/11L1412741275127612841L001284198519%А12871298129111275127440a Support Daily • in 2h 51 m100% (Tue 14 Apr 12:09:56AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltests/axt/ervkces/k3o5k/Autoatr/Rep/rtS/SrimannyReportActivtyserviceTest.php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.nminnvkenortactiv1tv.ervicelest.oho =-no-coveradeCould not open input file: /app/artisarCommand dockenItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6wpublic function getLimito: intreturn sthis->L1m1t;pubuic tunction istmptyl: boolreturn suns->elorypublic function isFirstRequestO: boolreturn sthis->empty | sthis->sequenceNumber === 0*public function getOnlyActiveUsers(): boolreturn sums->onuvactveusers === urue./*** Parse a Deal Insights date from request attributes, handling null empty values gracefully.* This method is specificallu for Deal Insights date fields to support the "All time" filter.* dparam collection sattributes* dparam string skey*dparam Davelimezone suimezone* dreturh carbonimmucable nucl/scring keturns seLf::UAlE_PARAREIER_NUI_PRUVIDED 1F parameter 15* mussing, nucl if explicitly nucl, carbonimmucable it vacla dateprivate static function parseDealInsightsDate(Collection $attributes,string Skey.lests passed: (moments agoWinasun leams 12/2:21uir-oia 4 spaces...
|
NULL
|
212898975688879357
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileFditViewNavigateCodelaraveRefactonTool PhpStormFileFditViewNavigateCodelaraveRefactonToolsWindowHelpFV faVsco.s v#11894 on JY-18909-automated-reports-ask-liminny k vProject v(©) ReportController.phpJiminnybeouecommana.ong= custom.log=laravel.loge SF (iminny@localhostc HS_local fiminny@localhost)& console (PROD]© AutomatedReportsCommand.php4 console [EUl(©) ActivityTypeService.console SlAGiNG© AskJiminnyReportActivityService.php© ActivitySearch.pnp(©) AskJiminnyReportAc© AutomatedReportse© AutomatedReportsSendCommand.php© AddLayoutentities.php© Criteria.php© AskJiminnyReportActivityServiceTest.phpCi RequestGenerateAskJiminnyReportJobTest.phpC) Team.onp(©) AutomatedReportsRepository.php XIsrirstheouestX 3 Cc W *TVY:© AutomatedReportss© DealStagesService.pC) RecipientsService.ph© AutomatedReportsService.phpC CreateHeldActivityEvent.phpclass criteri61446 M3© TrackProviderInstalledEvent.php1261€ ReportSort. php€ ReportSortDirection.c) CreateActivityLoggeacvencpnpC UserPilotActivityListener.php1204public function getLimito: int...}(©) KioskService.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php> _ Mail12001267public function isEmptyo: bool...hC RequestGenerateAskJiminnyReportJob.phpMeetingGenerator_ Notification(©) RequestGenerateReportJob.php(©) AutomatedReportResult.php1L/112721273public function isFirstRequestO: bool_ 0Auth2(C) AutomatedReport.php1274return sthis->empty l sthis->sequenceNumber === 03RecallAlclass Automacedкeрortskepo o:815 X4 лv 1275_ security> _ StrategyL7 Streaming>MTeampublic function getOnlyActiveUsers(): boolf...}> M Telephonv* Retrieve all standard (non-Ask Jiminny) m-282*rorse a veot unstonus dure troll redves ucaroures.mone uno nucaemoru vacues ardcerua› _ UserPilotWebhook* dparam string ssorttolumnThe column Z6-204* Anaram ctnina Sconthinection The cont dinc 1285* Inis mecnod 1s speciricaclu Tor veac insionts dace rielas to supoorc une AlL clme" T..rinavecurences or isrirstreouest XTargetsu Occurrences of "isFirstReques,yn File 'Criteria.phpFound occurrences in File 'Criteria.php' 1 resultv Unc assitied " resultv Caapp 1 resultv D app/VO/Repository/OnDemandActivitySearch 1 resultv (C) OnDemandActivitvSearch/Criteria.pho 1 result140012611262126312641265126212/2 publlc tunction IsrirstReguesto: bool126812/012/11L1412741275127612841L001284198519%А12871298129111275127440a Support Daily • in 2h 51 m100% (Tue 14 Apr 12:09:56AskJiminnyReportActivityServiceT...Defaults vCascadeFixing ReportControlleiAutomated Report MaiFixing Ask Jiminny RepNow let's run the test to verifvCommand dockerltests/axt/ervkces/k3o5k/Autoatr/Rep/rtS/SrimannyReportActivtyserviceTest.php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockeldocker_docker exec docker- Lamp_1 php /app/artisarredkenorts/ask.nminnvkenortactiv1tv.ervicelest.oho =-no-coveradeCould not open input file: /app/artisarCommand dockenItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1View allReject allAccept allAsk anything (&+L)+ <> Code Claude Sonnet 4.6wpublic function getLimito: intreturn sthis->L1m1t;pubuic tunction istmptyl: boolreturn suns->elorypublic function isFirstRequestO: boolreturn sthis->empty | sthis->sequenceNumber === 0*public function getOnlyActiveUsers(): boolreturn sums->onuvactveusers === urue./*** Parse a Deal Insights date from request attributes, handling null empty values gracefully.* This method is specificallu for Deal Insights date fields to support the "All time" filter.* dparam collection sattributes* dparam string skey*dparam Davelimezone suimezone* dreturh carbonimmucable nucl/scring keturns seLf::UAlE_PARAREIER_NUI_PRUVIDED 1F parameter 15* mussing, nucl if explicitly nucl, carbonimmucable it vacla dateprivate static function parseDealInsightsDate(Collection $attributes,string Skey.lests passed: (moments agoWinasun leams 12/2:21uir-oia 4 spaces...
|
11040
|
|
11043
|
219
|
11
|
2026-04-14T09:09:57.677781+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157797677_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
visual_change
|
NULL
|
NULL
|
NULL
|
NULL
|
|
11045
|
219
|
12
|
2026-04-14T09:09:58.162770+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157798162_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
NULL
|
click
|
NULL
|
NULL
|
NULL
|
NULL
|
|
11047
|
219
|
13
|
2026-04-14T09:09:59.323547+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157799323_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationDOAuth2D RecallAlD SecurityStrategyL7 Streaming>MTeam> D Telephony› _ UserPilotWebhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php©IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectii© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (a minute ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php) Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.logA console (EU]© Criteria.phpIsrirstheouest= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc w .*TVY:class Criteria(e TrackProvidernstallled-vent.ono12161217© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.php122112221226I2L1123114041236class Automacedкeрortskepo o:B15 X4 A12371241/**12421246* Retrieve all standard (non-Ask Jiminny) m 12471251* @param string $sortColumnThe column t(1252* Oparam string $sortDirection The sort dir€ 125661-1257* @return Collection<AutomatedReport>1261126212 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}1266126712711272831141151161171181191201211231274/*** Retrieve all Ask Liminny reports created À 1276-1277* Oodrdll usernusenIne User Wno:1281* @param string $sortColumnIne coLUmn c01282* @param string $sortDirection The sort dirt 1283* @return Collection<AutomatedReport>1284*/1285.128614 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',surno ssortutreccion = 'desc'): Collection {...J1ZY112922 usages1470private function buildSortedQuery(string $sor1294_12951296* Get all active and enabled reports with al 1297* @param string $frequency15111* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(sH1846 M3 ^public function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...;public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf..public function isFirstRequest(): boolreturn schis->empagll pchis→>sequencenumber === 0,public function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes,handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* dodron Dorelznezone outmezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if expticitty notl,carbonimmurable 1n vaclo dace4 usaeesprivate static function parseDealInsightsDate(Collection $attributes,string $key,DateTimeZone $timezone): CarbonImmutablelstringlnull f..40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:58CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwdesker nte/ sockces/k.osk/AuPowar/orts/artman yeportActivityserviceTest.php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisarCommand dockerocker exec oocker lano oash—e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests/nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest, php --no-coverage 2561"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsget activityE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetActi1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest () === false.Öul ..Vew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ ‹> CodeClaude Sonnet 4.6Winasun leams12/2.2uir-o( 4 spaces...
|
NULL
|
5125041244541957792
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationDOAuth2D RecallAlD SecurityStrategyL7 Streaming>MTeam> D Telephony› _ UserPilotWebhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php©IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectii© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (a minute ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php) Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.logA console (EU]© Criteria.phpIsrirstheouest= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpX3Cc w .*TVY:class Criteria(e TrackProvidernstallled-vent.ono12161217© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.php122112221226I2L1123114041236class Automacedкeрortskepo o:B15 X4 A12371241/**12421246* Retrieve all standard (non-Ask Jiminny) m 12471251* @param string $sortColumnThe column t(1252* Oparam string $sortDirection The sort dir€ 125661-1257* @return Collection<AutomatedReport>1261126212 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}1266126712711272831141151161171181191201211231274/*** Retrieve all Ask Liminny reports created À 1276-1277* Oodrdll usernusenIne User Wno:1281* @param string $sortColumnIne coLUmn c01282* @param string $sortDirection The sort dirt 1283* @return Collection<AutomatedReport>1284*/1285.128614 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',surno ssortutreccion = 'desc'): Collection {...J1ZY112922 usages1470private function buildSortedQuery(string $sor1294_12951296* Get all active and enabled reports with al 1297* @param string $frequency15111* dreturh coLcectzon<aucomacedкeрort>23 usagespublic function getActiveReportsByFrequency(sH1846 M3 ^public function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...;public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf..public function isFirstRequest(): boolreturn schis->empagll pchis→>sequencenumber === 0,public function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes,handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* dodron Dorelznezone outmezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if expticitty notl,carbonimmurable 1n vaclo dace4 usaeesprivate static function parseDealInsightsDate(Collection $attributes,string $key,DateTimeZone $timezone): CarbonImmutablelstringlnull f..40j Support Daily • in 2h 51 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:09:58CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwdesker nte/ sockces/k.osk/AuPowar/orts/artman yeportActivityserviceTest.php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisarCommand dockerocker exec oocker lano oash—e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homee/jiminny && php artisan testtests/nxe erckee/Kio5/AutonateReports/5KJimamyReportActivaty ServiceTest, php --no-coverage 2561"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsget activityE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetActi1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest () === false.Öul ..Vew allliItlle wiun changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ ‹> CodeClaude Sonnet 4.6Winasun leams12/2.2uir-o( 4 spaces...
|
NULL
|
|
11048
|
219
|
14
|
2026-04-14T09:10:03.728863+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157803728_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120© Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.php© AddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ Tlles* File mask:*.php(e) TrackProvidernstallled-vent.onoisFirstRequest© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a* @return Collection<AutomatedReport>In ProjectModuleDirectoryScopeif ($group === null || | $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return Sthis-> criteria->isFirstRequest0it binls-scrterar>srirstrecuesto8& $this->criteria->isFirstRequest0&& $this->criteria->isFirstRequest0)public function|isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn(SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144hte.php 158Filter Definition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86Dealclosevate.ong 106OnDemandActivitySearch/Criteria.php 1272ActivityDurationRangeTest.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106Acvwvbulauonkance lest.ono is12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/**OrganiserGroupln.php app/component/ActVtysearch/riiterDerinidonYoCLpubLic tunction getvalue(): arrayreturn $this->criteria->getGroupIds() ?? $this->getDefaultValue();* Retrieve all Ask Liminny reports create 101/** @return string[] */private tuncuion geuberaultvalued: array* OodrdllusernusenIne User #103*oparam scrine osorclocunnThe column 104* @param string $sortDirection The sort a105106$group = $this->executedBy->getGroup();* @return Collection<AutomatedReport>if ($group === null || ! $this->criteria->isFirstRequestO) {return []:*/14 usagespublic function getAskJiminnyReportsByUser110User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"113 Ct): Collection {...Jreturn [$group->getUvid(];public function getValidationRules(?string $prefix = null): array$team = $this->executedBy->getTeam();2 usages/**private function buildSortedQuery(string $117118119* Get all active and enabled reports with 120* @param string $frequency122123 Creturn [$prefix .uloupdu-?$prefix .'group_id.*' =>'uvid:groups, team_id,' • $team->getId(),]:public function getSortOrder(): int* dreturh coLcectzon<aucomacedкeрort>23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:03CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdecke nte/sdocxes /Losk/RuPonape/arports/ASkJ1ninyReportActivityservicetest, php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land 1oash -d&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan test•dests/unxe/servkces/K1osk/AusomatedReports/AskJ1maynyReportActiVatyServiceTest.php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned O.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.lest added: testbetacc1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6uir-of 4 space:...
|
NULL
|
-7355129271701132715
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120© Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.php© AddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ Tlles* File mask:*.php(e) TrackProvidernstallled-vent.onoisFirstRequest© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a* @return Collection<AutomatedReport>In ProjectModuleDirectoryScopeif ($group === null || | $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return Sthis-> criteria->isFirstRequest0it binls-scrterar>srirstrecuesto8& $this->criteria->isFirstRequest0&& $this->criteria->isFirstRequest0)public function|isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn(SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144hte.php 158Filter Definition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86Dealclosevate.ong 106OnDemandActivitySearch/Criteria.php 1272ActivityDurationRangeTest.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106Acvwvbulauonkance lest.ono is12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/**OrganiserGroupln.php app/component/ActVtysearch/riiterDerinidonYoCLpubLic tunction getvalue(): arrayreturn $this->criteria->getGroupIds() ?? $this->getDefaultValue();* Retrieve all Ask Liminny reports create 101/** @return string[] */private tuncuion geuberaultvalued: array* OodrdllusernusenIne User #103*oparam scrine osorclocunnThe column 104* @param string $sortDirection The sort a105106$group = $this->executedBy->getGroup();* @return Collection<AutomatedReport>if ($group === null || ! $this->criteria->isFirstRequestO) {return []:*/14 usagespublic function getAskJiminnyReportsByUser110User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"113 Ct): Collection {...Jreturn [$group->getUvid(];public function getValidationRules(?string $prefix = null): array$team = $this->executedBy->getTeam();2 usages/**private function buildSortedQuery(string $117118119* Get all active and enabled reports with 120* @param string $frequency122123 Creturn [$prefix .uloupdu-?$prefix .'group_id.*' =>'uvid:groups, team_id,' • $team->getId(),]:public function getSortOrder(): int* dreturh coLcectzon<aucomacedкeрort>23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:03CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdecke nte/sdocxes /Losk/RuPonape/arports/ASkJ1ninyReportActivityservicetest, php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker land 1oash -d&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan test•dests/unxe/servkces/K1osk/AusomatedReports/AskJ1maynyReportActiVatyServiceTest.php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned O.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.lest added: testbetacc1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Oul .Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6uir-of 4 space:...
|
11047
|
|
11050
|
219
|
15
|
2026-04-14T09:10:05.816563+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157805816_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120© Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.php© AddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ Tlles* File mask:*.php(e) TrackProvidernstallled-vent.onoisFirstRequest© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php© AutomatedReportResult.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a* @return Collection<AutomatedReport>In ProjectModuleDirectoryScopeif ($group === null || | $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return Sthis-> criteria->isFirstRequest0it binls-scrterar>srirstrecuesto8& $this->criteria->isFirstRequest0&& $this->criteria->isFirstRequest0)public function|isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn (SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144ActivityActualDate.php 158Filter Definition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86DealcloseUate.ong 10bOnDemandActivitySearch/Criteria.php 1272AcfuityDurationRange Test.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106Acvwvbulauonkance lest.ono is12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}OrganiserGroupln.php app/component/ActVtysearch/riiterDerinidonYoCLpubLic tunction getvalue(): arrayreturn $this->criteria->getGroupIds() ?? $this->getDefaultValue();/*** Retrieve all Ask Liminny reports create 101/** @return string[] */private tuncuion geuberaultvalued: array* OodrdllusernusenIne User #103*oparam scrine osorclocunnThe column 104* @param string $sortDirection The sort a105106$group = $this->executedBy->getGroup();* @return Collection<AutomatedReport>if ($group === null || ! $this->criteria->isFirstRequestO) {return []:*/14 usagespublic function getAskJiminnyReportsByUser|110User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"113 Ct): Collection {...Jreturn [$group->getUvid(];public function getValidationRules(?string $prefix = null): array$team = $this->executedBy->getTeam();2 usages/**private function buildSortedQuery(string $117118119* Get all active and enabled reports with 120* @param string $frequency122123 Creturn [$prefix .uloupdu-?$prefix .'group_id.*' =>'uvid:groups, team_id,' • $team->getId(),]:public function getSortOrder(): int* dreturh coLcectzon<aucomacedкeрort>23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:05CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdecke nte/sdocxes /Losk/RuPonape/arports/ASkJ1ninyReportActivityservicetest, php --no-coverageCould not open input file: /app/artisanCommand dockeroocker exec oocker vand ioash -d"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan test•dests/unxe/servkces/K1osk/AusomatedReports/AskJ1maynyReportActiVatyServiceTest.php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturee o.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct:1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Öul ..Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6uir-of 4 space:...
|
NULL
|
7385601512522591068
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.p© RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120© Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]© AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.php© AddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ Tlles* File mask:*.php(e) TrackProvidernstallled-vent.onoisFirstRequest© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php© AutomatedReportResult.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a* @return Collection<AutomatedReport>In ProjectModuleDirectoryScopeif ($group === null || | $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return Sthis-> criteria->isFirstRequest0it binls-scrterar>srirstrecuesto8& $this->criteria->isFirstRequest0&& $this->criteria->isFirstRequest0)public function|isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn (SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144ActivityActualDate.php 158Filter Definition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86DealcloseUate.ong 10bOnDemandActivitySearch/Criteria.php 1272AcfuityDurationRange Test.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106Acvwvbulauonkance lest.ono is12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}OrganiserGroupln.php app/component/ActVtysearch/riiterDerinidonYoCLpubLic tunction getvalue(): arrayreturn $this->criteria->getGroupIds() ?? $this->getDefaultValue();/*** Retrieve all Ask Liminny reports create 101/** @return string[] */private tuncuion geuberaultvalued: array* OodrdllusernusenIne User #103*oparam scrine osorclocunnThe column 104* @param string $sortDirection The sort a105106$group = $this->executedBy->getGroup();* @return Collection<AutomatedReport>if ($group === null || ! $this->criteria->isFirstRequestO) {return []:*/14 usagespublic function getAskJiminnyReportsByUser|110User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"113 Ct): Collection {...Jreturn [$group->getUvid(];public function getValidationRules(?string $prefix = null): array$team = $this->executedBy->getTeam();2 usages/**private function buildSortedQuery(string $117118119* Get all active and enabled reports with 120* @param string $frequency122123 Creturn [$prefix .uloupdu-?$prefix .'group_id.*' =>'uvid:groups, team_id,' • $team->getId(),]:public function getSortOrder(): int* dreturh coLcectzon<aucomacedкeрort>23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:05CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Nowersrunthe esto vertvwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdecke nte/sdocxes /Losk/RuPonape/arports/ASkJ1ninyReportActivityservicetest, php --no-coverageCould not open input file: /app/artisanCommand dockeroocker exec oocker vand ioash -d"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan test•dests/unxe/servkces/K1osk/AusomatedReports/AskJ1maynyReportActiVatyServiceTest.php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturee o.Fix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetAct:1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Öul ..Vew allliItlle win changesvapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> CodeClaude Sonnet 4.6uir-of 4 space:...
|
NULL
|
|
11052
|
219
|
16
|
2026-04-14T09:10:08.221683+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157808221_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpyJiminnyDeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.ph|© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120) Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]• AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.phpAddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php XAutomaleakeporisservice.onpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ TllesFile mask".ohoisFirstRequest(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php© AutomatedReportResult.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a*orerurn coccectlonsauromcreoreooroIn ProjectModuleDirectoryScopeif ($group === null || ! $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return $this->criteria->isFirstRequest()it binls-scrterar>srirstrecuesto8& $this-> criteria->isFirstRequest()&& $this->criteria->isFirstRequest0)public function isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn (SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144ActivityActualDate.php 158FilterDefinition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86DealCloseDaAt.php 106OnDemandActivitySearch/Criteria.php 1272ActivityDurationRangeTest.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106AcuvIvbu auonkancelestiono s12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/**Criteria,php app/VO/Repository/OnDemandActivitySearch126412651266* Recrieve aLL ASk Jimnnu reporus create 126/1268* Oocrdlll UsernusenJne user Wzoy*oparam scrine osorclocunnIne coLumnlz/e* Oparam string $sortDirection The sort a12711272return $this->limit;public function isEmpty(): boolreturn $this->empty;public function isFirstRequest(): bool* @return Collection<AutomatedReport>*/127414 usagespublic function getAskJiminnyReportsByUser|1276User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J127812791280128111284return $this->empty || $this->sequenceNumber === 0;public function getOnlyActiveUsers(): boolreturn suns->onuvactveusers === urue.2 usages/**/**private function buildSortedQuery(string $1283* Parse a Deal Insights date from request attributes, handling null/empty values gracefully.* This method is specifically for Deal Insights date fields to support the "All time" filter* Get all active and enabled reports with 1286* @param string $frequency* Oparam Collection $attributes* @param string $key* dparam batelimezone sulmezone1289* dreturn cocLectron<Aucomacedкeрort»* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parameter23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:07CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verify:Command dockenwo docteraxe doukees /.osk/AuP /var//rts/artinam yReportActivätyServäceTest- php -no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand docker•cocker exec oocker land ioasn —"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisanCommand docken• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan testdests/unxe/servaces/K1osk/AusomatedReports/AskJ1maynyReportActivaty5erviceTest- php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixKoOL cause: bu1 Ldkequestraramst romsearch never set sequence number In the request params, so criterla::creater romkequest delaulted lt to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the serviceretumee uFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.lest added: testbetacc1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Öul ..Vew allliItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> Code Claude Sonnet 4.6uir-of 4 space:...
|
NULL
|
9193021323297827425
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorToo PhpStormFileEditViewNavigateCodeLaravelRefactorToolsWindowHelp#11894 on.lY-18909-automated-renorts-ask-liminnvProject v© ReportController.php© AutomatedReportsCommand.phpyJiminnyDeouecommana.ong© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationOAuth2D RecallAlSecurityD Strategy_ streamingM TeamTelephony→ UserPilotD Webhook© AbstractService.php©ActivityProviderFactory.ph|© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php© IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorInterface.© ResolveTeamCrmConnecti© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.phpC) TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases114> MUser115>MUtils116> D Validation117v DVO118v D Repository119v D OnDemandActivitySears120) Criteria.php© TranscriptionKeywordP:>D TeamSettings= custom.logA console (EU]Criteria.php x= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console [STAGING]• AskJiminnyReportActivityService.php© ActivitySearch.php© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpAutomatedReportsSendCommand.phpAddLayoutEntities.php,leam.ono© AutomatedReportsRepository.php XAutomaleakeporisservice.onpC CreateHeldActivityEvent.phpFind in Files 100+ matches in 11+ TllesFile mask".ohoisFirstRequest(e TrackProvidernstallled-vent.ono© CreateActivityLoggedEvent.php(©) ActivityLogged.php© UserPilotActivityListener.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php(C) AutomatedReport.php© AutomatedReportResult.phpclass Automacedкeрortskepo o:A15 X4 ^/*** Retrieve all standard (non-Ask Jiminny)* @param string $sortColumnThe column* dodron scrino osorcurection ine sor a*orerurn coccectlonsauromcreoreooroIn ProjectModuleDirectoryScopeif ($group === null || ! $this->criteria->isFirstRequest() (if ($this->criteria->isFirstRequest() (if ($this-> criteria->isFirstRequest() (return $this->criteria->isFirstRequest()it binls-scrterar>srirstrecuesto8& $this-> criteria->isFirstRequest()&& $this->criteria->isFirstRequest0)public function isFirstRequest(): boolbool SisFirstRequestSthis->criteria->method(isFirstRequest)->willReturn (SisFirstRequest);isFirstRequest => true,t => true,=> true,isFirstRequest => false,isFirstRequest => true,isFirstRequest => true,OrganiserGroupln.php 106ActivityActualDate.php 144ActivityActualDate.php 158FilterDefinition/ActivityDurationRange.php 90TlerverniuonAcivivreco cec.ono vsDealCloseDate.php 86DealCloseDaAt.php 106OnDemandActivitySearch/Criteria.php 1272ActivityDurationRangeTest.php 56ActivityDurationRangeTest.php 62ActivityDurationRangeTest.php 63ActivityDurationRangeTest.php 78ActivityDurationRangeTest.php 85ActivityDurationRangeTest.php 92ActivityDurationRange Test.php 99ActivityDurationRangeTest.php 106AcuvIvbu auonkancelestiono s12 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}/**Criteria,php app/VO/Repository/OnDemandActivitySearch126412651266* Recrieve aLL ASk Jimnnu reporus create 126/1268* Oocrdlll UsernusenJne user Wzoy*oparam scrine osorclocunnIne coLumnlz/e* Oparam string $sortDirection The sort a12711272return $this->limit;public function isEmpty(): boolreturn $this->empty;public function isFirstRequest(): bool* @return Collection<AutomatedReport>*/127414 usagespublic function getAskJiminnyReportsByUser|1276User $user,string $sortColumn = 'created_at',string ssorcbirection = "desc"): Collection {...J127812791280128111284return $this->empty || $this->sequenceNumber === 0;public function getOnlyActiveUsers(): boolreturn suns->onuvactveusers === urue.2 usages/**/**private function buildSortedQuery(string $1283* Parse a Deal Insights date from request attributes, handling null/empty values gracefully.* This method is specifically for Deal Insights date fields to support the "All time" filter* Get all active and enabled reports with 1286* @param string $frequency* Oparam Collection $attributes* @param string $key* dparam batelimezone sulmezone1289* dreturn cocLectron<Aucomacedкeрort»* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parameter23 usages• Open results in new tabOpen in Find Windowpublic function getActiveReportsByFrequency(sSupport Daily • in 2h 50 mAAsk.liminnvRenortActivitvServicel..Defaults100% |45]Tue 14 Apr 12:10:07CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verify:Command dockenwo docteraxe doukees /.osk/AuP /var//rts/artinam yReportActivätyServäceTest- php -no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand docker•cocker exec oocker land ioasn —"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisanCommand docken• docker exec docker lamp 1 bash -c "find / -name artisan -maxdeoth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan testdests/unxe/servaces/K1osk/AusomatedReports/AskJ1maynyReportActivaty5erviceTest- php --no-coverage 2>&1"PASSgetTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTesta fittersemoty when no resultsE tatt tnt hperiod date filters0.03sids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixKoOL cause: bu1 Ldkequestraramst romsearch never set sequence number In the request params, so criterla::creater romkequest delaulted lt to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupin → apolies user's derault croup as a tiltelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the serviceretumee uFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.lest added: testbetacc1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirstRequest() === false.Öul ..Vew allliItlle wiun changes vapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Reject allAccept allAsk anything (2*L)+ <> Code Claude Sonnet 4.6uir-of 4 space:...
|
11050
|
|
11054
|
219
|
17
|
2026-04-14T09:10:15.222950+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-14/1776 /Users/lukas/.screenpipe/data/data/2026-04-14/1776157815222_m2.jpg...
|
NULL
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationDOAuth2D RecallAlD SecurityStrategyL7 Streaming>MTeam> D Telephony› _ UserPilotWebhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php©IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectii© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (a minute ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php) Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console (EU]A console [STAGING]© AsKJiminnyReportActivityService.php/d• ActivitySearch.php© Criteria.php x© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpO-isFirstRequestWclass Criteria(e TrackProvidernstallled-vent.ono12161217© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.php122112221226I2L1123114041236class Automacedкeрortskepo o:B15 X4 A12371241/**12421246* Retrieve all standard (non-Ask Jiminny) m 12471251* @param string $sortColumnThe column t(1252* Oparam string $sortDirection The sort dir€ 125661* @return Collection<AutomatedReport>—12571261126212 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}1266126712711272831141151161171181191201211231274/*** Retrieve all Ask Liminny reports created À 1276-1277* Oodrdll usernusenIne User Wno:1281* @param string $sortColumnIne coLUmn c01282* @param string $sortDirection The sort dirt 1283* @return Collection<AutomatedReport>1284*/1285.128614 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',surno ssortutreccion = 'desc'): Collection {...J1ZY112922 usages1470private function buildSortedQuery(string $sor1294_12951296* Get all active and enabled reports with al 1297* @param string $frequency15111* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(s41846 M3 ^public function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...}public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf..public function isFirstRequestC): boolrecurn suhis->empty ll suhis->sequencenumber === 0.public function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes,handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* Cparam DateTimeZone $timezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if expticitty notl,CarbonImmutable if valid date4 usagesprivate static function parseDealInsightsDate(Collection $attributes,string $key,Datelimezone „timezone): CarbonImmutablelstringlnull f..Support Daily • in 2 h 50 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:10:14CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker lano oash—e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan testdests/unxe/servaces/K1osk/AusomatedReports/AskJ1maynyReportActivaty5erviceTest-php --no-coverage 2>61"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTestemoty when no resultsget activityE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetActi1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirs-Requesto zzz tallse.Oul .1 file with changesapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Vew allliReject allAccept allAsk anything (2*L)+ ‹> CodeClaude Sonnet 4.6winasun leams12/2:3014 charsuir-o( 4 spaces...
|
NULL
|
-2773940394073602906
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorFV PhpStormFileEditViewNavigateCodeLaravelRefactorFV faVsco.s v#11894 on JY-18909-automated-reports-ask-iminny K vProject vToolsWindowHelp© ActivityTypeService.© AskJiminnyReportAc© AutomatedReportsC:© AutomatedReportsSt© DealStagesService.pC) RecipientsService.ph© ReportSort.php€ ReportSortDirection.© KioskService.php> D Mail• MeetingGeneratorC NotificationDOAuth2D RecallAlD SecurityStrategyL7 Streaming>MTeam> D Telephony› _ UserPilotWebhook© AbstractService.php©ActivityProviderFactory.phj© ActivityService.php© ApiResponseService.php© ConferenceService.php© InsightSeatService.php© InstantMeetingService.php© IntercomService.php©IpapiClient.php© lpapiService.php© ParticipantShareService.ph© PlanhatService.php©PlaybackService.php© PlaybackVideoOnlyService©PlaybookCategoryService./© PlaylistGeneratorinterface./©ResolveTeamCrmConnectii© SimpleThrottleService.php© SlackService.php© SocialAccountService.php© SoftPhoneService.php©TeamDeactivatedService.p©TeamOwnerService.php©TeamService.php© TranscodeParameterResol©UserService.php© Uuid.php> D Traits> D UseCases> MUser>MUtils> D Validationv DVOv D Repositoryv D OnDemandActivitySears) Criteria.php© TranscriptionKeywordP:>D TeamSettingsTests passed: 1 (a minute ago)© ReportController.php© AutomatedReportsCommand.phpJiminnybeouecommana.ong© AutomatedReportsSendCommand.php© AddLayoutEntities.php) Team.php© AutomatedReportsRepository.php X© AutomatedReportsService.phpC CreateHeldActivityEvent.php= custom.log= laravel.logA SF [jiminny@localhost]A HS_local [jiminny@localhost]A console [PROD]A console (EU]A console [STAGING]© AsKJiminnyReportActivityService.php/d• ActivitySearch.php© Criteria.php x© AskJiminnyReportActivityServiceTest.php© RequestGenerateAskJiminnyReportJobTest.phpO-isFirstRequestWclass Criteria(e TrackProvidernstallled-vent.ono12161217© CreateActivityLoggedEvent.php© UserPilotActivityListener.php(©) ActivityLogged.php(C) AutomatedReportsCallbackService.php© RequestGenerateAskJiminnyReportJob.phpRequestGenerateReportJob.php© AutomatedReportResult.php(C) AutomatedReport.php122112221226I2L1123114041236class Automacedкeрortskepo o:B15 X4 A12371241/**12421246* Retrieve all standard (non-Ask Jiminny) m 12471251* @param string $sortColumnThe column t(1252* Oparam string $sortDirection The sort dir€ 125661* @return Collection<AutomatedReport>—12571261126212 usagespublic function getAllStandardReports(string $sortColumn = 'created_at',string $sortDirection = 'desc'): Collection {...}1266126712711272831141151161171181191201211231274/*** Retrieve all Ask Liminny reports created À 1276-1277* Oodrdll usernusenIne User Wno:1281* @param string $sortColumnIne coLUmn c01282* @param string $sortDirection The sort dirt 1283* @return Collection<AutomatedReport>1284*/1285.128614 usagespublic function getAskJiminnyReportsByUser(User $user,string $sortColumn = 'created_at',surno ssortutreccion = 'desc'): Collection {...J1ZY112922 usages1470private function buildSortedQuery(string $sor1294_12951296* Get all active and enabled reports with al 1297* @param string $frequency15111* dreturn cocLectron<Aucomacedкeрort»23 usagespublic function getActiveReportsByFrequency(s41846 M3 ^public function getMaxCustomerQuestions(): intf..public function hasMinCommentCount(): boolf...}public function getMinCommentCount(): stringf...}public function hasMaxCommentCount(): boolf...}public function getMaxCommentCount(): stringf...public function hasSortDirection(): boolf...}public function getSortDirection(): stringf...}public function hasSortBy(): boolf...}public function getSortBy(): stringf...}public function getLimit(): intl...public function isEmpty(): boolf..public function isFirstRequestC): boolrecurn suhis->empty ll suhis->sequencenumber === 0.public function getOnlyActiveUsers(): boolf...}/*** Parse a Deal Insights date from request attributes,handling null/empty values graceful* This method is specifically for Deal Insights date fields to support the "All time" fil* Oparam Collection $attributes* Oparam string $key* Cparam DateTimeZone $timezone=* Creturn CarbonImmutable/null/string Returns self::DATE_PARAMETER_NOT_PROVIDED if parame* missing, null if expticitty notl,CarbonImmutable if valid date4 usagesprivate static function parseDealInsightsDate(Collection $attributes,string $key,Datelimezone „timezone): CarbonImmutablelstringlnull f..Support Daily • in 2 h 50 mAAskJiminnyReportActivityServiceT…Defaults100% C•Tue 14 Apr 12:10:14CascadeFixing ReportControllerAutomated Report MarFixing Ask Jiminny Rep+D..Now let's run the test to verifvCommand dockenwo desker nxe dovkcrs/ko3k Automwa/wports/arman yRgportActzvityserväceTest-php --no-coverageloul nor oen Indlr tler var w nunwarusanCommand dockerdoster nxe ceockes /kJosk/AuP /ape/a/poras/A5kJ1minyReportActivityServiceTest.php --no-coverageCould not open input file: /app/artisanCommand dockerocker exec oocker lano oash—e"cd /var/www&& php artisan testLests unlu services Klosk Aucomaceakeporcs AskJiminnykeportAccivityservicelest.ono =-no-coverade D&l'Could not open input file: artisan• docker exec docker_lamp_1 bash -c "find / -name artisan -maxdepth 6 2>/dev/null | head -5"/home/jiminny/artisan"cd /homeiminny && php artisan testdests/unxe/servaces/K1osk/AusomatedReports/AskJ1maynyReportActivaty5erviceTest-php --no-coverage 2>61"PASSTests\Unit\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityServiceTestemoty when no resultsget activityE tatt tnt hperiod date filtersids bassess snazer fsequence number to disable first _ 0.025All 8 tests pass. Here's a summary:Root Cause & FixRoot cause: buildRequestParamsFromSearch never set sequence number in the request params, so Criteria::createFromRequest defaulted it to 0Since isFirstRequest() returns true when sequenceNumber === 0, several implicit defaults were silently applied:Activitvourat ionRande → min duration = 1 Tilters ouf o-second activitiesiActivityRecorded → only_recorded = 1 (restricts to recorded activities only)OrganiserGroupIn → applies user's default group as a filtelThe frontend URL you noticed uses sequence_number=4, which disables these defaults - explaining why the frontend returned activities but the servicereturned OFix: AskJiminnyReportActivityService.php:51—added 'sequence_number' » 1 to the Criteria::createFromRequest merge, ensuring isFirstRequest() returns false and no implicit defaults are injected.Test added: testGetActi1cylasPassesNonzerosequencenumberloDisablerarsckequestberaulus assers that the captured uriteria ob ect nas 1srirs-Requesto zzz tallse.Oul .1 file with changesapp/Services/Kiosk/AutomatedReports/D AskJiminnyReportActivityService.php +1 -1Vew allliReject allAccept allAsk anything (2*L)+ ‹> CodeClaude Sonnet 4.6winasun leams12/2:3014 charsuir-o( 4 spaces...
|
NULL
|