|
10992
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 53 m100% C48Tue 14 Apr 12:07:44Today ~...
|
NULL
|
NULL
|
NULL
|
10992
|
|
10993
|
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
|
NULL
|
NULL
|
10993
|
|
10994
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 53 m100% <47Tue 14 Apr 12:07:458Today ~...
|
NULL
|
NULL
|
NULL
|
10994
|
|
10995
|
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
|
NULL
|
NULL
|
10995
|
|
10996
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 53 m100% C7Tue 14 Apr 12:07:558Today ~...
|
NULL
|
NULL
|
NULL
|
10996
|
|
10997
|
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
|
NULL
|
NULL
|
10997
|
|
10998
|
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
|
NULL
|
NULL
|
10998
|
|
10999
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 53 m100% C7Tue 14 Apr 12:07:588Today ~...
|
NULL
|
NULL
|
NULL
|
10999
|
|
11000
|
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
|
NULL
|
NULL
|
11000
|
|
11001
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 53 m100% <47Tue 14 Apr 12:08:008Today ~...
|
NULL
|
NULL
|
NULL
|
11001
|
|
11002
|
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
|
NULL
|
NULL
|
11002
|
|
11003
|
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
|
NULL
|
NULL
|
11003
|
|
11004
|
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
+SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:048Today ~...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
NULL
|
11004
|
|
11005
|
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
|
NULL
|
NULL
|
11005
|
|
11006
|
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...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
NULL
|
11006
|
|
11007
|
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...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
NULL
|
11007
|
|
11008
|
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
|
NULL
|
NULL
|
11008
|
|
11009
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:178Today ~...
|
NULL
|
NULL
|
NULL
|
11009
|
|
11010
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:188Today ~...
|
NULL
|
NULL
|
NULL
|
11010
|
|
11011
|
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
|
NULL
|
NULL
|
11011
|
|
11012
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:228Today ~...
|
NULL
|
NULL
|
NULL
|
11012
|
|
11013
|
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...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
NULL
|
11013
|
|
11014
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:278Today ~...
|
NULL
|
NULL
|
NULL
|
11014
|
|
11015
|
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
|
NULL
|
NULL
|
11015
|
|
11016
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:308Today ~...
|
NULL
|
NULL
|
NULL
|
11016
|
|
11017
|
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
|
NULL
|
NULL
|
11017
|
|
11018
|
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
|
NULL
|
NULL
|
11018
|
|
11019
|
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
|
NULL
|
NULL
|
11019
|
|
11020
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa> 0ladl= Support Daily • in 2h 52 m100% <47Tue 14 Apr 12:08:3986 0Today ~...
|
NULL
|
NULL
|
NULL
|
11020
|
|
11021
|
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
|
NULL
|
NULL
|
11021
|
|
11022
|
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...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
NULL
|
11022
|
|
11023
|
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...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
NULL
|
11023
|
|
11024
|
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
|
NULL
|
NULL
|
11024
|
|
11025
|
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
|
NULL
|
NULL
|
11025
|
|
11026
|
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
+SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:1686 0Today ~...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
NULL
|
11026
|
|
11027
|
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...
|
PhpStorm
|
faVsco.js – ActivitySearch.php
|
NULL
|
11027
|
|
11028
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:1986 0Today ~...
|
NULL
|
NULL
|
NULL
|
11028
|
|
11029
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:3286 0Today ~...
|
NULL
|
NULL
|
NULL
|
11029
|
|
11030
|
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
|
NULL
|
NULL
|
11030
|
|
11031
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:3786 0Today ~...
|
NULL
|
NULL
|
NULL
|
11031
|
|
11032
|
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
|
NULL
|
NULL
|
11032
|
|
11033
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:4286 0Today ~...
|
NULL
|
NULL
|
NULL
|
11033
|
|
11034
|
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
|
NULL
|
NULL
|
11034
|
|
11035
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
isFirstRequest
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/1
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
1
46
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\VO\Repository\OnDemandActivitySearch;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use DateTimeZone;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\CreatedPeriodFilter;
class Criteria
{
/**
* Sentinel value to indicate a date parameter was not provided in the request
*/
private const DATE_PARAMETER_NOT_PROVIDED = 'DATE_PARAMETER_NOT_PROVIDED';
/**
* @var string[]
*/
private $playlistIds;
/**
* @var string[]
*/
private array $topicIds = [];
private ?string $compareTopicId = null;
private ?string $partnerId;
/**
* @var string[]
*/
private $activityTypeIds;
/**
* @var string[]
*/
private $stageIds;
/**
* @var string[]
*/
private $currentStageIds;
/**
* @var string[]|null
*/
private ?array $groupIds = null;
/**
* @var string[]|null
*/
private ?array $userIds = null;
/**
* @var string[]|null
*/
private ?array $coachingFeedbackCoachUserId;
/**
* @var string[]|null
*/
private ?array $participantUserIds = null;
/**
* @var string[]|null
*/
private ?array $teamMemberUserIds;
/**
* @var string[]
*/
private $teamIds;
/**
* @var string
*/
private $providerId;
/**
* Channel ID for filtering activities by a single channel.
*/
private ?string $channelId = null;
/**
* Channel IDs for filtering activities by multiple channels.
* When provided, activities matching any of the specified channels will be returned.
*
* @var string[]|null
*/
private ?array $channelIds = null;
/**
* Filter activities based on whether they have a transcription.
* true = only activities with transcription, false = only activities without transcription, null = no filter
*/
private ?bool $hasTranscription = null;
private ?int $minDuration = null;
private ?int $maxDuration = null;
/**
* @var string
*
* @format uuid
*/
private $excludedUserId;
private ?CarbonImmutable $startDate = null;
private ?CarbonImmutable $endDate = null;
/**
* @var Carbon|null
*/
private $scheduledFrom;
private ?Carbon $scheduledTo = null;
/**
* @var Carbon|null
*/
private $updatedFrom;
/**
* @var Carbon|null
*/
private $updatedTo;
private CarbonImmutable|string|null $dealCloseDateStart = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCloseDateEnd = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCreatedDateStart = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCreatedDateEnd = self::DATE_PARAMETER_NOT_PROVIDED;
private ?array $dealStageIds = null;
private ?array $dealPipelineIds = null;
private ?array $dealTypeIds = null;
private ?int $minDealValue = null;
private ?int $maxDealValue = null;
/**
* @var string|null
*/
private $minDealAge;
/**
* @var string|null
*/
private $maxDealAge;
/**
* @var string|null
*/
private $minPatience;
/**
* @var string|null
*/
private $maxPatience;
private ?int $minTalkRatio = null;
private ?int $maxTalkRatio = null;
/**
* @var string|null
*/
private $minMonologue;
/**
* @var string|null
*/
private $maxMonologue;
/**
* @var string|null
*/
private $minCustomerMonologue;
/**
* @var string|null
*/
private $maxCustomerMonologue;
/**
* @var string|null
*/
private $minSpeechRate;
/**
* @var string|null
*/
private $maxSpeechRate;
private ?float $minScore = null;
private ?float $maxScore = null;
/**
* @var int[]|null
*/
private ?array $coachingScores = null;
private ?int $minAutoScore = null;
private ?int $maxAutoScore = null;
/**
* @var int[]|null
*/
private ?array $autoScores = null;
/**
* @var int[]|null
*/
private ?array $aiCallScores = null;
/**
* @var string[]
*/
private ?array $includeStatuses;
/**
* @var bool
*/
private $notLogged;
private bool $hasPendingAiCrmNotes;
private bool $includeHostJoinedMeetings;
private ?int $onlyRecorded;
private ?int $includeInternalConversations = null;
private ?string $searchQuery = null;
/**
* @var string
*/
private $transcriptKeywords;
/**
* @var string
*/
private $transcriptSaidBy;
/**
* @var string
*/
private $transcriptSpeaker;
/**
* @var string[]|null
*/
private $languages;
private ?string $externalId = null;
private ?string $externalIdType = null;
/**
* @var string|null
*/
private $minUserQuestions;
/**
* @var string|null
*/
private $maxUserQuestions;
/**
* @var string|null
*/
private $minEngagingQuestions;
/**
* @var string|null
*/
private $maxEngagingQuestions;
/**
* @var string|null
*/
private $minInsightfulQuestions;
/**
* @var string|null
*/
private $maxInsightfulQuestions;
/**
* @var string|null
*/
private $minCustomerQuestions;
/**
* @var string|null
*/
private $maxCustomerQuestions;
/**
* @var string|null
*/
private $sortDirection;
/**
* @var string|null
*/
private $sortBy;
private int $limit;
/**
* @var int
*/
private $pageNumber;
/**
* @var bool
*/
private $empty;
/**
* @var int
*/
private $sequenceNumber;
/**
* @var string
*/
private $nudgeRunId;
private ?bool $onlyActiveUsers = null;
/**
* @var string
*/
private $activityId;
private ?string $context = null;
private ?string $minCommentCount = null;
private ?string $maxCommentCount = null;
/** @var array<string, string|string[]> */
private array $crmFieldValues = [];
public static function createFromRequest(
array $requestAttributes,
DateTimeZone $timezone,
?string $context = null
): self {
$attributes = Collection::make($requestAttributes);
$instance = new self();
$instance->context = $context;
$instance->partnerId = $attributes->get('partner_id');
$instance->teamIds = $attributes->get('team_id');
$instance->groupIds = $attributes->get('group_id');
$instance->userIds = $attributes->get('user_id');
$instance->coachingFeedbackCoachUserId = $attributes->get('coaching_feedback_coach_id');
$instance->participantUserIds = $attributes->get('participant_user_id');
$instance->teamMemberUserIds = $attributes->get('team_member_user_id');
$instance->excludedUserId = $attributes->get('excluded_user_id');
$instance->activityTypeIds = $attributes->get('category_id');
$instance->searchQuery = $attributes->get('query');
$instance->transcriptKeywords = $attributes->get('transcript_keywords');
$instance->transcriptSaidBy = $attributes->get('transcript_said_by');
$instance->transcriptSpeaker = $attributes->get('transcript_speaker');
$instance->languages = $attributes->get('languages');
$instance->topicIds = $attributes->get('topic_id', []);
$instance->compareTopicId = $attributes->get('compare_topic_id');
$instance->stageIds = $attributes->get('stage_id');
$instance->currentStageIds = $attributes->get('current_stage_id');
$instance->playlistIds = $attributes->get('playlist_id');
$instance->providerId = $attributes->get('provider_id');
$instance->channelId = $attributes->get('channel_id');
$instance->channelIds = $attributes->get('channel_ids');
$hasTranscription = $attributes->get('has_transcription');
$instance->hasTranscription = $hasTranscription !== null ? (bool) $hasTranscription : null;
$instance->externalId = $attributes->get('external_id');
$instance->externalIdType = $attributes->get('external_id_type');
$instance->notLogged = $attributes->get('not_logged') === '1';
$instance->hasPendingAiCrmNotes = $attributes->get('has_pending_ai_crm_notes') === '1';
$instance->includeHostJoinedMeetings = $attributes->get('include_host_joined_meetings') === '1';
$instance->onlyRecorded = $attributes->has('only_recorded')
? (int) $attributes->get('only_recorded')
: null;
$instance->includeInternalConversations = $attributes->has('include_internal_conversations')
? (int) $attributes->get('include_internal_conversations')
: null;
$instance->minDuration = $attributes->has('min_duration')
? (int) $attributes->get('min_duration')
: null;
$instance->maxDuration = $attributes->has('max_duration')
? (int) $attributes->get('max_duration')
: null;
$minDealValue = $attributes->get('min_deal_value');
$instance->minDealValue = $minDealValue !== null ? (int) $minDealValue : null;
$maxDealValue = $attributes->get('max_deal_value');
$instance->maxDealValue = $maxDealValue !== null ? (int) $maxDealValue : null;
$instance->minDealAge = $attributes->get('min_deal_age');
$instance->maxDealAge = $attributes->get('max_deal_age');
$instance->minCustomerMonologue = $attributes->get('min_customer_monologue');
$instance->maxCustomerMonologue = $attributes->get('max_customer_monologue');
$instance->minMonologue = $attributes->get('min_monologue');
$instance->maxMonologue = $attributes->get('max_monologue');
$instance->minTalkRatio = $attributes->has('min_talk_ratio')
? (int) $attributes->get('min_talk_ratio')
: null;
$instance->maxTalkRatio = $attributes->has('max_talk_ratio')
? (int) $attributes->get('max_talk_ratio')
: null;
$instance->minPatience = $attributes->get('min_patience');
$instance->maxPatience = $attributes->get('max_patience');
$instance->minSpeechRate = $attributes->get('min_speech_rate');
$instance->maxSpeechRate = $attributes->get('max_speech_rate');
$instance->minScore = $attributes->has('min_score')
? (float) $attributes->get('min_score')
: null;
$instance->maxScore = $attributes->has('max_score')
? (float) $attributes->get('max_score')
: null;
$coachingScores = $attributes->get('coaching_score');
if (is_array($coachingScores)) {
$instance->coachingScores = array_map('intval', $coachingScores);
}
$instance->minAutoScore = $attributes->has('min_auto_score')
? (int) $attributes->get('min_auto_score')
: null;
$instance->maxAutoScore = $attributes->has('max_auto_score')
? (int) $attributes->get('max_auto_score')
: null;
$autoScores = $attributes->get('auto_score');
if (is_array($autoScores)) {
$instance->autoScores = array_map('intval', $autoScores);
}
$aiCallScores = $attributes->get('ai_call_score');
if (is_array($aiCallScores)) {
$instance->aiCallScores = array_map('intval', $aiCallScores);
}
$instance->minUserQuestions = $attributes->get('min_user_questions');
$instance->maxUserQuestions = $attributes->get('max_user_questions');
$instance->minEngagingQuestions = $attributes->get('min_engaging_questions');
$instance->maxEngagingQuestions = $attributes->get('max_engaging_questions');
$instance->minInsightfulQuestions = $attributes->get('min_insightful_questions');
$instance->maxInsightfulQuestions = $attributes->get('max_insightful_questions');
$instance->minCustomerQuestions = $attributes->get('min_customer_questions');
$instance->maxCustomerQuestions = $attributes->get('max_customer_questions');
$instance->nudgeRunId = $attributes->get('nudge_run_id');
$instance->activityId = $attributes->get('activity_id');
$instance->minCommentCount = $attributes->has('min_comment_count')
? (string) $attributes->get('min_comment_count')
: null;
$instance->maxCommentCount = $attributes->has('max_comment_count')
? (string) $attributes->get('max_comment_count')
: null;
$instance->onlyActiveUsers = $attributes->has('only_active_users')
? $attributes->get('only_active_users') === '1'
: null;
$instance->crmFieldValues = $attributes
->filter(static function ($value, $key): bool {
return str_starts_with($key, FilterDefinition\CrmFieldCollection::CRITERIA_PREFIX);
})
->mapWithKeys(static function ($value, string $key): array {
$key = str_replace_first(FilterDefinition\CrmFieldCollection::CRITERIA_PREFIX, '', $key);
return [
$key => $value,
];
})
->all();
$instance->limit = (int) $attributes->get('limit', 25);
$instance->pageNumber = (int) $attributes->get('page', 1);
$instance->empty = $attributes->isEmpty();
$instance->sequenceNumber = (int) $attributes->get('sequence_number', 0);
$instance->includeStatuses = $attributes->get('status');
$instance->dealCloseDateStart = self::parseDealInsightsDate($attributes, ClosingPeriodFilter::KEY_START_DATE, $timezone);
$instance->dealCloseDateEnd = self::parseDealInsightsDate($attributes, ClosingPeriodFilter::KEY_END_DATE, $timezone);
$dealCreatedDateStartKey = CreatedPeriodFilter::KEY_START_DATE;
$dealCreatedDateEndKey = CreatedPeriodFilter::KEY_END_DATE;
$instance->dealCreatedDateStart = self::parseDealInsightsDate($attributes, $dealCreatedDateStartKey, $timezone);
$instance->dealCreatedDateEnd = self::parseDealInsightsDate($attributes, $dealCreatedDateEndKey, $timezone);
if ($attributes->has('deal_pipeline_id')) {
$instance->dealPipelineIds = $attributes->get('deal_pipeline_id');
}
if ($attributes->has('deal_stage_id')) {
$instance->dealStageIds = $attributes->get('deal_stage_id');
}
if ($attributes->has('deal_type_id')) {
$instance->dealTypeIds = $attributes->get('deal_type_id');
}
if ($attributes->has('start_date')) {
$instance->startDate = CarbonImmutable::parse($attributes->get('start_date'), $timezone);
}
if ($attributes->has('end_date')) {
$instance->endDate = CarbonImmutable::parse($attributes->get('end_date'), $timezone);
}
if ($attributes->has('scheduled_from')) {
$instance->scheduledFrom = Carbon::parse($attributes->get('scheduled_from'), $timezone);
}
if ($attributes->has('scheduled_to')) {
$instance->scheduledTo = Carbon::parse($attributes->get('scheduled_to'), $timezone);
}
if ($attributes->has('updated_from')) {
$instance->updatedFrom = Carbon::parse($attributes->get('updated_from'), $timezone);
}
if ($attributes->has('updated_to')) {
$instance->updatedTo = Carbon::parse($attributes->get('updated_to'), $timezone);
}
$instance->sortBy = $attributes->get('sort_by');
$instance->sortDirection = $attributes->get('sort_direction');
return $instance;
}
public function setContext(?string $context): self
{
$this->context = $context;
return $this;
}
public function getContext(): ?string
{
return $this->context;
}
public function getMinDealValue(): ?int
{
return $this->minDealValue;
}
public function getMaxDealValue(): ?int
{
return $this->maxDealValue;
}
public function hasMinDealAge(): bool
{
return $this->minDealAge !== null;
}
public function getMinDealAge(): int
{
return (int) $this->minDealAge;
}
public function hasMaxDealAge(): bool
{
return $this->maxDealAge !== null;
}
public function getMaxDealAge(): int
{
return (int) $this->maxDealAge;
}
public function hasTranscriptKeywords(): bool
{
return $this->transcriptKeywords !== null;
}
public function getTranscriptKeywords(): string
{
return $this->transcriptKeywords;
}
public function hasTranscriptSaidBy(): bool
{
return $this->transcriptSaidBy !== null;
}
public function getTranscriptSaidBy(): string
{
return $this->transcriptSaidBy;
}
public function hasTranscriptSpeaker(): bool
{
return $this->transcriptSpeaker !== null;
}
public function getTranscriptSpeaker(): string
{
return $this->transcriptSpeaker;
}
public function getLanguages(): ?array
{
return $this->languages;
}
public function getPartnerId(): ?string
{
return $this->partnerId;
}
public function getMinScore(): ?float
{
return $this->minScore;
}
public function getMaxScore(): ?float
{
return $this->maxScore;
}
/**
* @return int[]|null
*/
public function getCoachingScores(): ?array
{
return $this->coachingScores;
}
public function getMinAutoScore(): ?int
{
return $this->minAutoScore;
}
public function getMaxAutoScore(): ?int
{
return $this->maxAutoScore;
}
/**
* @return int[]|null
*/
public function getAutoScores(): ?array
{
return $this->autoScores;
}
/**
* @return int[]|null
*/
public function getAiCallScores(): ?array
{
return $this->aiCallScores;
}
public function hasMinPatience(): bool
{
return $this->minPatience !== null;
}
public function getMinPatience(): float
{
return (float) $this->minPatience;
}
public function hasMaxPatience(): bool
{
return $this->maxPatience !== null;
}
public function getMaxPatience(): float
{
return (float) $this->maxPatience;
}
public function hasMinSpeechRate(): bool
{
return $this->minSpeechRate !== null;
}
public function getMinSpeechRate(): float
{
return (float) $this->minSpeechRate;
}
public function hasMaxSpeechRate(): bool
{
return $this->maxSpeechRate !== null;
}
public function getMaxSpeechRate(): float
{
return (float) $this->maxSpeechRate;
}
public function getMinTalkRatio(): ?int
{
return $this->minTalkRatio;
}
public function getMaxTalkRatio(): ?int
{
return $this->maxTalkRatio;
}
public function hasMinMonologue(): bool
{
return $this->minMonologue !== null;
}
public function getMinMonologue(): float
{
return (float) $this->minMonologue;
}
public function hasMaxMonologue(): bool
{
return $this->maxMonologue !== null;
}
public function getMaxMonologue(): float
{
return (float) $this->maxMonologue;
}
public function hasMinCustomerMonologue(): bool
{
return $this->minCustomerMonologue !== null;
}
public function getMinCustomerMonologue(): float
{
return (float) $this->minCustomerMonologue;
}
public function hasMaxCustomerMonologue(): bool
{
return $this->maxCustomerMonologue !== null;
}
public function getMaxCustomerMonologue(): float
{
return (float) $this->maxCustomerMonologue;
}
public function getDealCloseDateStart(): ?CarbonImmutable
{
return $this->dealCloseDateStart === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCloseDateStart;
}
public function getDealCloseDateEnd(): ?CarbonImmutable
{
return $this->dealCloseDateEnd === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCloseDateEnd;
}
public function getDealCreatedDateStart(): ?CarbonImmutable
{
return $this->dealCreatedDateStart === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCreatedDateStart;
}
public function getDealCreatedDateEnd(): ?CarbonImmutable
{
return $this->dealCreatedDateEnd === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCreatedDateEnd;
}
/**
* Check if deal close date start parameter was explicitly set (even if to null)
*/
public function hasDealCloseDateStart(): bool
{
return $this->dealCloseDateStart !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal close date end parameter was explicitly set (even if to null)
*/
public function hasDealCloseDateEnd(): bool
{
return $this->dealCloseDateEnd !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal created date start parameter was explicitly set (even if to null)
*/
public function hasDealCreatedDateStart(): bool
{
return $this->dealCreatedDateStart !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal created date end parameter was explicitly set (even if to null)
*/
public function hasDealCreatedDateEnd(): bool
{
return $this->dealCreatedDateEnd !== self::DATE_PARAMETER_NOT_PROVIDED;
}
public function hasDealStageIds(): bool
{
return $this->dealStageIds !== null;
}
public function getDealStageIds(): array
{
return $this->dealStageIds;
}
public function hasDealPipelineIds(): bool
{
return $this->dealPipelineIds !== null;
}
public function getDealPipelineIds(): array
{
return $this->dealPipelineIds;
}
public function hasDealTypeIds(): bool
{
return $this->dealTypeIds !== null;
}
public function getDealTypeIds(): array
{
return $this->dealTypeIds;
}
public function getExternalId(): ?string
{
return $this->externalId;
}
public function getExternalIdType(): ?string
{
return $this->externalIdType;
}
public function hasNudgeRunId(): bool
{
return $this->nudgeRunId !== null;
}
public function getNudgeRunId(): string
{
return $this->nudgeRunId;
}
public function hasActivityId(): bool
{
return $this->activityId !== null;
}
public function getActivityId(): string
{
return $this->activityId;
}
public function hasPlaylists(): bool
{
return $this->playlistIds !== null;
}
/**
* @return string[]
*/
public function getPlaylistIds(): array
{
return $this->playlistIds;
}
public function hasActivityTypeIds(): bool
{
return $this->activityTypeIds !== null;
}
public function getActivityTypeIds(): array
{
return $this->activityTypeIds;
}
/**
* @return string[]
*/
public function getTopicIds(): array
{
return $this->topicIds;
}
public function getCompareTopicId(): ?string
{
return $this->compareTopicId;
}
public function hasMinDuration(): bool
{
return $this->minDuration !== null;
}
public function getMinDuration(): int
{
return $this->minDuration;
}
public function hasMaxDuration(): bool
{
return $this->maxDuration !== null;
}
public function getMaxDuration(): int
{
return $this->maxDuration;
}
public function hasStageIds(): bool
{
return $this->stageIds !== null;
}
public function getStageIds(): array
{
return $this->stageIds;
}
public function hasCurrentStageIds(): bool
{
return $this->currentStageIds !== null;
}
public function getCurrentStageIds(): array
{
return $this->currentStageIds;
}
public function hasProviderId(): bool
{
return $this->providerId !== null;
}
public function getProviderId(): string
{
return $this->providerId;
}
public function getChannelId(): ?string
{
return $this->channelId;
}
public function getChannelIds(): ?array
{
return $this->channelIds;
}
public function getHasTranscription(): ?bool
{
return $this->hasTranscription;
}
/**
* @return string[]|null
*/
public function getGroupIds(): ?array
{
return $this->groupIds;
}
/** @return array<string, string|string[]> */
public function getCrmFieldValues(): array
{
return $this->crmFieldValues;
}
public function hasCoachingFeedbackCoachUserIds(): bool
{
return $this->coachingFeedbackCoachUserId !== null;
}
/**
* @return string[]
*/
public function getTeamIds(): array
{
return $this->teamIds;
}
public function hasTeamIds(): bool
{
return $this->teamIds !== null;
}
public function hasTeamMemberUserIds(): bool
{
return $this->teamMemberUserIds !== null;
}
/**
* @return string[]
*/
public function getTeamMemberUserIds(): array
{
return $this->teamMemberUserIds;
}
/**
* @return ?string[]
*/
public function getUserIds(): ?array
{
return $this->userIds;
}
public function getCoachingFeedbackCoachUserId(): array
{
return $this->coachingFeedbackCoachUserId;
}
public function getParticipantUserIds(): ?array
{
return $this->participantUserIds;
}
public function hasExcludedUserId(): bool
{
return $this->excludedUserId !== null;
}
public function getExcludedUserId(): string
{
return $this->excludedUserId;
}
public function getStartDate(): ?CarbonImmutable
{
return $this->startDate;
}
public function getEndDate(): ?CarbonImmutable
{
return $this->endDate;
}
public function getScheduledFrom(): ?Carbon
{
return $this->scheduledFrom;
}
public function getScheduledTo(): ?Carbon
{
return $this->scheduledTo;
}
public function hasUpdatedFrom(): bool
{
return $this->updatedFrom !== null;
}
public function getUpdatedFrom(): Carbon
{
return $this->updatedFrom;
}
public function hasUpdatedTo(): bool
{
return $this->updatedTo !== null;
}
public function getUpdatedTo(): Carbon
{
return $this->updatedTo;
}
public function hasActivityStatusValues(): bool
{
return is_array($this->includeStatuses) && count($this->includeStatuses) > 0;
}
/**
* @return string[]
*/
public function getActivityStatusValues(): array
{
return $this->includeStatuses;
}
public function onlyNotLoggedActivities(): bool
{
return $this->notLogged === true;
}
public function hasPendingAiCrmNotes(): bool
{
return $this->hasPendingAiCrmNotes === true;
}
public function hasIncludeHostJoinedMeetings(): bool
{
return $this->includeHostJoinedMeetings === true;
}
public function hasOnlyRecordedActivities(): bool
{
return $this->onlyRecorded !== null;
}
public function getOnlyRecordedActivities(): int
{
return $this->onlyRecorded;
}
public function getIncludeInternalConversations(): ?int
{
return $this->includeInternalConversations;
}
public function hasSearchQuery(): bool
{
return $this->searchQuery !== null;
}
public function getPageNumber(): int
{
return $this->pageNumber;
}
public function getSearchQuery(): ?string
{
return $this->searchQuery;
}
public function hasMinUserQuestions(): bool
{
return $this->minUserQuestions !== null;
}
public function getMinUserQuestions(): int
{
return (int) $this->minUserQuestions;
}
public function hasMaxUserQuestions(): bool
{
return $this->maxUserQuestions !== null;
}
public function getMaxUserQuestions(): int
{
return (int) $this->maxUserQuestions;
}
public function hasMinEngagingQuestions(): bool
{
return $this->minEngagingQuestions !== null;
}
public function getMinEngagingQuestions(): int
{
return (int) $this->minEngagingQuestions;
}
public function hasMaxEngagingQuestions(): bool
{
return $this->maxEngagingQuestions !== null;
}
public function getMaxEngagingQuestions(): int
{
return (int) $this->maxEngagingQuestions;
}
public function hasMinInsightfulQuestions(): bool
{
return $this->minInsightfulQuestions !== null;
}
public function getMinInsightfulQuestions(): int
{
return (int) $this->minInsightfulQuestions;
}
public function hasMaxInsightfulQuestions(): bool
{
return $this->maxInsightfulQuestions !== null;
}
public function getMaxInsightfulQuestions(): int
{
return (int) $this->maxInsightfulQuestions;
}
public function hasMinCustomerQuestions(): bool
{
return $this->minCustomerQuestions !== null;
}
public function getMinCustomerQuestions(): int
{
return (int) $this->minCustomerQuestions;
}
public function hasMaxCustomerQuestions(): bool
{
return $this->maxCustomerQuestions !== null;
}
public function getMaxCustomerQuestions(): int
{
return (int) $this->maxCustomerQuestions;
}
public function hasMinCommentCount(): bool
{
return $this->minCommentCount !== null;
}
public function getMinCommentCount(): string
{
return $this->minCommentCount;
}
public function hasMaxCommentCount(): bool
{
return $this->maxCommentCount !== null;
}
public function getMaxCommentCount(): string
{
return $this->maxCommentCount;
}
public function hasSortDirection(): bool
{
return $this->sortDirection !== null;
}
public function getSortDirection(): string
{
return $this->sortDirection;
}
public function hasSortBy(): bool
{
return $this->sortBy !== null;
}
public function getSortBy(): string
{
return $this->sortBy;
}
public function getLimit(): int
{
return $this->limit;
}
public function isEmpty(): bool
{
return $this->empty;
}
public function isFirstRequest(): bool
{
return $this->empty || $this->sequenceNumber === 0;
}
public function getOnlyActiveUsers(): bool
{
return $this->onlyActiveUsers === true;
}
/**
* 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.
*
* @param Collection $attributes
* @param string $key
* @param DateTimeZone $timezone
*
* @return CarbonImmutable|null|string Returns self::DATE_PARAMETER_NOT_PROVIDED if parameter is
* missing, null if explicitly null, CarbonImmutable if valid date
*/
private static function parseDealInsightsDate(
Collection $attributes,
string $key,
DateTimeZone $timezone
): CarbonImmutable|string|null {
if (! $attributes->has($key)) {
return self::DATE_PARAMETER_NOT_PROVIDED; // Parameter is missing (should use default period)
}
$value = $attributes->get($key);
if (empty($value) || $value === 'null') {
return null; // Parameter is explicitly null (should use "All time")
}
return CarbonImmutable::parse($value, $timezone);
}
}
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...
|
PhpStorm
|
faVsco.js – Criteria.php
|
NULL
|
11035
|
|
11036
|
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
|
NULL
|
NULL
|
11036
|
|
11037
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:5186 0Today ~...
|
NULL
|
NULL
|
NULL
|
11037
|
|
11038
|
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
|
NULL
|
NULL
|
11038
|
|
11039
|
+SlackEDHomeDMSActivityFilesLater..•More+FileEditV +SlackEDHomeDMSActivityFilesLater..•More+FileEditViewGoHistoryWindowHelpJiminny ...# Starredplatform-inner-teamChannels# ai-chapter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bg# platform-tickets# product launches# random# releases# sofia-office# support# thank-yous# the_people_of jimi…..Direct messagesAneliya Angelova, ...Steliyan GeorgievAdelina Petrova, Ili.... Adelina PetrovaO. Calea Dimitravo→Search Jiminny IncAneliya Angelova, Nikolay Yankov, Steliyan GeorgievMessagesAdd canvas+Nikolay Yankov 10:45 AMпиши кат оя рьннешLukas Kovalik 10:52 AMзабавих се че ми се разбазикаха settings за средипуснах и мина и fail-наима result но e failedзначиREASON_NOT_ENOUGH_ACTIVITIESвиж дали има нещо в OD със този филтьрNikolay Yankov 11:01 AMДобреNikolay Yankov 11:39 AMя рьнни пак LukasLukas Kovalik 11:43 AMготовосьщотоCompetitive pitches беше втория нали такаNikolay Yankov 12:04 PMДа, там има 14 активитита, защо не сработи този пьт?Lukas Kovalik 12:05 PMпак изглежда sequenceгледам гоMessage Aneliya Angelova, Nikolay Yankov, Steliyan Georgiev+Aa(ahlSupport Daily - in 2h 51 m100% C4Tue 14 Apr 12:09:5286 0Today ~...
|
NULL
|
NULL
|
NULL
|
11039
|
|
11040
|
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
|
NULL
|
NULL
|
11040
|
|
11041
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceT…Defaults
Run 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
Debug 'AskJiminnyReportActivityServiceTest.tes…uenceNumberToDisableFirstRequestDefaults'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
isFirstRequest
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/1
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
1
46
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\VO\Repository\OnDemandActivitySearch;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use DateTimeZone;
use Illuminate\Support\Collection;
use Jiminny\Component\ActivitySearch\FilterDefinition;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\CreatedPeriodFilter;
class Criteria
{
/**
* Sentinel value to indicate a date parameter was not provided in the request
*/
private const DATE_PARAMETER_NOT_PROVIDED = 'DATE_PARAMETER_NOT_PROVIDED';
/**
* @var string[]
*/
private $playlistIds;
/**
* @var string[]
*/
private array $topicIds = [];
private ?string $compareTopicId = null;
private ?string $partnerId;
/**
* @var string[]
*/
private $activityTypeIds;
/**
* @var string[]
*/
private $stageIds;
/**
* @var string[]
*/
private $currentStageIds;
/**
* @var string[]|null
*/
private ?array $groupIds = null;
/**
* @var string[]|null
*/
private ?array $userIds = null;
/**
* @var string[]|null
*/
private ?array $coachingFeedbackCoachUserId;
/**
* @var string[]|null
*/
private ?array $participantUserIds = null;
/**
* @var string[]|null
*/
private ?array $teamMemberUserIds;
/**
* @var string[]
*/
private $teamIds;
/**
* @var string
*/
private $providerId;
/**
* Channel ID for filtering activities by a single channel.
*/
private ?string $channelId = null;
/**
* Channel IDs for filtering activities by multiple channels.
* When provided, activities matching any of the specified channels will be returned.
*
* @var string[]|null
*/
private ?array $channelIds = null;
/**
* Filter activities based on whether they have a transcription.
* true = only activities with transcription, false = only activities without transcription, null = no filter
*/
private ?bool $hasTranscription = null;
private ?int $minDuration = null;
private ?int $maxDuration = null;
/**
* @var string
*
* @format uuid
*/
private $excludedUserId;
private ?CarbonImmutable $startDate = null;
private ?CarbonImmutable $endDate = null;
/**
* @var Carbon|null
*/
private $scheduledFrom;
private ?Carbon $scheduledTo = null;
/**
* @var Carbon|null
*/
private $updatedFrom;
/**
* @var Carbon|null
*/
private $updatedTo;
private CarbonImmutable|string|null $dealCloseDateStart = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCloseDateEnd = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCreatedDateStart = self::DATE_PARAMETER_NOT_PROVIDED;
private CarbonImmutable|string|null $dealCreatedDateEnd = self::DATE_PARAMETER_NOT_PROVIDED;
private ?array $dealStageIds = null;
private ?array $dealPipelineIds = null;
private ?array $dealTypeIds = null;
private ?int $minDealValue = null;
private ?int $maxDealValue = null;
/**
* @var string|null
*/
private $minDealAge;
/**
* @var string|null
*/
private $maxDealAge;
/**
* @var string|null
*/
private $minPatience;
/**
* @var string|null
*/
private $maxPatience;
private ?int $minTalkRatio = null;
private ?int $maxTalkRatio = null;
/**
* @var string|null
*/
private $minMonologue;
/**
* @var string|null
*/
private $maxMonologue;
/**
* @var string|null
*/
private $minCustomerMonologue;
/**
* @var string|null
*/
private $maxCustomerMonologue;
/**
* @var string|null
*/
private $minSpeechRate;
/**
* @var string|null
*/
private $maxSpeechRate;
private ?float $minScore = null;
private ?float $maxScore = null;
/**
* @var int[]|null
*/
private ?array $coachingScores = null;
private ?int $minAutoScore = null;
private ?int $maxAutoScore = null;
/**
* @var int[]|null
*/
private ?array $autoScores = null;
/**
* @var int[]|null
*/
private ?array $aiCallScores = null;
/**
* @var string[]
*/
private ?array $includeStatuses;
/**
* @var bool
*/
private $notLogged;
private bool $hasPendingAiCrmNotes;
private bool $includeHostJoinedMeetings;
private ?int $onlyRecorded;
private ?int $includeInternalConversations = null;
private ?string $searchQuery = null;
/**
* @var string
*/
private $transcriptKeywords;
/**
* @var string
*/
private $transcriptSaidBy;
/**
* @var string
*/
private $transcriptSpeaker;
/**
* @var string[]|null
*/
private $languages;
private ?string $externalId = null;
private ?string $externalIdType = null;
/**
* @var string|null
*/
private $minUserQuestions;
/**
* @var string|null
*/
private $maxUserQuestions;
/**
* @var string|null
*/
private $minEngagingQuestions;
/**
* @var string|null
*/
private $maxEngagingQuestions;
/**
* @var string|null
*/
private $minInsightfulQuestions;
/**
* @var string|null
*/
private $maxInsightfulQuestions;
/**
* @var string|null
*/
private $minCustomerQuestions;
/**
* @var string|null
*/
private $maxCustomerQuestions;
/**
* @var string|null
*/
private $sortDirection;
/**
* @var string|null
*/
private $sortBy;
private int $limit;
/**
* @var int
*/
private $pageNumber;
/**
* @var bool
*/
private $empty;
/**
* @var int
*/
private $sequenceNumber;
/**
* @var string
*/
private $nudgeRunId;
private ?bool $onlyActiveUsers = null;
/**
* @var string
*/
private $activityId;
private ?string $context = null;
private ?string $minCommentCount = null;
private ?string $maxCommentCount = null;
/** @var array<string, string|string[]> */
private array $crmFieldValues = [];
public static function createFromRequest(
array $requestAttributes,
DateTimeZone $timezone,
?string $context = null
): self {
$attributes = Collection::make($requestAttributes);
$instance = new self();
$instance->context = $context;
$instance->partnerId = $attributes->get('partner_id');
$instance->teamIds = $attributes->get('team_id');
$instance->groupIds = $attributes->get('group_id');
$instance->userIds = $attributes->get('user_id');
$instance->coachingFeedbackCoachUserId = $attributes->get('coaching_feedback_coach_id');
$instance->participantUserIds = $attributes->get('participant_user_id');
$instance->teamMemberUserIds = $attributes->get('team_member_user_id');
$instance->excludedUserId = $attributes->get('excluded_user_id');
$instance->activityTypeIds = $attributes->get('category_id');
$instance->searchQuery = $attributes->get('query');
$instance->transcriptKeywords = $attributes->get('transcript_keywords');
$instance->transcriptSaidBy = $attributes->get('transcript_said_by');
$instance->transcriptSpeaker = $attributes->get('transcript_speaker');
$instance->languages = $attributes->get('languages');
$instance->topicIds = $attributes->get('topic_id', []);
$instance->compareTopicId = $attributes->get('compare_topic_id');
$instance->stageIds = $attributes->get('stage_id');
$instance->currentStageIds = $attributes->get('current_stage_id');
$instance->playlistIds = $attributes->get('playlist_id');
$instance->providerId = $attributes->get('provider_id');
$instance->channelId = $attributes->get('channel_id');
$instance->channelIds = $attributes->get('channel_ids');
$hasTranscription = $attributes->get('has_transcription');
$instance->hasTranscription = $hasTranscription !== null ? (bool) $hasTranscription : null;
$instance->externalId = $attributes->get('external_id');
$instance->externalIdType = $attributes->get('external_id_type');
$instance->notLogged = $attributes->get('not_logged') === '1';
$instance->hasPendingAiCrmNotes = $attributes->get('has_pending_ai_crm_notes') === '1';
$instance->includeHostJoinedMeetings = $attributes->get('include_host_joined_meetings') === '1';
$instance->onlyRecorded = $attributes->has('only_recorded')
? (int) $attributes->get('only_recorded')
: null;
$instance->includeInternalConversations = $attributes->has('include_internal_conversations')
? (int) $attributes->get('include_internal_conversations')
: null;
$instance->minDuration = $attributes->has('min_duration')
? (int) $attributes->get('min_duration')
: null;
$instance->maxDuration = $attributes->has('max_duration')
? (int) $attributes->get('max_duration')
: null;
$minDealValue = $attributes->get('min_deal_value');
$instance->minDealValue = $minDealValue !== null ? (int) $minDealValue : null;
$maxDealValue = $attributes->get('max_deal_value');
$instance->maxDealValue = $maxDealValue !== null ? (int) $maxDealValue : null;
$instance->minDealAge = $attributes->get('min_deal_age');
$instance->maxDealAge = $attributes->get('max_deal_age');
$instance->minCustomerMonologue = $attributes->get('min_customer_monologue');
$instance->maxCustomerMonologue = $attributes->get('max_customer_monologue');
$instance->minMonologue = $attributes->get('min_monologue');
$instance->maxMonologue = $attributes->get('max_monologue');
$instance->minTalkRatio = $attributes->has('min_talk_ratio')
? (int) $attributes->get('min_talk_ratio')
: null;
$instance->maxTalkRatio = $attributes->has('max_talk_ratio')
? (int) $attributes->get('max_talk_ratio')
: null;
$instance->minPatience = $attributes->get('min_patience');
$instance->maxPatience = $attributes->get('max_patience');
$instance->minSpeechRate = $attributes->get('min_speech_rate');
$instance->maxSpeechRate = $attributes->get('max_speech_rate');
$instance->minScore = $attributes->has('min_score')
? (float) $attributes->get('min_score')
: null;
$instance->maxScore = $attributes->has('max_score')
? (float) $attributes->get('max_score')
: null;
$coachingScores = $attributes->get('coaching_score');
if (is_array($coachingScores)) {
$instance->coachingScores = array_map('intval', $coachingScores);
}
$instance->minAutoScore = $attributes->has('min_auto_score')
? (int) $attributes->get('min_auto_score')
: null;
$instance->maxAutoScore = $attributes->has('max_auto_score')
? (int) $attributes->get('max_auto_score')
: null;
$autoScores = $attributes->get('auto_score');
if (is_array($autoScores)) {
$instance->autoScores = array_map('intval', $autoScores);
}
$aiCallScores = $attributes->get('ai_call_score');
if (is_array($aiCallScores)) {
$instance->aiCallScores = array_map('intval', $aiCallScores);
}
$instance->minUserQuestions = $attributes->get('min_user_questions');
$instance->maxUserQuestions = $attributes->get('max_user_questions');
$instance->minEngagingQuestions = $attributes->get('min_engaging_questions');
$instance->maxEngagingQuestions = $attributes->get('max_engaging_questions');
$instance->minInsightfulQuestions = $attributes->get('min_insightful_questions');
$instance->maxInsightfulQuestions = $attributes->get('max_insightful_questions');
$instance->minCustomerQuestions = $attributes->get('min_customer_questions');
$instance->maxCustomerQuestions = $attributes->get('max_customer_questions');
$instance->nudgeRunId = $attributes->get('nudge_run_id');
$instance->activityId = $attributes->get('activity_id');
$instance->minCommentCount = $attributes->has('min_comment_count')
? (string) $attributes->get('min_comment_count')
: null;
$instance->maxCommentCount = $attributes->has('max_comment_count')
? (string) $attributes->get('max_comment_count')
: null;
$instance->onlyActiveUsers = $attributes->has('only_active_users')
? $attributes->get('only_active_users') === '1'
: null;
$instance->crmFieldValues = $attributes
->filter(static function ($value, $key): bool {
return str_starts_with($key, FilterDefinition\CrmFieldCollection::CRITERIA_PREFIX);
})
->mapWithKeys(static function ($value, string $key): array {
$key = str_replace_first(FilterDefinition\CrmFieldCollection::CRITERIA_PREFIX, '', $key);
return [
$key => $value,
];
})
->all();
$instance->limit = (int) $attributes->get('limit', 25);
$instance->pageNumber = (int) $attributes->get('page', 1);
$instance->empty = $attributes->isEmpty();
$instance->sequenceNumber = (int) $attributes->get('sequence_number', 0);
$instance->includeStatuses = $attributes->get('status');
$instance->dealCloseDateStart = self::parseDealInsightsDate($attributes, ClosingPeriodFilter::KEY_START_DATE, $timezone);
$instance->dealCloseDateEnd = self::parseDealInsightsDate($attributes, ClosingPeriodFilter::KEY_END_DATE, $timezone);
$dealCreatedDateStartKey = CreatedPeriodFilter::KEY_START_DATE;
$dealCreatedDateEndKey = CreatedPeriodFilter::KEY_END_DATE;
$instance->dealCreatedDateStart = self::parseDealInsightsDate($attributes, $dealCreatedDateStartKey, $timezone);
$instance->dealCreatedDateEnd = self::parseDealInsightsDate($attributes, $dealCreatedDateEndKey, $timezone);
if ($attributes->has('deal_pipeline_id')) {
$instance->dealPipelineIds = $attributes->get('deal_pipeline_id');
}
if ($attributes->has('deal_stage_id')) {
$instance->dealStageIds = $attributes->get('deal_stage_id');
}
if ($attributes->has('deal_type_id')) {
$instance->dealTypeIds = $attributes->get('deal_type_id');
}
if ($attributes->has('start_date')) {
$instance->startDate = CarbonImmutable::parse($attributes->get('start_date'), $timezone);
}
if ($attributes->has('end_date')) {
$instance->endDate = CarbonImmutable::parse($attributes->get('end_date'), $timezone);
}
if ($attributes->has('scheduled_from')) {
$instance->scheduledFrom = Carbon::parse($attributes->get('scheduled_from'), $timezone);
}
if ($attributes->has('scheduled_to')) {
$instance->scheduledTo = Carbon::parse($attributes->get('scheduled_to'), $timezone);
}
if ($attributes->has('updated_from')) {
$instance->updatedFrom = Carbon::parse($attributes->get('updated_from'), $timezone);
}
if ($attributes->has('updated_to')) {
$instance->updatedTo = Carbon::parse($attributes->get('updated_to'), $timezone);
}
$instance->sortBy = $attributes->get('sort_by');
$instance->sortDirection = $attributes->get('sort_direction');
return $instance;
}
public function setContext(?string $context): self
{
$this->context = $context;
return $this;
}
public function getContext(): ?string
{
return $this->context;
}
public function getMinDealValue(): ?int
{
return $this->minDealValue;
}
public function getMaxDealValue(): ?int
{
return $this->maxDealValue;
}
public function hasMinDealAge(): bool
{
return $this->minDealAge !== null;
}
public function getMinDealAge(): int
{
return (int) $this->minDealAge;
}
public function hasMaxDealAge(): bool
{
return $this->maxDealAge !== null;
}
public function getMaxDealAge(): int
{
return (int) $this->maxDealAge;
}
public function hasTranscriptKeywords(): bool
{
return $this->transcriptKeywords !== null;
}
public function getTranscriptKeywords(): string
{
return $this->transcriptKeywords;
}
public function hasTranscriptSaidBy(): bool
{
return $this->transcriptSaidBy !== null;
}
public function getTranscriptSaidBy(): string
{
return $this->transcriptSaidBy;
}
public function hasTranscriptSpeaker(): bool
{
return $this->transcriptSpeaker !== null;
}
public function getTranscriptSpeaker(): string
{
return $this->transcriptSpeaker;
}
public function getLanguages(): ?array
{
return $this->languages;
}
public function getPartnerId(): ?string
{
return $this->partnerId;
}
public function getMinScore(): ?float
{
return $this->minScore;
}
public function getMaxScore(): ?float
{
return $this->maxScore;
}
/**
* @return int[]|null
*/
public function getCoachingScores(): ?array
{
return $this->coachingScores;
}
public function getMinAutoScore(): ?int
{
return $this->minAutoScore;
}
public function getMaxAutoScore(): ?int
{
return $this->maxAutoScore;
}
/**
* @return int[]|null
*/
public function getAutoScores(): ?array
{
return $this->autoScores;
}
/**
* @return int[]|null
*/
public function getAiCallScores(): ?array
{
return $this->aiCallScores;
}
public function hasMinPatience(): bool
{
return $this->minPatience !== null;
}
public function getMinPatience(): float
{
return (float) $this->minPatience;
}
public function hasMaxPatience(): bool
{
return $this->maxPatience !== null;
}
public function getMaxPatience(): float
{
return (float) $this->maxPatience;
}
public function hasMinSpeechRate(): bool
{
return $this->minSpeechRate !== null;
}
public function getMinSpeechRate(): float
{
return (float) $this->minSpeechRate;
}
public function hasMaxSpeechRate(): bool
{
return $this->maxSpeechRate !== null;
}
public function getMaxSpeechRate(): float
{
return (float) $this->maxSpeechRate;
}
public function getMinTalkRatio(): ?int
{
return $this->minTalkRatio;
}
public function getMaxTalkRatio(): ?int
{
return $this->maxTalkRatio;
}
public function hasMinMonologue(): bool
{
return $this->minMonologue !== null;
}
public function getMinMonologue(): float
{
return (float) $this->minMonologue;
}
public function hasMaxMonologue(): bool
{
return $this->maxMonologue !== null;
}
public function getMaxMonologue(): float
{
return (float) $this->maxMonologue;
}
public function hasMinCustomerMonologue(): bool
{
return $this->minCustomerMonologue !== null;
}
public function getMinCustomerMonologue(): float
{
return (float) $this->minCustomerMonologue;
}
public function hasMaxCustomerMonologue(): bool
{
return $this->maxCustomerMonologue !== null;
}
public function getMaxCustomerMonologue(): float
{
return (float) $this->maxCustomerMonologue;
}
public function getDealCloseDateStart(): ?CarbonImmutable
{
return $this->dealCloseDateStart === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCloseDateStart;
}
public function getDealCloseDateEnd(): ?CarbonImmutable
{
return $this->dealCloseDateEnd === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCloseDateEnd;
}
public function getDealCreatedDateStart(): ?CarbonImmutable
{
return $this->dealCreatedDateStart === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCreatedDateStart;
}
public function getDealCreatedDateEnd(): ?CarbonImmutable
{
return $this->dealCreatedDateEnd === self::DATE_PARAMETER_NOT_PROVIDED ? null : $this->dealCreatedDateEnd;
}
/**
* Check if deal close date start parameter was explicitly set (even if to null)
*/
public function hasDealCloseDateStart(): bool
{
return $this->dealCloseDateStart !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal close date end parameter was explicitly set (even if to null)
*/
public function hasDealCloseDateEnd(): bool
{
return $this->dealCloseDateEnd !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal created date start parameter was explicitly set (even if to null)
*/
public function hasDealCreatedDateStart(): bool
{
return $this->dealCreatedDateStart !== self::DATE_PARAMETER_NOT_PROVIDED;
}
/**
* Check if deal created date end parameter was explicitly set (even if to null)
*/
public function hasDealCreatedDateEnd(): bool
{
return $this->dealCreatedDateEnd !== self::DATE_PARAMETER_NOT_PROVIDED;
}
public function hasDealStageIds(): bool
{
return $this->dealStageIds !== null;
}
public function getDealStageIds(): array
{
return $this->dealStageIds;
}
public function hasDealPipelineIds(): bool
{
return $this->dealPipelineIds !== null;
}
public function getDealPipelineIds(): array
{
return $this->dealPipelineIds;
}
public function hasDealTypeIds(): bool
{
return $this->dealTypeIds !== null;
}
public function getDealTypeIds(): array
{
return $this->dealTypeIds;
}
public function getExternalId(): ?string
{
return $this->externalId;
}
public function getExternalIdType(): ?string
{
return $this->externalIdType;
}
public function hasNudgeRunId(): bool
{
return $this->nudgeRunId !== null;
}
public function getNudgeRunId(): string
{
return $this->nudgeRunId;
}
public function hasActivityId(): bool
{
return $this->activityId !== null;
}
public function getActivityId(): string
{
return $this->activityId;
}
public function hasPlaylists(): bool
{
return $this->playlistIds !== null;
}
/**
* @return string[]
*/
public function getPlaylistIds(): array
{
return $this->playlistIds;
}
public function hasActivityTypeIds(): bool
{
return $this->activityTypeIds !== null;
}
public function getActivityTypeIds(): array
{
return $this->activityTypeIds;
}
/**
* @return string[]
*/
public function getTopicIds(): array
{
return $this->topicIds;
}
public function getCompareTopicId(): ?string
{
return $this->compareTopicId;
}
public function hasMinDuration(): bool
{
return $this->minDuration !== null;
}
public function getMinDuration(): int
{
return $this->minDuration;
}
public function hasMaxDuration(): bool
{
return $this->maxDuration !== null;
}
public function getMaxDuration(): int
{
return $this->maxDuration;
}
public function hasStageIds(): bool
{
return $this->stageIds !== null;
}
public function getStageIds(): array
{
return $this->stageIds;
}
public function hasCurrentStageIds(): bool
{
return $this->currentStageIds !== null;
}
public function getCurrentStageIds(): array
{
return $this->currentStageIds;
}
public function hasProviderId(): bool
{
return $this->providerId !== null;
}
public function getProviderId(): string
{
return $this->providerId;
}
public function getChannelId(): ?string
{
return $this->channelId;
}
public function getChannelIds(): ?array
{
return $this->channelIds;
}
public function getHasTranscription(): ?bool
{
return $this->hasTranscription;
}
/**
* @return string[]|null
*/
public function getGroupIds(): ?array
{
return $this->groupIds;
}
/** @return array<string, string|string[]> */
public function getCrmFieldValues(): array
{
return $this->crmFieldValues;
}
public function hasCoachingFeedbackCoachUserIds(): bool
{
return $this->coachingFeedbackCoachUserId !== null;
}
/**
* @return string[]
*/
public function getTeamIds(): array
{
return $this->teamIds;
}
public function hasTeamIds(): bool
{
return $this->teamIds !== null;
}
public function hasTeamMemberUserIds(): bool
{
return $this->teamMemberUserIds !== null;
}
/**
* @return string[]
*/
public function getTeamMemberUserIds(): array
{
return $this->teamMemberUserIds;
}
/**
* @return ?string[]
*/
public function getUserIds(): ?array
{
return $this->userIds;
}
public function getCoachingFeedbackCoachUserId(): array
{
return $this->coachingFeedbackCoachUserId;
}
public function getParticipantUserIds(): ?array
{
return $this->participantUserIds;
}
public function hasExcludedUserId(): bool
{
return $this->excludedUserId !== null;
}
public function getExcludedUserId(): string
{
return $this->excludedUserId;
}
public function getStartDate(): ?CarbonImmutable
{
return $this->startDate;
}
public function getEndDate(): ?CarbonImmutable
{
return $this->endDate;
}
public function getScheduledFrom(): ?Carbon
{
return $this->scheduledFrom;
}
public function getScheduledTo(): ?Carbon
{
return $this->scheduledTo;
}
public function hasUpdatedFrom(): bool
{
return $this->updatedFrom !== null;
}
public function getUpdatedFrom(): Carbon
{
return $this->updatedFrom;
}
public function hasUpdatedTo(): bool
{
return $this->updatedTo !== null;
}
public function getUpdatedTo(): Carbon
{
return $this->updatedTo;
}
public function hasActivityStatusValues(): bool
{
return is_array($this->includeStatuses) && count($this->includeStatuses) > 0;
}
/**
* @return string[]
*/
public function getActivityStatusValues(): array
{
return $this->includeStatuses;
}
public function onlyNotLoggedActivities(): bool
{
return $this->notLogged === true;
}
public function hasPendingAiCrmNotes(): bool
{
return $this->hasPendingAiCrmNotes === true;
}
public function hasIncludeHostJoinedMeetings(): bool
{
return $this->includeHostJoinedMeetings === true;
}
public function hasOnlyRecordedActivities(): bool
{
return $this->onlyRecorded !== null;
}
public function getOnlyRecordedActivities(): int
{
return $this->onlyRecorded;
}
public function getIncludeInternalConversations(): ?int
{
return $this->includeInternalConversations;
}
public function hasSearchQuery(): bool
{
return $this->searchQuery !== null;
}
public function getPageNumber(): int
{
return $this->pageNumber;
}
public function getSearchQuery(): ?string
{
return $this->searchQuery;
}
public function hasMinUserQuestions(): bool
{
return $this->minUserQuestions !== null;
}
public function getMinUserQuestions(): int
{
return (int) $this->minUserQuestions;
}
public function hasMaxUserQuestions(): bool
{
return $this->maxUserQuestions !== null;
}
public function getMaxUserQuestions(): int
{
return (int) $this->maxUserQuestions;
}
public function hasMinEngagingQuestions(): bool
{
return $this->minEngagingQuestions !== null;
}
public function getMinEngagingQuestions(): int
{
return (int) $this->minEngagingQuestions;
}
public function hasMaxEngagingQuestions(): bool
{
return $this->maxEngagingQuestions !== null;
}
public function getMaxEngagingQuestions(): int
{
return (int) $this->maxEngagingQuestions;
}
public function hasMinInsightfulQuestions(): bool
{
return $this->minInsightfulQuestions !== null;
}
public function getMinInsightfulQuestions(): int
{
return (int) $this->minInsightfulQuestions;
}
public function hasMaxInsightfulQuestions(): bool
{
return $this->maxInsightfulQuestions !== null;
}
public function getMaxInsightfulQuestions(): int
{
return (int) $this->maxInsightfulQuestions;
}
public function hasMinCustomerQuestions(): bool
{
return $this->minCustomerQuestions !== null;
}
public function getMinCustomerQuestions(): int
{
return (int) $this->minCustomerQuestions;
}
public function hasMaxCustomerQuestions(): bool
{
return $this->maxCustomerQuestions !== null;
}
public function getMaxCustomerQuestions(): int
{
return (int) $this->maxCustomerQuestions;
}
public function hasMinCommentCount(): bool
{
return $this->minCommentCount !== null;
}
public function getMinCommentCount(): string
{
return $this->minCommentCount;
}
public function hasMaxCommentCount(): bool
{
return $this->maxCommentCount !== null;
}
public function getMaxCommentCount(): string
{
return $this->maxCommentCount;
}
public function hasSortDirection(): bool
{
return $this->sortDirection !== null;
}
public function getSortDirection(): string
{
return $this->sortDirection;
}
public function hasSortBy(): bool
{
return $this->sortBy !== null;
}
public function getSortBy(): string
{
return $this->sortBy;
}
public function getLimit(): int
{
return $this->limit;
}
public function isEmpty(): bool
{
return $this->empty;
}
public function isFirstRequest(): bool
{
return $this->empty || $this->sequenceNumber === 0;
}
public function getOnlyActiveUsers(): bool
{
return $this->onlyActiveUsers === true;
}
/**
* 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.
*
* @param Collection $attributes
* @param string $key
* @param DateTimeZone $timezone
*
* @return CarbonImmutable|null|string Returns self::DATE_PARAMETER_NOT_PROVIDED if parameter is
* missing, null if explicitly null, CarbonImmutable if valid date
*/
private static function parseDealInsightsDate(
Collection $attributes,
string $key,
DateTimeZone $timezone
): CarbonImmutable|string|null {
if (! $attributes->has($key)) {
return self::DATE_PARAMETER_NOT_PROVIDED; // Parameter is missing (should use default period)
}
$value = $attributes->get($key);
if (empty($value) || $value === 'null') {
return null; // Parameter is explicitly null (should use "All time")
}
return CarbonImmutable::parse($value, $timezone);
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
15
4
Previous Highlighted Error
Next Highlighted Error...
|
PhpStorm
|
faVsco.js – Criteria.php
|
NULL
|
11041
|